From 6042ea8d3f0c789e61b8530a815f0da253996d17 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 25 Jul 2017 14:18:56 -0700 Subject: [PATCH 01/75] Import translations. DO NOT MERGE Change-Id: I17c2c5957d9eaab581330b20fc6925def9a0d111 Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- library/main/res/values-af/strings.xml | 23 ------------------- library/main/res/values-am/strings.xml | 23 ------------------- library/main/res/values-ar/strings.xml | 23 ------------------- library/main/res/values-az/strings.xml | 23 ------------------- library/main/res/values-b+sr+Latn/strings.xml | 23 ------------------- library/main/res/values-be/strings.xml | 23 ------------------- library/main/res/values-bg/strings.xml | 23 ------------------- library/main/res/values-bn/strings.xml | 23 ------------------- library/main/res/values-bs/strings.xml | 23 ------------------- library/main/res/values-ca/strings.xml | 23 ------------------- library/main/res/values-cs/strings.xml | 23 ------------------- library/main/res/values-da/strings.xml | 23 ------------------- library/main/res/values-de/strings.xml | 23 ------------------- library/main/res/values-el/strings.xml | 23 ------------------- library/main/res/values-en-rAU/strings.xml | 23 ------------------- library/main/res/values-en-rGB/strings.xml | 23 ------------------- library/main/res/values-en-rIN/strings.xml | 23 ------------------- library/main/res/values-es-rUS/strings.xml | 23 ------------------- library/main/res/values-es/strings.xml | 23 ------------------- library/main/res/values-et/strings.xml | 23 ------------------- library/main/res/values-eu/strings.xml | 23 ------------------- library/main/res/values-fa/strings.xml | 23 ------------------- library/main/res/values-fi/strings.xml | 23 ------------------- library/main/res/values-fr-rCA/strings.xml | 23 ------------------- library/main/res/values-fr/strings.xml | 23 ------------------- library/main/res/values-gl/strings.xml | 23 ------------------- library/main/res/values-gu/strings.xml | 23 ------------------- library/main/res/values-hi/strings.xml | 23 ------------------- library/main/res/values-hr/strings.xml | 23 ------------------- library/main/res/values-hu/strings.xml | 23 ------------------- library/main/res/values-hy/strings.xml | 23 ------------------- library/main/res/values-in/strings.xml | 23 ------------------- library/main/res/values-is/strings.xml | 23 ------------------- library/main/res/values-it/strings.xml | 23 ------------------- library/main/res/values-iw/strings.xml | 23 ------------------- library/main/res/values-ja/strings.xml | 23 ------------------- library/main/res/values-ka/strings.xml | 23 ------------------- library/main/res/values-kk/strings.xml | 23 ------------------- library/main/res/values-km/strings.xml | 23 ------------------- library/main/res/values-kn/strings.xml | 23 ------------------- library/main/res/values-ko/strings.xml | 23 ------------------- library/main/res/values-ky/strings.xml | 23 ------------------- library/main/res/values-lo/strings.xml | 23 ------------------- library/main/res/values-lt/strings.xml | 23 ------------------- library/main/res/values-lv/strings.xml | 23 ------------------- library/main/res/values-mk/strings.xml | 23 ------------------- library/main/res/values-ml/strings.xml | 23 ------------------- library/main/res/values-mn/strings.xml | 23 ------------------- library/main/res/values-mr/strings.xml | 23 ------------------- library/main/res/values-ms/strings.xml | 23 ------------------- library/main/res/values-my/strings.xml | 23 ------------------- library/main/res/values-nb/strings.xml | 23 ------------------- library/main/res/values-ne/strings.xml | 23 ------------------- library/main/res/values-nl/strings.xml | 23 ------------------- library/main/res/values-pa/strings.xml | 23 ------------------- library/main/res/values-pl/strings.xml | 23 ------------------- library/main/res/values-pt-rBR/strings.xml | 23 ------------------- library/main/res/values-pt-rPT/strings.xml | 23 ------------------- library/main/res/values-pt/strings.xml | 23 ------------------- library/main/res/values-ro/strings.xml | 23 ------------------- library/main/res/values-ru/strings.xml | 23 ------------------- library/main/res/values-si/strings.xml | 23 ------------------- library/main/res/values-sk/strings.xml | 23 ------------------- library/main/res/values-sl/strings.xml | 23 ------------------- library/main/res/values-sq/strings.xml | 23 ------------------- library/main/res/values-sr/strings.xml | 23 ------------------- library/main/res/values-sv/strings.xml | 23 ------------------- library/main/res/values-sw/strings.xml | 23 ------------------- library/main/res/values-ta/strings.xml | 23 ------------------- library/main/res/values-te/strings.xml | 23 ------------------- library/main/res/values-th/strings.xml | 23 ------------------- library/main/res/values-tl/strings.xml | 23 ------------------- library/main/res/values-tr/strings.xml | 23 ------------------- library/main/res/values-uk/strings.xml | 23 ------------------- library/main/res/values-ur/strings.xml | 23 ------------------- library/main/res/values-uz/strings.xml | 23 ------------------- library/main/res/values-vi/strings.xml | 23 ------------------- library/main/res/values-zh-rCN/strings.xml | 23 ------------------- library/main/res/values-zh-rHK/strings.xml | 23 ------------------- library/main/res/values-zh-rTW/strings.xml | 23 ------------------- library/main/res/values-zu/strings.xml | 23 ------------------- 81 files changed, 1863 deletions(-) delete mode 100644 library/main/res/values-af/strings.xml delete mode 100644 library/main/res/values-am/strings.xml delete mode 100644 library/main/res/values-ar/strings.xml delete mode 100644 library/main/res/values-az/strings.xml delete mode 100644 library/main/res/values-b+sr+Latn/strings.xml delete mode 100644 library/main/res/values-be/strings.xml delete mode 100644 library/main/res/values-bg/strings.xml delete mode 100644 library/main/res/values-bn/strings.xml delete mode 100644 library/main/res/values-bs/strings.xml delete mode 100644 library/main/res/values-ca/strings.xml delete mode 100644 library/main/res/values-cs/strings.xml delete mode 100644 library/main/res/values-da/strings.xml delete mode 100644 library/main/res/values-de/strings.xml delete mode 100644 library/main/res/values-el/strings.xml delete mode 100644 library/main/res/values-en-rAU/strings.xml delete mode 100644 library/main/res/values-en-rGB/strings.xml delete mode 100644 library/main/res/values-en-rIN/strings.xml delete mode 100644 library/main/res/values-es-rUS/strings.xml delete mode 100644 library/main/res/values-es/strings.xml delete mode 100644 library/main/res/values-et/strings.xml delete mode 100644 library/main/res/values-eu/strings.xml delete mode 100644 library/main/res/values-fa/strings.xml delete mode 100644 library/main/res/values-fi/strings.xml delete mode 100644 library/main/res/values-fr-rCA/strings.xml delete mode 100644 library/main/res/values-fr/strings.xml delete mode 100644 library/main/res/values-gl/strings.xml delete mode 100644 library/main/res/values-gu/strings.xml delete mode 100644 library/main/res/values-hi/strings.xml delete mode 100644 library/main/res/values-hr/strings.xml delete mode 100644 library/main/res/values-hu/strings.xml delete mode 100644 library/main/res/values-hy/strings.xml delete mode 100644 library/main/res/values-in/strings.xml delete mode 100644 library/main/res/values-is/strings.xml delete mode 100644 library/main/res/values-it/strings.xml delete mode 100644 library/main/res/values-iw/strings.xml delete mode 100644 library/main/res/values-ja/strings.xml delete mode 100644 library/main/res/values-ka/strings.xml delete mode 100644 library/main/res/values-kk/strings.xml delete mode 100644 library/main/res/values-km/strings.xml delete mode 100644 library/main/res/values-kn/strings.xml delete mode 100644 library/main/res/values-ko/strings.xml delete mode 100644 library/main/res/values-ky/strings.xml delete mode 100644 library/main/res/values-lo/strings.xml delete mode 100644 library/main/res/values-lt/strings.xml delete mode 100644 library/main/res/values-lv/strings.xml delete mode 100644 library/main/res/values-mk/strings.xml delete mode 100644 library/main/res/values-ml/strings.xml delete mode 100644 library/main/res/values-mn/strings.xml delete mode 100644 library/main/res/values-mr/strings.xml delete mode 100644 library/main/res/values-ms/strings.xml delete mode 100644 library/main/res/values-my/strings.xml delete mode 100644 library/main/res/values-nb/strings.xml delete mode 100644 library/main/res/values-ne/strings.xml delete mode 100644 library/main/res/values-nl/strings.xml delete mode 100644 library/main/res/values-pa/strings.xml delete mode 100644 library/main/res/values-pl/strings.xml delete mode 100644 library/main/res/values-pt-rBR/strings.xml delete mode 100644 library/main/res/values-pt-rPT/strings.xml delete mode 100644 library/main/res/values-pt/strings.xml delete mode 100644 library/main/res/values-ro/strings.xml delete mode 100644 library/main/res/values-ru/strings.xml delete mode 100644 library/main/res/values-si/strings.xml delete mode 100644 library/main/res/values-sk/strings.xml delete mode 100644 library/main/res/values-sl/strings.xml delete mode 100644 library/main/res/values-sq/strings.xml delete mode 100644 library/main/res/values-sr/strings.xml delete mode 100644 library/main/res/values-sv/strings.xml delete mode 100644 library/main/res/values-sw/strings.xml delete mode 100644 library/main/res/values-ta/strings.xml delete mode 100644 library/main/res/values-te/strings.xml delete mode 100644 library/main/res/values-th/strings.xml delete mode 100644 library/main/res/values-tl/strings.xml delete mode 100644 library/main/res/values-tr/strings.xml delete mode 100644 library/main/res/values-uk/strings.xml delete mode 100644 library/main/res/values-ur/strings.xml delete mode 100644 library/main/res/values-uz/strings.xml delete mode 100644 library/main/res/values-vi/strings.xml delete mode 100644 library/main/res/values-zh-rCN/strings.xml delete mode 100644 library/main/res/values-zh-rHK/strings.xml delete mode 100644 library/main/res/values-zh-rTW/strings.xml delete mode 100644 library/main/res/values-zu/strings.xml diff --git a/library/main/res/values-af/strings.xml b/library/main/res/values-af/strings.xml deleted file mode 100644 index 27dfb9a..0000000 --- a/library/main/res/values-af/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Volgende" - "Terug" - "Meer" - diff --git a/library/main/res/values-am/strings.xml b/library/main/res/values-am/strings.xml deleted file mode 100644 index b2870e0..0000000 --- a/library/main/res/values-am/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "ቀጣይ" - "ተመለስ" - "ተጨማሪ" - diff --git a/library/main/res/values-ar/strings.xml b/library/main/res/values-ar/strings.xml deleted file mode 100644 index 81877a6..0000000 --- a/library/main/res/values-ar/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "التالي" - "رجوع" - "المزيد" - diff --git a/library/main/res/values-az/strings.xml b/library/main/res/values-az/strings.xml deleted file mode 100644 index 3086528..0000000 --- a/library/main/res/values-az/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Növbəti" - "Geri" - "Daha çox" - diff --git a/library/main/res/values-b+sr+Latn/strings.xml b/library/main/res/values-b+sr+Latn/strings.xml deleted file mode 100644 index 2a0934c..0000000 --- a/library/main/res/values-b+sr+Latn/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Dalje" - "Nazad" - "Još" - diff --git a/library/main/res/values-be/strings.xml b/library/main/res/values-be/strings.xml deleted file mode 100644 index 1753d86..0000000 --- a/library/main/res/values-be/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Далей" - "Назад" - "Яшчэ" - diff --git a/library/main/res/values-bg/strings.xml b/library/main/res/values-bg/strings.xml deleted file mode 100644 index 6580ccd..0000000 --- a/library/main/res/values-bg/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Напред" - "Назад" - "Още" - diff --git a/library/main/res/values-bn/strings.xml b/library/main/res/values-bn/strings.xml deleted file mode 100644 index d807c08..0000000 --- a/library/main/res/values-bn/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "পরবর্তী" - "ফিরুন" - "আরো" - diff --git a/library/main/res/values-bs/strings.xml b/library/main/res/values-bs/strings.xml deleted file mode 100644 index 2490af5..0000000 --- a/library/main/res/values-bs/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Naprijed" - "Nazad" - "Još" - diff --git a/library/main/res/values-ca/strings.xml b/library/main/res/values-ca/strings.xml deleted file mode 100644 index 55fffc3..0000000 --- a/library/main/res/values-ca/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Següent" - "Enrere" - "Més" - diff --git a/library/main/res/values-cs/strings.xml b/library/main/res/values-cs/strings.xml deleted file mode 100644 index ea061b2..0000000 --- a/library/main/res/values-cs/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Další" - "Zpět" - "Další" - diff --git a/library/main/res/values-da/strings.xml b/library/main/res/values-da/strings.xml deleted file mode 100644 index dc0213f..0000000 --- a/library/main/res/values-da/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Næste" - "Tilbage" - "Mere" - diff --git a/library/main/res/values-de/strings.xml b/library/main/res/values-de/strings.xml deleted file mode 100644 index 222b4f0..0000000 --- a/library/main/res/values-de/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Weiter" - "Zurück" - "Mehr" - diff --git a/library/main/res/values-el/strings.xml b/library/main/res/values-el/strings.xml deleted file mode 100644 index 221cb85..0000000 --- a/library/main/res/values-el/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Επόμενο" - "Πίσω" - "Περισσότερα" - diff --git a/library/main/res/values-en-rAU/strings.xml b/library/main/res/values-en-rAU/strings.xml deleted file mode 100644 index 5260500..0000000 --- a/library/main/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Next" - "Back" - "More" - diff --git a/library/main/res/values-en-rGB/strings.xml b/library/main/res/values-en-rGB/strings.xml deleted file mode 100644 index 5260500..0000000 --- a/library/main/res/values-en-rGB/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Next" - "Back" - "More" - diff --git a/library/main/res/values-en-rIN/strings.xml b/library/main/res/values-en-rIN/strings.xml deleted file mode 100644 index 5260500..0000000 --- a/library/main/res/values-en-rIN/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Next" - "Back" - "More" - diff --git a/library/main/res/values-es-rUS/strings.xml b/library/main/res/values-es-rUS/strings.xml deleted file mode 100644 index c86f18c..0000000 --- a/library/main/res/values-es-rUS/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Siguiente" - "Atrás" - "Más" - diff --git a/library/main/res/values-es/strings.xml b/library/main/res/values-es/strings.xml deleted file mode 100644 index c86f18c..0000000 --- a/library/main/res/values-es/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Siguiente" - "Atrás" - "Más" - diff --git a/library/main/res/values-et/strings.xml b/library/main/res/values-et/strings.xml deleted file mode 100644 index 45fa9dc..0000000 --- a/library/main/res/values-et/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Edasi" - "Tagasi" - "Rohkem" - diff --git a/library/main/res/values-eu/strings.xml b/library/main/res/values-eu/strings.xml deleted file mode 100644 index 0e3738e..0000000 --- a/library/main/res/values-eu/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Hurrengoa" - "Atzera" - "Gehiago" - diff --git a/library/main/res/values-fa/strings.xml b/library/main/res/values-fa/strings.xml deleted file mode 100644 index 58fd9ba..0000000 --- a/library/main/res/values-fa/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "بعدی" - "برگشت" - "بیشتر" - diff --git a/library/main/res/values-fi/strings.xml b/library/main/res/values-fi/strings.xml deleted file mode 100644 index 35b4360..0000000 --- a/library/main/res/values-fi/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Seuraava" - "Takaisin" - "Lisää" - diff --git a/library/main/res/values-fr-rCA/strings.xml b/library/main/res/values-fr-rCA/strings.xml deleted file mode 100644 index 9e5badf..0000000 --- a/library/main/res/values-fr-rCA/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Suivant" - "Précédent" - "Plus" - diff --git a/library/main/res/values-fr/strings.xml b/library/main/res/values-fr/strings.xml deleted file mode 100644 index 5c4f2b7..0000000 --- a/library/main/res/values-fr/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Suivant" - "Retour" - "Plus" - diff --git a/library/main/res/values-gl/strings.xml b/library/main/res/values-gl/strings.xml deleted file mode 100644 index 28548a5..0000000 --- a/library/main/res/values-gl/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Seguinte" - "Atrás" - "Máis" - diff --git a/library/main/res/values-gu/strings.xml b/library/main/res/values-gu/strings.xml deleted file mode 100644 index eceb654..0000000 --- a/library/main/res/values-gu/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "આગલું" - "પાછળ" - "વધુ" - diff --git a/library/main/res/values-hi/strings.xml b/library/main/res/values-hi/strings.xml deleted file mode 100644 index d30fbb4..0000000 --- a/library/main/res/values-hi/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "आगे" - "पीछे" - "अधिक" - diff --git a/library/main/res/values-hr/strings.xml b/library/main/res/values-hr/strings.xml deleted file mode 100644 index 2ea5d79..0000000 --- a/library/main/res/values-hr/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Dalje" - "Natrag" - "Više" - diff --git a/library/main/res/values-hu/strings.xml b/library/main/res/values-hu/strings.xml deleted file mode 100644 index dae7516..0000000 --- a/library/main/res/values-hu/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Következő" - "Vissza" - "Továbbiak" - diff --git a/library/main/res/values-hy/strings.xml b/library/main/res/values-hy/strings.xml deleted file mode 100644 index 68083dd..0000000 --- a/library/main/res/values-hy/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Առաջ" - "Հետ" - "Ավելին" - diff --git a/library/main/res/values-in/strings.xml b/library/main/res/values-in/strings.xml deleted file mode 100644 index e58bb0d..0000000 --- a/library/main/res/values-in/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Berikutnya" - "Kembali" - "Lainnya" - diff --git a/library/main/res/values-is/strings.xml b/library/main/res/values-is/strings.xml deleted file mode 100644 index 13b3d30..0000000 --- a/library/main/res/values-is/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Áfram" - "Til baka" - "Meira" - diff --git a/library/main/res/values-it/strings.xml b/library/main/res/values-it/strings.xml deleted file mode 100644 index a787895..0000000 --- a/library/main/res/values-it/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Avanti" - "Indietro" - "Altro" - diff --git a/library/main/res/values-iw/strings.xml b/library/main/res/values-iw/strings.xml deleted file mode 100644 index 856cff8..0000000 --- a/library/main/res/values-iw/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "הבא" - "חזרה" - "עוד" - diff --git a/library/main/res/values-ja/strings.xml b/library/main/res/values-ja/strings.xml deleted file mode 100644 index b21b8d3..0000000 --- a/library/main/res/values-ja/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "次へ" - "戻る" - "もっと見る" - diff --git a/library/main/res/values-ka/strings.xml b/library/main/res/values-ka/strings.xml deleted file mode 100644 index e90c485..0000000 --- a/library/main/res/values-ka/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "შემდეგი" - "უკან" - "დამატებით" - diff --git a/library/main/res/values-kk/strings.xml b/library/main/res/values-kk/strings.xml deleted file mode 100644 index d3c6fa4..0000000 --- a/library/main/res/values-kk/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Келесі" - "Артқа" - "Тағы" - diff --git a/library/main/res/values-km/strings.xml b/library/main/res/values-km/strings.xml deleted file mode 100644 index 7bf81a2..0000000 --- a/library/main/res/values-km/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "បន្ទាប់" - "ថយក្រោយ" - "ច្រើនទៀត" - diff --git a/library/main/res/values-kn/strings.xml b/library/main/res/values-kn/strings.xml deleted file mode 100644 index 0e609bb..0000000 --- a/library/main/res/values-kn/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "ಮುಂದೆ" - "ಹಿಂದೆ" - "ಇನ್ನಷ್ಟು" - diff --git a/library/main/res/values-ko/strings.xml b/library/main/res/values-ko/strings.xml deleted file mode 100644 index e55c0d7..0000000 --- a/library/main/res/values-ko/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "다음" - "뒤로" - "더보기" - diff --git a/library/main/res/values-ky/strings.xml b/library/main/res/values-ky/strings.xml deleted file mode 100644 index c3b3a4c..0000000 --- a/library/main/res/values-ky/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Кийинки" - "Артка" - "Дагы" - diff --git a/library/main/res/values-lo/strings.xml b/library/main/res/values-lo/strings.xml deleted file mode 100644 index 568b7a5..0000000 --- a/library/main/res/values-lo/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "ຕໍ່​ໄປ" - "ກັບຄືນ" - "ເພີ່ມເຕີມ" - diff --git a/library/main/res/values-lt/strings.xml b/library/main/res/values-lt/strings.xml deleted file mode 100644 index db46bd5..0000000 --- a/library/main/res/values-lt/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Kitas" - "Atgal" - "Daugiau" - diff --git a/library/main/res/values-lv/strings.xml b/library/main/res/values-lv/strings.xml deleted file mode 100644 index dee7589..0000000 --- a/library/main/res/values-lv/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Tālāk" - "Atpakaļ" - "Vairāk" - diff --git a/library/main/res/values-mk/strings.xml b/library/main/res/values-mk/strings.xml deleted file mode 100644 index 30ee8f2..0000000 --- a/library/main/res/values-mk/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Следно" - "Назад" - "Повеќе" - diff --git a/library/main/res/values-ml/strings.xml b/library/main/res/values-ml/strings.xml deleted file mode 100644 index 394c894..0000000 --- a/library/main/res/values-ml/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "അടുത്തത്" - "മടങ്ങുക" - "കൂടുതൽ" - diff --git a/library/main/res/values-mn/strings.xml b/library/main/res/values-mn/strings.xml deleted file mode 100644 index 18a6e27..0000000 --- a/library/main/res/values-mn/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Дараах" - "Буцах" - "Илүү" - diff --git a/library/main/res/values-mr/strings.xml b/library/main/res/values-mr/strings.xml deleted file mode 100644 index bb9980e..0000000 --- a/library/main/res/values-mr/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "पुढील" - "परत" - "अधिक" - diff --git a/library/main/res/values-ms/strings.xml b/library/main/res/values-ms/strings.xml deleted file mode 100644 index 04b8c6f..0000000 --- a/library/main/res/values-ms/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Seterusnya" - "Kembali" - "Lagi" - diff --git a/library/main/res/values-my/strings.xml b/library/main/res/values-my/strings.xml deleted file mode 100644 index 4bdcd11..0000000 --- a/library/main/res/values-my/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "ရှေ့သို့" - "နောက်သို့" - "နောက်ထပ်" - diff --git a/library/main/res/values-nb/strings.xml b/library/main/res/values-nb/strings.xml deleted file mode 100644 index bc856e3..0000000 --- a/library/main/res/values-nb/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Neste" - "Tilbake" - "Mer" - diff --git a/library/main/res/values-ne/strings.xml b/library/main/res/values-ne/strings.xml deleted file mode 100644 index c46b118..0000000 --- a/library/main/res/values-ne/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "अर्को" - "पछाडि जानुहोस्" - "थप" - diff --git a/library/main/res/values-nl/strings.xml b/library/main/res/values-nl/strings.xml deleted file mode 100644 index 27dfb9a..0000000 --- a/library/main/res/values-nl/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Volgende" - "Terug" - "Meer" - diff --git a/library/main/res/values-pa/strings.xml b/library/main/res/values-pa/strings.xml deleted file mode 100644 index 742020c..0000000 --- a/library/main/res/values-pa/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "ਅੱਗੇ" - "ਪਿੱਛੇ" - "ਹੋਰ" - diff --git a/library/main/res/values-pl/strings.xml b/library/main/res/values-pl/strings.xml deleted file mode 100644 index f4e7e81..0000000 --- a/library/main/res/values-pl/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Dalej" - "Wstecz" - "Więcej" - diff --git a/library/main/res/values-pt-rBR/strings.xml b/library/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index 79d86e2..0000000 --- a/library/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Próxima" - "Voltar" - "Mais" - diff --git a/library/main/res/values-pt-rPT/strings.xml b/library/main/res/values-pt-rPT/strings.xml deleted file mode 100644 index b9c95a1..0000000 --- a/library/main/res/values-pt-rPT/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Seguinte" - "Anterior" - "Mais" - diff --git a/library/main/res/values-pt/strings.xml b/library/main/res/values-pt/strings.xml deleted file mode 100644 index 79d86e2..0000000 --- a/library/main/res/values-pt/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Próxima" - "Voltar" - "Mais" - diff --git a/library/main/res/values-ro/strings.xml b/library/main/res/values-ro/strings.xml deleted file mode 100644 index 7e643a7..0000000 --- a/library/main/res/values-ro/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Înainte" - "Înapoi" - "Mai mult" - diff --git a/library/main/res/values-ru/strings.xml b/library/main/res/values-ru/strings.xml deleted file mode 100644 index fcfbc3d..0000000 --- a/library/main/res/values-ru/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Далее" - "Назад" - "Ещё" - diff --git a/library/main/res/values-si/strings.xml b/library/main/res/values-si/strings.xml deleted file mode 100644 index f79c169..0000000 --- a/library/main/res/values-si/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "ඊළඟ" - "ආපසු" - "තවත්" - diff --git a/library/main/res/values-sk/strings.xml b/library/main/res/values-sk/strings.xml deleted file mode 100644 index 30fe40a..0000000 --- a/library/main/res/values-sk/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Ďalej" - "Späť" - "Viac" - diff --git a/library/main/res/values-sl/strings.xml b/library/main/res/values-sl/strings.xml deleted file mode 100644 index 0aa330d..0000000 --- a/library/main/res/values-sl/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Naprej" - "Nazaj" - "Več" - diff --git a/library/main/res/values-sq/strings.xml b/library/main/res/values-sq/strings.xml deleted file mode 100644 index c30f08d..0000000 --- a/library/main/res/values-sq/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Përpara" - "Prapa" - "Më shumë" - diff --git a/library/main/res/values-sr/strings.xml b/library/main/res/values-sr/strings.xml deleted file mode 100644 index 20be271..0000000 --- a/library/main/res/values-sr/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Даље" - "Назад" - "Још" - diff --git a/library/main/res/values-sv/strings.xml b/library/main/res/values-sv/strings.xml deleted file mode 100644 index 2d66a8d..0000000 --- a/library/main/res/values-sv/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Nästa" - "Tillbaka" - "Mer" - diff --git a/library/main/res/values-sw/strings.xml b/library/main/res/values-sw/strings.xml deleted file mode 100644 index 8191ab8..0000000 --- a/library/main/res/values-sw/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Endelea" - "Rudi nyuma" - "Zaidi" - diff --git a/library/main/res/values-ta/strings.xml b/library/main/res/values-ta/strings.xml deleted file mode 100644 index 59a6098..0000000 --- a/library/main/res/values-ta/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "அடுத்து" - "முந்தையது" - "மேலும்" - diff --git a/library/main/res/values-te/strings.xml b/library/main/res/values-te/strings.xml deleted file mode 100644 index 4209a3c..0000000 --- a/library/main/res/values-te/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "తదుపరి" - "వెనుకకు" - "మరింత" - diff --git a/library/main/res/values-th/strings.xml b/library/main/res/values-th/strings.xml deleted file mode 100644 index 0ea98d6..0000000 --- a/library/main/res/values-th/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "ถัดไป" - "กลับ" - "เพิ่มเติม" - diff --git a/library/main/res/values-tl/strings.xml b/library/main/res/values-tl/strings.xml deleted file mode 100644 index dc85cb8..0000000 --- a/library/main/res/values-tl/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Susunod" - "Bumalik" - "Higit pa" - diff --git a/library/main/res/values-tr/strings.xml b/library/main/res/values-tr/strings.xml deleted file mode 100644 index 8e14f51..0000000 --- a/library/main/res/values-tr/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "İleri" - "Geri" - "Diğer" - diff --git a/library/main/res/values-uk/strings.xml b/library/main/res/values-uk/strings.xml deleted file mode 100644 index 7777cd5..0000000 --- a/library/main/res/values-uk/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Далі" - "Назад" - "Більше" - diff --git a/library/main/res/values-ur/strings.xml b/library/main/res/values-ur/strings.xml deleted file mode 100644 index e4e8fc4..0000000 --- a/library/main/res/values-ur/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "آگے" - "پیچھے" - "مزید" - diff --git a/library/main/res/values-uz/strings.xml b/library/main/res/values-uz/strings.xml deleted file mode 100644 index dfc9014..0000000 --- a/library/main/res/values-uz/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Keyingisi" - "Orqaga" - "Yana" - diff --git a/library/main/res/values-vi/strings.xml b/library/main/res/values-vi/strings.xml deleted file mode 100644 index 40fb5ab..0000000 --- a/library/main/res/values-vi/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Tiếp theo" - "Quay lại" - "Khác" - diff --git a/library/main/res/values-zh-rCN/strings.xml b/library/main/res/values-zh-rCN/strings.xml deleted file mode 100644 index 1ba83ed..0000000 --- a/library/main/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "下一步" - "返回" - "更多" - diff --git a/library/main/res/values-zh-rHK/strings.xml b/library/main/res/values-zh-rHK/strings.xml deleted file mode 100644 index 1ba83ed..0000000 --- a/library/main/res/values-zh-rHK/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "下一步" - "返回" - "更多" - diff --git a/library/main/res/values-zh-rTW/strings.xml b/library/main/res/values-zh-rTW/strings.xml deleted file mode 100644 index 9115698..0000000 --- a/library/main/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "繼續" - "返回" - "更多" - diff --git a/library/main/res/values-zu/strings.xml b/library/main/res/values-zu/strings.xml deleted file mode 100644 index 93e30c2..0000000 --- a/library/main/res/values-zu/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - "Okulandelayo" - "Emuva" - "Okuningi" - From 321851f6ffaf9af8c26d934689675a55b4c43257 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 25 Jul 2017 23:47:13 +0000 Subject: [PATCH 02/75] Revert "Import translations. DO NOT MERGE" This reverts commit 6042ea8d3f0c789e61b8530a815f0da253996d17. Change-Id: I22b5dbda88c93cd028745fc4e9582150cec8def8 --- library/main/res/values-af/strings.xml | 23 +++++++++++++++++++ library/main/res/values-am/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ar/strings.xml | 23 +++++++++++++++++++ library/main/res/values-az/strings.xml | 23 +++++++++++++++++++ library/main/res/values-b+sr+Latn/strings.xml | 23 +++++++++++++++++++ library/main/res/values-be/strings.xml | 23 +++++++++++++++++++ library/main/res/values-bg/strings.xml | 23 +++++++++++++++++++ library/main/res/values-bn/strings.xml | 23 +++++++++++++++++++ library/main/res/values-bs/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ca/strings.xml | 23 +++++++++++++++++++ library/main/res/values-cs/strings.xml | 23 +++++++++++++++++++ library/main/res/values-da/strings.xml | 23 +++++++++++++++++++ library/main/res/values-de/strings.xml | 23 +++++++++++++++++++ library/main/res/values-el/strings.xml | 23 +++++++++++++++++++ library/main/res/values-en-rAU/strings.xml | 23 +++++++++++++++++++ library/main/res/values-en-rGB/strings.xml | 23 +++++++++++++++++++ library/main/res/values-en-rIN/strings.xml | 23 +++++++++++++++++++ library/main/res/values-es-rUS/strings.xml | 23 +++++++++++++++++++ library/main/res/values-es/strings.xml | 23 +++++++++++++++++++ library/main/res/values-et/strings.xml | 23 +++++++++++++++++++ library/main/res/values-eu/strings.xml | 23 +++++++++++++++++++ library/main/res/values-fa/strings.xml | 23 +++++++++++++++++++ library/main/res/values-fi/strings.xml | 23 +++++++++++++++++++ library/main/res/values-fr-rCA/strings.xml | 23 +++++++++++++++++++ library/main/res/values-fr/strings.xml | 23 +++++++++++++++++++ library/main/res/values-gl/strings.xml | 23 +++++++++++++++++++ library/main/res/values-gu/strings.xml | 23 +++++++++++++++++++ library/main/res/values-hi/strings.xml | 23 +++++++++++++++++++ library/main/res/values-hr/strings.xml | 23 +++++++++++++++++++ library/main/res/values-hu/strings.xml | 23 +++++++++++++++++++ library/main/res/values-hy/strings.xml | 23 +++++++++++++++++++ library/main/res/values-in/strings.xml | 23 +++++++++++++++++++ library/main/res/values-is/strings.xml | 23 +++++++++++++++++++ library/main/res/values-it/strings.xml | 23 +++++++++++++++++++ library/main/res/values-iw/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ja/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ka/strings.xml | 23 +++++++++++++++++++ library/main/res/values-kk/strings.xml | 23 +++++++++++++++++++ library/main/res/values-km/strings.xml | 23 +++++++++++++++++++ library/main/res/values-kn/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ko/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ky/strings.xml | 23 +++++++++++++++++++ library/main/res/values-lo/strings.xml | 23 +++++++++++++++++++ library/main/res/values-lt/strings.xml | 23 +++++++++++++++++++ library/main/res/values-lv/strings.xml | 23 +++++++++++++++++++ library/main/res/values-mk/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ml/strings.xml | 23 +++++++++++++++++++ library/main/res/values-mn/strings.xml | 23 +++++++++++++++++++ library/main/res/values-mr/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ms/strings.xml | 23 +++++++++++++++++++ library/main/res/values-my/strings.xml | 23 +++++++++++++++++++ library/main/res/values-nb/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ne/strings.xml | 23 +++++++++++++++++++ library/main/res/values-nl/strings.xml | 23 +++++++++++++++++++ library/main/res/values-pa/strings.xml | 23 +++++++++++++++++++ library/main/res/values-pl/strings.xml | 23 +++++++++++++++++++ library/main/res/values-pt-rBR/strings.xml | 23 +++++++++++++++++++ library/main/res/values-pt-rPT/strings.xml | 23 +++++++++++++++++++ library/main/res/values-pt/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ro/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ru/strings.xml | 23 +++++++++++++++++++ library/main/res/values-si/strings.xml | 23 +++++++++++++++++++ library/main/res/values-sk/strings.xml | 23 +++++++++++++++++++ library/main/res/values-sl/strings.xml | 23 +++++++++++++++++++ library/main/res/values-sq/strings.xml | 23 +++++++++++++++++++ library/main/res/values-sr/strings.xml | 23 +++++++++++++++++++ library/main/res/values-sv/strings.xml | 23 +++++++++++++++++++ library/main/res/values-sw/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ta/strings.xml | 23 +++++++++++++++++++ library/main/res/values-te/strings.xml | 23 +++++++++++++++++++ library/main/res/values-th/strings.xml | 23 +++++++++++++++++++ library/main/res/values-tl/strings.xml | 23 +++++++++++++++++++ library/main/res/values-tr/strings.xml | 23 +++++++++++++++++++ library/main/res/values-uk/strings.xml | 23 +++++++++++++++++++ library/main/res/values-ur/strings.xml | 23 +++++++++++++++++++ library/main/res/values-uz/strings.xml | 23 +++++++++++++++++++ library/main/res/values-vi/strings.xml | 23 +++++++++++++++++++ library/main/res/values-zh-rCN/strings.xml | 23 +++++++++++++++++++ library/main/res/values-zh-rHK/strings.xml | 23 +++++++++++++++++++ library/main/res/values-zh-rTW/strings.xml | 23 +++++++++++++++++++ library/main/res/values-zu/strings.xml | 23 +++++++++++++++++++ 81 files changed, 1863 insertions(+) create mode 100644 library/main/res/values-af/strings.xml create mode 100644 library/main/res/values-am/strings.xml create mode 100644 library/main/res/values-ar/strings.xml create mode 100644 library/main/res/values-az/strings.xml create mode 100644 library/main/res/values-b+sr+Latn/strings.xml create mode 100644 library/main/res/values-be/strings.xml create mode 100644 library/main/res/values-bg/strings.xml create mode 100644 library/main/res/values-bn/strings.xml create mode 100644 library/main/res/values-bs/strings.xml create mode 100644 library/main/res/values-ca/strings.xml create mode 100644 library/main/res/values-cs/strings.xml create mode 100644 library/main/res/values-da/strings.xml create mode 100644 library/main/res/values-de/strings.xml create mode 100644 library/main/res/values-el/strings.xml create mode 100644 library/main/res/values-en-rAU/strings.xml create mode 100644 library/main/res/values-en-rGB/strings.xml create mode 100644 library/main/res/values-en-rIN/strings.xml create mode 100644 library/main/res/values-es-rUS/strings.xml create mode 100644 library/main/res/values-es/strings.xml create mode 100644 library/main/res/values-et/strings.xml create mode 100644 library/main/res/values-eu/strings.xml create mode 100644 library/main/res/values-fa/strings.xml create mode 100644 library/main/res/values-fi/strings.xml create mode 100644 library/main/res/values-fr-rCA/strings.xml create mode 100644 library/main/res/values-fr/strings.xml create mode 100644 library/main/res/values-gl/strings.xml create mode 100644 library/main/res/values-gu/strings.xml create mode 100644 library/main/res/values-hi/strings.xml create mode 100644 library/main/res/values-hr/strings.xml create mode 100644 library/main/res/values-hu/strings.xml create mode 100644 library/main/res/values-hy/strings.xml create mode 100644 library/main/res/values-in/strings.xml create mode 100644 library/main/res/values-is/strings.xml create mode 100644 library/main/res/values-it/strings.xml create mode 100644 library/main/res/values-iw/strings.xml create mode 100644 library/main/res/values-ja/strings.xml create mode 100644 library/main/res/values-ka/strings.xml create mode 100644 library/main/res/values-kk/strings.xml create mode 100644 library/main/res/values-km/strings.xml create mode 100644 library/main/res/values-kn/strings.xml create mode 100644 library/main/res/values-ko/strings.xml create mode 100644 library/main/res/values-ky/strings.xml create mode 100644 library/main/res/values-lo/strings.xml create mode 100644 library/main/res/values-lt/strings.xml create mode 100644 library/main/res/values-lv/strings.xml create mode 100644 library/main/res/values-mk/strings.xml create mode 100644 library/main/res/values-ml/strings.xml create mode 100644 library/main/res/values-mn/strings.xml create mode 100644 library/main/res/values-mr/strings.xml create mode 100644 library/main/res/values-ms/strings.xml create mode 100644 library/main/res/values-my/strings.xml create mode 100644 library/main/res/values-nb/strings.xml create mode 100644 library/main/res/values-ne/strings.xml create mode 100644 library/main/res/values-nl/strings.xml create mode 100644 library/main/res/values-pa/strings.xml create mode 100644 library/main/res/values-pl/strings.xml create mode 100644 library/main/res/values-pt-rBR/strings.xml create mode 100644 library/main/res/values-pt-rPT/strings.xml create mode 100644 library/main/res/values-pt/strings.xml create mode 100644 library/main/res/values-ro/strings.xml create mode 100644 library/main/res/values-ru/strings.xml create mode 100644 library/main/res/values-si/strings.xml create mode 100644 library/main/res/values-sk/strings.xml create mode 100644 library/main/res/values-sl/strings.xml create mode 100644 library/main/res/values-sq/strings.xml create mode 100644 library/main/res/values-sr/strings.xml create mode 100644 library/main/res/values-sv/strings.xml create mode 100644 library/main/res/values-sw/strings.xml create mode 100644 library/main/res/values-ta/strings.xml create mode 100644 library/main/res/values-te/strings.xml create mode 100644 library/main/res/values-th/strings.xml create mode 100644 library/main/res/values-tl/strings.xml create mode 100644 library/main/res/values-tr/strings.xml create mode 100644 library/main/res/values-uk/strings.xml create mode 100644 library/main/res/values-ur/strings.xml create mode 100644 library/main/res/values-uz/strings.xml create mode 100644 library/main/res/values-vi/strings.xml create mode 100644 library/main/res/values-zh-rCN/strings.xml create mode 100644 library/main/res/values-zh-rHK/strings.xml create mode 100644 library/main/res/values-zh-rTW/strings.xml create mode 100644 library/main/res/values-zu/strings.xml diff --git a/library/main/res/values-af/strings.xml b/library/main/res/values-af/strings.xml new file mode 100644 index 0000000..27dfb9a --- /dev/null +++ b/library/main/res/values-af/strings.xml @@ -0,0 +1,23 @@ + + + + + "Volgende" + "Terug" + "Meer" + diff --git a/library/main/res/values-am/strings.xml b/library/main/res/values-am/strings.xml new file mode 100644 index 0000000..b2870e0 --- /dev/null +++ b/library/main/res/values-am/strings.xml @@ -0,0 +1,23 @@ + + + + + "ቀጣይ" + "ተመለስ" + "ተጨማሪ" + diff --git a/library/main/res/values-ar/strings.xml b/library/main/res/values-ar/strings.xml new file mode 100644 index 0000000..81877a6 --- /dev/null +++ b/library/main/res/values-ar/strings.xml @@ -0,0 +1,23 @@ + + + + + "التالي" + "رجوع" + "المزيد" + diff --git a/library/main/res/values-az/strings.xml b/library/main/res/values-az/strings.xml new file mode 100644 index 0000000..3086528 --- /dev/null +++ b/library/main/res/values-az/strings.xml @@ -0,0 +1,23 @@ + + + + + "Növbəti" + "Geri" + "Daha çox" + diff --git a/library/main/res/values-b+sr+Latn/strings.xml b/library/main/res/values-b+sr+Latn/strings.xml new file mode 100644 index 0000000..2a0934c --- /dev/null +++ b/library/main/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,23 @@ + + + + + "Dalje" + "Nazad" + "Još" + diff --git a/library/main/res/values-be/strings.xml b/library/main/res/values-be/strings.xml new file mode 100644 index 0000000..1753d86 --- /dev/null +++ b/library/main/res/values-be/strings.xml @@ -0,0 +1,23 @@ + + + + + "Далей" + "Назад" + "Яшчэ" + diff --git a/library/main/res/values-bg/strings.xml b/library/main/res/values-bg/strings.xml new file mode 100644 index 0000000..6580ccd --- /dev/null +++ b/library/main/res/values-bg/strings.xml @@ -0,0 +1,23 @@ + + + + + "Напред" + "Назад" + "Още" + diff --git a/library/main/res/values-bn/strings.xml b/library/main/res/values-bn/strings.xml new file mode 100644 index 0000000..d807c08 --- /dev/null +++ b/library/main/res/values-bn/strings.xml @@ -0,0 +1,23 @@ + + + + + "পরবর্তী" + "ফিরুন" + "আরো" + diff --git a/library/main/res/values-bs/strings.xml b/library/main/res/values-bs/strings.xml new file mode 100644 index 0000000..2490af5 --- /dev/null +++ b/library/main/res/values-bs/strings.xml @@ -0,0 +1,23 @@ + + + + + "Naprijed" + "Nazad" + "Još" + diff --git a/library/main/res/values-ca/strings.xml b/library/main/res/values-ca/strings.xml new file mode 100644 index 0000000..55fffc3 --- /dev/null +++ b/library/main/res/values-ca/strings.xml @@ -0,0 +1,23 @@ + + + + + "Següent" + "Enrere" + "Més" + diff --git a/library/main/res/values-cs/strings.xml b/library/main/res/values-cs/strings.xml new file mode 100644 index 0000000..ea061b2 --- /dev/null +++ b/library/main/res/values-cs/strings.xml @@ -0,0 +1,23 @@ + + + + + "Další" + "Zpět" + "Další" + diff --git a/library/main/res/values-da/strings.xml b/library/main/res/values-da/strings.xml new file mode 100644 index 0000000..dc0213f --- /dev/null +++ b/library/main/res/values-da/strings.xml @@ -0,0 +1,23 @@ + + + + + "Næste" + "Tilbage" + "Mere" + diff --git a/library/main/res/values-de/strings.xml b/library/main/res/values-de/strings.xml new file mode 100644 index 0000000..222b4f0 --- /dev/null +++ b/library/main/res/values-de/strings.xml @@ -0,0 +1,23 @@ + + + + + "Weiter" + "Zurück" + "Mehr" + diff --git a/library/main/res/values-el/strings.xml b/library/main/res/values-el/strings.xml new file mode 100644 index 0000000..221cb85 --- /dev/null +++ b/library/main/res/values-el/strings.xml @@ -0,0 +1,23 @@ + + + + + "Επόμενο" + "Πίσω" + "Περισσότερα" + diff --git a/library/main/res/values-en-rAU/strings.xml b/library/main/res/values-en-rAU/strings.xml new file mode 100644 index 0000000..5260500 --- /dev/null +++ b/library/main/res/values-en-rAU/strings.xml @@ -0,0 +1,23 @@ + + + + + "Next" + "Back" + "More" + diff --git a/library/main/res/values-en-rGB/strings.xml b/library/main/res/values-en-rGB/strings.xml new file mode 100644 index 0000000..5260500 --- /dev/null +++ b/library/main/res/values-en-rGB/strings.xml @@ -0,0 +1,23 @@ + + + + + "Next" + "Back" + "More" + diff --git a/library/main/res/values-en-rIN/strings.xml b/library/main/res/values-en-rIN/strings.xml new file mode 100644 index 0000000..5260500 --- /dev/null +++ b/library/main/res/values-en-rIN/strings.xml @@ -0,0 +1,23 @@ + + + + + "Next" + "Back" + "More" + diff --git a/library/main/res/values-es-rUS/strings.xml b/library/main/res/values-es-rUS/strings.xml new file mode 100644 index 0000000..c86f18c --- /dev/null +++ b/library/main/res/values-es-rUS/strings.xml @@ -0,0 +1,23 @@ + + + + + "Siguiente" + "Atrás" + "Más" + diff --git a/library/main/res/values-es/strings.xml b/library/main/res/values-es/strings.xml new file mode 100644 index 0000000..c86f18c --- /dev/null +++ b/library/main/res/values-es/strings.xml @@ -0,0 +1,23 @@ + + + + + "Siguiente" + "Atrás" + "Más" + diff --git a/library/main/res/values-et/strings.xml b/library/main/res/values-et/strings.xml new file mode 100644 index 0000000..45fa9dc --- /dev/null +++ b/library/main/res/values-et/strings.xml @@ -0,0 +1,23 @@ + + + + + "Edasi" + "Tagasi" + "Rohkem" + diff --git a/library/main/res/values-eu/strings.xml b/library/main/res/values-eu/strings.xml new file mode 100644 index 0000000..0e3738e --- /dev/null +++ b/library/main/res/values-eu/strings.xml @@ -0,0 +1,23 @@ + + + + + "Hurrengoa" + "Atzera" + "Gehiago" + diff --git a/library/main/res/values-fa/strings.xml b/library/main/res/values-fa/strings.xml new file mode 100644 index 0000000..58fd9ba --- /dev/null +++ b/library/main/res/values-fa/strings.xml @@ -0,0 +1,23 @@ + + + + + "بعدی" + "برگشت" + "بیشتر" + diff --git a/library/main/res/values-fi/strings.xml b/library/main/res/values-fi/strings.xml new file mode 100644 index 0000000..35b4360 --- /dev/null +++ b/library/main/res/values-fi/strings.xml @@ -0,0 +1,23 @@ + + + + + "Seuraava" + "Takaisin" + "Lisää" + diff --git a/library/main/res/values-fr-rCA/strings.xml b/library/main/res/values-fr-rCA/strings.xml new file mode 100644 index 0000000..9e5badf --- /dev/null +++ b/library/main/res/values-fr-rCA/strings.xml @@ -0,0 +1,23 @@ + + + + + "Suivant" + "Précédent" + "Plus" + diff --git a/library/main/res/values-fr/strings.xml b/library/main/res/values-fr/strings.xml new file mode 100644 index 0000000..5c4f2b7 --- /dev/null +++ b/library/main/res/values-fr/strings.xml @@ -0,0 +1,23 @@ + + + + + "Suivant" + "Retour" + "Plus" + diff --git a/library/main/res/values-gl/strings.xml b/library/main/res/values-gl/strings.xml new file mode 100644 index 0000000..28548a5 --- /dev/null +++ b/library/main/res/values-gl/strings.xml @@ -0,0 +1,23 @@ + + + + + "Seguinte" + "Atrás" + "Máis" + diff --git a/library/main/res/values-gu/strings.xml b/library/main/res/values-gu/strings.xml new file mode 100644 index 0000000..eceb654 --- /dev/null +++ b/library/main/res/values-gu/strings.xml @@ -0,0 +1,23 @@ + + + + + "આગલું" + "પાછળ" + "વધુ" + diff --git a/library/main/res/values-hi/strings.xml b/library/main/res/values-hi/strings.xml new file mode 100644 index 0000000..d30fbb4 --- /dev/null +++ b/library/main/res/values-hi/strings.xml @@ -0,0 +1,23 @@ + + + + + "आगे" + "पीछे" + "अधिक" + diff --git a/library/main/res/values-hr/strings.xml b/library/main/res/values-hr/strings.xml new file mode 100644 index 0000000..2ea5d79 --- /dev/null +++ b/library/main/res/values-hr/strings.xml @@ -0,0 +1,23 @@ + + + + + "Dalje" + "Natrag" + "Više" + diff --git a/library/main/res/values-hu/strings.xml b/library/main/res/values-hu/strings.xml new file mode 100644 index 0000000..dae7516 --- /dev/null +++ b/library/main/res/values-hu/strings.xml @@ -0,0 +1,23 @@ + + + + + "Következő" + "Vissza" + "Továbbiak" + diff --git a/library/main/res/values-hy/strings.xml b/library/main/res/values-hy/strings.xml new file mode 100644 index 0000000..68083dd --- /dev/null +++ b/library/main/res/values-hy/strings.xml @@ -0,0 +1,23 @@ + + + + + "Առաջ" + "Հետ" + "Ավելին" + diff --git a/library/main/res/values-in/strings.xml b/library/main/res/values-in/strings.xml new file mode 100644 index 0000000..e58bb0d --- /dev/null +++ b/library/main/res/values-in/strings.xml @@ -0,0 +1,23 @@ + + + + + "Berikutnya" + "Kembali" + "Lainnya" + diff --git a/library/main/res/values-is/strings.xml b/library/main/res/values-is/strings.xml new file mode 100644 index 0000000..13b3d30 --- /dev/null +++ b/library/main/res/values-is/strings.xml @@ -0,0 +1,23 @@ + + + + + "Áfram" + "Til baka" + "Meira" + diff --git a/library/main/res/values-it/strings.xml b/library/main/res/values-it/strings.xml new file mode 100644 index 0000000..a787895 --- /dev/null +++ b/library/main/res/values-it/strings.xml @@ -0,0 +1,23 @@ + + + + + "Avanti" + "Indietro" + "Altro" + diff --git a/library/main/res/values-iw/strings.xml b/library/main/res/values-iw/strings.xml new file mode 100644 index 0000000..856cff8 --- /dev/null +++ b/library/main/res/values-iw/strings.xml @@ -0,0 +1,23 @@ + + + + + "הבא" + "חזרה" + "עוד" + diff --git a/library/main/res/values-ja/strings.xml b/library/main/res/values-ja/strings.xml new file mode 100644 index 0000000..b21b8d3 --- /dev/null +++ b/library/main/res/values-ja/strings.xml @@ -0,0 +1,23 @@ + + + + + "次へ" + "戻る" + "もっと見る" + diff --git a/library/main/res/values-ka/strings.xml b/library/main/res/values-ka/strings.xml new file mode 100644 index 0000000..e90c485 --- /dev/null +++ b/library/main/res/values-ka/strings.xml @@ -0,0 +1,23 @@ + + + + + "შემდეგი" + "უკან" + "დამატებით" + diff --git a/library/main/res/values-kk/strings.xml b/library/main/res/values-kk/strings.xml new file mode 100644 index 0000000..d3c6fa4 --- /dev/null +++ b/library/main/res/values-kk/strings.xml @@ -0,0 +1,23 @@ + + + + + "Келесі" + "Артқа" + "Тағы" + diff --git a/library/main/res/values-km/strings.xml b/library/main/res/values-km/strings.xml new file mode 100644 index 0000000..7bf81a2 --- /dev/null +++ b/library/main/res/values-km/strings.xml @@ -0,0 +1,23 @@ + + + + + "បន្ទាប់" + "ថយក្រោយ" + "ច្រើនទៀត" + diff --git a/library/main/res/values-kn/strings.xml b/library/main/res/values-kn/strings.xml new file mode 100644 index 0000000..0e609bb --- /dev/null +++ b/library/main/res/values-kn/strings.xml @@ -0,0 +1,23 @@ + + + + + "ಮುಂದೆ" + "ಹಿಂದೆ" + "ಇನ್ನಷ್ಟು" + diff --git a/library/main/res/values-ko/strings.xml b/library/main/res/values-ko/strings.xml new file mode 100644 index 0000000..e55c0d7 --- /dev/null +++ b/library/main/res/values-ko/strings.xml @@ -0,0 +1,23 @@ + + + + + "다음" + "뒤로" + "더보기" + diff --git a/library/main/res/values-ky/strings.xml b/library/main/res/values-ky/strings.xml new file mode 100644 index 0000000..c3b3a4c --- /dev/null +++ b/library/main/res/values-ky/strings.xml @@ -0,0 +1,23 @@ + + + + + "Кийинки" + "Артка" + "Дагы" + diff --git a/library/main/res/values-lo/strings.xml b/library/main/res/values-lo/strings.xml new file mode 100644 index 0000000..568b7a5 --- /dev/null +++ b/library/main/res/values-lo/strings.xml @@ -0,0 +1,23 @@ + + + + + "ຕໍ່​ໄປ" + "ກັບຄືນ" + "ເພີ່ມເຕີມ" + diff --git a/library/main/res/values-lt/strings.xml b/library/main/res/values-lt/strings.xml new file mode 100644 index 0000000..db46bd5 --- /dev/null +++ b/library/main/res/values-lt/strings.xml @@ -0,0 +1,23 @@ + + + + + "Kitas" + "Atgal" + "Daugiau" + diff --git a/library/main/res/values-lv/strings.xml b/library/main/res/values-lv/strings.xml new file mode 100644 index 0000000..dee7589 --- /dev/null +++ b/library/main/res/values-lv/strings.xml @@ -0,0 +1,23 @@ + + + + + "Tālāk" + "Atpakaļ" + "Vairāk" + diff --git a/library/main/res/values-mk/strings.xml b/library/main/res/values-mk/strings.xml new file mode 100644 index 0000000..30ee8f2 --- /dev/null +++ b/library/main/res/values-mk/strings.xml @@ -0,0 +1,23 @@ + + + + + "Следно" + "Назад" + "Повеќе" + diff --git a/library/main/res/values-ml/strings.xml b/library/main/res/values-ml/strings.xml new file mode 100644 index 0000000..394c894 --- /dev/null +++ b/library/main/res/values-ml/strings.xml @@ -0,0 +1,23 @@ + + + + + "അടുത്തത്" + "മടങ്ങുക" + "കൂടുതൽ" + diff --git a/library/main/res/values-mn/strings.xml b/library/main/res/values-mn/strings.xml new file mode 100644 index 0000000..18a6e27 --- /dev/null +++ b/library/main/res/values-mn/strings.xml @@ -0,0 +1,23 @@ + + + + + "Дараах" + "Буцах" + "Илүү" + diff --git a/library/main/res/values-mr/strings.xml b/library/main/res/values-mr/strings.xml new file mode 100644 index 0000000..bb9980e --- /dev/null +++ b/library/main/res/values-mr/strings.xml @@ -0,0 +1,23 @@ + + + + + "पुढील" + "परत" + "अधिक" + diff --git a/library/main/res/values-ms/strings.xml b/library/main/res/values-ms/strings.xml new file mode 100644 index 0000000..04b8c6f --- /dev/null +++ b/library/main/res/values-ms/strings.xml @@ -0,0 +1,23 @@ + + + + + "Seterusnya" + "Kembali" + "Lagi" + diff --git a/library/main/res/values-my/strings.xml b/library/main/res/values-my/strings.xml new file mode 100644 index 0000000..4bdcd11 --- /dev/null +++ b/library/main/res/values-my/strings.xml @@ -0,0 +1,23 @@ + + + + + "ရှေ့သို့" + "နောက်သို့" + "နောက်ထပ်" + diff --git a/library/main/res/values-nb/strings.xml b/library/main/res/values-nb/strings.xml new file mode 100644 index 0000000..bc856e3 --- /dev/null +++ b/library/main/res/values-nb/strings.xml @@ -0,0 +1,23 @@ + + + + + "Neste" + "Tilbake" + "Mer" + diff --git a/library/main/res/values-ne/strings.xml b/library/main/res/values-ne/strings.xml new file mode 100644 index 0000000..c46b118 --- /dev/null +++ b/library/main/res/values-ne/strings.xml @@ -0,0 +1,23 @@ + + + + + "अर्को" + "पछाडि जानुहोस्" + "थप" + diff --git a/library/main/res/values-nl/strings.xml b/library/main/res/values-nl/strings.xml new file mode 100644 index 0000000..27dfb9a --- /dev/null +++ b/library/main/res/values-nl/strings.xml @@ -0,0 +1,23 @@ + + + + + "Volgende" + "Terug" + "Meer" + diff --git a/library/main/res/values-pa/strings.xml b/library/main/res/values-pa/strings.xml new file mode 100644 index 0000000..742020c --- /dev/null +++ b/library/main/res/values-pa/strings.xml @@ -0,0 +1,23 @@ + + + + + "ਅੱਗੇ" + "ਪਿੱਛੇ" + "ਹੋਰ" + diff --git a/library/main/res/values-pl/strings.xml b/library/main/res/values-pl/strings.xml new file mode 100644 index 0000000..f4e7e81 --- /dev/null +++ b/library/main/res/values-pl/strings.xml @@ -0,0 +1,23 @@ + + + + + "Dalej" + "Wstecz" + "Więcej" + diff --git a/library/main/res/values-pt-rBR/strings.xml b/library/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000..79d86e2 --- /dev/null +++ b/library/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,23 @@ + + + + + "Próxima" + "Voltar" + "Mais" + diff --git a/library/main/res/values-pt-rPT/strings.xml b/library/main/res/values-pt-rPT/strings.xml new file mode 100644 index 0000000..b9c95a1 --- /dev/null +++ b/library/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,23 @@ + + + + + "Seguinte" + "Anterior" + "Mais" + diff --git a/library/main/res/values-pt/strings.xml b/library/main/res/values-pt/strings.xml new file mode 100644 index 0000000..79d86e2 --- /dev/null +++ b/library/main/res/values-pt/strings.xml @@ -0,0 +1,23 @@ + + + + + "Próxima" + "Voltar" + "Mais" + diff --git a/library/main/res/values-ro/strings.xml b/library/main/res/values-ro/strings.xml new file mode 100644 index 0000000..7e643a7 --- /dev/null +++ b/library/main/res/values-ro/strings.xml @@ -0,0 +1,23 @@ + + + + + "Înainte" + "Înapoi" + "Mai mult" + diff --git a/library/main/res/values-ru/strings.xml b/library/main/res/values-ru/strings.xml new file mode 100644 index 0000000..fcfbc3d --- /dev/null +++ b/library/main/res/values-ru/strings.xml @@ -0,0 +1,23 @@ + + + + + "Далее" + "Назад" + "Ещё" + diff --git a/library/main/res/values-si/strings.xml b/library/main/res/values-si/strings.xml new file mode 100644 index 0000000..f79c169 --- /dev/null +++ b/library/main/res/values-si/strings.xml @@ -0,0 +1,23 @@ + + + + + "ඊළඟ" + "ආපසු" + "තවත්" + diff --git a/library/main/res/values-sk/strings.xml b/library/main/res/values-sk/strings.xml new file mode 100644 index 0000000..30fe40a --- /dev/null +++ b/library/main/res/values-sk/strings.xml @@ -0,0 +1,23 @@ + + + + + "Ďalej" + "Späť" + "Viac" + diff --git a/library/main/res/values-sl/strings.xml b/library/main/res/values-sl/strings.xml new file mode 100644 index 0000000..0aa330d --- /dev/null +++ b/library/main/res/values-sl/strings.xml @@ -0,0 +1,23 @@ + + + + + "Naprej" + "Nazaj" + "Več" + diff --git a/library/main/res/values-sq/strings.xml b/library/main/res/values-sq/strings.xml new file mode 100644 index 0000000..c30f08d --- /dev/null +++ b/library/main/res/values-sq/strings.xml @@ -0,0 +1,23 @@ + + + + + "Përpara" + "Prapa" + "Më shumë" + diff --git a/library/main/res/values-sr/strings.xml b/library/main/res/values-sr/strings.xml new file mode 100644 index 0000000..20be271 --- /dev/null +++ b/library/main/res/values-sr/strings.xml @@ -0,0 +1,23 @@ + + + + + "Даље" + "Назад" + "Још" + diff --git a/library/main/res/values-sv/strings.xml b/library/main/res/values-sv/strings.xml new file mode 100644 index 0000000..2d66a8d --- /dev/null +++ b/library/main/res/values-sv/strings.xml @@ -0,0 +1,23 @@ + + + + + "Nästa" + "Tillbaka" + "Mer" + diff --git a/library/main/res/values-sw/strings.xml b/library/main/res/values-sw/strings.xml new file mode 100644 index 0000000..8191ab8 --- /dev/null +++ b/library/main/res/values-sw/strings.xml @@ -0,0 +1,23 @@ + + + + + "Endelea" + "Rudi nyuma" + "Zaidi" + diff --git a/library/main/res/values-ta/strings.xml b/library/main/res/values-ta/strings.xml new file mode 100644 index 0000000..59a6098 --- /dev/null +++ b/library/main/res/values-ta/strings.xml @@ -0,0 +1,23 @@ + + + + + "அடுத்து" + "முந்தையது" + "மேலும்" + diff --git a/library/main/res/values-te/strings.xml b/library/main/res/values-te/strings.xml new file mode 100644 index 0000000..4209a3c --- /dev/null +++ b/library/main/res/values-te/strings.xml @@ -0,0 +1,23 @@ + + + + + "తదుపరి" + "వెనుకకు" + "మరింత" + diff --git a/library/main/res/values-th/strings.xml b/library/main/res/values-th/strings.xml new file mode 100644 index 0000000..0ea98d6 --- /dev/null +++ b/library/main/res/values-th/strings.xml @@ -0,0 +1,23 @@ + + + + + "ถัดไป" + "กลับ" + "เพิ่มเติม" + diff --git a/library/main/res/values-tl/strings.xml b/library/main/res/values-tl/strings.xml new file mode 100644 index 0000000..dc85cb8 --- /dev/null +++ b/library/main/res/values-tl/strings.xml @@ -0,0 +1,23 @@ + + + + + "Susunod" + "Bumalik" + "Higit pa" + diff --git a/library/main/res/values-tr/strings.xml b/library/main/res/values-tr/strings.xml new file mode 100644 index 0000000..8e14f51 --- /dev/null +++ b/library/main/res/values-tr/strings.xml @@ -0,0 +1,23 @@ + + + + + "İleri" + "Geri" + "Diğer" + diff --git a/library/main/res/values-uk/strings.xml b/library/main/res/values-uk/strings.xml new file mode 100644 index 0000000..7777cd5 --- /dev/null +++ b/library/main/res/values-uk/strings.xml @@ -0,0 +1,23 @@ + + + + + "Далі" + "Назад" + "Більше" + diff --git a/library/main/res/values-ur/strings.xml b/library/main/res/values-ur/strings.xml new file mode 100644 index 0000000..e4e8fc4 --- /dev/null +++ b/library/main/res/values-ur/strings.xml @@ -0,0 +1,23 @@ + + + + + "آگے" + "پیچھے" + "مزید" + diff --git a/library/main/res/values-uz/strings.xml b/library/main/res/values-uz/strings.xml new file mode 100644 index 0000000..dfc9014 --- /dev/null +++ b/library/main/res/values-uz/strings.xml @@ -0,0 +1,23 @@ + + + + + "Keyingisi" + "Orqaga" + "Yana" + diff --git a/library/main/res/values-vi/strings.xml b/library/main/res/values-vi/strings.xml new file mode 100644 index 0000000..40fb5ab --- /dev/null +++ b/library/main/res/values-vi/strings.xml @@ -0,0 +1,23 @@ + + + + + "Tiếp theo" + "Quay lại" + "Khác" + diff --git a/library/main/res/values-zh-rCN/strings.xml b/library/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..1ba83ed --- /dev/null +++ b/library/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,23 @@ + + + + + "下一步" + "返回" + "更多" + diff --git a/library/main/res/values-zh-rHK/strings.xml b/library/main/res/values-zh-rHK/strings.xml new file mode 100644 index 0000000..1ba83ed --- /dev/null +++ b/library/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,23 @@ + + + + + "下一步" + "返回" + "更多" + diff --git a/library/main/res/values-zh-rTW/strings.xml b/library/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..9115698 --- /dev/null +++ b/library/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,23 @@ + + + + + "繼續" + "返回" + "更多" + diff --git a/library/main/res/values-zu/strings.xml b/library/main/res/values-zu/strings.xml new file mode 100644 index 0000000..93e30c2 --- /dev/null +++ b/library/main/res/values-zu/strings.xml @@ -0,0 +1,23 @@ + + + + + "Okulandelayo" + "Emuva" + "Okuningi" + From 751b5a55ef783b4ea1c01fee0e39b894335c9c74 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2017 10:08:27 -0700 Subject: [PATCH 03/75] Import translations. DO NOT MERGE Change-Id: Id80ab0ef0199e8130c32cd1f5dd00df21ae46b89 Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- library/main/res/values-pt-rBR/strings.xml | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 library/main/res/values-pt-rBR/strings.xml diff --git a/library/main/res/values-pt-rBR/strings.xml b/library/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000..79d86e2 --- /dev/null +++ b/library/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,23 @@ + + + + + "Próxima" + "Voltar" + "Mais" + From 8fc6285e6afa764fa6430f1a36421cbd9f19c7c1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2017 10:09:17 -0700 Subject: [PATCH 04/75] Import translations. DO NOT MERGE Change-Id: Ifd34bfe725d1d866a1b6edc4200aec4c3439b678 Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- library/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/main/res/values-pt-rBR/strings.xml b/library/main/res/values-pt-rBR/strings.xml index 41032f8..79d86e2 100644 --- a/library/main/res/values-pt-rBR/strings.xml +++ b/library/main/res/values-pt-rBR/strings.xml @@ -17,7 +17,7 @@ - "Próximo" + "Próxima" "Voltar" "Mais" From 0e0b5e053be23cb91a5a1c0a6c9ee8024cdfb605 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2017 10:10:02 -0700 Subject: [PATCH 05/75] Import translations. DO NOT MERGE Change-Id: I6d4523cde671fc0a0d5779803480c2fdf8e0c763 Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- library/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/main/res/values-pt-rBR/strings.xml b/library/main/res/values-pt-rBR/strings.xml index 41032f8..79d86e2 100644 --- a/library/main/res/values-pt-rBR/strings.xml +++ b/library/main/res/values-pt-rBR/strings.xml @@ -17,7 +17,7 @@ - "Próximo" + "Próxima" "Voltar" "Mais" From a23e50896f6ddb40f14551d7fc1af129ce501f3f Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Tue, 1 Aug 2017 19:08:48 -0700 Subject: [PATCH 06/75] Allow keyboard to focus on switch item Test: ./gradlew connectedAndroidTest test Bug: 63115991 Change-Id: If03b3e469fd740631b5eabb6031f11fd2165bdb3 --- .../gingerbread/res/layout/suw_items_expandable_switch.xml | 1 - library/gingerbread/res/layout/suw_items_switch.xml | 1 - .../android/setupwizardlib/items/ExpandableSwitchItem.java | 4 ++++ .../setupwizardlib/items/ExpandableSwitchItemTest.java | 2 ++ .../android/setupwizardlib/items/RecyclerItemAdapter.java | 2 +- .../com/android/setupwizardlib/test/SystemBarHelperTest.java | 5 ++++- 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/library/gingerbread/res/layout/suw_items_expandable_switch.xml b/library/gingerbread/res/layout/suw_items_expandable_switch.xml index 2b98a9f..21c2c22 100644 --- a/library/gingerbread/res/layout/suw_items_expandable_switch.xml +++ b/library/gingerbread/res/layout/suw_items_expandable_switch.xml @@ -20,7 +20,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:colorBackground" - android:descendantFocusability="blocksDescendants" android:orientation="horizontal" android:tag="noBackground"> diff --git a/library/gingerbread/res/layout/suw_items_switch.xml b/library/gingerbread/res/layout/suw_items_switch.xml index af326b2..3f101d7 100644 --- a/library/gingerbread/res/layout/suw_items_switch.xml +++ b/library/gingerbread/res/layout/suw_items_switch.xml @@ -20,7 +20,6 @@ style="@style/SuwItemContainer.Verbose" android:layout_width="match_parent" android:layout_height="wrap_content" - android:descendantFocusability="blocksDescendants" android:orientation="horizontal"> @Override public void onBindViewHolder(ItemViewHolder holder, int position) { final IItem item = getItem(position); - item.onBindView(holder.itemView); holder.setEnabled(item.isEnabled()); holder.setItem(item); + item.onBindView(holder.itemView); } @Override diff --git a/library/test/instrumentation/src/com/android/setupwizardlib/test/SystemBarHelperTest.java b/library/test/instrumentation/src/com/android/setupwizardlib/test/SystemBarHelperTest.java index 0ebf7cb..d3142f1 100644 --- a/library/test/instrumentation/src/com/android/setupwizardlib/test/SystemBarHelperTest.java +++ b/library/test/instrumentation/src/com/android/setupwizardlib/test/SystemBarHelperTest.java @@ -31,6 +31,7 @@ import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; import android.support.test.rule.UiThreadTestRule; import android.support.test.runner.AndroidJUnit4; +import android.view.ContextThemeWrapper; import android.view.View; import android.view.Window; import android.view.WindowManager; @@ -131,7 +132,9 @@ public class SystemBarHelperTest { @Test public void testShowSystemBarsWindow() { final Window window = createWindowWithSystemUiVisibility(0x456); - SystemBarHelper.showSystemBars(window, InstrumentationRegistry.getContext()); + Context context = new ContextThemeWrapper( + InstrumentationRegistry.getContext(), android.R.style.Theme); + SystemBarHelper.showSystemBars(window, context); if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) { assertEquals( "DEFAULT_IMMERSIVE_FLAGS should be removed from window's systemUiVisibility", From c072bc26cd2709a2cfcdeb36e3c45c35fdaaf01b Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Thu, 3 Aug 2017 16:02:03 -0700 Subject: [PATCH 07/75] Set status bar color to transparent in "platform" So that the status bar background drawn by GlifLayout is visible. Test: ./gradlew test Bug: 64126435 Change-Id: If089091a08ab80cddc2514e1e929a771f3371373 --- library/platform/res/values-v23/styles.xml | 4 ++-- .../setupwizardlib/util/GlifStyleTest.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/library/platform/res/values-v23/styles.xml b/library/platform/res/values-v23/styles.xml index 2eb5caf..9fff5f1 100644 --- a/library/platform/res/values-v23/styles.xml +++ b/library/platform/res/values-v23/styles.xml @@ -92,7 +92,7 @@ ?attr/suwMarginSides ?attr/suwMarginSides @android:color/black - ?android:attr/colorPrimary + @android:color/transparent @style/TextAppearance.SuwGlifItemTitle @style/TextAppearance.SuwGlifItemSummary @color/suw_color_accent_glif_dark @@ -124,7 +124,7 @@ ?attr/suwMarginSides ?attr/suwMarginSides @android:color/black - ?android:attr/colorPrimary + @android:color/transparent @style/TextAppearance.SuwGlifItemTitle @style/TextAppearance.SuwGlifItemSummary @color/suw_color_accent_glif_light diff --git a/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java b/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java index e4e311f..aea2c03 100644 --- a/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java +++ b/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java @@ -20,9 +20,13 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.robolectric.RuntimeEnvironment.application; +import android.annotation.TargetApi; +import android.app.Activity; import android.content.Context; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; +import android.os.Bundle; +import android.support.annotation.Nullable; import android.view.ContextThemeWrapper; import android.widget.Button; @@ -63,4 +67,21 @@ public class GlifStyleTest { assertEquals("ff4285f4", Integer.toHexString(button.getTextColors().getDefaultColor())); } } + + @TargetApi(VERSION_CODES.LOLLIPOP) + @Config(sdk = Config.NEWEST_SDK) + @Test + public void glifThemeLight_statusBarColorShouldBeTransparent() { + GlifThemeActivity activity = Robolectric.setupActivity(GlifThemeActivity.class); + assertEquals(0x00000000, activity.getWindow().getStatusBarColor()); + } + + private static class GlifThemeActivity extends Activity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + setTheme(R.style.SuwThemeGlif_Light); + super.onCreate(savedInstanceState); + } + } } From fef3d11f566d2da42d839266a5ba18b91be6e8a9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 12 Aug 2017 02:11:44 -0700 Subject: [PATCH 08/75] Import translations. DO NOT MERGE Change-Id: Ic1e67887f748126543ebb9bcf583f98f1bdb4bf6 Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- library/main/res/values-en-rCA/strings.xml | 23 ++++++++++++++++++++++ library/main/res/values-en-rXC/strings.xml | 23 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 library/main/res/values-en-rCA/strings.xml create mode 100644 library/main/res/values-en-rXC/strings.xml diff --git a/library/main/res/values-en-rCA/strings.xml b/library/main/res/values-en-rCA/strings.xml new file mode 100644 index 0000000..5260500 --- /dev/null +++ b/library/main/res/values-en-rCA/strings.xml @@ -0,0 +1,23 @@ + + + + + "Next" + "Back" + "More" + diff --git a/library/main/res/values-en-rXC/strings.xml b/library/main/res/values-en-rXC/strings.xml new file mode 100644 index 0000000..693af6b --- /dev/null +++ b/library/main/res/values-en-rXC/strings.xml @@ -0,0 +1,23 @@ + + + + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎Next‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎Back‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‎More‎‏‎‎‏‎" + From 0bd21785449bccbd66646bd20d87dbf00c9b7f78 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 12 Aug 2017 02:12:34 -0700 Subject: [PATCH 09/75] Import translations. DO NOT MERGE Change-Id: If94feed12b0b9d9549785771627a5daf29e8304a Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- navigationbar/res/values-en-rCA/strings.xml | 6 ++++++ navigationbar/res/values-en-rXC/strings.xml | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 navigationbar/res/values-en-rCA/strings.xml create mode 100644 navigationbar/res/values-en-rXC/strings.xml diff --git a/navigationbar/res/values-en-rCA/strings.xml b/navigationbar/res/values-en-rCA/strings.xml new file mode 100644 index 0000000..b06dc86 --- /dev/null +++ b/navigationbar/res/values-en-rCA/strings.xml @@ -0,0 +1,6 @@ + + + "Next" + "Back" + diff --git a/navigationbar/res/values-en-rXC/strings.xml b/navigationbar/res/values-en-rXC/strings.xml new file mode 100644 index 0000000..5c7c658 --- /dev/null +++ b/navigationbar/res/values-en-rXC/strings.xml @@ -0,0 +1,6 @@ + + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‎Next‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‎Back‎‏‎‎‏‎" + From 16bb52a67c60c147d5d681ffcf573acedb5ba7e0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 23 Aug 2017 17:30:03 -0700 Subject: [PATCH 10/75] Import translations. DO NOT MERGE Change-Id: I9a663646228e95ae006a0b1fd328e1c06ff98c33 Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- library/main/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/main/res/values-hi/strings.xml b/library/main/res/values-hi/strings.xml index d30fbb4..a5c27b1 100644 --- a/library/main/res/values-hi/strings.xml +++ b/library/main/res/values-hi/strings.xml @@ -17,7 +17,7 @@ - "आगे" + "अगला" "पीछे" "अधिक" From 18fb5350f2c345c9094430ceff41262bb4ef8d8b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 23 Aug 2017 17:31:07 -0700 Subject: [PATCH 11/75] Import translations. DO NOT MERGE Change-Id: I7b0f4ed9c5158e9b1abd6c19457a6e60df610cdd Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- navigationbar/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/navigationbar/res/values-hi/strings.xml b/navigationbar/res/values-hi/strings.xml index 6afe5e5..fc1e9da 100644 --- a/navigationbar/res/values-hi/strings.xml +++ b/navigationbar/res/values-hi/strings.xml @@ -1,6 +1,6 @@ - "आगे" + "अगला" "पीछे" From 74098f24035dcc157fe9a9cd542defcd6fefa60e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 27 Aug 2017 10:20:34 -0700 Subject: [PATCH 12/75] Import translations. DO NOT MERGE Change-Id: Ica3a3f0e2bbb680dfb35c86e0940fe06c236d998 Auto-generated-cl: translation import --- library/main/res/values-mr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/main/res/values-mr/strings.xml b/library/main/res/values-mr/strings.xml index bb9980e..a529655 100644 --- a/library/main/res/values-mr/strings.xml +++ b/library/main/res/values-mr/strings.xml @@ -18,6 +18,6 @@ "पुढील" - "परत" + "मागे" "अधिक" From 69ee2b75a4ad3b7519d919dc0a3948fce926c2a8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 27 Aug 2017 10:21:25 -0700 Subject: [PATCH 13/75] Import translations. DO NOT MERGE Change-Id: Ic14c9e42fdbd002ada864b88111196e846b997d6 Auto-generated-cl: translation import --- navigationbar/res/values-mr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/navigationbar/res/values-mr/strings.xml b/navigationbar/res/values-mr/strings.xml index 9269807..3668c64 100644 --- a/navigationbar/res/values-mr/strings.xml +++ b/navigationbar/res/values-mr/strings.xml @@ -2,5 +2,5 @@ "पुढील" - "परत" + "मागे" From 8d48b26adcbac4a42edffffb9e699eb38a1a961d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 6 Sep 2017 04:03:48 -0700 Subject: [PATCH 14/75] Import translations. DO NOT MERGE Change-Id: Ic3bd4a006b17bcb36e60b3b5f5fcf22242d6711b Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- library/main/res/values-bn/strings.xml | 2 +- library/main/res/values-hi/strings.xml | 2 +- library/main/res/values-te/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/main/res/values-bn/strings.xml b/library/main/res/values-bn/strings.xml index d807c08..88865ee 100644 --- a/library/main/res/values-bn/strings.xml +++ b/library/main/res/values-bn/strings.xml @@ -19,5 +19,5 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "পরবর্তী" "ফিরুন" - "আরো" + "আরও" diff --git a/library/main/res/values-hi/strings.xml b/library/main/res/values-hi/strings.xml index a5c27b1..3fb41d3 100644 --- a/library/main/res/values-hi/strings.xml +++ b/library/main/res/values-hi/strings.xml @@ -17,7 +17,7 @@ - "अगला" + "आगे बढ़ें" "पीछे" "अधिक" diff --git a/library/main/res/values-te/strings.xml b/library/main/res/values-te/strings.xml index 4209a3c..b120ee8 100644 --- a/library/main/res/values-te/strings.xml +++ b/library/main/res/values-te/strings.xml @@ -17,7 +17,7 @@ - "తదుపరి" + "తర్వాత" "వెనుకకు" "మరింత" From c3648f6d260585ff5d3e420ae57649868e7de5b3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 6 Sep 2017 04:04:46 -0700 Subject: [PATCH 15/75] Import translations. DO NOT MERGE Change-Id: I1b10f49ffead502e0317e238b118e3df1ea6b3f1 Auto-generated-cl: translation import Exempt-From-Owner-Approval: translation import --- navigationbar/res/values-hi/strings.xml | 2 +- navigationbar/res/values-te/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/navigationbar/res/values-hi/strings.xml b/navigationbar/res/values-hi/strings.xml index fc1e9da..f8e9f9d 100644 --- a/navigationbar/res/values-hi/strings.xml +++ b/navigationbar/res/values-hi/strings.xml @@ -1,6 +1,6 @@ - "अगला" + "आगे बढ़ें" "पीछे" diff --git a/navigationbar/res/values-te/strings.xml b/navigationbar/res/values-te/strings.xml index e575ba7..fdf5c75 100644 --- a/navigationbar/res/values-te/strings.xml +++ b/navigationbar/res/values-te/strings.xml @@ -1,6 +1,6 @@ - "తదుపరి" + "తర్వాత" "వెనుకకు" From 96b54f3cd7c66a21ae39390d155b310a0e575eb5 Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Wed, 13 Sep 2017 21:44:22 -0700 Subject: [PATCH 16/75] Update to Robolectric 3.4.2 Test: ./gradlew test Bug: 65652792 Change-Id: I8e0093fd956a885c8f1404e2a17b5f4aaec87dfc --- library/self.gradle | 4 +-- .../setupwizardlib/util/PartnerTest.java | 28 +++++++++++++------ .../view/IllustrationVideoViewTest.java | 2 +- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/library/self.gradle b/library/self.gradle index 6a405e2..69f9654 100644 --- a/library/self.gradle +++ b/library/self.gradle @@ -38,8 +38,8 @@ android.sourceSets { java.srcDirs = ['test/robotest/src'] dependencies { - testCompile 'org.robolectric:robolectric:3.+' - testCompile 'org.robolectric:shadows-core:3.+' + testCompile 'org.robolectric:robolectric:3.4.2' + testCompile 'org.robolectric:framework:3.4.2' testCompile 'junit:junit:4.+' testCompile 'org.mockito:mockito-core:1.9.5' // Workaround for https://github.com/robolectric/robolectric/issues/2566 diff --git a/library/test/robotest/src/com/android/setupwizardlib/util/PartnerTest.java b/library/test/robotest/src/com/android/setupwizardlib/util/PartnerTest.java index f47eef1..aeb678f 100644 --- a/library/test/robotest/src/com/android/setupwizardlib/util/PartnerTest.java +++ b/library/test/robotest/src/com/android/setupwizardlib/util/PartnerTest.java @@ -31,6 +31,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.os.Build.VERSION; @@ -40,20 +41,25 @@ import com.android.setupwizardlib.BuildConfig; import com.android.setupwizardlib.R; import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner; import com.android.setupwizardlib.util.Partner.ResourceEntry; +import com.android.setupwizardlib.util.PartnerTest.ShadowApplicationPackageManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RuntimeEnvironment; +import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.res.builder.DefaultPackageManager; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; import org.robolectric.shadows.ShadowResources; import java.util.Arrays; import java.util.Collections; @RunWith(SuwLibRobolectricTestRunner.class) -@Config(constants = BuildConfig.class, sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK }) +@Config( + constants = BuildConfig.class, + sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK }, + shadows = ShadowApplicationPackageManager.class) public class PartnerTest { private static final String ACTION_PARTNER_CUSTOMIZATION = @@ -62,7 +68,7 @@ public class PartnerTest { private Context mContext; private Resources mPartnerResources; - private TestPackageManager mPackageManager; + private ShadowApplicationPackageManager mPackageManager; @Before public void setUp() throws Exception { @@ -71,8 +77,9 @@ public class PartnerTest { mContext = spy(application); mPartnerResources = spy(ShadowResources.getSystem()); - mPackageManager = new TestPackageManager(); - RuntimeEnvironment.setRobolectricPackageManager(mPackageManager); + mPackageManager = + (ShadowApplicationPackageManager) Shadows.shadowOf(application.getPackageManager()); + mPackageManager.partnerResources = mPartnerResources; } @Test @@ -173,13 +180,18 @@ public class PartnerTest { return info; } - private class TestPackageManager extends DefaultPackageManager { + @Implements(className = "android.app.ApplicationPackageManager") + public static class ShadowApplicationPackageManager extends + org.robolectric.shadows.ShadowApplicationPackageManager { + public Resources partnerResources; + + @Implementation @Override public Resources getResourcesForApplication(ApplicationInfo app) throws NameNotFoundException { if (app != null && "test.partner.package".equals(app.packageName)) { - return mPartnerResources; + return partnerResources; } else { return super.getResourcesForApplication(app); } diff --git a/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java b/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java index ffa228d..ddf59ca 100644 --- a/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java +++ b/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java @@ -48,7 +48,7 @@ import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.annotation.RealObject; -import org.robolectric.internal.Shadow; +import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowMediaPlayer; import org.robolectric.util.ReflectionHelpers; From 31dbc098a972bd970c947d860d062d9be45ea223 Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Wed, 20 Sep 2017 18:55:33 -0700 Subject: [PATCH 17/75] Add OWNERS file to setup wizard lib Test: None Change-Id: I9ab8618b1764be15556452887d73e09a1a3fdf2e --- OWNERS | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 OWNERS diff --git a/OWNERS b/OWNERS new file mode 100644 index 0000000..5245206 --- /dev/null +++ b/OWNERS @@ -0,0 +1,4 @@ +russellbrenner@google.com +ajayns@google.com +iofir@google.com +yukl@google.com From 668644f62475a4d77ad4af09fc2129243d0c4c95 Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Mon, 25 Sep 2017 19:47:54 -0700 Subject: [PATCH 18/75] Add continuous coverage for Robolectric tests Configured jacoco build for Robolectric tests, and dist the results so it can be picked up in continuous testing. Test: OUT_DIR=/path/to/out DIST_DIR=/path/to/out/dist \ ./gradlew coverage dist Bug: 66828854 Change-Id: If847f74dbcfa57af1ce3c64f28c2c870f4b9d973 --- tools/build_for_build_server.sh | 2 +- tools/gradle/dist-unit-tests.gradle | 74 ++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/tools/build_for_build_server.sh b/tools/build_for_build_server.sh index a90ae67..7a8c942 100755 --- a/tools/build_for_build_server.sh +++ b/tools/build_for_build_server.sh @@ -6,4 +6,4 @@ export TARGET_BUILD_DENSITY="alldpi" export TARGET_BUILD_TYPE="release" export TARGET_BUILD_APPS="setup-wizard-lib" -./gradlew buildProjectFull test +./gradlew buildProjectFull test coverage diff --git a/tools/gradle/dist-unit-tests.gradle b/tools/gradle/dist-unit-tests.gradle index faae260..aaecd35 100644 --- a/tools/gradle/dist-unit-tests.gradle +++ b/tools/gradle/dist-unit-tests.gradle @@ -10,6 +10,7 @@ */ apply plugin: 'dist' +apply plugin: 'jacoco' // If unit tests are run as part of the build, dist the test XML reports to host-test-reports/*.zip android.unitTestVariants.all { variant -> @@ -28,11 +29,80 @@ android.unitTestVariants.all { variant -> archiveName = task.name + 'Result.zip' destinationDir = junitReport.destination.parentFile } - zipTask.mustRunAfter task + task.finalizedBy zipTask // Copy the test reports to dist/host-test-reports // The file path and format should match GradleHostBasedTest class in TradeFed. - tasks.dist.dependsOn zipTask + tasks.dist.mustRunAfter zipTask dist.file zipTask.archivePath.path, "host-test-reports/${zipTask.archiveName}" } } + +/* + * The section below adds code coverage to all the unitTest targets. By default, the jacoco plugin + * only adds to the 'java' plugin and not the Android ones. + * + * For each unitTest task "fooUnitTest", a new target "fooUnitTestCoverage" will be generated for + * to generate the jacoco report. + */ +android.testOptions.unitTests.all { + // Fix robolectric tests reporting 0 coverage on newer versions of the plugin. + jacoco { + includeNoLocationClasses = true + } +} + +// Define the main coverage task if it does not exist. This task generates coverage report for all +// unit tests. +def coverageTask = tasks.findByName('coverage') ?: tasks.create('coverage') { + group = "Reporting" + description = "Generate Jacoco coverage reports" +} + +android.unitTestVariants.all { variant -> + def testTaskName = "test${variant.name.capitalize()}" + def testTask = tasks.findByName(testTaskName) + + // Create coverage task of form 'testFlavorCoverageUnitTestCoverage' depending on + // 'testFlavorCoverageUnitTest' + def jacocoTask = tasks.create("${testTaskName}Coverage", JacocoReport) { + group = "Reporting" + description = "Generate a Jacoco coverage report for robolectric tests on ${variant.name}." + + classDirectories = fileTree( + dir: "${project.buildDir}/intermediates/classes/" + + "${variant.productFlavors[0].name}/${variant.buildType.name}", + excludes: ['**/R.class', + '**/R$*.class', + '**/BuildConfig.*', + '**/Manifest*.*'] + ) + + sourceDirectories = files(variant.testedVariant.sourceSets.collect { it.java.srcDirs }) + executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec") + + reports { + xml.enabled = true + html.enabled = true + } + } + jacocoTask.dependsOn testTask + + // Create a zip file of the HTML coverage reports + def zipTask = tasks.create("zipResultsOf${jacocoTask.name.capitalize()}", Zip) { + from jacocoTask.reports.html.destination + archiveName = "${testTaskName}HtmlCoverage.zip" + destinationDir = jacocoTask.reports.html.destination.parentFile + } + jacocoTask.finalizedBy zipTask + + // Copy the coverage reports to dist/host-test-coverage + // The file path and format should match JacocoLogForwarder class in TradeFed. + tasks.dist.mustRunAfter jacocoTask + dist.file jacocoTask.reports.xml.destination.path, "host-test-coverage/${jacocoTask.name}.xml" + + tasks.dist.mustRunAfter zipTask + dist.file zipTask.archivePath.path, "host-test-coverage/${zipTask.archiveName}" + + coverageTask.dependsOn(jacocoTask) +} From b72f3fb4598d2bd2560cdf5043defc80a0199e2e Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Mon, 15 May 2017 19:09:24 -0700 Subject: [PATCH 19/75] Add test for LinkAccessibilityHelper - For the AccessibilityDelegateCompat methods, add tests that the delegation is done correctly. - Refactored LinkAccessibilityHelper to make the dependency direction clearer. Test: ./gradlew connectedAndroidTest test Change-Id: I6132c0820ee6de1b9cc71a2838bdf05a34d7d2af --- .../util/LinkAccessibilityHelper.java | 414 ++++++++---------- .../LinkAccessibilityHelperTest.java | 95 +++- library/standalone.gradle | 4 +- tools/gradle/android.properties | 4 +- 4 files changed, 269 insertions(+), 248 deletions(-) rename library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/{test => util}/LinkAccessibilityHelperTest.java (75%) diff --git a/library/gingerbread/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java b/library/gingerbread/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java index 1e663d6..1fb3a37 100644 --- a/library/gingerbread/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java +++ b/library/gingerbread/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java @@ -19,6 +19,8 @@ package com.android.setupwizardlib.util; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; import android.support.v4.view.AccessibilityDelegateCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat; @@ -38,12 +40,11 @@ import java.util.List; /** * An accessibility delegate that allows {@link android.text.style.ClickableSpan} to be focused and * clicked by accessibility services. - *

- * Note: From Android O on, there is native support for ClickableSpan - * accessibility, so this class is not needed (and indeed has no effect.) - *

* - *

Sample usage: + *

Note: This class is a no-op on Android O or above since there is native + * support for ClickableSpan accessibility. + * + *

Sample usage: *

  * LinkAccessibilityHelper mAccessibilityHelper;
  *
@@ -68,294 +69,255 @@ public class LinkAccessibilityHelper extends AccessibilityDelegateCompat {
 
     private static final String TAG = "LinkAccessibilityHelper";
 
-    private final TextView mView;
-    private final Rect mTempRect = new Rect();
-    private final ExploreByTouchHelper mExploreByTouchHelper;
+    private final AccessibilityDelegateCompat mDelegate;
 
     public LinkAccessibilityHelper(TextView view) {
-        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
-            // Pre-O, we essentially extend ExploreByTouchHelper to expose a virtual view hierarchy
-            mExploreByTouchHelper = new ExploreByTouchHelper(view) {
-                @Override
-                protected int getVirtualViewAt(float x, float y) {
-                    return LinkAccessibilityHelper.this.getVirtualViewAt(x, y);
-                }
+        this(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
+                // Platform support was added in O. This helper will be no-op
+                ? new AccessibilityDelegateCompat()
+                // Pre-O, we extend ExploreByTouchHelper to expose a virtual view hierarchy
+                : new PreOLinkAccessibilityHelper(view));
+    }
 
-                @Override
-                protected void getVisibleVirtualViews(List virtualViewIds) {
-                    LinkAccessibilityHelper.this.getVisibleVirtualViews(virtualViewIds);
-                }
-
-                @Override
-                protected void onPopulateEventForVirtualView(int virtualViewId,
-                        AccessibilityEvent event) {
-                    LinkAccessibilityHelper
-                            .this.onPopulateEventForVirtualView(virtualViewId, event);
-                }
-
-                @Override
-                protected void onPopulateNodeForVirtualView(int virtualViewId,
-                        AccessibilityNodeInfoCompat infoCompat) {
-                    LinkAccessibilityHelper
-                            .this.onPopulateNodeForVirtualView(virtualViewId, infoCompat);
-
-                }
-
-                @Override
-                protected boolean onPerformActionForVirtualView(int virtualViewId, int action,
-                        Bundle arguments) {
-                    return LinkAccessibilityHelper.this
-                            .onPerformActionForVirtualView(virtualViewId, action, arguments);
-                }
-            };
-        } else {
-            mExploreByTouchHelper = null;
-        }
-        mView = view;
+    @VisibleForTesting
+    LinkAccessibilityHelper(@NonNull AccessibilityDelegateCompat delegate) {
+        mDelegate = delegate;
     }
 
     @Override
     public void sendAccessibilityEvent(View host, int eventType) {
-        if (mExploreByTouchHelper != null) {
-            mExploreByTouchHelper.sendAccessibilityEvent(host, eventType);
-        } else {
-            super.sendAccessibilityEvent(host, eventType);
-        }
+        mDelegate.sendAccessibilityEvent(host, eventType);
     }
 
     @Override
     public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
-        if (mExploreByTouchHelper != null) {
-            mExploreByTouchHelper.sendAccessibilityEventUnchecked(host, event);
-        } else {
-            super.sendAccessibilityEventUnchecked(host, event);
-        }
+        mDelegate.sendAccessibilityEventUnchecked(host, event);
     }
 
     @Override
     public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-        return (mExploreByTouchHelper != null)
-                ? mExploreByTouchHelper.dispatchPopulateAccessibilityEvent(host, event)
-                : super.dispatchPopulateAccessibilityEvent(host, event);
+        return mDelegate.dispatchPopulateAccessibilityEvent(host, event);
     }
 
     @Override
     public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-        if (mExploreByTouchHelper != null) {
-            mExploreByTouchHelper.onPopulateAccessibilityEvent(host, event);
-        } else {
-            super.onPopulateAccessibilityEvent(host, event);
-        }
+        mDelegate.onPopulateAccessibilityEvent(host, event);
     }
 
     @Override
     public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-        if (mExploreByTouchHelper != null) {
-            mExploreByTouchHelper.onInitializeAccessibilityEvent(host, event);
-        } else {
-            super.onInitializeAccessibilityEvent(host, event);
-        }
+        mDelegate.onInitializeAccessibilityEvent(host, event);
     }
 
     @Override
     public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
-        if (mExploreByTouchHelper != null) {
-            mExploreByTouchHelper.onInitializeAccessibilityNodeInfo(host, info);
-        } else {
-            super.onInitializeAccessibilityNodeInfo(host, info);
-        }
+        mDelegate.onInitializeAccessibilityNodeInfo(host, info);
     }
 
     @Override
     public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
             AccessibilityEvent event) {
-        return (mExploreByTouchHelper != null)
-                ? mExploreByTouchHelper.onRequestSendAccessibilityEvent(host, child, event)
-                : super.onRequestSendAccessibilityEvent(host, child, event);
+        return mDelegate.onRequestSendAccessibilityEvent(host, child, event);
     }
 
     @Override
     public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {
-        return (mExploreByTouchHelper != null)
-                ? mExploreByTouchHelper.getAccessibilityNodeProvider(host)
-                : super.getAccessibilityNodeProvider(host);
+        return mDelegate.getAccessibilityNodeProvider(host);
     }
 
     @Override
     public boolean performAccessibilityAction(View host, int action, Bundle args) {
-        return (mExploreByTouchHelper != null)
-                ? mExploreByTouchHelper.performAccessibilityAction(host, action, args)
-                : super.performAccessibilityAction(host, action, args);
+        return mDelegate.performAccessibilityAction(host, action, args);
     }
 
     /**
-     * Delegated to {@link ExploreByTouchHelper}
+     * Dispatches hover event to the virtual view hierarchy. This method should be called in
+     * {@link View#dispatchHoverEvent(MotionEvent)}.
+     *
+     * @see ExploreByTouchHelper#dispatchHoverEvent(MotionEvent)
      */
     public final boolean dispatchHoverEvent(MotionEvent event) {
-        return (mExploreByTouchHelper != null) ? mExploreByTouchHelper.dispatchHoverEvent(event)
-                : false;
+        return mDelegate instanceof ExploreByTouchHelper
+                && ((ExploreByTouchHelper) mDelegate).dispatchHoverEvent(event);
     }
 
-    protected int getVirtualViewAt(float x, float y) {
-        final CharSequence text = mView.getText();
-        if (text instanceof Spanned) {
-            final Spanned spannedText = (Spanned) text;
-            final int offset = getOffsetForPosition(mView, x, y);
-            ClickableSpan[] linkSpans = spannedText.getSpans(offset, offset, ClickableSpan.class);
-            if (linkSpans.length == 1) {
-                ClickableSpan linkSpan = linkSpans[0];
-                return spannedText.getSpanStart(linkSpan);
+    @VisibleForTesting
+    static class PreOLinkAccessibilityHelper extends ExploreByTouchHelper {
+
+        private final Rect mTempRect = new Rect();
+        private final TextView mView;
+
+        PreOLinkAccessibilityHelper(TextView view) {
+            super(view);
+            mView = view;
+        }
+
+        protected int getVirtualViewAt(float x, float y) {
+            final CharSequence text = mView.getText();
+            if (text instanceof Spanned) {
+                final Spanned spannedText = (Spanned) text;
+                final int offset = getOffsetForPosition(mView, x, y);
+                ClickableSpan[] linkSpans =
+                        spannedText.getSpans(offset, offset, ClickableSpan.class);
+                if (linkSpans.length == 1) {
+                    ClickableSpan linkSpan = linkSpans[0];
+                    return spannedText.getSpanStart(linkSpan);
+                }
+            }
+            return ExploreByTouchHelper.INVALID_ID;
+        }
+
+        protected void getVisibleVirtualViews(List virtualViewIds) {
+            final CharSequence text = mView.getText();
+            if (text instanceof Spanned) {
+                final Spanned spannedText = (Spanned) text;
+                ClickableSpan[] linkSpans = spannedText.getSpans(0, spannedText.length(),
+                        ClickableSpan.class);
+                for (ClickableSpan span : linkSpans) {
+                    virtualViewIds.add(spannedText.getSpanStart(span));
+                }
             }
         }
-        return ExploreByTouchHelper.INVALID_ID;
-    }
 
-    protected void getVisibleVirtualViews(List virtualViewIds) {
-        final CharSequence text = mView.getText();
-        if (text instanceof Spanned) {
-            final Spanned spannedText = (Spanned) text;
-            ClickableSpan[] linkSpans = spannedText.getSpans(0, spannedText.length(),
-                    ClickableSpan.class);
-            for (ClickableSpan span : linkSpans) {
-                virtualViewIds.add(spannedText.getSpanStart(span));
-            }
-        }
-    }
-
-    protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
-        final ClickableSpan span = getSpanForOffset(virtualViewId);
-        if (span != null) {
-            event.setContentDescription(getTextForSpan(span));
-        } else {
-            Log.e(TAG, "LinkSpan is null for offset: " + virtualViewId);
-            event.setContentDescription(mView.getText());
-        }
-    }
-
-    protected void onPopulateNodeForVirtualView(int virtualViewId,
-            AccessibilityNodeInfoCompat info) {
-        final ClickableSpan span = getSpanForOffset(virtualViewId);
-        if (span != null) {
-            info.setContentDescription(getTextForSpan(span));
-        } else {
-            Log.e(TAG, "LinkSpan is null for offset: " + virtualViewId);
-            info.setContentDescription(mView.getText());
-        }
-        info.setFocusable(true);
-        info.setClickable(true);
-        getBoundsForSpan(span, mTempRect);
-        if (mTempRect.isEmpty()) {
-            Log.e(TAG, "LinkSpan bounds is empty for: " + virtualViewId);
-            mTempRect.set(0, 0, 1, 1);
-        }
-        info.setBoundsInParent(mTempRect);
-        info.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
-    }
-
-    protected boolean onPerformActionForVirtualView(int virtualViewId, int action,
-            Bundle arguments) {
-        if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) {
-            ClickableSpan span = getSpanForOffset(virtualViewId);
+        protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
+            final ClickableSpan span = getSpanForOffset(virtualViewId);
             if (span != null) {
-                span.onClick(mView);
-                return true;
+                event.setContentDescription(getTextForSpan(span));
             } else {
                 Log.e(TAG, "LinkSpan is null for offset: " + virtualViewId);
+                event.setContentDescription(mView.getText());
             }
         }
-        return false;
-    }
 
-    private ClickableSpan getSpanForOffset(int offset) {
-        CharSequence text = mView.getText();
-        if (text instanceof Spanned) {
-            Spanned spannedText = (Spanned) text;
-            ClickableSpan[] spans = spannedText.getSpans(offset, offset, ClickableSpan.class);
-            if (spans.length == 1) {
-                return spans[0];
+        protected void onPopulateNodeForVirtualView(
+                int virtualViewId,
+                AccessibilityNodeInfoCompat info) {
+            final ClickableSpan span = getSpanForOffset(virtualViewId);
+            if (span != null) {
+                info.setContentDescription(getTextForSpan(span));
+            } else {
+                Log.e(TAG, "LinkSpan is null for offset: " + virtualViewId);
+                info.setContentDescription(mView.getText());
             }
+            info.setFocusable(true);
+            info.setClickable(true);
+            getBoundsForSpan(span, mTempRect);
+            if (mTempRect.isEmpty()) {
+                Log.e(TAG, "LinkSpan bounds is empty for: " + virtualViewId);
+                mTempRect.set(0, 0, 1, 1);
+            }
+            info.setBoundsInParent(mTempRect);
+            info.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
         }
-        return null;
-    }
 
-    private CharSequence getTextForSpan(ClickableSpan span) {
-        CharSequence text = mView.getText();
-        if (text instanceof Spanned) {
-            Spanned spannedText = (Spanned) text;
-            return spannedText.subSequence(spannedText.getSpanStart(span),
-                    spannedText.getSpanEnd(span));
-        }
-        return text;
-    }
-
-    // Find the bounds of a span. If it spans multiple lines, it will only return the bounds for the
-    // section on the first line.
-    private Rect getBoundsForSpan(ClickableSpan span, Rect outRect) {
-        CharSequence text = mView.getText();
-        outRect.setEmpty();
-        if (text instanceof Spanned) {
-            final Layout layout = mView.getLayout();
-            if (layout != null) {
-                Spanned spannedText = (Spanned) text;
-                final int spanStart = spannedText.getSpanStart(span);
-                final int spanEnd = spannedText.getSpanEnd(span);
-                final float xStart = layout.getPrimaryHorizontal(spanStart);
-                final float xEnd = layout.getPrimaryHorizontal(spanEnd);
-                final int lineStart = layout.getLineForOffset(spanStart);
-                final int lineEnd = layout.getLineForOffset(spanEnd);
-                layout.getLineBounds(lineStart, outRect);
-                if (lineEnd == lineStart) {
-                    // If the span is on a single line, adjust both the left and right bounds
-                    // so outrect is exactly bounding the span.
-                    outRect.left = (int) Math.min(xStart, xEnd);
-                    outRect.right = (int) Math.max(xStart, xEnd);
+        protected boolean onPerformActionForVirtualView(
+                int virtualViewId,
+                int action,
+                Bundle arguments) {
+            if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) {
+                ClickableSpan span = getSpanForOffset(virtualViewId);
+                if (span != null) {
+                    span.onClick(mView);
+                    return true;
                 } else {
-                    // If the span wraps across multiple lines, only use the first line (as returned
-                    // by layout.getLineBounds above), and adjust the "start" of outrect to where
-                    // the span starts, leaving the "end" of outrect at the end of the line.
-                    // ("start" being left for LTR, and right for RTL)
-                    if (layout.getParagraphDirection(lineStart) == Layout.DIR_RIGHT_TO_LEFT) {
-                        outRect.right = (int) xStart;
-                    } else {
-                        outRect.left = (int) xStart;
-                    }
+                    Log.e(TAG, "LinkSpan is null for offset: " + virtualViewId);
                 }
-
-                // Offset for padding
-                outRect.offset(mView.getTotalPaddingLeft(), mView.getTotalPaddingTop());
             }
+            return false;
         }
-        return outRect;
-    }
 
-    // Compat implementation of TextView#getOffsetForPosition().
+        private ClickableSpan getSpanForOffset(int offset) {
+            CharSequence text = mView.getText();
+            if (text instanceof Spanned) {
+                Spanned spannedText = (Spanned) text;
+                ClickableSpan[] spans = spannedText.getSpans(offset, offset, ClickableSpan.class);
+                if (spans.length == 1) {
+                    return spans[0];
+                }
+            }
+            return null;
+        }
 
-    private static int getOffsetForPosition(TextView view, float x, float y) {
-        if (view.getLayout() == null) return -1;
-        final int line = getLineAtCoordinate(view, y);
-        return getOffsetAtCoordinate(view, line, x);
-    }
+        private CharSequence getTextForSpan(ClickableSpan span) {
+            CharSequence text = mView.getText();
+            if (text instanceof Spanned) {
+                Spanned spannedText = (Spanned) text;
+                return spannedText.subSequence(
+                        spannedText.getSpanStart(span),
+                        spannedText.getSpanEnd(span));
+            }
+            return text;
+        }
 
-    private static float convertToLocalHorizontalCoordinate(TextView view, float x) {
-        x -= view.getTotalPaddingLeft();
-        // Clamp the position to inside of the view.
-        x = Math.max(0.0f, x);
-        x = Math.min(view.getWidth() - view.getTotalPaddingRight() - 1, x);
-        x += view.getScrollX();
-        return x;
-    }
+        // Find the bounds of a span. If it spans multiple lines, it will only return the bounds for
+        // the section on the first line.
+        private Rect getBoundsForSpan(ClickableSpan span, Rect outRect) {
+            CharSequence text = mView.getText();
+            outRect.setEmpty();
+            if (text instanceof Spanned) {
+                final Layout layout = mView.getLayout();
+                if (layout != null) {
+                    Spanned spannedText = (Spanned) text;
+                    final int spanStart = spannedText.getSpanStart(span);
+                    final int spanEnd = spannedText.getSpanEnd(span);
+                    final float xStart = layout.getPrimaryHorizontal(spanStart);
+                    final float xEnd = layout.getPrimaryHorizontal(spanEnd);
+                    final int lineStart = layout.getLineForOffset(spanStart);
+                    final int lineEnd = layout.getLineForOffset(spanEnd);
+                    layout.getLineBounds(lineStart, outRect);
+                    if (lineEnd == lineStart) {
+                        // If the span is on a single line, adjust both the left and right bounds
+                        // so outrect is exactly bounding the span.
+                        outRect.left = (int) Math.min(xStart, xEnd);
+                        outRect.right = (int) Math.max(xStart, xEnd);
+                    } else {
+                        // If the span wraps across multiple lines, only use the first line (as
+                        // returned by layout.getLineBounds above), and adjust the "start" of
+                        // outrect to where the span starts, leaving the "end" of outrect at the end
+                        // of the line. ("start" being left for LTR, and right for RTL)
+                        if (layout.getParagraphDirection(lineStart) == Layout.DIR_RIGHT_TO_LEFT) {
+                            outRect.right = (int) xStart;
+                        } else {
+                            outRect.left = (int) xStart;
+                        }
+                    }
 
-    private static int getLineAtCoordinate(TextView view, float y) {
-        y -= view.getTotalPaddingTop();
-        // Clamp the position to inside of the view.
-        y = Math.max(0.0f, y);
-        y = Math.min(view.getHeight() - view.getTotalPaddingBottom() - 1, y);
-        y += view.getScrollY();
-        return view.getLayout().getLineForVertical((int) y);
-    }
+                    // Offset for padding
+                    outRect.offset(mView.getTotalPaddingLeft(), mView.getTotalPaddingTop());
+                }
+            }
+            return outRect;
+        }
 
-    private static int getOffsetAtCoordinate(TextView view, int line, float x) {
-        x = convertToLocalHorizontalCoordinate(view, x);
-        return view.getLayout().getOffsetForHorizontal(line, x);
+        // Compat implementation of TextView#getOffsetForPosition().
+
+        private static int getOffsetForPosition(TextView view, float x, float y) {
+            if (view.getLayout() == null) return -1;
+            final int line = getLineAtCoordinate(view, y);
+            return getOffsetAtCoordinate(view, line, x);
+        }
+
+        private static float convertToLocalHorizontalCoordinate(TextView view, float x) {
+            x -= view.getTotalPaddingLeft();
+            // Clamp the position to inside of the view.
+            x = Math.max(0.0f, x);
+            x = Math.min(view.getWidth() - view.getTotalPaddingRight() - 1, x);
+            x += view.getScrollX();
+            return x;
+        }
+
+        private static int getLineAtCoordinate(TextView view, float y) {
+            y -= view.getTotalPaddingTop();
+            // Clamp the position to inside of the view.
+            y = Math.max(0.0f, y);
+            y = Math.min(view.getHeight() - view.getTotalPaddingBottom() - 1, y);
+            y += view.getScrollY();
+            return view.getLayout().getLineForVertical((int) y);
+        }
+
+        private static int getOffsetAtCoordinate(TextView view, int line, float x) {
+            x = convertToLocalHorizontalCoordinate(view, x);
+            return view.getLayout().getOffsetForHorizontal(line, x);
+        }
     }
 }
diff --git a/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/util/LinkAccessibilityHelperTest.java
similarity index 75%
rename from library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java
rename to library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/util/LinkAccessibilityHelperTest.java
index 844e73e..6228e6f 100644
--- a/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java
+++ b/library/gingerbread/test/instrumentation/src/com/android/setupwizardlib/util/LinkAccessibilityHelperTest.java
@@ -14,29 +14,35 @@
  * limitations under the License.
  */
 
-package com.android.setupwizardlib.test;
+package com.android.setupwizardlib.util;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 
 import android.graphics.Rect;
-import android.os.Build;
 import android.os.Bundle;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.v4.text.BidiFormatter;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
 import android.support.v4.widget.ExploreByTouchHelper;
 import android.text.SpannableStringBuilder;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
+import android.widget.FrameLayout;
 import android.widget.TextView;
 
 import com.android.setupwizardlib.span.LinkSpan;
-import com.android.setupwizardlib.util.LinkAccessibilityHelper;
+import com.android.setupwizardlib.util.LinkAccessibilityHelper.PreOLinkAccessibilityHelper;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -52,13 +58,12 @@ public class LinkAccessibilityHelperTest {
     private static final LinkSpan LINK_SPAN = new LinkSpan("foobar");
 
     private TextView mTextView;
-    private TestLinkAccessibilityHelper mHelper;
+    private TestPreOLinkAccessibilityHelper mHelper;
 
     private DisplayMetrics mDisplayMetrics;
 
     @Test
     public void testGetVirtualViewAt() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         initTextView();
         final int virtualViewId = mHelper.getVirtualViewAt(dp2Px(15), dp2Px(10));
         assertEquals("Virtual view ID should be 1", 1, virtualViewId);
@@ -66,7 +71,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testGetVirtualViewAtHost() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         initTextView();
         final int virtualViewId = mHelper.getVirtualViewAt(dp2Px(100), dp2Px(100));
         assertEquals("Virtual view ID should be INVALID_ID",
@@ -75,7 +79,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testGetVisibleVirtualViews() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         initTextView();
         List virtualViewIds = new ArrayList<>();
         mHelper.getVisibleVirtualViews(virtualViewIds);
@@ -86,7 +89,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testOnPopulateEventForVirtualView() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         initTextView();
         AccessibilityEvent event = AccessibilityEvent.obtain();
         mHelper.onPopulateEventForVirtualView(1, event);
@@ -100,7 +102,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testOnPopulateEventForVirtualViewHost() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         initTextView();
         AccessibilityEvent event = AccessibilityEvent.obtain();
         mHelper.onPopulateEventForVirtualView(ExploreByTouchHelper.INVALID_ID, event);
@@ -113,7 +114,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testOnPopulateNodeForVirtualView() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         initTextView();
         AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
         mHelper.onPopulateNodeForVirtualView(1, info);
@@ -132,7 +132,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testNullLayout() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         initTextView();
         // Setting the padding will cause the layout to be null-ed out.
         mTextView.setPadding(1, 1, 1, 1);
@@ -150,7 +149,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testRtlLayout() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         SpannableStringBuilder ssb = new SpannableStringBuilder("מכונה בתרגום");
         ssb.setSpan(LINK_SPAN, 1, 2, 0 /* flags */);
         initTextView(ssb);
@@ -170,7 +168,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testMultilineLink() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         SpannableStringBuilder ssb = new SpannableStringBuilder(
                 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
                 + "Praesent accumsan efficitur eros eu porttitor.");
@@ -192,7 +189,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testRtlMultilineLink() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         String iwLoremIpsum = "אחר על רביעי אקטואליה. לוח דת אחרות המקובל רומנית, מיזמים מועמדים "
                 + "האנציקלופדיה בה צ'ט. מתן מה שנורו לערוך ייִדיש, בקר או החול אנתרופולוגיה, עוד "
                 + "דפים המחשב מיזמים ב.";
@@ -216,7 +212,6 @@ public class LinkAccessibilityHelperTest {
 
     @Test
     public void testBidiMultilineLink() {
-        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) return;
         String iwLoremIpsum = "אחר על רביעי אקטואליה. לוח דת אחרות המקובל רומנית, מיזמים מועמדים "
                 + "האנציקלופדיה בה צ'ט. מתן מה שנורו לערוך ייִדיש, בקר או החול אנתרופולוגיה, עוד "
                 + "דפים המחשב מיזמים ב.";
@@ -243,6 +238,70 @@ public class LinkAccessibilityHelperTest {
         info.recycle();
     }
 
+    @Test
+    public void testMethodDelegation() {
+        initTextView();
+        ExploreByTouchHelper delegate = mock(TestPreOLinkAccessibilityHelper.class);
+        LinkAccessibilityHelper helper = new LinkAccessibilityHelper(delegate);
+
+        AccessibilityEvent accessibilityEvent =
+                AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_CLICKED);
+
+        helper.sendAccessibilityEvent(mTextView, AccessibilityEvent.TYPE_VIEW_CLICKED);
+        verify(delegate).sendAccessibilityEvent(
+                same(mTextView),
+                eq(AccessibilityEvent.TYPE_VIEW_CLICKED));
+
+        helper.sendAccessibilityEventUnchecked(mTextView, accessibilityEvent);
+        verify(delegate).sendAccessibilityEventUnchecked(same(mTextView), same(accessibilityEvent));
+
+        helper.performAccessibilityAction(
+                mTextView,
+                AccessibilityActionCompat.ACTION_CLICK.getId(),
+                Bundle.EMPTY);
+        verify(delegate).performAccessibilityAction(
+                same(mTextView),
+                eq(AccessibilityActionCompat.ACTION_CLICK.getId()),
+                eq(Bundle.EMPTY));
+
+        helper.dispatchPopulateAccessibilityEvent(
+                mTextView,
+                accessibilityEvent);
+        verify(delegate).dispatchPopulateAccessibilityEvent(
+                same(mTextView),
+                same(accessibilityEvent));
+
+        MotionEvent motionEvent = MotionEvent.obtain(0, 0, 0, 0, 0, 0);
+        helper.dispatchHoverEvent(motionEvent);
+        verify(delegate).dispatchHoverEvent(eq(motionEvent));
+
+        helper.getAccessibilityNodeProvider(mTextView);
+        verify(delegate).getAccessibilityNodeProvider(same(mTextView));
+
+        helper.onInitializeAccessibilityEvent(mTextView, accessibilityEvent);
+        verify(delegate).onInitializeAccessibilityEvent(
+                same(mTextView),
+                eq(accessibilityEvent));
+
+        AccessibilityNodeInfoCompat accessibilityNodeInfo = AccessibilityNodeInfoCompat.obtain();
+        helper.onInitializeAccessibilityNodeInfo(mTextView, accessibilityNodeInfo);
+        verify(delegate).onInitializeAccessibilityNodeInfo(
+                same(mTextView),
+                same(accessibilityNodeInfo));
+
+        helper.onPopulateAccessibilityEvent(mTextView, accessibilityEvent);
+        verify(delegate).onPopulateAccessibilityEvent(
+                same(mTextView),
+                same(accessibilityEvent));
+
+        FrameLayout parent = new FrameLayout(InstrumentationRegistry.getTargetContext());
+        helper.onRequestSendAccessibilityEvent(parent, mTextView, accessibilityEvent);
+        verify(delegate).onRequestSendAccessibilityEvent(
+                same(parent),
+                same(mTextView),
+                same(accessibilityEvent));
+    }
+
     private void initTextView() {
         SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
         ssb.setSpan(LINK_SPAN, 1, 2, 0 /* flags */);
@@ -254,7 +313,7 @@ public class LinkAccessibilityHelperTest {
         mTextView.setSingleLine(false);
         mTextView.setText(text);
         mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
-        mHelper = new TestLinkAccessibilityHelper(mTextView);
+        mHelper = new TestPreOLinkAccessibilityHelper(mTextView);
 
         int measureExactly500dp = View.MeasureSpec.makeMeasureSpec(dp2Px(500),
                 View.MeasureSpec.EXACTLY);
@@ -270,9 +329,9 @@ public class LinkAccessibilityHelperTest {
         return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, mDisplayMetrics);
     }
 
-    private static class TestLinkAccessibilityHelper extends LinkAccessibilityHelper {
+    public static class TestPreOLinkAccessibilityHelper extends PreOLinkAccessibilityHelper {
 
-        TestLinkAccessibilityHelper(TextView view) {
+        TestPreOLinkAccessibilityHelper(TextView view) {
             super(view);
         }
 
diff --git a/library/standalone.gradle b/library/standalone.gradle
index a2119ac..132b908 100644
--- a/library/standalone.gradle
+++ b/library/standalone.gradle
@@ -16,5 +16,5 @@
 
 apply from: 'standalone-rules.gradle'
 
-android.compileSdkVersion 25
-android.buildToolsVersion '25.0.0'
+android.compileSdkVersion 26
+android.buildToolsVersion '26.0.0'
diff --git a/tools/gradle/android.properties b/tools/gradle/android.properties
index 75de660..b4a1e0c 100644
--- a/tools/gradle/android.properties
+++ b/tools/gradle/android.properties
@@ -1,6 +1,6 @@
 // Set the default SDK and build tools version for all apps
-compileSdkVersion 25
-buildToolsVersion = '25.0.0'
+compileSdkVersion 26
+buildToolsVersion = '26.0.0'
 
 // enable Java7
 compileOptions.sourceCompatibility JavaVersion.VERSION_1_7

From beea4d67b53a2ee83eb85df452fdac5add971754 Mon Sep 17 00:00:00 2001
From: Ajay Nadathur 
Date: Mon, 16 Oct 2017 16:02:33 -0700
Subject: [PATCH 20/75] Add "isPreDeferredSetupWizard" to WizardManagerHelper

bug: 67782334
Test: Manually tested
Change-Id: Ic75eac6fd743a526e2cf61a12eecf66da7fa02b1
---
 .../setupwizardlib/util/WizardManagerHelper.java   | 14 ++++++++++++++
 .../util/WizardManagerHelperTest.java              |  8 ++++++++
 2 files changed, 22 insertions(+)

diff --git a/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java b/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
index a93694c..896c013 100644
--- a/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
+++ b/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
@@ -45,6 +45,8 @@ public class WizardManagerHelper {
     static final String EXTRA_IS_FIRST_RUN = "firstRun";
     @VisibleForTesting
     static final String EXTRA_IS_DEFERRED_SETUP = "deferredSetup";
+    @VisibleForTesting
+    static final String EXTRA_IS_PRE_DEFERRED_SETUP = "preDeferredSetup";
 
     public static final String EXTRA_THEME = "theme";
     public static final String EXTRA_USE_IMMERSIVE_MODE = "useImmersiveMode";
@@ -212,6 +214,18 @@ public class WizardManagerHelper {
                 && originalIntent.getBooleanExtra(EXTRA_IS_DEFERRED_SETUP, false);
     }
 
+    /**
+     * Checks whether an intent is running in "pre-deferred" setup wizard flow.
+     *
+     * @param originalIntent The original intent that was used to start the step, usually via
+     *                       {@link android.app.Activity#getIntent()}.
+     * @return true if the intent passed in was running in "pre-deferred" setup wizard.
+     */
+    public static boolean isPreDeferredSetupWizard(Intent originalIntent) {
+        return originalIntent != null
+                && originalIntent.getBooleanExtra(EXTRA_IS_PRE_DEFERRED_SETUP, false);
+    }
+
     /**
      * Checks the intent whether the extra indicates that the light theme should be used or not. If
      * the theme is not specified in the intent, or the theme specified is unknown, the value def
diff --git a/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java b/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
index 4c460c8..6477b51 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
@@ -87,6 +87,14 @@ public class WizardManagerHelperTest {
                 WizardManagerHelper.isDeferredSetupWizard(intent));
     }
 
+    @Test
+    public void testIsPreDeferredSetupTrue() {
+        final Intent intent = new Intent();
+        intent.putExtra("preDeferredSetup", true);
+        assertTrue("Is pre-deferred setup wizard should be true",
+                WizardManagerHelper.isPreDeferredSetupWizard(intent));
+    }
+
     @Test
     public void testIsSetupWizardFalse() {
         final Intent intent = new Intent();

From 88d7f0d37007e13601b6ead3ca039ece20ef94d7 Mon Sep 17 00:00:00 2001
From: Ajay Nadathur 
Date: Tue, 31 Oct 2017 14:43:49 -0700
Subject: [PATCH 21/75] Intent extra PRE_DEFERRED_SETUP should be copied

Test: Robolectric tests updated, manually tested and verified extra
copied
Change-Id: I282ab5e0121fb41be5f082eec77019d3e6d3a369
---
 .../util/WizardManagerHelper.java               | 17 ++++++++++-------
 .../util/WizardManagerHelperTest.java           |  3 +++
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java b/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
index 896c013..32929aa 100644
--- a/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
+++ b/library/main/src/com/android/setupwizardlib/util/WizardManagerHelper.java
@@ -27,6 +27,8 @@ import android.support.annotation.VisibleForTesting;
 
 import com.android.setupwizardlib.R;
 
+import java.util.Arrays;
+
 public class WizardManagerHelper {
 
     private static final String ACTION_NEXT = "com.android.wizard.NEXT";
@@ -142,13 +144,14 @@ public class WizardManagerHelper {
      */
     public static void copyWizardManagerExtras(Intent srcIntent, Intent dstIntent) {
         dstIntent.putExtra(EXTRA_WIZARD_BUNDLE, srcIntent.getBundleExtra(EXTRA_WIZARD_BUNDLE));
-        dstIntent.putExtra(EXTRA_THEME, srcIntent.getStringExtra(EXTRA_THEME));
-        dstIntent.putExtra(EXTRA_IS_FIRST_RUN,
-                srcIntent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false));
-        dstIntent.putExtra(EXTRA_IS_DEFERRED_SETUP,
-                srcIntent.getBooleanExtra(EXTRA_IS_DEFERRED_SETUP, false));
-        dstIntent.putExtra(EXTRA_SCRIPT_URI, srcIntent.getStringExtra(EXTRA_SCRIPT_URI));
-        dstIntent.putExtra(EXTRA_ACTION_ID, srcIntent.getStringExtra(EXTRA_ACTION_ID));
+        for (String key : Arrays.asList(
+                EXTRA_IS_FIRST_RUN, EXTRA_IS_DEFERRED_SETUP, EXTRA_IS_PRE_DEFERRED_SETUP)) {
+            dstIntent.putExtra(key, srcIntent.getBooleanExtra(key, false));
+        }
+
+        for (String key : Arrays.asList(EXTRA_THEME, EXTRA_SCRIPT_URI, EXTRA_ACTION_ID)) {
+            dstIntent.putExtra(key, srcIntent.getStringExtra(key));
+        }
     }
 
     /**
diff --git a/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java b/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
index 6477b51..c236bb5 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/util/WizardManagerHelperTest.java
@@ -274,6 +274,7 @@ public class WizardManagerHelperTest {
                 .putExtra(WizardManagerHelper.EXTRA_WIZARD_BUNDLE, wizardBundle)
                 .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
                 .putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, true)
+                .putExtra(WizardManagerHelper.EXTRA_IS_PRE_DEFERRED_SETUP, true)
                 // Script URI and Action ID are kept for backwards compatibility
                 .putExtra(WizardManagerHelper.EXTRA_SCRIPT_URI, "test_script_uri")
                 .putExtra(WizardManagerHelper.EXTRA_ACTION_ID, "test_action_id");
@@ -292,6 +293,8 @@ public class WizardManagerHelperTest {
                 intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, false));
         assertTrue("EXTRA_IS_DEFERRED_SETUP should be copied",
                 intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, false));
+        assertTrue("EXTRA_IS_PRE_DEFERRED_SETUP should be copied",
+                intent.getBooleanExtra(WizardManagerHelper.EXTRA_IS_PRE_DEFERRED_SETUP, false));
 
         // Script URI and Action ID are replaced by Wizard Bundle in M, but are kept for backwards
         // compatibility

From 58195c5316855122593366bd867ed51a91bd5c11 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Thu, 2 Nov 2017 20:52:08 -0700
Subject: [PATCH 22/75] Hide icon view if icon is null

To remove the extra margin when the icon is not used.

Test: ./gradlew connectedAndroidTest
Bug: 68826871
Change-Id: Ic23307a28b2829fdbe029c61f912f04bab90ca13
---
 library/main/res/layout/suw_glif_header.xml           |  3 ++-
 .../android/setupwizardlib/template/IconMixin.java    |  2 ++
 .../setupwizardlib/template/IconMixinTest.java        | 11 +++++++++++
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/library/main/res/layout/suw_glif_header.xml b/library/main/res/layout/suw_glif_header.xml
index b090f79..cfabcb1 100644
--- a/library/main/res/layout/suw_glif_header.xml
+++ b/library/main/res/layout/suw_glif_header.xml
@@ -26,7 +26,8 @@
         style="@style/SuwGlifIcon"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:contentDescription="@null" />
+        android:contentDescription="@null"
+        android:visibility="gone" />
 
     
Date: Fri, 3 Nov 2017 12:16:04 -0700
Subject: [PATCH 23/75] Allow GlifLayout to not request fullscreen

For usage with app bars or inside another layout, GlifLayout should
not request fullscreen. Add a flag to allow disabling that.

Test: ./gradlew test
Bug: 68826871
Change-Id: Ie6a7f91628af5b861e8ba91e62a3f1c9c390aebf
---
 library/main/res/values/attrs.xml             |  1 +
 .../android/setupwizardlib/GlifLayout.java    | 11 +++++---
 .../setupwizardlib/GlifLayoutTest.java        | 27 +++++++++++++++++++
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/library/main/res/values/attrs.xml b/library/main/res/values/attrs.xml
index 36d5fb7..d378bb0 100644
--- a/library/main/res/values/attrs.xml
+++ b/library/main/res/values/attrs.xml
@@ -102,6 +102,7 @@
         
         
         
+        
     
 
     
diff --git a/library/main/src/com/android/setupwizardlib/GlifLayout.java b/library/main/src/com/android/setupwizardlib/GlifLayout.java
index f4d52a5..dd0963b 100644
--- a/library/main/src/com/android/setupwizardlib/GlifLayout.java
+++ b/library/main/src/com/android/setupwizardlib/GlifLayout.java
@@ -77,6 +77,8 @@ public class GlifLayout extends TemplateLayout {
     @Nullable
     private ColorStateList mBackgroundBaseColor;
 
+    private boolean mLayoutFullscreen = true;
+
     public GlifLayout(Context context) {
         this(context, 0, 0);
     }
@@ -139,7 +141,13 @@ public class GlifLayout extends TemplateLayout {
             inflateFooter(footer);
         }
 
+        mLayoutFullscreen = a.getBoolean(R.styleable.SuwGlifLayout_suwLayoutFullscreen, true);
+
         a.recycle();
+
+        if (Build.VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP && mLayoutFullscreen) {
+            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+        }
     }
 
     @Override
@@ -280,9 +288,6 @@ public class GlifLayout extends TemplateLayout {
                 patternBg.setBackgroundDrawable(background);
             }
         }
-        if (Build.VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
-            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
-        }
     }
 
     public boolean isProgressBarShown() {
diff --git a/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java b/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java
index d46409d..967a52e 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java
@@ -32,6 +32,7 @@ import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.os.Build.VERSION_CODES;
 import android.support.annotation.IdRes;
 import android.view.ContextThemeWrapper;
 import android.view.View;
@@ -266,6 +267,32 @@ public class GlifLayoutTest {
         assertNotNull(layout.findViewById(android.R.id.text1));
     }
 
+    @Config(sdk = { VERSION_CODES.M, Config.NEWEST_SDK })
+    @Test
+    public void createFromXml_shouldSetLayoutFullscreen_whenLayoutFullscreenIsNotSet() {
+        GlifLayout layout = new GlifLayout(
+                mContext,
+                Robolectric.buildAttributeSet()
+                        .build());
+
+        assertEquals(
+                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,
+                layout.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+    }
+
+    @Test
+    public void createFromXml_shouldNotSetLayoutFullscreen_whenLayoutFullscreenIsFalse() {
+        GlifLayout layout = new GlifLayout(
+                mContext,
+                Robolectric.buildAttributeSet()
+                        .addAttribute(R.attr.suwLayoutFullscreen, "false")
+                        .build());
+
+        assertEquals(
+                0,
+                layout.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+    }
+
     private Drawable getPhoneBackground(GlifLayout layout) {
         final StatusBarBackgroundLayout patternBg =
                 (StatusBarBackgroundLayout) layout.findManagedViewById(R.id.suw_pattern_bg);

From 33b56523998c90d5313b3f8f7a1f2eb29099e562 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Wed, 8 Nov 2017 11:15:55 -0800
Subject: [PATCH 24/75] Always compose GlifPatternDrawable using alpha

The color filter approach is broken in P, and the alpha approach
achieves the same result despite being slightly less efficient.

Test: Manual
Bug: 69039551
Change-Id: I1e1ee0bc89723995da69f272995b4825316a78dc
---
 .../setupwizardlib/GlifPatternDrawable.java   | 23 ++++---------------
 1 file changed, 4 insertions(+), 19 deletions(-)

diff --git a/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java b/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java
index 51c1a49..c1d968a 100644
--- a/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java
+++ b/library/main/src/com/android/setupwizardlib/GlifPatternDrawable.java
@@ -23,7 +23,6 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.ColorFilter;
-import android.graphics.ColorMatrixColorFilter;
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.PixelFormat;
@@ -96,7 +95,6 @@ public class GlifPatternDrawable extends Drawable {
 
     private int mColor;
     private Paint mTempPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-    private ColorFilter mColorFilter;
 
     public GlifPatternDrawable(int color) {
         setColor(color);
@@ -140,17 +138,10 @@ public class GlifPatternDrawable extends Drawable {
         canvas.clipRect(bounds);
 
         scaleCanvasToBounds(canvas, bitmap, bounds);
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
-                && canvas.isHardwareAccelerated()) {
-            mTempPaint.setColorFilter(mColorFilter);
-            canvas.drawBitmap(bitmap, 0, 0, mTempPaint);
-        } else {
-            // Software renderer doesn't work properly with ColorMatrix filter on ALPHA_8 bitmaps.
-            canvas.drawColor(Color.BLACK);
-            mTempPaint.setColor(Color.WHITE);
-            canvas.drawBitmap(bitmap, 0, 0, mTempPaint);
-            canvas.drawColor(mColor);
-        }
+        canvas.drawColor(Color.BLACK);
+        mTempPaint.setColor(Color.WHITE);
+        canvas.drawBitmap(bitmap, 0, 0, mTempPaint);
+        canvas.drawColor(mColor);
 
         canvas.restore();
     }
@@ -299,12 +290,6 @@ public class GlifPatternDrawable extends Drawable {
         final int g = Color.green(color);
         final int b = Color.blue(color);
         mColor = Color.argb(COLOR_ALPHA_INT, r, g, b);
-        mColorFilter = new ColorMatrixColorFilter(new float[] {
-                0, 0, 0, 1 - COLOR_ALPHA, r * COLOR_ALPHA,
-                0, 0, 0, 1 - COLOR_ALPHA, g * COLOR_ALPHA,
-                0, 0, 0, 1 - COLOR_ALPHA, b * COLOR_ALPHA,
-                0, 0, 0,               0,             255
-        });
         invalidateSelf();
     }
 

From fe4a75413551caa580537f80066396e3e69bac9f Mon Sep 17 00:00:00 2001
From: Aurimas Liutikas 
Date: Fri, 10 Nov 2017 18:59:14 +0000
Subject: [PATCH 25/75] Fix import of android-support-annotations

Bug: 69161825
Change-Id: Ic48ec4a3a5125ebc1fe83ae9b23e7696cd7c0cef
---
 library/Android.mk | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/library/Android.mk b/library/Android.mk
index 26f5e1f..030733e 100644
--- a/library/Android.mk
+++ b/library/Android.mk
@@ -43,8 +43,10 @@ LOCAL_SRC_FILES := $(call all-java-files-under, main/src gingerbread/src recycle
 
 ifdef LOCAL_USE_AAPT2
 
+LOCAL_JAVA_LIBRARIES := \
+    android-support-annotations
+
 LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-annotations \
     android-support-compat \
     android-support-core-ui \
     android-support-v7-appcompat \

From 4d2145974cef3022ec4162d77ef50d74a720c4f0 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Tue, 21 Nov 2017 18:39:27 -0800
Subject: [PATCH 26/75] Specify colorBackground in material theme

Lollipop and Marshmallow have different background colors. Specify
the color in SuwThemeMaterial so they are consistent across OS
versions.

Test: Manual
Bug: 69563212
Change-Id: Ice36a8f74796c0dd804fa897d74188c9ff88354d
---
 library/gingerbread/res/values/styles.xml  | 2 ++
 library/main/res/values/colors.xml         | 2 ++
 library/platform/res/values-v23/styles.xml | 2 ++
 3 files changed, 6 insertions(+)

diff --git a/library/gingerbread/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index 6e525ef..b556f07 100644
--- a/library/gingerbread/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -20,6 +20,7 @@
     
 
     
 
     
 
     
+
+    
+
     
 
-    
-    
 
-    
-    
@@ -94,11 +88,10 @@
         gravity
     
 
-    
-
-    
 
@@ -211,7 +204,10 @@
         false
     
 
-    
 
+    
+
     
 
     
 
+    
+
     
 
     
 
+    
+    
 
+    
+    
@@ -88,10 +94,11 @@
         gravity
     
 
-    
-    
+
+    
 
@@ -204,10 +211,7 @@
         false
     
 
-    
-    
 
-    
-    
 
-    
-    
@@ -94,11 +88,10 @@
         gravity
     
 
-    
-
-    
 
@@ -211,7 +204,10 @@
         false
     
 
-    
 
+    
+
 
diff --git a/library/main/res/values/attrs.xml b/library/main/res/values/attrs.xml
index ec21f87..7820a6d 100644
--- a/library/main/res/values/attrs.xml
+++ b/library/main/res/values/attrs.xml
@@ -21,6 +21,7 @@
     
     
     
+    
 
     
diff --git a/library/main/res/values/colors.xml b/library/main/res/values/colors.xml
index 7d2575e..b653c98 100644
--- a/library/main/res/values/colors.xml
+++ b/library/main/res/values/colors.xml
@@ -45,5 +45,6 @@
     #ff000000
     #ffffffff
     #ff1a73e8
+    #F1F3F4
 
 
diff --git a/library/main/res/values/dimens.xml b/library/main/res/values/dimens.xml
index 5978a4e..f5c2563 100644
--- a/library/main/res/values/dimens.xml
+++ b/library/main/res/values/dimens.xml
@@ -135,4 +135,7 @@
     -7dp
     7dp
 
+    
+    56dp
+
 
diff --git a/library/main/res/values/styles.xml b/library/main/res/values/styles.xml
index 0e7685b..e315795 100644
--- a/library/main/res/values/styles.xml
+++ b/library/main/res/values/styles.xml
@@ -30,6 +30,8 @@
         ?attr/suwMarginSides
         center_horizontal
         top|bottom
+        @color/suw_glif_edittext_bg_light_color 
+        @style/SuwEditText
     
 
     
@@ -46,6 +48,8 @@
         ?attr/suwMarginSides
         center_horizontal
         top|bottom
+        @color/suw_glif_edittext_bg_light_color
+        @style/SuwEditText
     
 
     
@@ -317,4 +321,9 @@
         ?android:attr/textColorPrimary
     
 
+
+    
+
 

From a820a7f85d1e7933a9d3e8b6d1e80fd7a1ca37bf Mon Sep 17 00:00:00 2001
From: Jeff Davidson 
Date: Thu, 14 Dec 2017 14:48:22 -0800
Subject: [PATCH 35/75] Add 'compat' flavor dimension to SUW lib.

Change-Id: I6538454ba777730f3a75cffda737a07901521733
Test: Gradle sync with 2.3 plugin.
---
 library/rules.gradle | 79 ++++++++++++++++++++++----------------------
 1 file changed, 39 insertions(+), 40 deletions(-)

diff --git a/library/rules.gradle b/library/rules.gradle
index f5face8..54ea68b 100644
--- a/library/rules.gradle
+++ b/library/rules.gradle
@@ -13,6 +13,22 @@ android {
 
     publishNonDefault true
 
+    flavorDimensions 'compat'
+
+    productFlavors {
+        // Platform version that will not include the compatibility libraries
+        platform {
+            dimension 'compat'
+            minSdkVersion 23
+        }
+
+        // Provides backwards compatibility for Gingerbread or above, using support libraries.
+        gingerbreadCompat {
+            dimension 'compat'
+            minSdkVersion 9
+        }
+    }
+
     sourceSets {
         main {
             manifest.srcFile 'main/AndroidManifest.xml'
@@ -21,46 +37,6 @@ android {
             res.srcDirs = ['main/res']
         }
 
-        flavorDimensions 'compat'
-
-        productFlavors {
-            // Platform version that will not include the compatibility libraries
-            platform {
-                dimension 'compat'
-                minSdkVersion 23
-
-                dependencies {
-                    // Read the dependencies from the "deps" map in the extra properties.
-                    //
-                    // For builds in the Android tree we want to build the dependencies from source
-                    // for reproducible builds, for example in build.gradle define something like
-                    // this:
-                    //      ext {
-                    //          deps = ['project-name': project(':project-path')]
-                    //      }
-                    //
-                    // For standalone project clients, since the source may not be available, we
-                    // fetch the dependencies from maven. For example in standalone.gradle define
-                    // something like this:
-                    //      ext {
-                    //          deps = ['project-name': 'com.example.group:project-name:1.0.0']
-                    //      }
-                    //
-                    platformImplementation deps['support-annotations']
-                }
-            }
-
-            // Provides backwards compatibility for Gingerbread or above, using support libraries.
-            gingerbreadCompat {
-                dimension 'compat'
-                minSdkVersion 9
-                dependencies {
-                    gingerbreadCompatImplementation deps['support-appcompat-v7']
-                    gingerbreadCompatImplementation deps['support-recyclerview-v7']
-                }
-            }
-        }
-
         platform {
             java.srcDirs = ['platform/src']
             res.srcDirs = ['platform/res']
@@ -72,3 +48,26 @@ android {
         }
     }
 }
+
+dependencies {
+    // Read the dependencies from the "deps" map in the extra properties.
+    //
+    // For builds in the Android tree we want to build the dependencies from source
+    // for reproducible builds, for example in build.gradle define something like
+    // this:
+    //      ext {
+    //          deps = ['project-name': project(':project-path')]
+    //      }
+    //
+    // For standalone project clients, since the source may not be available, we
+    // fetch the dependencies from maven. For example in standalone.gradle define
+    // something like this:
+    //      ext {
+    //          deps = ['project-name': 'com.example.group:project-name:1.0.0']
+    //      }
+    //
+    platformCompile deps['support-annotations']
+
+    gingerbreadCompatCompile deps['support-appcompat-v7']
+    gingerbreadCompatCompile deps['support-recyclerview-v7']
+}

From 2cb1021b95ed1d74aa0357db93f3f8155698a4af Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Thu, 14 Dec 2017 16:22:40 -0800
Subject: [PATCH 36/75] Rename GM progress bar to FourColor

Test: Existing tests pass
Bug: 63074068
Change-Id: Ib0ab34b556934de71920862fbd1d4b194f3db8a8
---
 library/gingerbread/res/values/styles.xml           | 2 +-
 library/main/res/layout/suw_glif_loading_screen.xml | 2 +-
 library/main/res/values-v21/styles.xml              | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/library/gingerbread/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index 1653938..ff8a685 100644
--- a/library/gingerbread/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -248,7 +248,7 @@
 
     
diff --git a/library/main/res/layout/suw_glif_loading_screen.xml b/library/main/res/layout/suw_glif_loading_screen.xml
index ecf932e..676ab34 100644
--- a/library/main/res/layout/suw_glif_loading_screen.xml
+++ b/library/main/res/layout/suw_glif_loading_screen.xml
@@ -31,7 +31,7 @@
 
         
 
diff --git a/library/main/res/values-v21/styles.xml b/library/main/res/values-v21/styles.xml
index f78149b..a77c32c 100644
--- a/library/main/res/values-v21/styles.xml
+++ b/library/main/res/values-v21/styles.xml
@@ -44,7 +44,7 @@
 
     
 
+    
+
+    
+
     
 
     
 
     
 
@@ -45,18 +45,10 @@
         ?attr/suwMarginSides
         center_horizontal
         top|bottom
-        @color/suw_glif_edittext_bg_light_color
+        @color/suw_glif_edit_text_bg_light_color
         @style/SuwEditText
     
 
-    
-
-    
-
     
 
+    
+
+    
+
     
 
     
 
+
+    
 
     
 
     
+
diff --git a/library/gingerbread/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index d9930f4..60a39a0 100644
--- a/library/gingerbread/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -159,9 +159,10 @@
         @color/suw_color_accent_glif_v3
     
 
-    
+    
 
     
diff --git a/library/rules.gradle b/library/rules.gradle
index e261a4c..f6dfafc 100644
--- a/library/rules.gradle
+++ b/library/rules.gradle
@@ -19,7 +19,7 @@ android {
         // DEPRECATED: Platform version that will not include the compatibility libraries
         platformDeprecated {
             dimension 'compat'
-            minSdkVersion 23
+            minSdkVersion 27
         }
 
         // Provides backwards compatibility for Gingerbread or above, using support libraries.
diff --git a/library/self.gradle b/library/self.gradle
index 4f9c5ba..008797a 100644
--- a/library/self.gradle
+++ b/library/self.gradle
@@ -50,8 +50,8 @@ android.sourceSets {
         java.srcDirs = ['test/robotest/src']
 
         dependencies {
-            testImplementation 'org.robolectric:robolectric:3.4.2'
-            testImplementation 'org.robolectric:framework:3.4.2'
+            testImplementation 'org.robolectric:robolectric:3.6.1'
+            testImplementation 'org.robolectric:shadows-framework:3.6.1'
             testImplementation 'junit:junit:4.+'
             testImplementation 'org.mockito:mockito-core:1.9.5'
             // Workaround for https://github.com/robolectric/robolectric/issues/2566
diff --git a/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java b/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java
index e07d5fa..d2d1ee0 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/GlifLayoutTest.java
@@ -32,6 +32,7 @@ import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
+import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
 import android.support.annotation.IdRes;
 import android.view.ContextThemeWrapper;
@@ -308,17 +309,18 @@ public class GlifLayoutTest {
         inflateStickyHeader_whenOnBlankTemplate_shouldAddViewToLayout();
     }
 
-    @Config(sdk = { VERSION_CODES.M, Config.NEWEST_SDK })
+    @Config(minSdk = Config.OLDEST_SDK, maxSdk = Config.NEWEST_SDK)
     @Test
     public void createFromXml_shouldSetLayoutFullscreen_whenLayoutFullscreenIsNotSet() {
         GlifLayout layout = new GlifLayout(
                 mContext,
                 Robolectric.buildAttributeSet()
                         .build());
-
-        assertEquals(
-                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,
-                layout.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+        if (VERSION.SDK_INT >= VERSION_CODES.M) {
+            assertEquals(
+                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,
+                    layout.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
+        }
     }
 
     @Test
diff --git a/library/test/robotest/src/com/android/setupwizardlib/util/GlifV3StyleTest.java b/library/test/robotest/src/com/android/setupwizardlib/util/GlifV3StyleTest.java
new file mode 100644
index 0000000..ffc40da
--- /dev/null
+++ b/library/test/robotest/src/com/android/setupwizardlib/util/GlifV3StyleTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.setupwizardlib.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+
+import com.android.setupwizardlib.R;
+import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+
+@RunWith(SuwLibRobolectricTestRunner.class)
+@Config(minSdk = Config.OLDEST_SDK, maxSdk = Config.NEWEST_SDK)
+public class GlifV3StyleTest {
+
+    @Test
+    public void activityWithGlifV3Theme_shouldUseLightNavBarOnV27OrAbove() {
+        GlifThemeActivity activity = Robolectric.setupActivity(GlifThemeActivity.class);
+        if (VERSION.SDK_INT >= VERSION_CODES.O_MR1) {
+            assertEquals(
+                    activity.getWindow().getNavigationBarColor(),
+                    Color.WHITE);
+            int vis = activity.getWindow().getDecorView().getSystemUiVisibility();
+            assertTrue((vis & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0);
+        } else if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
+            assertEquals(
+                    activity.getWindow().getNavigationBarColor(),
+                    Color.BLACK);
+        }
+        // Nav bar color is not customizable pre-L
+    }
+
+    private static class GlifThemeActivity extends Activity {
+
+        @Override
+        protected void onCreate(@Nullable Bundle savedInstanceState) {
+            setTheme(R.style.SuwThemeGlifV3_Light);
+            super.onCreate(savedInstanceState);
+        }
+    }
+}

From 78bc2e0c900935ed00e111a0c4b93b50d883e2b9 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Thu, 11 Jan 2018 18:43:23 -0800
Subject: [PATCH 48/75] Implement GLIF v3 button style

Buttons are now sentence case and uses Google sans font if available.

Test: ./gradlew test
Bug: 71759812
Change-Id: Ibb42b58306163f387837600ca52e73065c2b0d9d
---
 library/gingerbread/res/values/styles.xml      | 18 ++++++++++++++++++
 library/main/res/values/attrs.xml              |  2 ++
 library/main/res/values/config.xml             |  3 +++
 library/main/res/values/styles.xml             |  4 +++-
 library/platform/res/values-v27/styles.xml     | 18 ++++++++++++++++++
 library/self.gradle                            |  1 +
 .../setupwizardlib/util/GlifV3StyleTest.java   | 17 +++++++++++++++++
 7 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/library/gingerbread/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index 60a39a0..7a01fe7 100644
--- a/library/gingerbread/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -39,6 +39,8 @@
         @style/SuwFillContentLayout
         ?attr/suwMarginSides
         ?attr/suwMarginSides
+        true
+        sans-serif
         @drawable/suw_card_bg_dark
         0dp
         @dimen/suw_items_icon_divider_inset
@@ -71,6 +73,8 @@
         @style/SuwFillContentLayout
         ?attr/suwMarginSides
         ?attr/suwMarginSides
+        true
+        sans-serif
         @drawable/suw_card_bg_light
         0dp
         @dimen/suw_items_icon_divider_inset
@@ -103,6 +107,8 @@
         @color/suw_color_accent_glif_dark
         ?attr/suwMarginSides
         ?attr/suwMarginSides
+        true
+        sans-serif
         ?attr/colorPrimary
         @style/SuwFillContentLayout
         0dp
@@ -139,6 +145,8 @@
         @color/suw_color_accent_glif_light
         ?attr/suwMarginSides
         ?attr/suwMarginSides
+        true
+        sans-serif
         ?attr/colorPrimary
         @style/SuwFillContentLayout
         0dp
@@ -157,10 +165,14 @@
 
     
 
     
     
 
     
 
@@ -268,7 +270,7 @@
         ?attr/suwMarginSides
         ?attr/suwMarginSides
         @dimen/suw_glif_header_title_margin_top
-        google-sans
+        @string/suwFontSecondary
         gravity
         ?android:attr/textColorPrimary
     
diff --git a/library/platform/res/values-v27/styles.xml b/library/platform/res/values-v27/styles.xml
index 4704ccf..1dcb1d9 100644
--- a/library/platform/res/values-v27/styles.xml
+++ b/library/platform/res/values-v27/styles.xml
@@ -41,6 +41,8 @@
         true
         adjustResize
 
+        true
+        sans-serif
         @drawable/suw_card_bg
         @style/SuwFillContentLayout
         0dp
@@ -70,6 +72,8 @@
         true
         adjustResize
 
+        true
+        sans-serif
         @drawable/suw_card_bg
         @style/SuwFillContentLayout
         0dp
@@ -102,6 +106,8 @@
         true
         adjustResize
 
+        true
+        sans-serif
         ?android:attr/colorPrimary
         @style/SuwFillContentLayout
         0dp
@@ -135,6 +141,8 @@
         true
         adjustResize
 
+        true
+        sans-serif
         ?android:attr/colorPrimary
         @style/SuwFillContentLayout
         0dp
@@ -151,12 +159,18 @@
 
     
 
     
 
     
@@ -168,8 +182,10 @@
         @style/SuwGlifButton.Primary
 
         
+        ?attr/suwButtonFontFamily
         @dimen/suw_glif_button_padding
         @dimen/suw_glif_button_padding
+        ?attr/suwButtonAllCaps
     
 
     
 
diff --git a/library/main/res/values/colors.xml b/library/main/res/values/colors.xml
index aaaf39f..005d1c6 100644
--- a/library/main/res/values/colors.xml
+++ b/library/main/res/values/colors.xml
@@ -47,5 +47,6 @@
     #ffffffff
     #fff1f3f4
     #ffffffff
+    #1f000000
 
 
diff --git a/library/platform/res/values-v27/styles.xml b/library/platform/res/values-v27/styles.xml
index 1dcb1d9..7ef0fee 100644
--- a/library/platform/res/values-v27/styles.xml
+++ b/library/platform/res/values-v27/styles.xml
@@ -167,6 +167,7 @@
     
 
     
     
 
     
 
     

From f0001e7af7d641c0ce3112fd913d83448725ae63 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Fri, 16 Feb 2018 12:40:25 -0800
Subject: [PATCH 55/75] Set color primary to color accent

For GLIF v3, color accent is changed, and color primary should be
changed to match as well.

Test: ./gradlew test
Bug: 73253714
Change-Id: I553f4eaccc75abaedad4cf9e31d003d6c1f64660
---
 library/gingerbread/res/values/styles.xml  | 4 ++--
 library/platform/res/values-v27/styles.xml | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/library/gingerbread/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index 1dca8cd..2287d27 100644
--- a/library/gingerbread/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -104,7 +104,7 @@
         adjustResize
 
         @color/suw_color_accent_glif_dark
-        @color/suw_color_accent_glif_dark
+        ?attr/colorAccent
         ?attr/suwMarginSides
         ?attr/suwMarginSides
         true
@@ -142,7 +142,7 @@
         adjustResize
 
         @color/suw_color_accent_glif_light
-        @color/suw_color_accent_glif_light
+        ?attr/colorAccent
         ?attr/suwMarginSides
         ?attr/suwMarginSides
         true
diff --git a/library/platform/res/values-v27/styles.xml b/library/platform/res/values-v27/styles.xml
index 9284818..4833d60 100644
--- a/library/platform/res/values-v27/styles.xml
+++ b/library/platform/res/values-v27/styles.xml
@@ -90,7 +90,7 @@
     
 
diff --git a/library/platform/res/values-v27/styles.xml b/library/platform/res/values-v27/styles.xml
index 7ef0fee..dd77992 100644
--- a/library/platform/res/values-v27/styles.xml
+++ b/library/platform/res/values-v27/styles.xml
@@ -17,7 +17,7 @@
 
 
-
+
 
     
 
@@ -167,8 +167,10 @@
     
 
     
     
 
     
diff --git a/library/main/res/values/attrs.xml b/library/main/res/values/attrs.xml
index 7a7580d..b3fcfe9 100644
--- a/library/main/res/values/attrs.xml
+++ b/library/main/res/values/attrs.xml
@@ -41,6 +41,7 @@
     
 
     
+    
     
     
     
diff --git a/library/main/res/values/dimens.xml b/library/main/res/values/dimens.xml
index f5c2563..69475b2 100644
--- a/library/main/res/values/dimens.xml
+++ b/library/main/res/values/dimens.xml
@@ -20,6 +20,7 @@
     
     40dp
 
+    2dp
     
     20dp
     
@@ -30,6 +31,8 @@
     24dp
     48dp
 
+    4dp
+
     
     4sp
     12dp
diff --git a/library/platform/res/values-v27/styles.xml b/library/platform/res/values-v27/styles.xml
index ba287fc..6e36919 100644
--- a/library/platform/res/values-v27/styles.xml
+++ b/library/platform/res/values-v27/styles.xml
@@ -15,6 +15,7 @@
     limitations under the License.
 -->
 
+
 
 
@@ -107,6 +108,7 @@
         adjustResize
 
         true
+        @dimen/suw_glif_button_corner_radius
         sans-serif
         ?android:attr/colorPrimary
         @style/SuwFillContentLayout
@@ -142,6 +144,7 @@
         adjustResize
 
         true
+        @dimen/suw_glif_button_corner_radius
         sans-serif
         ?android:attr/colorPrimary
         @style/SuwFillContentLayout
@@ -161,6 +164,7 @@
         @color/suw_color_accent_glif_v3
 
         false
+        @dimen/suw_glif_v3_button_corner_radius
         @string/suwFontSecondaryMedium
     
 
@@ -173,6 +177,7 @@
         true
 
         false
+        @dimen/suw_glif_v3_button_corner_radius
         @string/suwFontSecondaryMedium
     
 
@@ -189,6 +194,9 @@
         @dimen/suw_glif_button_padding
         @dimen/suw_glif_button_padding
         ?attr/suwButtonAllCaps
+
+        
+        ?attr/suwButtonCornerRadius
     
 
     
 
diff --git a/library/rules.gradle b/library/rules.gradle
index f6dfafc..9baa390 100644
--- a/library/rules.gradle
+++ b/library/rules.gradle
@@ -19,6 +19,7 @@ android {
         // DEPRECATED: Platform version that will not include the compatibility libraries
         platformDeprecated {
             dimension 'compat'
+            // TODO(yukl): Bump this file to v28 once we can properly test that
             minSdkVersion 27
         }
 

From bf0415d6a8f5f4c11da6c71b49753c26629e47f7 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Fri, 2 Mar 2018 13:18:33 -0800
Subject: [PATCH 60/75] Add null check for MediaPlayer

In IllustrationVideoView, in case creation of media player failed,
check for null and throw WTF instead of crashing with null pointer.

Test: ./gradlew test
Bug: 74090736
Change-Id: Id63027067cc687516f585503b5218f4467845039
---
 .../view/IllustrationVideoView.java           | 26 +++++++---
 .../setupwizardlib/shadow/ShadowLog.java      | 51 +++++++++++++++++++
 .../view/IllustrationVideoViewTest.java       | 15 ++++++
 3 files changed, 84 insertions(+), 8 deletions(-)
 create mode 100644 library/test/robotest/src/com/android/setupwizardlib/shadow/ShadowLog.java

diff --git a/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java b/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java
index 9c79eb5..e5c2fb1 100644
--- a/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java
+++ b/library/main/src/com/android/setupwizardlib/view/IllustrationVideoView.java
@@ -23,9 +23,11 @@ import android.graphics.SurfaceTexture;
 import android.graphics.drawable.Animatable;
 import android.media.MediaPlayer;
 import android.os.Build.VERSION_CODES;
+import android.support.annotation.Nullable;
 import android.support.annotation.RawRes;
 import android.support.annotation.VisibleForTesting;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.Surface;
 import android.view.TextureView;
 import android.view.View;
@@ -51,8 +53,11 @@ public class IllustrationVideoView extends TextureView implements Animatable,
         MediaPlayer.OnSeekCompleteListener,
         MediaPlayer.OnInfoListener {
 
+    private static final String TAG = "IllustrationVideoView";
+
     protected float mAspectRatio = 1.0f; // initial guess until we know
 
+    @Nullable // Can be null when media player fails to initialize
     protected MediaPlayer mMediaPlayer;
 
     private @RawRes int mVideoResId = 0;
@@ -129,15 +134,20 @@ public class IllustrationVideoView extends TextureView implements Animatable,
 
         mMediaPlayer = MediaPlayer.create(getContext(), mVideoResId);
 
-        mMediaPlayer.setSurface(mSurface);
-        mMediaPlayer.setOnPreparedListener(this);
-        mMediaPlayer.setOnSeekCompleteListener(this);
-        mMediaPlayer.setOnInfoListener(this);
+        if (mMediaPlayer != null) {
+            mMediaPlayer.setSurface(mSurface);
+            mMediaPlayer.setOnPreparedListener(this);
+            mMediaPlayer.setOnSeekCompleteListener(this);
+            mMediaPlayer.setOnInfoListener(this);
 
-        float aspectRatio = (float) mMediaPlayer.getVideoHeight() / mMediaPlayer.getVideoWidth();
-        if (mAspectRatio != aspectRatio) {
-            mAspectRatio = aspectRatio;
-            requestLayout();
+            float aspectRatio =
+                    (float) mMediaPlayer.getVideoHeight() / mMediaPlayer.getVideoWidth();
+            if (mAspectRatio != aspectRatio) {
+                mAspectRatio = aspectRatio;
+                requestLayout();
+            }
+        } else {
+            Log.wtf(TAG, "Unable to initialize media player for video view");
         }
         if (getWindowVisibility() == View.VISIBLE) {
             start();
diff --git a/library/test/robotest/src/com/android/setupwizardlib/shadow/ShadowLog.java b/library/test/robotest/src/com/android/setupwizardlib/shadow/ShadowLog.java
new file mode 100644
index 0000000..f1d37c8
--- /dev/null
+++ b/library/test/robotest/src/com/android/setupwizardlib/shadow/ShadowLog.java
@@ -0,0 +1,51 @@
+/*
+ * 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.setupwizardlib.shadow;
+
+import android.util.Log;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(Log.class)
+public class ShadowLog extends org.robolectric.shadows.ShadowLog {
+
+    public static boolean sWtfIsFatal = true;
+
+    public static class TerribleFailure extends RuntimeException {
+
+        public TerribleFailure(String msg, Throwable cause) {
+            super(msg, cause);
+        }
+    }
+
+    @Implementation
+    public static void wtf(String tag, String msg) {
+        org.robolectric.shadows.ShadowLog.wtf(tag, msg);
+        if (sWtfIsFatal) {
+            throw new TerribleFailure(msg, null);
+        }
+    }
+
+    @Implementation
+    public static void wtf(String tag, String msg, Throwable throwable) {
+        org.robolectric.shadows.ShadowLog.wtf(tag, msg, throwable);
+        if (sWtfIsFatal) {
+            throw new TerribleFailure(msg, throwable);
+        }
+    }
+}
diff --git a/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java b/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java
index 6db8852..21822a4 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/view/IllustrationVideoViewTest.java
@@ -18,6 +18,7 @@ package com.android.setupwizardlib.view;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
@@ -33,6 +34,8 @@ import android.view.Surface;
 
 import com.android.setupwizardlib.R;
 import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
+import com.android.setupwizardlib.shadow.ShadowLog;
+import com.android.setupwizardlib.shadow.ShadowLog.TerribleFailure;
 import com.android.setupwizardlib.view.IllustrationVideoViewTest.ShadowMockMediaPlayer;
 import com.android.setupwizardlib.view.IllustrationVideoViewTest.ShadowSurface;
 
@@ -55,6 +58,7 @@ import org.robolectric.util.ReflectionHelpers;
 @Config(
         sdk = Config.NEWEST_SDK,
         shadows = {
+                ShadowLog.class,
                 ShadowMockMediaPlayer.class,
                 ShadowSurface.class
         })
@@ -75,6 +79,17 @@ public class IllustrationVideoViewTest {
         ShadowMockMediaPlayer.reset();
     }
 
+    @Test
+    public void nullMediaPlayer_shouldThrowWtf() {
+        ShadowMockMediaPlayer.sMediaPlayer = null;
+        try {
+            createDefaultView();
+            fail("WTF should be thrown for null media player");
+        } catch (TerribleFailure e) {
+            // pass
+        }
+    }
+
     @Test
     public void testPausedWhenWindowFocusLost() {
         createDefaultView();

From 56ecb4d1e9cea33a978ab89b47accdc09c2b04cf Mon Sep 17 00:00:00 2001
From: Bill Yi 
Date: Tue, 6 Mar 2018 11:44:42 -0800
Subject: [PATCH 61/75] Import translations. DO NOT MERGE

Change-Id: If98c408c53ad5ceae4554fff46d8066558d0279c
Auto-generated-cl: translation import
---
 library/main/res/values-as/strings.xml | 23 +++++++++++++++++++++++
 library/main/res/values-or/strings.xml | 23 +++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 library/main/res/values-as/strings.xml
 create mode 100644 library/main/res/values-or/strings.xml

diff --git a/library/main/res/values-as/strings.xml b/library/main/res/values-as/strings.xml
new file mode 100644
index 0000000..be6e06b
--- /dev/null
+++ b/library/main/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+
+
+
+
+    "পৰৱৰ্তী"
+    "উভতি যাওক"
+    "অধিক"
+
diff --git a/library/main/res/values-or/strings.xml b/library/main/res/values-or/strings.xml
new file mode 100644
index 0000000..c4d12ff
--- /dev/null
+++ b/library/main/res/values-or/strings.xml
@@ -0,0 +1,23 @@
+
+
+
+
+    "ପରବର୍ତ୍ତୀ"
+    "ପଛକୁ ଫେରନ୍ତୁ"
+    "ଅଧିକ"
+

From c0b7a4fa0eedd16c5f4dfbd7da0e9b35f26d8316 Mon Sep 17 00:00:00 2001
From: Bill Yi 
Date: Tue, 6 Mar 2018 11:44:55 -0800
Subject: [PATCH 62/75] Import translations. DO NOT MERGE

Change-Id: If7d1a4a871997e9ad696b77397a3afc70a24a105
Auto-generated-cl: translation import
---
 navigationbar/res/values-as/strings.xml | 6 ++++++
 navigationbar/res/values-or/strings.xml | 6 ++++++
 2 files changed, 12 insertions(+)
 create mode 100644 navigationbar/res/values-as/strings.xml
 create mode 100644 navigationbar/res/values-or/strings.xml

diff --git a/navigationbar/res/values-as/strings.xml b/navigationbar/res/values-as/strings.xml
new file mode 100644
index 0000000..398ff1f
--- /dev/null
+++ b/navigationbar/res/values-as/strings.xml
@@ -0,0 +1,6 @@
+
+
+    "পৰৱৰ্তী"
+    "উভতি যাওক"
+
diff --git a/navigationbar/res/values-or/strings.xml b/navigationbar/res/values-or/strings.xml
new file mode 100644
index 0000000..4c70d06
--- /dev/null
+++ b/navigationbar/res/values-or/strings.xml
@@ -0,0 +1,6 @@
+
+
+    "ପରବର୍ତ୍ତୀ"
+    "ପଛକୁ ଫେରନ୍ତୁ"
+

From 15d9037e89d502c7deb9cbf81c0407d433a5706b Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Thu, 8 Mar 2018 18:33:42 -0800
Subject: [PATCH 63/75] Add touch feedback to tertiary buttons

Test: Manual, updated `./gradlew test`
Bug: 29574531
Change-Id: I1db6beb3bd4d6c4ab34e7dfeab79ed8976756332
(cherry picked from commit fc01f70b288135f0c4654a4c16a023f6fd52ebd0)
---
 library/main/res/values/dimens.xml                        | 2 ++
 library/main/res/values/styles.xml                        | 4 ++--
 .../com/android/setupwizardlib/util/GlifStyleTest.java    | 8 ++++----
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/library/main/res/values/dimens.xml b/library/main/res/values/dimens.xml
index 69475b2..be6b248 100644
--- a/library/main/res/values/dimens.xml
+++ b/library/main/res/values/dimens.xml
@@ -26,6 +26,8 @@
     
     8dp
     16dp
+    
+    -16dp
     8dp
     72dp
     24dp
diff --git a/library/main/res/values/styles.xml b/library/main/res/values/styles.xml
index dbd5358..fa2a080 100644
--- a/library/main/res/values/styles.xml
+++ b/library/main/res/values/styles.xml
@@ -195,10 +195,10 @@
         @style/SuwGlifButton.Tertiary
         @style/SuwGlifButton.Tertiary
 
-        @null
         sans-serif
         ?attr/suwGlifHeaderGravity
-        0dp
+        @dimen/suw_glif_negative_button_padding
+        @dimen/suw_glif_negative_button_padding
         
         false
diff --git a/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java b/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java
index 20661ff..46df9d6 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/util/GlifStyleTest.java
@@ -16,8 +16,9 @@
 
 package com.android.setupwizardlib.util;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.robolectric.RuntimeEnvironment.application;
 
@@ -59,9 +60,8 @@ public class GlifStyleTest {
                 Robolectric.buildAttributeSet()
                         .setStyleAttribute("@style/SuwGlifButton.Tertiary")
                         .build());
-        assertNull("Background of tertiary button should be null", button.getBackground());
-        assertNull("Tertiary button should have no transformation method",
-                button.getTransformationMethod());
+        assertThat(button.getBackground()).named("background").isNotNull();
+        assertThat(button.getTransformationMethod()).named("transformation method").isNull();
         if (VERSION.SDK_INT < VERSION_CODES.M) {
             // Robolectric resolved the wrong theme attribute on versions >= M
             // https://github.com/robolectric/robolectric/issues/2940

From df13f242d3a8fdb5a224706fb01d425e8106cecd Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Thu, 8 Mar 2018 21:40:05 -0800
Subject: [PATCH 64/75] Make links focusableInTouchMode for platform variant

ag/3692611, but for platform variant

Test: ./gradlew testPlatformDeprecatedDebugUnitTest
Bug: 73350031
Change-Id: Ibd27348d97b9884be38eff69b540aedaf6416a2c
(cherry picked from commit a164eae405e822157f07b050982640d5c457f9aa)
---
 .../src/com/android/setupwizardlib/view/RichTextView.java    | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
index 5a78561..aab3238 100644
--- a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
@@ -121,6 +121,11 @@ public class RichTextView extends TextView implements OnLinkClickListener {
         // as individual TextViews consume touch events and thereby reducing the focus window
         // shown by Talkback. Disable focus if there are no links
         setFocusable(hasLinks);
+        // Do not "reveal" (i.e. scroll to) this view when this view is focused. Since this view is
+        // focusable in touch mode, we may be focused when the screen is first shown, and starting
+        // a screen halfway scrolled down is confusing to the user.
+        setRevealOnFocusHint(false);
+        setFocusableInTouchMode(hasLinks);
     }
 
     private boolean hasLinks(CharSequence text) {

From b5a2d11440eab84ef1ae1f44fb29b0690038c8e5 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Fri, 9 Mar 2018 20:55:24 -0800
Subject: [PATCH 65/75] Update fourcolor progress bar

Test: Manual. Existing tests pass
Bug: 63074068
Change-Id: I52a1704c39a9a54f9a4e79f42d174a20ee96c310
(cherry picked from commit 83817ea0336e6d9a217b4c4585b11dbaf3eb740a)
---
 library/gingerbread/res/values/styles.xml     |  1 +
 .../suw_fourcolor_progress_bar.xml            | 61 +++++++++++--------
 library/main/res/values-v21/styles.xml        |  1 +
 library/main/res/values/dimens.xml            |  1 +
 4 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/library/gingerbread/res/values/styles.xml b/library/gingerbread/res/values/styles.xml
index 241f037..130925d 100644
--- a/library/gingerbread/res/values/styles.xml
+++ b/library/gingerbread/res/values/styles.xml
@@ -277,6 +277,7 @@
     
diff --git a/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml b/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml
index 2ac35ee..9d54141 100644
--- a/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml
+++ b/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml
@@ -26,37 +26,44 @@
     
         
-            
-                
+                
             
-            
-                
+                
             
-            
-                
+                
             
-            
-                
+                
+            
+            
+            
+                
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
                 
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
 
     
diff --git a/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml b/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml
index 9d54141..2ac35ee 100644
--- a/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml
+++ b/library/main/res/drawable-v21/suw_fourcolor_progress_bar.xml
@@ -26,44 +26,37 @@
     
         
-            
-                
+                
             
-            
-                
+                
             
-            
-                
+                
             
-            
-                
-            
-            
-            
-                
+                
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
                 
         
     
-    
+    
         
             
         
     
-    
+    
         
             
         
     
-    
+    
         
             
 
     
 
     
 
 
diff --git a/library/main/res/values/dimens.xml b/library/main/res/values/dimens.xml
index be6b248..1a8b516 100644
--- a/library/main/res/values/dimens.xml
+++ b/library/main/res/values/dimens.xml
@@ -142,5 +142,6 @@
 
     
     56dp
+    12dp
 
 

From 618a4449bb3e9be43586040ea2fb9a6371365ae7 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Mon, 5 Mar 2018 15:59:43 -0800
Subject: [PATCH 70/75] Add touch feedback to links

- Clear selection after LinkSpan is clicked so that the highlight
  effect will be cleared when the tap completes
- Set focusableInTouchMode to true and revealOnFocusHint to false
  in RichTextView for N MR1 or above to allow the highlight effect
  to be visible in touch mode.

Test: ./gradlew test connectedAndroidTest
Bug: 73350031
Change-Id: Ibb6f67102775802cdfebaa1529c09d936b4096cb
(cherry picked from commit bc1c7a159c14f8b8f532fec60681d34771cd7909)
---
 .../setupwizardlib/view/RichTextView.java     | 11 ++++++
 .../android/setupwizardlib/span/LinkSpan.java | 11 ++++++
 .../setupwizardlib/span/LinkSpanTest.java     | 32 +++++++++++++++--
 .../view}/RichTextViewTest.java               | 36 +++++++++++--------
 4 files changed, 73 insertions(+), 17 deletions(-)
 rename library/test/{instrumentation/src/com/android/setupwizardlib/test => robotest/src/com/android/setupwizardlib/view}/RichTextViewTest.java (84%)

diff --git a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
index e6bc9da..6694cb2 100644
--- a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
@@ -130,6 +130,17 @@ public class RichTextView extends AppCompatTextView implements OnLinkClickListen
         // as individual TextViews consume touch events and thereby reducing the focus window
         // shown by Talkback. Disable focus if there are no links
         setFocusable(hasLinks);
+        // Do not "reveal" (i.e. scroll to) this view when this view is focused. Since this view is
+        // focusable in touch mode, we may be focused when the screen is first shown, and starting
+        // a screen halfway scrolled down is confusing to the user.
+        if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
+            setRevealOnFocusHint(false);
+            // setRevealOnFocusHint is a new API added in SDK 25. For lower SDK versions, do not
+            // call setFocusableInTouchMode. We won't get touch effect on those earlier versions,
+            // but the link will still work, and will prevent the scroll view from starting halfway
+            // down the page.
+            setFocusableInTouchMode(hasLinks);
+        }
     }
 
     private boolean hasLinks(CharSequence text) {
diff --git a/library/main/src/com/android/setupwizardlib/span/LinkSpan.java b/library/main/src/com/android/setupwizardlib/span/LinkSpan.java
index a5f0424..26a3d16 100644
--- a/library/main/src/com/android/setupwizardlib/span/LinkSpan.java
+++ b/library/main/src/com/android/setupwizardlib/span/LinkSpan.java
@@ -21,10 +21,13 @@ import android.content.ContextWrapper;
 import android.graphics.Typeface;
 import android.os.Build;
 import android.support.annotation.Nullable;
+import android.text.Selection;
+import android.text.Spannable;
 import android.text.TextPaint;
 import android.text.style.ClickableSpan;
 import android.util.Log;
 import android.view.View;
+import android.widget.TextView;
 
 /**
  * A clickable span that will listen for click events and send it back to the context. To use this
@@ -86,11 +89,19 @@ public class LinkSpan extends ClickableSpan {
     public void onClick(View view) {
         if (dispatchClick(view)) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                // Prevent the touch event from bubbling up to the parent views.
                 view.cancelPendingInputEvents();
             }
         } else {
             Log.w(TAG, "Dropping click event. No listener attached.");
         }
+        if (view instanceof TextView) {
+            // Remove the highlight effect when the click happens by clearing the selection
+            CharSequence text = ((TextView) view).getText();
+            if (text instanceof Spannable) {
+                Selection.setSelection((Spannable) text, 0);
+            }
+        }
     }
 
     private boolean dispatchClick(View view) {
diff --git a/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java b/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java
index fe72e03..3aafa7d 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/span/LinkSpanTest.java
@@ -16,11 +16,16 @@
 
 package com.android.setupwizardlib.span;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertSame;
 import static org.robolectric.RuntimeEnvironment.application;
 
 import android.content.Context;
 import android.content.ContextWrapper;
+import android.text.Selection;
+import android.text.SpannableStringBuilder;
+import android.text.method.LinkMovementMethod;
 import android.widget.TextView;
 
 import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
@@ -32,7 +37,7 @@ import org.junit.runner.RunWith;
 public class LinkSpanTest {
 
     @Test
-    public void testOnClick() {
+    public void onClick_shouldCallListenerOnContext() {
         final TestContext context = new TestContext(application);
         final TextView textView = new TextView(context);
         final LinkSpan linkSpan = new LinkSpan("test_id");
@@ -43,7 +48,7 @@ public class LinkSpanTest {
     }
 
     @Test
-    public void testNonImplementingContext() {
+    public void onClick_contextDoesNotImplementOnClickListener_shouldBeNoOp() {
         final TextView textView = new TextView(application);
         final LinkSpan linkSpan = new LinkSpan("test_id");
 
@@ -54,7 +59,7 @@ public class LinkSpanTest {
     }
 
     @Test
-    public void testWrappedListener() {
+    public void onClick_contextWrapsOnClickListener_shouldCallWrappedListener() {
         final TestContext context = new TestContext(application);
         final Context wrapperContext = new ContextWrapper(context);
         final TextView textView = new TextView(wrapperContext);
@@ -65,6 +70,27 @@ public class LinkSpanTest {
         assertSame("Clicked LinkSpan should be passed to setup", linkSpan, context.clickedSpan);
     }
 
+    @Test
+    public void onClick_shouldClearSelection() {
+        final TestContext context = new TestContext(application);
+        final TextView textView = new TextView(context);
+        textView.setMovementMethod(LinkMovementMethod.getInstance());
+        textView.setFocusable(true);
+        textView.setFocusableInTouchMode(true);
+        final LinkSpan linkSpan = new LinkSpan("test_id");
+
+        SpannableStringBuilder text = new SpannableStringBuilder("Lorem ipsum dolor sit");
+        textView.setText(text);
+        text.setSpan(linkSpan, /* start= */ 0, /* end= */ 5, /* flags= */ 0);
+        // Simulate the touch effect set by TextView when touched.
+        Selection.setSelection(text, /* start= */ 0, /* end= */ 5);
+
+        linkSpan.onClick(textView);
+
+        assertThat(Selection.getSelectionStart(textView.getText())).isEqualTo(0);
+        assertThat(Selection.getSelectionEnd(textView.getText())).isEqualTo(0);
+    }
+
     @SuppressWarnings("deprecation")
     private static class TestContext extends ContextWrapper implements LinkSpan.OnClickListener {
 
diff --git a/library/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
similarity index 84%
rename from library/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java
rename to library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
index 5f3eb9f..2e28b48 100644
--- a/library/test/instrumentation/src/com/android/setupwizardlib/test/RichTextViewTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.setupwizardlib.test;
+package com.android.setupwizardlib.view;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -24,29 +24,30 @@ import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
+import static org.robolectric.RuntimeEnvironment.application;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.ContextWrapper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
 import android.text.Annotation;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.style.TextAppearanceSpan;
 
+import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
 import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
-import com.android.setupwizardlib.view.RichTextView;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
 
 import java.util.Arrays;
 
-@RunWith(AndroidJUnit4.class)
-@SmallTest
+@RunWith(SuwLibRobolectricTestRunner.class)
+@Config(sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK })
 public class RichTextViewTest {
 
     @Test
@@ -55,7 +56,7 @@ public class RichTextViewTest {
         SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
         ssb.setSpan(link, 1, 2, 0 /* flags */);
 
-        RichTextView textView = new RichTextView(InstrumentationRegistry.getContext());
+        RichTextView textView = new RichTextView(application);
         textView.setText(ssb);
 
         final CharSequence text = textView.getText();
@@ -77,7 +78,7 @@ public class RichTextViewTest {
         SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
         ssb.setSpan(link, 1, 2, 0 /* flags */);
 
-        RichTextView textView = new RichTextView(InstrumentationRegistry.getContext());
+        RichTextView textView = new RichTextView(application);
         textView.setText(ssb);
 
         OnLinkClickListener listener = mock(OnLinkClickListener.class);
@@ -99,7 +100,7 @@ public class RichTextViewTest {
         SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
         ssb.setSpan(link, 1, 2, 0 /* flags */);
 
-        TestContext context = spy(new TestContext(InstrumentationRegistry.getTargetContext()));
+        TestContext context = spy(new TestContext(application));
         RichTextView textView = new RichTextView(context);
         textView.setText(ssb);
 
@@ -116,7 +117,7 @@ public class RichTextViewTest {
         SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
         ssb.setSpan(link, 1, 2, 0 /* flags */);
 
-        RichTextView textView = new RichTextView(InstrumentationRegistry.getContext());
+        RichTextView textView = new RichTextView(application);
         textView.setText(ssb);
 
         final CharSequence text = textView.getText();
@@ -137,7 +138,7 @@ public class RichTextViewTest {
         SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("Linked");
         spannableStringBuilder.setSpan(testLink, 0, 3, 0);
 
-        RichTextView view = new RichTextView(InstrumentationRegistry.getContext());
+        RichTextView view = new RichTextView(application);
         view.setText(spannableStringBuilder);
 
         assertTrue("TextView should be focusable since it contains spans", view.isFocusable());
@@ -147,7 +148,7 @@ public class RichTextViewTest {
     @SuppressLint("SetTextI18n")  // It's OK. This is just a test.
     @Test
     public void testTextContainingNoLinksAreNotFocusable() {
-        RichTextView textView = new RichTextView(InstrumentationRegistry.getContext());
+        RichTextView textView = new RichTextView(application);
         textView.setText("Thou shall not be focusable!");
 
         assertFalse("TextView should not be focusable since it does not contain any span",
@@ -160,16 +161,23 @@ public class RichTextViewTest {
     @SuppressLint("SetTextI18n")  // It's OK. This is just a test.
     @Test
     public void testRichTextViewFocusChangesWithTextChange() {
-        RichTextView textView = new RichTextView(InstrumentationRegistry.getContext());
+        RichTextView textView = new RichTextView(application);
         textView.setText("Thou shall not be focusable!");
 
         assertFalse(textView.isFocusable());
+        assertFalse(textView.isFocusableInTouchMode());
 
         SpannableStringBuilder spannableStringBuilder =
                 new SpannableStringBuilder("I am focusable");
         spannableStringBuilder.setSpan(new Annotation("link", "focus:on_me"), 0, 1, 0);
         textView.setText(spannableStringBuilder);
         assertTrue(textView.isFocusable());
+        if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
+            assertTrue(textView.isFocusableInTouchMode());
+            assertFalse(textView.getRevealOnFocusHint());
+        } else {
+            assertFalse(textView.isFocusableInTouchMode());
+        }
     }
 
     public static class TestContext extends ContextWrapper implements LinkSpan.OnClickListener {

From e4475dcf52c1235a7d9756b454fa81fb4b54726c Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Wed, 4 Apr 2018 19:45:31 -0700
Subject: [PATCH 71/75] Add workaround for touch event propagation

In TextView with links, onTouchEvent always return true regardless of
return value from the movement method because View#onTouchEvent is
hard coded to return true whenever the view is clickable.

In RichTextView, add a layer of abstraction to allow the movement
method to override the return value. TouchableLinkMovementMethod is
an implementation added, which will consume the event only when a
link is being touched.

Test: ./gradlew test
Bug: 77338508
Change-Id: I761579d6f153a41beb979acd88a4090eb3998cf3
---
 .../setupwizardlib/view/RichTextView.java     | 23 ++++-
 .../view/TouchableMovementMethod.java         | 83 +++++++++++++++++++
 .../setupwizardlib/view/RichTextView.java     | 24 +++++-
 .../setupwizardlib/view/RichTextViewTest.java | 45 ++++++++++
 4 files changed, 171 insertions(+), 4 deletions(-)
 create mode 100644 library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java

diff --git a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
index 6694cb2..ff2b1a7 100644
--- a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
@@ -25,7 +25,7 @@ import android.support.v7.widget.AppCompatTextView;
 import android.text.Annotation;
 import android.text.SpannableString;
 import android.text.Spanned;
-import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
@@ -36,6 +36,7 @@ import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
 import com.android.setupwizardlib.span.SpanHelper;
 import com.android.setupwizardlib.util.LinkAccessibilityHelper;
+import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 /**
  * An extension of TextView that automatically replaces the annotation tags as specified in
@@ -121,7 +122,7 @@ public class RichTextView extends AppCompatTextView implements OnLinkClickListen
             // nullifying any return values of MovementMethod.onTouchEvent.
             // To still allow propagating touch events to the parent when this view doesn't have
             // links, we only set the movement method here if the text contains links.
-            setMovementMethod(LinkMovementMethod.getInstance());
+            setMovementMethod(TouchableLinkMovementMethod.getInstance());
         } else {
             setMovementMethod(null);
         }
@@ -152,6 +153,24 @@ public class RichTextView extends AppCompatTextView implements OnLinkClickListen
         return false;
     }
 
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        // Since View#onTouchEvent always return true if the view is clickable (which is the case
+        // when a TextView has a movement method), override the implementation to allow the movement
+        // method, if it implements TouchableMovementMethod, to say that the touch is not handled,
+        // allowing the event to bubble up to the parent view.
+        boolean superResult = super.onTouchEvent(event);
+        MovementMethod movementMethod = getMovementMethod();
+        if (movementMethod instanceof TouchableMovementMethod) {
+            TouchableMovementMethod touchableMovementMethod =
+                    (TouchableMovementMethod) movementMethod;
+            if (touchableMovementMethod.getLastTouchEvent() == event) {
+                return touchableMovementMethod.isLastTouchEventHandled();
+            }
+        }
+        return superResult;
+    }
+
     @Override
     protected boolean dispatchHoverEvent(MotionEvent event) {
         if (mAccessibilityHelper != null && mAccessibilityHelper.dispatchHoverEvent(event)) {
diff --git a/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java b/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java
new file mode 100644
index 0000000..10e91f4
--- /dev/null
+++ b/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java
@@ -0,0 +1,83 @@
+/*
+ * 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.setupwizardlib.view;
+
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
+import android.view.MotionEvent;
+import android.widget.TextView;
+
+/**
+ * A movement method that tracks the last result of whether touch events are handled. This is
+ * used to patch the return value of {@link TextView#onTouchEvent} so that it consumes the touch
+ * events only when the movement method says the event is consumed.
+ */
+public interface TouchableMovementMethod {
+
+    /**
+     * @return The last touch event received in {@link MovementMethod#onTouchEvent}
+     */
+    MotionEvent getLastTouchEvent();
+
+    /**
+     * @return The return value of the last {@link MovementMethod#onTouchEvent}, or whether the
+     * last touch event should be considered handled by the text view
+     */
+    boolean isLastTouchEventHandled();
+
+    /**
+     * An extension of LinkMovementMethod that tracks whether the event is handled when it is
+     * touched.
+     */
+    class TouchableLinkMovementMethod extends LinkMovementMethod
+            implements TouchableMovementMethod {
+
+        public static TouchableLinkMovementMethod getInstance() {
+            return new TouchableLinkMovementMethod();
+        }
+
+        boolean mLastEventResult = false;
+        MotionEvent mLastEvent;
+
+        @Override
+        public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
+            mLastEvent = event;
+            boolean result = super.onTouchEvent(widget, buffer, event);
+            if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                // Unfortunately, LinkMovementMethod extends ScrollMovementMethod, and it always
+                // consume the down event. So here we use the selection instead as a hint of whether
+                // the down event landed on a link.
+                mLastEventResult = Selection.getSelectionStart(buffer) != -1;
+            } else {
+                mLastEventResult = result;
+            }
+            return result;
+        }
+
+        @Override
+        public MotionEvent getLastTouchEvent() {
+            return mLastEvent;
+        }
+
+        @Override
+        public boolean isLastTouchEventHandled() {
+            return mLastEventResult;
+        }
+    }
+}
diff --git a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
index aab3238..4a53304 100644
--- a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
@@ -20,16 +20,18 @@ import android.content.Context;
 import android.text.Annotation;
 import android.text.SpannableString;
 import android.text.Spanned;
-import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.view.MotionEvent;
 import android.widget.TextView;
 
 import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
 import com.android.setupwizardlib.span.SpanHelper;
+import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 /**
  * An extension of TextView that automatically replaces the annotation tags as specified in
@@ -112,7 +114,7 @@ public class RichTextView extends TextView implements OnLinkClickListener {
             // nullifying any return values of MovementMethod.onTouchEvent.
             // To still allow propagating touch events to the parent when this view doesn't have
             // links, we only set the movement method here if the text contains links.
-            setMovementMethod(LinkMovementMethod.getInstance());
+            setMovementMethod(TouchableLinkMovementMethod.getInstance());
         } else {
             setMovementMethod(null);
         }
@@ -137,6 +139,24 @@ public class RichTextView extends TextView implements OnLinkClickListener {
         return false;
     }
 
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        // Since View#onTouchEvent always return true if the view is clickable (which is the case
+        // when a TextView has a movement method), override the implementation to allow the movement
+        // method, if it implements TouchableMovementMethod, to say that the touch is not handled,
+        // allowing the event to bubble up to the parent view.
+        boolean superResult = super.onTouchEvent(event);
+        MovementMethod movementMethod = getMovementMethod();
+        if (movementMethod instanceof TouchableMovementMethod) {
+            TouchableMovementMethod touchableMovementMethod =
+                    (TouchableMovementMethod) movementMethod;
+            if (touchableMovementMethod.getLastTouchEvent() == event) {
+                return touchableMovementMethod.isLastTouchEventHandled();
+            }
+        }
+        return superResult;
+    }
+
     public void setOnLinkClickListener(OnLinkClickListener listener) {
         mOnLinkClickListener = listener;
     }
diff --git a/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
index 2e28b48..f77de68 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
@@ -16,11 +16,14 @@
 
 package com.android.setupwizardlib.view;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -35,10 +38,12 @@ import android.text.Annotation;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.style.TextAppearanceSpan;
+import android.view.MotionEvent;
 
 import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
 import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
+import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -62,6 +67,8 @@ public class RichTextViewTest {
         final CharSequence text = textView.getText();
         assertTrue("Text should be spanned", text instanceof Spanned);
 
+        assertThat(textView.getMovementMethod()).isInstanceOf(TouchableLinkMovementMethod.class);
+
         Object[] spans = ((Spanned) text).getSpans(0, text.length(), Annotation.class);
         assertEquals("Annotation should be removed " + Arrays.toString(spans), 0, spans.length);
 
@@ -111,6 +118,44 @@ public class RichTextViewTest {
         verify(context).onClick(eq(spans[0]));
     }
 
+    @Test
+    public void onTouchEvent_clickOnLinks_shouldReturnTrue() {
+        Annotation link = new Annotation("link", "foobar");
+        SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
+        ssb.setSpan(link, 0, 2, 0 /* flags */);
+
+        RichTextView textView = new RichTextView(application);
+        textView.setText(ssb);
+
+        TouchableLinkMovementMethod mockMovementMethod = mock(TouchableLinkMovementMethod.class);
+        textView.setMovementMethod(mockMovementMethod);
+
+        MotionEvent motionEvent =
+                MotionEvent.obtain(123, 22, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        doReturn(motionEvent).when(mockMovementMethod).getLastTouchEvent();
+        doReturn(true).when(mockMovementMethod).isLastTouchEventHandled();
+        assertThat(textView.onTouchEvent(motionEvent)).isTrue();
+    }
+
+    @Test
+    public void onTouchEvent_clickOutsideLinks_shouldReturnFalse() {
+        Annotation link = new Annotation("link", "foobar");
+        SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
+        ssb.setSpan(link, 0, 2, 0 /* flags */);
+
+        RichTextView textView = new RichTextView(application);
+        textView.setText(ssb);
+
+        TouchableLinkMovementMethod mockMovementMethod = mock(TouchableLinkMovementMethod.class);
+        textView.setMovementMethod(mockMovementMethod);
+
+        MotionEvent motionEvent =
+                MotionEvent.obtain(123, 22, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        doReturn(motionEvent).when(mockMovementMethod).getLastTouchEvent();
+        doReturn(false).when(mockMovementMethod).isLastTouchEventHandled();
+        assertThat(textView.onTouchEvent(motionEvent)).isFalse();
+    }
+
     @Test
     public void testTextStyle() {
         Annotation link = new Annotation("textAppearance", "foobar");

From a6d66b41b08b2d612da1a3e27c651053ceb7a871 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Fri, 6 Apr 2018 21:25:55 +0000
Subject: [PATCH 72/75] Revert "Add workaround for touch event propagation"

This reverts commit e4475dcf52c1235a7d9756b454fa81fb4b54726c.

Reason for revert: Breaks ub-setupwizard-master build (lint error)

Bug: 77338508
Test: ./gradlew lint
Change-Id: I251ff930b7d8391db3ea55597fa42f491cdff963
---
 .../setupwizardlib/view/RichTextView.java     | 23 +----
 .../view/TouchableMovementMethod.java         | 83 -------------------
 .../setupwizardlib/view/RichTextView.java     | 24 +-----
 .../setupwizardlib/view/RichTextViewTest.java | 45 ----------
 4 files changed, 4 insertions(+), 171 deletions(-)
 delete mode 100644 library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java

diff --git a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
index ff2b1a7..6694cb2 100644
--- a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
@@ -25,7 +25,7 @@ import android.support.v7.widget.AppCompatTextView;
 import android.text.Annotation;
 import android.text.SpannableString;
 import android.text.Spanned;
-import android.text.method.MovementMethod;
+import android.text.method.LinkMovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
@@ -36,7 +36,6 @@ import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
 import com.android.setupwizardlib.span.SpanHelper;
 import com.android.setupwizardlib.util.LinkAccessibilityHelper;
-import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 /**
  * An extension of TextView that automatically replaces the annotation tags as specified in
@@ -122,7 +121,7 @@ public class RichTextView extends AppCompatTextView implements OnLinkClickListen
             // nullifying any return values of MovementMethod.onTouchEvent.
             // To still allow propagating touch events to the parent when this view doesn't have
             // links, we only set the movement method here if the text contains links.
-            setMovementMethod(TouchableLinkMovementMethod.getInstance());
+            setMovementMethod(LinkMovementMethod.getInstance());
         } else {
             setMovementMethod(null);
         }
@@ -153,24 +152,6 @@ public class RichTextView extends AppCompatTextView implements OnLinkClickListen
         return false;
     }
 
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        // Since View#onTouchEvent always return true if the view is clickable (which is the case
-        // when a TextView has a movement method), override the implementation to allow the movement
-        // method, if it implements TouchableMovementMethod, to say that the touch is not handled,
-        // allowing the event to bubble up to the parent view.
-        boolean superResult = super.onTouchEvent(event);
-        MovementMethod movementMethod = getMovementMethod();
-        if (movementMethod instanceof TouchableMovementMethod) {
-            TouchableMovementMethod touchableMovementMethod =
-                    (TouchableMovementMethod) movementMethod;
-            if (touchableMovementMethod.getLastTouchEvent() == event) {
-                return touchableMovementMethod.isLastTouchEventHandled();
-            }
-        }
-        return superResult;
-    }
-
     @Override
     protected boolean dispatchHoverEvent(MotionEvent event) {
         if (mAccessibilityHelper != null && mAccessibilityHelper.dispatchHoverEvent(event)) {
diff --git a/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java b/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java
deleted file mode 100644
index 10e91f4..0000000
--- a/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java
+++ /dev/null
@@ -1,83 +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.setupwizardlib.view;
-
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.method.LinkMovementMethod;
-import android.text.method.MovementMethod;
-import android.view.MotionEvent;
-import android.widget.TextView;
-
-/**
- * A movement method that tracks the last result of whether touch events are handled. This is
- * used to patch the return value of {@link TextView#onTouchEvent} so that it consumes the touch
- * events only when the movement method says the event is consumed.
- */
-public interface TouchableMovementMethod {
-
-    /**
-     * @return The last touch event received in {@link MovementMethod#onTouchEvent}
-     */
-    MotionEvent getLastTouchEvent();
-
-    /**
-     * @return The return value of the last {@link MovementMethod#onTouchEvent}, or whether the
-     * last touch event should be considered handled by the text view
-     */
-    boolean isLastTouchEventHandled();
-
-    /**
-     * An extension of LinkMovementMethod that tracks whether the event is handled when it is
-     * touched.
-     */
-    class TouchableLinkMovementMethod extends LinkMovementMethod
-            implements TouchableMovementMethod {
-
-        public static TouchableLinkMovementMethod getInstance() {
-            return new TouchableLinkMovementMethod();
-        }
-
-        boolean mLastEventResult = false;
-        MotionEvent mLastEvent;
-
-        @Override
-        public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
-            mLastEvent = event;
-            boolean result = super.onTouchEvent(widget, buffer, event);
-            if (event.getAction() == MotionEvent.ACTION_DOWN) {
-                // Unfortunately, LinkMovementMethod extends ScrollMovementMethod, and it always
-                // consume the down event. So here we use the selection instead as a hint of whether
-                // the down event landed on a link.
-                mLastEventResult = Selection.getSelectionStart(buffer) != -1;
-            } else {
-                mLastEventResult = result;
-            }
-            return result;
-        }
-
-        @Override
-        public MotionEvent getLastTouchEvent() {
-            return mLastEvent;
-        }
-
-        @Override
-        public boolean isLastTouchEventHandled() {
-            return mLastEventResult;
-        }
-    }
-}
diff --git a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
index 4a53304..aab3238 100644
--- a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
@@ -20,18 +20,16 @@ import android.content.Context;
 import android.text.Annotation;
 import android.text.SpannableString;
 import android.text.Spanned;
-import android.text.method.MovementMethod;
+import android.text.method.LinkMovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
 import android.util.Log;
-import android.view.MotionEvent;
 import android.widget.TextView;
 
 import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
 import com.android.setupwizardlib.span.SpanHelper;
-import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 /**
  * An extension of TextView that automatically replaces the annotation tags as specified in
@@ -114,7 +112,7 @@ public class RichTextView extends TextView implements OnLinkClickListener {
             // nullifying any return values of MovementMethod.onTouchEvent.
             // To still allow propagating touch events to the parent when this view doesn't have
             // links, we only set the movement method here if the text contains links.
-            setMovementMethod(TouchableLinkMovementMethod.getInstance());
+            setMovementMethod(LinkMovementMethod.getInstance());
         } else {
             setMovementMethod(null);
         }
@@ -139,24 +137,6 @@ public class RichTextView extends TextView implements OnLinkClickListener {
         return false;
     }
 
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        // Since View#onTouchEvent always return true if the view is clickable (which is the case
-        // when a TextView has a movement method), override the implementation to allow the movement
-        // method, if it implements TouchableMovementMethod, to say that the touch is not handled,
-        // allowing the event to bubble up to the parent view.
-        boolean superResult = super.onTouchEvent(event);
-        MovementMethod movementMethod = getMovementMethod();
-        if (movementMethod instanceof TouchableMovementMethod) {
-            TouchableMovementMethod touchableMovementMethod =
-                    (TouchableMovementMethod) movementMethod;
-            if (touchableMovementMethod.getLastTouchEvent() == event) {
-                return touchableMovementMethod.isLastTouchEventHandled();
-            }
-        }
-        return superResult;
-    }
-
     public void setOnLinkClickListener(OnLinkClickListener listener) {
         mOnLinkClickListener = listener;
     }
diff --git a/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
index f77de68..2e28b48 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
@@ -16,14 +16,11 @@
 
 package com.android.setupwizardlib.view;
 
-import static com.google.common.truth.Truth.assertThat;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -38,12 +35,10 @@ import android.text.Annotation;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.style.TextAppearanceSpan;
-import android.view.MotionEvent;
 
 import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
 import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
-import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -67,8 +62,6 @@ public class RichTextViewTest {
         final CharSequence text = textView.getText();
         assertTrue("Text should be spanned", text instanceof Spanned);
 
-        assertThat(textView.getMovementMethod()).isInstanceOf(TouchableLinkMovementMethod.class);
-
         Object[] spans = ((Spanned) text).getSpans(0, text.length(), Annotation.class);
         assertEquals("Annotation should be removed " + Arrays.toString(spans), 0, spans.length);
 
@@ -118,44 +111,6 @@ public class RichTextViewTest {
         verify(context).onClick(eq(spans[0]));
     }
 
-    @Test
-    public void onTouchEvent_clickOnLinks_shouldReturnTrue() {
-        Annotation link = new Annotation("link", "foobar");
-        SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
-        ssb.setSpan(link, 0, 2, 0 /* flags */);
-
-        RichTextView textView = new RichTextView(application);
-        textView.setText(ssb);
-
-        TouchableLinkMovementMethod mockMovementMethod = mock(TouchableLinkMovementMethod.class);
-        textView.setMovementMethod(mockMovementMethod);
-
-        MotionEvent motionEvent =
-                MotionEvent.obtain(123, 22, MotionEvent.ACTION_DOWN, 0, 0, 0);
-        doReturn(motionEvent).when(mockMovementMethod).getLastTouchEvent();
-        doReturn(true).when(mockMovementMethod).isLastTouchEventHandled();
-        assertThat(textView.onTouchEvent(motionEvent)).isTrue();
-    }
-
-    @Test
-    public void onTouchEvent_clickOutsideLinks_shouldReturnFalse() {
-        Annotation link = new Annotation("link", "foobar");
-        SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
-        ssb.setSpan(link, 0, 2, 0 /* flags */);
-
-        RichTextView textView = new RichTextView(application);
-        textView.setText(ssb);
-
-        TouchableLinkMovementMethod mockMovementMethod = mock(TouchableLinkMovementMethod.class);
-        textView.setMovementMethod(mockMovementMethod);
-
-        MotionEvent motionEvent =
-                MotionEvent.obtain(123, 22, MotionEvent.ACTION_DOWN, 0, 0, 0);
-        doReturn(motionEvent).when(mockMovementMethod).getLastTouchEvent();
-        doReturn(false).when(mockMovementMethod).isLastTouchEventHandled();
-        assertThat(textView.onTouchEvent(motionEvent)).isFalse();
-    }
-
     @Test
     public void testTextStyle() {
         Annotation link = new Annotation("textAppearance", "foobar");

From e58194099d9133ce7b2e19fe7c717679b62fddb2 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Fri, 6 Apr 2018 14:27:41 -0700
Subject: [PATCH 73/75] Revert "Revert "Add workaround for touch event
 propagation""

This reverts commit b268a8c365a4c9dcb7b1382a7ce3ec5607b22de0.

Rolling forward with suppress for the lint errors

Test: ./gradlew lint
Bug: 77338508
Change-Id: I9582bfbb4c73ae60a15e8285facf20da458b9690
---
 .../setupwizardlib/view/RichTextView.java     | 24 +++++-
 .../view/TouchableMovementMethod.java         | 83 +++++++++++++++++++
 .../setupwizardlib/view/RichTextView.java     | 25 +++++-
 .../setupwizardlib/view/RichTextViewTest.java | 45 ++++++++++
 4 files changed, 173 insertions(+), 4 deletions(-)
 create mode 100644 library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java

diff --git a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
index 6694cb2..1b1f82e 100644
--- a/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/gingerbread/src/com/android/setupwizardlib/view/RichTextView.java
@@ -25,7 +25,7 @@ import android.support.v7.widget.AppCompatTextView;
 import android.text.Annotation;
 import android.text.SpannableString;
 import android.text.Spanned;
-import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
@@ -36,6 +36,7 @@ import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
 import com.android.setupwizardlib.span.SpanHelper;
 import com.android.setupwizardlib.util.LinkAccessibilityHelper;
+import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 /**
  * An extension of TextView that automatically replaces the annotation tags as specified in
@@ -121,7 +122,7 @@ public class RichTextView extends AppCompatTextView implements OnLinkClickListen
             // nullifying any return values of MovementMethod.onTouchEvent.
             // To still allow propagating touch events to the parent when this view doesn't have
             // links, we only set the movement method here if the text contains links.
-            setMovementMethod(LinkMovementMethod.getInstance());
+            setMovementMethod(TouchableLinkMovementMethod.getInstance());
         } else {
             setMovementMethod(null);
         }
@@ -152,6 +153,25 @@ public class RichTextView extends AppCompatTextView implements OnLinkClickListen
         return false;
     }
 
+    @Override
+    @SuppressWarnings("ClickableViewAccessibility")  // super.onTouchEvent is called
+    public boolean onTouchEvent(MotionEvent event) {
+        // Since View#onTouchEvent always return true if the view is clickable (which is the case
+        // when a TextView has a movement method), override the implementation to allow the movement
+        // method, if it implements TouchableMovementMethod, to say that the touch is not handled,
+        // allowing the event to bubble up to the parent view.
+        boolean superResult = super.onTouchEvent(event);
+        MovementMethod movementMethod = getMovementMethod();
+        if (movementMethod instanceof TouchableMovementMethod) {
+            TouchableMovementMethod touchableMovementMethod =
+                    (TouchableMovementMethod) movementMethod;
+            if (touchableMovementMethod.getLastTouchEvent() == event) {
+                return touchableMovementMethod.isLastTouchEventHandled();
+            }
+        }
+        return superResult;
+    }
+
     @Override
     protected boolean dispatchHoverEvent(MotionEvent event) {
         if (mAccessibilityHelper != null && mAccessibilityHelper.dispatchHoverEvent(event)) {
diff --git a/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java b/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java
new file mode 100644
index 0000000..10e91f4
--- /dev/null
+++ b/library/main/src/com/android/setupwizardlib/view/TouchableMovementMethod.java
@@ -0,0 +1,83 @@
+/*
+ * 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.setupwizardlib.view;
+
+import android.text.Selection;
+import android.text.Spannable;
+import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
+import android.view.MotionEvent;
+import android.widget.TextView;
+
+/**
+ * A movement method that tracks the last result of whether touch events are handled. This is
+ * used to patch the return value of {@link TextView#onTouchEvent} so that it consumes the touch
+ * events only when the movement method says the event is consumed.
+ */
+public interface TouchableMovementMethod {
+
+    /**
+     * @return The last touch event received in {@link MovementMethod#onTouchEvent}
+     */
+    MotionEvent getLastTouchEvent();
+
+    /**
+     * @return The return value of the last {@link MovementMethod#onTouchEvent}, or whether the
+     * last touch event should be considered handled by the text view
+     */
+    boolean isLastTouchEventHandled();
+
+    /**
+     * An extension of LinkMovementMethod that tracks whether the event is handled when it is
+     * touched.
+     */
+    class TouchableLinkMovementMethod extends LinkMovementMethod
+            implements TouchableMovementMethod {
+
+        public static TouchableLinkMovementMethod getInstance() {
+            return new TouchableLinkMovementMethod();
+        }
+
+        boolean mLastEventResult = false;
+        MotionEvent mLastEvent;
+
+        @Override
+        public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
+            mLastEvent = event;
+            boolean result = super.onTouchEvent(widget, buffer, event);
+            if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                // Unfortunately, LinkMovementMethod extends ScrollMovementMethod, and it always
+                // consume the down event. So here we use the selection instead as a hint of whether
+                // the down event landed on a link.
+                mLastEventResult = Selection.getSelectionStart(buffer) != -1;
+            } else {
+                mLastEventResult = result;
+            }
+            return result;
+        }
+
+        @Override
+        public MotionEvent getLastTouchEvent() {
+            return mLastEvent;
+        }
+
+        @Override
+        public boolean isLastTouchEventHandled() {
+            return mLastEventResult;
+        }
+    }
+}
diff --git a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
index aab3238..fa68a68 100644
--- a/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
+++ b/library/platform/src/com/android/setupwizardlib/view/RichTextView.java
@@ -20,16 +20,18 @@ import android.content.Context;
 import android.text.Annotation;
 import android.text.SpannableString;
 import android.text.Spanned;
-import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.TextAppearanceSpan;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.view.MotionEvent;
 import android.widget.TextView;
 
 import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
 import com.android.setupwizardlib.span.SpanHelper;
+import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 /**
  * An extension of TextView that automatically replaces the annotation tags as specified in
@@ -112,7 +114,7 @@ public class RichTextView extends TextView implements OnLinkClickListener {
             // nullifying any return values of MovementMethod.onTouchEvent.
             // To still allow propagating touch events to the parent when this view doesn't have
             // links, we only set the movement method here if the text contains links.
-            setMovementMethod(LinkMovementMethod.getInstance());
+            setMovementMethod(TouchableLinkMovementMethod.getInstance());
         } else {
             setMovementMethod(null);
         }
@@ -137,6 +139,25 @@ public class RichTextView extends TextView implements OnLinkClickListener {
         return false;
     }
 
+    @Override
+    @SuppressWarnings("ClickableViewAccessibility")  // super.onTouchEvent is called
+    public boolean onTouchEvent(MotionEvent event) {
+        // Since View#onTouchEvent always return true if the view is clickable (which is the case
+        // when a TextView has a movement method), override the implementation to allow the movement
+        // method, if it implements TouchableMovementMethod, to say that the touch is not handled,
+        // allowing the event to bubble up to the parent view.
+        boolean superResult = super.onTouchEvent(event);
+        MovementMethod movementMethod = getMovementMethod();
+        if (movementMethod instanceof TouchableMovementMethod) {
+            TouchableMovementMethod touchableMovementMethod =
+                    (TouchableMovementMethod) movementMethod;
+            if (touchableMovementMethod.getLastTouchEvent() == event) {
+                return touchableMovementMethod.isLastTouchEventHandled();
+            }
+        }
+        return superResult;
+    }
+
     public void setOnLinkClickListener(OnLinkClickListener listener) {
         mOnLinkClickListener = listener;
     }
diff --git a/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
index 2e28b48..f77de68 100644
--- a/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
+++ b/library/test/robotest/src/com/android/setupwizardlib/view/RichTextViewTest.java
@@ -16,11 +16,14 @@
 
 package com.android.setupwizardlib.view;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -35,10 +38,12 @@ import android.text.Annotation;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
 import android.text.style.TextAppearanceSpan;
+import android.view.MotionEvent;
 
 import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
 import com.android.setupwizardlib.span.LinkSpan;
 import com.android.setupwizardlib.span.LinkSpan.OnLinkClickListener;
+import com.android.setupwizardlib.view.TouchableMovementMethod.TouchableLinkMovementMethod;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -62,6 +67,8 @@ public class RichTextViewTest {
         final CharSequence text = textView.getText();
         assertTrue("Text should be spanned", text instanceof Spanned);
 
+        assertThat(textView.getMovementMethod()).isInstanceOf(TouchableLinkMovementMethod.class);
+
         Object[] spans = ((Spanned) text).getSpans(0, text.length(), Annotation.class);
         assertEquals("Annotation should be removed " + Arrays.toString(spans), 0, spans.length);
 
@@ -111,6 +118,44 @@ public class RichTextViewTest {
         verify(context).onClick(eq(spans[0]));
     }
 
+    @Test
+    public void onTouchEvent_clickOnLinks_shouldReturnTrue() {
+        Annotation link = new Annotation("link", "foobar");
+        SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
+        ssb.setSpan(link, 0, 2, 0 /* flags */);
+
+        RichTextView textView = new RichTextView(application);
+        textView.setText(ssb);
+
+        TouchableLinkMovementMethod mockMovementMethod = mock(TouchableLinkMovementMethod.class);
+        textView.setMovementMethod(mockMovementMethod);
+
+        MotionEvent motionEvent =
+                MotionEvent.obtain(123, 22, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        doReturn(motionEvent).when(mockMovementMethod).getLastTouchEvent();
+        doReturn(true).when(mockMovementMethod).isLastTouchEventHandled();
+        assertThat(textView.onTouchEvent(motionEvent)).isTrue();
+    }
+
+    @Test
+    public void onTouchEvent_clickOutsideLinks_shouldReturnFalse() {
+        Annotation link = new Annotation("link", "foobar");
+        SpannableStringBuilder ssb = new SpannableStringBuilder("Hello world");
+        ssb.setSpan(link, 0, 2, 0 /* flags */);
+
+        RichTextView textView = new RichTextView(application);
+        textView.setText(ssb);
+
+        TouchableLinkMovementMethod mockMovementMethod = mock(TouchableLinkMovementMethod.class);
+        textView.setMovementMethod(mockMovementMethod);
+
+        MotionEvent motionEvent =
+                MotionEvent.obtain(123, 22, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        doReturn(motionEvent).when(mockMovementMethod).getLastTouchEvent();
+        doReturn(false).when(mockMovementMethod).isLastTouchEventHandled();
+        assertThat(textView.onTouchEvent(motionEvent)).isFalse();
+    }
+
     @Test
     public void testTextStyle() {
         Annotation link = new Annotation("textAppearance", "foobar");

From a65273f3bdf0527b101e51b6c5fba0ff51585831 Mon Sep 17 00:00:00 2001
From: Maurice Lam 
Date: Thu, 10 May 2018 13:51:26 -0700
Subject: [PATCH 74/75] Fix SwitchItem clip

Test: ./gradlew test
Bug: 79175394
Change-Id: I3b0824e770b4c0470fc949d0d58f63dec54d7e12
(cherry picked from commit 2c20d03bbd0cb0ad835853f93a00cd509e982836)
---
 library/gingerbread/res/layout/suw_items_switch.xml |  1 +
 .../setupwizardlib/items/SwitchItemTest.java        | 13 +++++++++++++
 2 files changed, 14 insertions(+)

diff --git a/library/gingerbread/res/layout/suw_items_switch.xml b/library/gingerbread/res/layout/suw_items_switch.xml
index 3f101d7..319d7f7 100644
--- a/library/gingerbread/res/layout/suw_items_switch.xml
+++ b/library/gingerbread/res/layout/suw_items_switch.xml
@@ -20,6 +20,7 @@
     style="@style/SuwItemContainer.Verbose"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:clipToPadding="false"
     android:orientation="horizontal">
 
     = VERSION_CODES.LOLLIPOP);
+        SwitchItem item = new SwitchItem();
+        LayoutInflater inflater = LayoutInflater.from(application);
+        ViewGroup layout = (ViewGroup) inflater.inflate(item.getDefaultLayoutResource(), null);
+        assertThat(layout.getClipToPadding()).isFalse();
+    }
+
     @Test
     public void testChecked() {
         SwitchItem item = new SwitchItem();

From 4a5ff8044c5069aa7e6cd1774cee8d7f5f9595da Mon Sep 17 00:00:00 2001
From: Colin Cross 
Date: Fri, 15 Jun 2018 11:51:23 -0700
Subject: [PATCH 75/75] Fix ManifestMerger issues

Set LOCAL_MIN_SDK_VERSION in setup-wizard-lib so that the build system
doesn't raise the minSdkVersion value specified in the manifest, which
causes ManifestMerger to error when trying to merge it into a package
that specifies a lower minSdkVersion.

Bug: 78447299
Test: m java
Change-Id: Ia72327d787c45f6e2f35df97094b92cf6e88e214
---
 library/Android.mk | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/library/Android.mk b/library/Android.mk
index ff92194..6cbfae8 100644
--- a/library/Android.mk
+++ b/library/Android.mk
@@ -15,6 +15,7 @@ LOCAL_RESOURCE_DIR := \
     $(LOCAL_PATH)/platform/res
 LOCAL_SDK_VERSION := current
 LOCAL_SRC_FILES := $(call all-java-files-under, main/src platform/src)
+LOCAL_MIN_SDK_VERSION := 23
 
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
@@ -48,4 +49,6 @@ LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-v7-appcompat \
     android-support-v7-recyclerview
 
+LOCAL_MIN_SDK_VERSION := 14
+
 include $(BUILD_STATIC_JAVA_LIBRARY)