From ce8533db3b2cc7d91dd795c723b8a9ceb4f59e98 Mon Sep 17 00:00:00 2001 From: ekager Date: Tue, 4 Aug 2020 17:42:53 -0400 Subject: [PATCH 01/10] No issue: Change first paint feature flag to nightly/debug --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 06580a6b9..6ef25e4e2 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -47,5 +47,5 @@ object FeatureFlags { /** * Enables wait til first contentful paint */ - val waitUntilPaintToDraw = Config.channel.isDebug + val waitUntilPaintToDraw = Config.channel.isNightlyOrDebug } From 0e0183aa24510229b8335dd1cb88ff682084cb3c Mon Sep 17 00:00:00 2001 From: Richard Pappalardo Date: Tue, 4 Aug 2020 19:46:41 -0700 Subject: [PATCH 02/10] Disable flaky tests: settingsAddonsItemsTest, verifyAboutFirefoxPreview (#13286) * fix: disable intermittent failing UI tests * fix: add dependency --- .../androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt | 3 ++- .../java/org/mozilla/fenix/ui/SettingsAddonsTest.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt index 26368bd0a..b9963cb98 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt @@ -10,6 +10,7 @@ import okhttp3.mockwebserver.MockWebServer import org.junit.Rule import org.junit.Before import org.junit.After +import org.junit.Ignore import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityIntentTestRule @@ -68,7 +69,7 @@ class SettingsAboutTest { } } - + @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/13219") @Test fun verifyAboutFirefoxPreview() { homeScreen { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt index 05b3b82fc..a310457bb 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAddonsTest.kt @@ -44,6 +44,7 @@ class SettingsAddonsTest { } // Walks through settings add-ons menu to ensure all items are present + @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/13218") @Test fun settingsAddonsItemsTest() { homeScreen { From 27341eaaf44c966e07f114496a362b7742480ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hakk=C4=B1=20Kaan=20=C3=87al=C4=B1=C5=9Fkan?= Date: Wed, 15 Jul 2020 14:35:22 +0300 Subject: [PATCH 03/10] For #12585: Close tab tray menu on orientation changes --- .../java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt index a4417ef15..cfe8b0f1c 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt @@ -61,6 +61,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler private val tabsFeature = ViewBoundFeatureWrapper() private var _tabTrayView: TabTrayView? = null + private var currentOrientation: Int? = null private val tabTrayView: TabTrayView get() = _tabTrayView!! private lateinit var tabTrayDialogStore: TabTrayDialogFragmentStore @@ -154,9 +155,10 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler val isLandscape = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE tabTrayView.setTopOffset(isLandscape) - if (isLandscape) { + if (newConfig.orientation != currentOrientation) { tabTrayView.dismissMenu() tabTrayView.expand() + currentOrientation = newConfig.orientation } } @@ -168,6 +170,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler val thumbnailLoader = ThumbnailLoader(requireContext().components.core.thumbnailStorage) val adapter = FenixTabsAdapter(requireContext(), thumbnailLoader) + currentOrientation = resources.configuration.orientation _tabTrayView = TabTrayView( view.tabLayout, From add147ba388180022615cdb28169a3dfe822176a Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Wed, 5 Aug 2020 00:21:25 +0000 Subject: [PATCH 04/10] Import l10n. --- app/src/main/res/values-cy/strings.xml | 17 +++--------- app/src/main/res/values-en-rCA/strings.xml | 17 +++--------- app/src/main/res/values-es-rCL/strings.xml | 18 +++---------- app/src/main/res/values-fr/strings.xml | 18 +++---------- app/src/main/res/values-gn/strings.xml | 17 +++--------- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 18 +++---------- app/src/main/res/values-nl/strings.xml | 31 ++++++++++++---------- app/src/main/res/values-pl/strings.xml | 17 +++--------- app/src/main/res/values-pt-rBR/strings.xml | 17 +++--------- app/src/main/res/values-sk/strings.xml | 18 +++---------- app/src/main/res/values-su/strings.xml | 17 +++--------- app/src/main/res/values-te/strings.xml | 17 +++--------- app/src/main/res/values-th/strings.xml | 17 +++--------- app/src/main/res/values-tr/strings.xml | 17 +++--------- app/src/main/res/values-uz/strings.xml | 20 ++++++-------- app/src/main/res/values-vi/strings.xml | 17 +++--------- app/src/main/res/values-zh-rCN/strings.xml | 18 +++---------- app/src/main/res/values-zh-rTW/strings.xml | 17 +++--------- 19 files changed, 74 insertions(+), 256 deletions(-) diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 7373f9449..3da299943 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -170,8 +170,8 @@ Sganio - - Peiriant Chwilio + + Peiriant chwilio Gosodiadau peiriannau chwilio @@ -1456,9 +1456,7 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Mae mewngofnod gyda’r enw defnyddiwr yna eisoes yn bodoli - - Cysylltu gyda Chyfrif Firefox. - + Cysylltu dyfais arall Ail-ddilyswch, os gwelwch yn dda. @@ -1480,13 +1478,4 @@ Fodd bynnag, gall fod yn llai sefydlog. Llwythwch ein porwr Beta i gael profiad Iawn, Wedi deall! - - - Llwybrau byr - - Chwilio gyda - - Y tro hwn, chwilio gyda: - - Dangos llwybrau byr chwilio diff --git a/app/src/main/res/values-en-rCA/strings.xml b/app/src/main/res/values-en-rCA/strings.xml index 2428be270..3f822e18c 100644 --- a/app/src/main/res/values-en-rCA/strings.xml +++ b/app/src/main/res/values-en-rCA/strings.xml @@ -170,8 +170,8 @@ Scan - - Search Engine + + Search engine Search engine settings @@ -1447,9 +1447,7 @@ A login with that username already exists - - Connect with a Firefox Account. - + Connect another device. Please re-authenticate. @@ -1470,13 +1468,4 @@ OK, Got It - - - Shortcuts - - Search with - - This time, search with: - - Show search shortcuts diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index 86efd0030..b8815f6d6 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -169,8 +169,8 @@ Escanear - - Motor de búsqueda + + Motor de búsqueda Ajustes del motor de búsqueda @@ -1456,9 +1456,7 @@ Ya existe una credencial con ese nombre de usuario - - Conectarse con una cuenta de Firefox. - + Conectar otro dispositivo. Por favor, vuelve a autentificarte. @@ -1479,14 +1477,4 @@ Ok, ¡ya caché! - - - Atajos - - Buscar con - - Esta vez, buscar con: - - - Mostrar atajos de búsqueda diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d4861c785..07fcfa93f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -172,8 +172,8 @@ Scanner - - Moteur de recherche + + Moteur de recherche Paramètres du moteur de recherche @@ -1490,9 +1490,7 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n Un identifiant avec ce nom d’utilisateur existe déjà - - Connectez-vous avec un compte Firefox. - + Connectez un autre appareil. Veuillez vous authentifier à nouveau. @@ -1513,14 +1511,4 @@ Cependant, il peut être moins stable. Téléchargez la version bêta de notre n J’ai compris - - - Raccourcis - - Rechercher avec - - - Pour cette fois, rechercher avec : - - Afficher les raccourcis de recherche diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index 750344e21..8977f2b82 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -175,8 +175,8 @@ Moha’ãnga - - Hekaha mongu’eha + + Hekaha mongu’eha Hekaha ñemboheko @@ -1484,9 +1484,7 @@ Oĩma tembiapo ñepyrũ puruhára réra peichagua - - Eike Firefox Account ndive. - + Emoinge ambue mba’e’oka. Ikatúpiko emoneĩjey. @@ -1508,13 +1506,4 @@ Oĩma, aikumby - - - Mbopya’eha - - Eheka amo - - Ko’ág̃a, eheka hendive: - - Ehechauka jeheka mbopya’eha diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 15970f7ce..b1b97162b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -800,7 +800,7 @@ Ponovo se poveži za sinkronizaciju - Neumreženo + Izvanmrežno Poveži jedan drugi uređaj diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d7ef5b200..f0eb7997c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -173,8 +173,8 @@ Leggi - - Motore di ricerca + + Motore di ricerca Impostazioni motori di ricerca @@ -1492,9 +1492,7 @@ Esistono già credenziali con questo nome utente - - Connetti un account Firefox. - + Connetti un altro dispositivo. Esegui nuovamente l’accesso. @@ -1516,14 +1514,4 @@ OK, tutto chiaro - - - Scelte rapide - - Cerca con - - - Adesso cerca con: - - Mostra le scorciatoie di ricerca diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7cf425cce..9c65f659f 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -30,6 +30,17 @@ %1$d geselecteerd + + Nieuwe collectie toevoegen + + Naam + + Collectie selecteren + + %1$s geselecteerd + + Geselecteerd + %1$s is gemaakt door Mozilla. @@ -156,8 +167,8 @@ Scannen - - Zoekmachine + + Zoekmachine Instellingen zoekmachine @@ -520,6 +531,9 @@ %1$s (privémodus) + + Opslaan + Geschiedenis verwijderen @@ -1444,9 +1458,7 @@ Er bestaat al een aanmelding met die gebruikersnaam - - Verbinden met een Firefox-account. - + Een ander apparaat verbinden. Gelieve opnieuw te authenticeren. @@ -1468,13 +1480,4 @@ OK, begrepen - - - Snelkoppelingen - - Zoeken met - - Deze keer zoeken met: - - Zoeksnelkoppelingen tonen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e2a98b23a..12a58500e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -173,8 +173,8 @@ Skanuj - - Wyszukiwarka + + Wyszukiwarka Ustawienia wyszukiwarki @@ -1466,9 +1466,7 @@ Dane logowania z tą nazwą użytkownika już istnieją - - Połącz się z kontem Firefoksa. - + Połącz inne urządzenie. Proszę uwierzytelnić się ponownie. @@ -1490,13 +1488,4 @@ OK - - - Skróty - - Szukaj w - - Tym razem szukaj w: - - Skróty wyszukiwania diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index dcb7b0153..ef5a2e67b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -171,8 +171,8 @@ Digitalizar - - Mecanismo de pesquisa + + Mecanismo de pesquisa Configurações de mecanismos de pesquisa @@ -1461,9 +1461,7 @@ Já existe uma conta com este nome de usuário - - Conecte-se com uma Conta Firefox. - + Conecte outro dispositivo. Autentique novamente. @@ -1485,13 +1483,4 @@ OK, entendi - - - Atalhos - - Pesquisar com - - Desta vez, pesquisar com: - - Mostrar atalhos de pesquisa diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d927a9e84..08ca67184 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -173,8 +173,8 @@ Skenovať - - Vyhľadávací modul + + Vyhľadávací modul Nastavenia vyhľadávacieho modulu @@ -1466,9 +1466,7 @@ Prihlasovacie údaje s týmto používateľským menom už existujú - - Prepojiť s účtom Firefox. - + Pripojiť ďalšie zariadenie. Prosím, znova overte totožnosť. @@ -1490,14 +1488,4 @@ Ok, rozumiem - - - Skratky - - Hľadať pomocou - - - Vyhľadať pomocou: - - Zobrazovať skratky vyhľadávania diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index a155b1da3..40d2e0025 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -169,8 +169,8 @@ Pinday - - Mesin Pamaluruh + + Mesin pamaluruh Setélan mesin pamaluruh @@ -1471,9 +1471,7 @@ Login maké éta sandiasma geus aya - - Sambungkeun maké Firefox Account. - + Sambungkeun séjén paranti. Mangga oténtikasi ulang. @@ -1494,13 +1492,4 @@ Okéh, Ngarti - - - Takulan - - Paluruh maké - - Saayeunaeun, paluruh maké: - - Témbongkeun takulan pamaluruhan diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 517dd67e5..4b05e418b 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -169,8 +169,8 @@ స్కాన్ చేయి - - శోధన యంత్రం + + శోధన యంత్రం శోధన యంత్ర అమరికలు @@ -1479,9 +1479,7 @@ ఆ వాడుకరి పేరుతో ఒక ప్రవేశం ఇప్పటికే ఉంది - - Firefox ఖాతాతో అనుసంధానమవ్వండి. - + మరొక పరికరాన్ని అనుసంధానించండి. దయచేసి పునరధీకరణ చేయండి. @@ -1502,13 +1500,4 @@ సరే, అర్థమయ్యింది - - - సత్వరమార్గాలు - - దీనితో వెతుకు - - ఈసారి దీనితో వెతుకు: - - శోధన సత్వరమార్గాలను చూపించు diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 9dca54614..40f4c67d1 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -169,8 +169,8 @@ สแกน - - เครื่องมือค้นหา + + เครื่องมือค้นหา การตั้งค่าเครื่องมือค้นหา @@ -1454,9 +1454,7 @@ การเข้าสู่ระบบที่มีชื่อผู้ใช้นี้มีอยู่แล้ว - - เชื่อมต่อกับบัญชี Firefox - + เชื่อมต่ออุปกรณ์อื่น @@ -1478,13 +1476,4 @@ ตกลง เข้าใจแล้ว - - - ทางลัด - - ค้นหาด้วย - - คราวนี้ค้นหาด้วย: - - แสดงทางลัดการค้นหา diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 1b6ccda3a..3253c226f 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -171,8 +171,8 @@ Tara - - Arama motoru + + Arama motoru Arama motoru ayarları @@ -1456,9 +1456,7 @@ Bu kullanıcı adına sahip bir hesap zaten var - - Firefox Hesabınıza giriş yapın. - + Başka bir cihaz bağlayın. Lütfen yeniden giriş yapın. @@ -1479,13 +1477,4 @@ Tamam - - - Kısayollar - - Bununla ara: - - Bir de bununla aramayı deneyin: - - Arama kısayollarını göster diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index a1f99455b..cff6609cd 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -166,8 +166,8 @@ Tekshirish - - Qidiruv tizimi + + Qidiruv tizimi Qidiruv tizimi sozlamalari @@ -378,6 +378,11 @@ Texnik va foydalanishga oid maʼlumotlar + + Samaradorlik, foydalanish statistikasi va moslash maʼlumotlarini Mozillaga ulashish orqali siz %1$s brauzerini yaxshilashda yordam berasiz + + Marketing maʼlumotlari + Maxfiy varaq qoʻshish @@ -809,9 +814,7 @@ Shu nomdagi login oldindan bor - - Firefox hisobi bilan ulanish - + Boshqa qurilmani ulash Qaytadan haqiqiylikni tekshiring. @@ -832,11 +835,4 @@ OK, tushundim - - - Yorliqlar - - Izlash: - - Bu safar quyidagi bilan izlash: diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 4bc8f7662..02a89d376 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -171,8 +171,8 @@ Quét - - Công cụ tìm kiếm + + Công cụ tìm kiếm Cài đặt công cụ tìm kiếm @@ -1450,9 +1450,7 @@ Một thông tin đăng nhập với tên người dùng đó đã tồn tại - - Kết nối với tài khoản Firefox. - + Kết nối thiết bị khác. Vui lòng xác thực lại. @@ -1473,13 +1471,4 @@ OK, đã hiểu - - - Tìm kiếm - - Tìm kiếm với - - Lần này, tìm kiếm với: - - Hiển thị các lối tắt tìm kiếm diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3615f0b5a..5e01ed42b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -178,8 +178,8 @@ 扫码 - - 搜索引擎 + + 搜索引擎 搜索引擎设置 @@ -1495,9 +1495,7 @@ 已有同用户名的登录信息存在 - - 绑定 Firefox 账户 - + 绑定其他设备 请重新验证。 @@ -1518,14 +1516,4 @@ 我知道了 - - - 快捷操作 - - 可选用下列引擎搜索 - - - 更多搜索引擎: - - 显示搜索快捷操作 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e1d52cb6b..5802a9129 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -174,8 +174,8 @@ 掃描 - - 搜尋引擎 + + 搜尋引擎 搜尋引擎設定 @@ -1484,9 +1484,7 @@ 已有該使用者名稱的登入資訊 - - 連結 Firefox 帳號。 - + 連結另一部裝置。 請重新登入。 @@ -1507,13 +1505,4 @@ 好,知道了! - - - 捷徑 - - 使用下列引擎搜尋 - - 這次使用下列搜尋引擎搜尋: - - 顯示搜尋捷徑 From 5318d64911688c1d7cada2452d3fe861a81b8e5d Mon Sep 17 00:00:00 2001 From: Kainalu Hagiwara Date: Tue, 28 Jul 2020 16:06:23 -0700 Subject: [PATCH 05/10] For #12906 - Fix swipe-to-delete bookmark folder. --- .../library/bookmarks/BookmarkTouchHelper.kt | 15 ++++- .../fenix/library/bookmarks/BookmarkView.kt | 3 +- .../bookmarks/BookmarkTouchHelperTest.kt | 59 +++++++++++++++++++ 3 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelperTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt index 69c0186ed..1cecff4fe 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt @@ -10,6 +10,7 @@ import android.graphics.drawable.Drawable import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView +import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.support.ktx.android.content.getColorFromAttr import mozilla.components.support.ktx.android.content.getDrawableWithTint import mozilla.components.support.ktx.android.util.dpToPx @@ -21,8 +22,9 @@ import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkSeparatorViewHold class BookmarkTouchHelper(interactor: BookmarkViewInteractor) : ItemTouchHelper(BookmarkTouchCallback(interactor)) -class BookmarkTouchCallback(private val interactor: BookmarkViewInteractor) : - ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) { +class BookmarkTouchCallback( + private val interactor: BookmarkViewInteractor +) : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) { override fun getSwipeDirs( recyclerView: RecyclerView, @@ -41,7 +43,14 @@ class BookmarkTouchCallback(private val interactor: BookmarkViewInteractor) : */ override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { val item = (viewHolder as BookmarkNodeViewHolder).item - item?.let { interactor.onDelete(setOf(it)) } + item?.let { + interactor.onDelete(setOf(it)) + // We need to notify the adapter of a change if we swipe a folder to prevent + // visual bugs when cancelling deletion of a folder + if (item.type == BookmarkNodeType.FOLDER) { + viewHolder.bindingAdapter?.notifyItemChanged(viewHolder.bindingAdapterPosition) + } + } } override fun onChildDraw( diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt index 10d91822b..a64f4b6ee 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt @@ -112,11 +112,10 @@ class BookmarkView( private var mode: BookmarkFragmentState.Mode = BookmarkFragmentState.Mode.Normal() private var tree: BookmarkNode? = null - private val bookmarkAdapter: BookmarkAdapter + private val bookmarkAdapter = BookmarkAdapter(view.bookmarks_empty_view, interactor) init { view.bookmark_list.apply { - bookmarkAdapter = BookmarkAdapter(view.bookmarks_empty_view, interactor) adapter = bookmarkAdapter } view.bookmark_folders_sign_in.setOnClickListener { diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelperTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelperTest.kt new file mode 100644 index 000000000..5e9209d88 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelperTest.kt @@ -0,0 +1,59 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.library.bookmarks + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.mockk +import io.mockk.verify +import mozilla.components.concept.storage.BookmarkNode +import mozilla.components.concept.storage.BookmarkNodeType +import org.junit.Before +import org.junit.Test +import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkNodeViewHolder + +class BookmarkTouchHelperTest { + + @RelaxedMockK private lateinit var interactor: BookmarkViewInteractor + @RelaxedMockK private lateinit var viewHolder: BookmarkNodeViewHolder + @RelaxedMockK private lateinit var item: BookmarkNode + private lateinit var touchCallback: BookmarkTouchCallback + + @Before + fun setup() { + MockKAnnotations.init(this) + touchCallback = BookmarkTouchCallback(interactor) + + every { viewHolder.item } returns item + } + + @Test + fun `swiping an item calls onDelete`() { + touchCallback.onSwiped(viewHolder, ItemTouchHelper.LEFT) + + verify { + interactor.onDelete(setOf(item)) + } + } + + @Test + fun `swiping a folder calls onDelete and notifies the adapter of the change`() { + val adapter: RecyclerView.Adapter = mockk(relaxed = true) + + every { item.type } returns BookmarkNodeType.FOLDER + every { viewHolder.bindingAdapter } returns adapter + every { viewHolder.bindingAdapterPosition } returns 0 + + touchCallback.onSwiped(viewHolder, ItemTouchHelper.LEFT) + + verify { + interactor.onDelete(setOf(item)) + adapter.notifyItemChanged(0) + } + } +} From 30c7b5ea5ef5ae270c3e592d3d893d34e9047764 Mon Sep 17 00:00:00 2001 From: Kainalu Hagiwara Date: Tue, 28 Jul 2020 16:57:43 -0700 Subject: [PATCH 06/10] For #12831 - Disable SwipeRefreshLayout while swiping a bookmark. --- .../library/bookmarks/BookmarkController.kt | 10 ++ .../bookmarks/BookmarkFragmentInteractor.kt | 8 ++ .../bookmarks/BookmarkFragmentStore.kt | 71 ++++++----- .../library/bookmarks/BookmarkTouchHelper.kt | 9 ++ .../fenix/library/bookmarks/BookmarkView.kt | 13 +- .../bookmarks/BookmarkControllerTest.kt | 18 +++ .../BookmarkFragmentInteractorTest.kt | 18 +++ .../bookmarks/BookmarkFragmentStoreTest.kt | 113 +++++++++++++++--- 8 files changed, 215 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt index add69b004..5d203028f 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkController.kt @@ -45,6 +45,8 @@ interface BookmarkController { fun handleBookmarkFolderDeletion(nodes: Set) fun handleRequestSync() fun handleBackPressed() + fun handleStartSwipingItem() + fun handleStopSwipingItem() } @Suppress("TooManyFunctions") @@ -169,6 +171,14 @@ class DefaultBookmarkController( } } + override fun handleStartSwipingItem() { + store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(false)) + } + + override fun handleStopSwipingItem() { + store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)) + } + private fun openInNewTab( searchTermOrURL: String, newTab: Boolean, diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt index 4f5e757fc..3a1a4f252 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractor.kt @@ -120,4 +120,12 @@ class BookmarkFragmentInteractor( override fun onRequestSync() { bookmarksController.handleRequestSync() } + + override fun onStartSwipingItem() { + bookmarksController.handleStartSwipingItem() + } + + override fun onStopSwipingItem() { + bookmarksController.handleStopSwipingItem() + } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt index d2c2341de..e1c4a8f43 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStore.kt @@ -23,12 +23,14 @@ class BookmarkFragmentStore( * @property guidBackstack A set of guids for bookmark nodes we have visited. Used to traverse back * up the tree after a sync. * @property isLoading true if bookmarks are still being loaded from disk + * @property isSwipeToRefreshEnabled true if swipe to refresh should be enabled */ data class BookmarkFragmentState( val tree: BookmarkNode?, val mode: Mode = Mode.Normal(), val guidBackstack: List = emptyList(), - val isLoading: Boolean = true + val isLoading: Boolean = true, + val isSwipeToRefreshEnabled: Boolean = true ) : State { sealed class Mode { open val selectedItems = emptySet() @@ -49,6 +51,7 @@ sealed class BookmarkFragmentAction : Action { object DeselectAll : BookmarkFragmentAction() object StartSync : BookmarkFragmentAction() object FinishSync : BookmarkFragmentAction() + data class SwipeRefreshAvailabilityChanged(val enabled: Boolean) : BookmarkFragmentAction() } /** @@ -71,31 +74,37 @@ private fun bookmarkFragmentStateReducer( } + action.tree.guid val items = state.mode.selectedItems.filter { it in action.tree } + val mode = when { + state.mode is BookmarkFragmentState.Mode.Syncing -> { + BookmarkFragmentState.Mode.Syncing + } + items.isEmpty() -> { + BookmarkFragmentState.Mode.Normal(shouldShowMenu(action.tree.guid)) + } + else -> BookmarkFragmentState.Mode.Selecting(items.toSet()) + } state.copy( tree = action.tree, - mode = when { - state.mode is BookmarkFragmentState.Mode.Syncing -> { - BookmarkFragmentState.Mode.Syncing - } - items.isEmpty() -> { - BookmarkFragmentState.Mode.Normal(shouldShowMenu(action.tree.guid)) - } - else -> BookmarkFragmentState.Mode.Selecting(items.toSet()) - }, + mode = mode, guidBackstack = backstack, - isLoading = false + isLoading = false, + isSwipeToRefreshEnabled = mode !is BookmarkFragmentState.Mode.Selecting ) } - is BookmarkFragmentAction.Select -> - state.copy(mode = BookmarkFragmentState.Mode.Selecting(state.mode.selectedItems + action.item)) + is BookmarkFragmentAction.Select -> state.copy( + mode = BookmarkFragmentState.Mode.Selecting(state.mode.selectedItems + action.item), + isSwipeToRefreshEnabled = false + ) is BookmarkFragmentAction.Deselect -> { val items = state.mode.selectedItems - action.item + val mode = if (items.isEmpty()) { + BookmarkFragmentState.Mode.Normal() + } else { + BookmarkFragmentState.Mode.Selecting(items) + } state.copy( - mode = if (items.isEmpty()) { - BookmarkFragmentState.Mode.Normal() - } else { - BookmarkFragmentState.Mode.Selecting(items) - } + mode = mode, + isSwipeToRefreshEnabled = mode !is BookmarkFragmentState.Mode.Selecting ) } is BookmarkFragmentAction.DeselectAll -> @@ -104,18 +113,22 @@ private fun bookmarkFragmentStateReducer( BookmarkFragmentState.Mode.Syncing } else { BookmarkFragmentState.Mode.Normal() - } - ) - is BookmarkFragmentAction.StartSync -> - state.copy( - mode = BookmarkFragmentState.Mode.Syncing - ) - is BookmarkFragmentAction.FinishSync -> - state.copy( - mode = BookmarkFragmentState.Mode.Normal( - showMenu = shouldShowMenu(state.tree?.guid) - ) + }, + isSwipeToRefreshEnabled = true ) + is BookmarkFragmentAction.StartSync -> state.copy( + mode = BookmarkFragmentState.Mode.Syncing, + isSwipeToRefreshEnabled = true + ) + is BookmarkFragmentAction.FinishSync -> state.copy( + mode = BookmarkFragmentState.Mode.Normal( + showMenu = shouldShowMenu(state.tree?.guid) + ), + isSwipeToRefreshEnabled = true + ) + is BookmarkFragmentAction.SwipeRefreshAvailabilityChanged -> state.copy( + isSwipeToRefreshEnabled = action.enabled && state.mode !is BookmarkFragmentState.Mode.Selecting + ) } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt index 1cecff4fe..b31b99fa6 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkTouchHelper.kt @@ -116,6 +116,15 @@ class BookmarkTouchCallback( target: RecyclerView.ViewHolder ): Boolean = false + override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { + super.onSelectedChanged(viewHolder, actionState) + if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { + interactor.onStartSwipingItem() + } else { + interactor.onStopSwipingItem() + } + } + private fun setBounds( background: Drawable, backgroundBounds: Rect, diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt index a64f4b6ee..9a0e4644a 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkView.kt @@ -98,6 +98,16 @@ interface BookmarkViewInteractor : SelectionInteractor { * */ fun onRequestSync() + + /** + * Handles the start of a swipe on a bookmark. + */ + fun onStartSwipingItem() + + /** + * Handles the end of a swipe on a bookmark. + */ + fun onStopSwipingItem() } class BookmarkView( @@ -152,8 +162,7 @@ class BookmarkView( } } view.bookmarks_progress_bar.isVisible = state.isLoading - view.swipe_refresh.isEnabled = - state.mode is BookmarkFragmentState.Mode.Normal || state.mode is BookmarkFragmentState.Mode.Syncing + view.swipe_refresh.isEnabled = state.isSwipeToRefreshEnabled view.swipe_refresh.isRefreshing = state.mode is BookmarkFragmentState.Mode.Syncing } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt index d55eb3818..2d0f2deb4 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkControllerTest.kt @@ -337,4 +337,22 @@ class BookmarkControllerTest { navController.popBackStack() } } + + @Test + fun `handleStartSwipingItem disables swipe to refresh`() { + controller.handleStartSwipingItem() + + verify { + bookmarkStore.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(false)) + } + } + + @Test + fun `handleStopSwipingItem attempts to enable swipe to refresh`() { + controller.handleStopSwipingItem() + + verify { + bookmarkStore.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)) + } + } } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt index 5f0a409cc..d640a9c78 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentInteractorTest.kt @@ -210,4 +210,22 @@ class BookmarkFragmentInteractorTest { bookmarkController.handleRequestSync() } } + + @Test + fun `start swiping an item`() { + interactor.onStartSwipingItem() + + verify { + bookmarkController.handleStartSwipingItem() + } + } + + @Test + fun `stop swiping an item`() { + interactor.onStopSwipingItem() + + verify { + bookmarkController.handleStopSwipingItem() + } + } } diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt index f0e6f629c..321558e07 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkFragmentStoreTest.kt @@ -80,32 +80,63 @@ class BookmarkFragmentStoreTest { @Test fun `ensure selected items remain selected after a tree change`() = runBlocking { - val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder))) + val initialState = BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder)), + isLoading = false, + isSwipeToRefreshEnabled = false + ) val store = BookmarkFragmentStore(initialState) store.dispatch(BookmarkFragmentAction.Change(newTree)).join() - assertEquals(store.state.tree, newTree) - assertEquals(store.state.mode, BookmarkFragmentState.Mode.Selecting(setOf(subfolder))) + assertEquals( + store.state, + BookmarkFragmentState( + newTree, + BookmarkFragmentState.Mode.Selecting(setOf(subfolder)), + guidBackstack = listOf(tree.guid), + isLoading = false, + isSwipeToRefreshEnabled = false + ) + ) } @Test - fun `select and deselect bookmarks changes the mode`() = runBlocking { + fun `select and deselect a single bookmark changes the mode and swipe to refresh state`() = runBlocking { val initialState = BookmarkFragmentState(tree) val store = BookmarkFragmentStore(initialState) store.dispatch(BookmarkFragmentAction.Select(childItem)).join() - assertEquals(store.state, BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(childItem)))) + assertEquals( + store.state, + BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Selecting(setOf(childItem)), + isSwipeToRefreshEnabled = false + ) + ) store.dispatch(BookmarkFragmentAction.Deselect(childItem)).join() - assertEquals(store.state, BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal())) + assertEquals( + store.state, + BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Normal(), + isSwipeToRefreshEnabled = true + ) + ) } @Test fun `selecting the same item twice does nothing`() = runBlocking { - val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder))) + val initialState = BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Selecting(setOf(item, subfolder)), + isSwipeToRefreshEnabled = false + ) val store = BookmarkFragmentStore(initialState) store.dispatch(BookmarkFragmentAction.Select(item)).join() @@ -115,7 +146,11 @@ class BookmarkFragmentStoreTest { @Test fun `deselecting an unselected bookmark does nothing`() = runBlocking { - val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(childItem))) + val initialState = BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Selecting(setOf(childItem)), + isSwipeToRefreshEnabled = false + ) val store = BookmarkFragmentStore(initialState) store.dispatch(BookmarkFragmentAction.Deselect(item)).join() @@ -134,14 +169,25 @@ class BookmarkFragmentStoreTest { } @Test - fun `deselect all bookmarks changes the mode`() = runBlocking { - val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Selecting(setOf(item, childItem))) - val store = BookmarkFragmentStore(initialState) + fun `deselect all bookmarks changes the mode and updates swipe to refresh state`() = + runBlocking { + val initialState = BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Selecting(setOf(item, childItem)), + isSwipeToRefreshEnabled = false + ) + val store = BookmarkFragmentStore(initialState) - store.dispatch(BookmarkFragmentAction.DeselectAll).join() + store.dispatch(BookmarkFragmentAction.DeselectAll).join() - assertEquals(store.state, initialState.copy(mode = BookmarkFragmentState.Mode.Normal())) - } + assertEquals( + store.state, + initialState.copy( + mode = BookmarkFragmentState.Mode.Normal(), + isSwipeToRefreshEnabled = true + ) + ) + } @Test fun `deselect all bookmarks when none are selected`() = runBlocking { @@ -214,6 +260,45 @@ class BookmarkFragmentStoreTest { assertEquals(BookmarkFragmentState.Mode.Syncing, store.state.mode) } + @Test + fun `enabling swipe to refresh in Normal mode works`() = runBlocking { + val initialState = BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Normal(), + isSwipeToRefreshEnabled = false + ) + val store = BookmarkFragmentStore(initialState) + + store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)).join() + assertEquals(true, store.state.isSwipeToRefreshEnabled) + } + + @Test + fun `enabling swipe to refresh in Syncing mode works`() = runBlocking { + val initialState = BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Syncing, + isSwipeToRefreshEnabled = false + ) + val store = BookmarkFragmentStore(initialState) + + store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)).join() + assertEquals(true, store.state.isSwipeToRefreshEnabled) + } + + @Test + fun `enabling swipe to refresh in Selecting mode does not work`() = runBlocking { + val initialState = BookmarkFragmentState( + tree, + BookmarkFragmentState.Mode.Selecting(emptySet()), + isSwipeToRefreshEnabled = false + ) + val store = BookmarkFragmentStore(initialState) + + store.dispatch(BookmarkFragmentAction.SwipeRefreshAvailabilityChanged(true)).join() + assertEquals(false, store.state.isSwipeToRefreshEnabled) + } + private val item = BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null) private val separator = BookmarkNode(BookmarkNodeType.SEPARATOR, "789", "123", 1, null, null, null) private val subfolder = BookmarkNode(BookmarkNodeType.FOLDER, "987", "123", 0, "Subfolder", null, listOf()) From c1c7de5c1a655171f48beb4f3ce7ccbf7243a46a Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Wed, 5 Aug 2020 09:17:30 -0700 Subject: [PATCH 07/10] For #13262: Update gradle (#13263) --- app/build.gradle | 15 +++++++++------ gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3f86afe6a..0df1ecc6a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -566,7 +566,9 @@ if (project.hasProperty("coverage")) { } android.applicationVariants.all { variant -> - task "jacoco${variant.name.capitalize()}TestReport"(type: JacocoReport, dependsOn: "test${variant.name.capitalize()}UnitTest") { + tasks.register("jacoco${variant.name.capitalize()}TestReport", JacocoReport) { + dependsOn "test${variant.name.capitalize()}UnitTest" + reports { xml.enabled = true html.enabled = true @@ -579,11 +581,12 @@ if (project.hasProperty("coverage")) { excludes: fileFilter) def mainSrc = "$project.projectDir/src/main/java" - sourceDirectories = files([mainSrc]) - classDirectories = files([kotlinDebugTree, javaDebugTree]) - executionData = fileTree(dir: project.buildDir, includes: [ - "jacoco/test${variant.name.capitalize()}UnitTest.exec", 'outputs/code-coverage/connected/*coverage.ec' - ]) + sourceDirectories.setFrom(files([mainSrc])) + classDirectories.setFrom(files([kotlinDebugTree, javaDebugTree])) + executionData.setFrom(fileTree(dir: project.buildDir, includes: [ + "jacoco/test${variant.name.capitalize()}UnitTest.exec", + 'outputs/code-coverage/connected/*coverage.ec' + ])) } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0ebb3108e..ac33e9944 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 27c8a77c3f985297c92b90b264fb14df35dc068c Mon Sep 17 00:00:00 2001 From: Michael Comella Date: Mon, 3 Aug 2020 14:27:01 -0700 Subject: [PATCH 08/10] For #4132: remove BrowserPerformanceTestActivity & usages. --- .../org/mozilla/fenix/engine/GeckoProvider.kt | 7 ---- .../org/mozilla/fenix/engine/GeckoProvider.kt | 7 ---- app/src/main/AndroidManifest.xml | 5 --- .../browser/BrowserPerformanceTestActivity.kt | 33 ------------------- .../PerformanceActivityLifecycleCallbacks.kt | 4 +-- 5 files changed, 1 insertion(+), 55 deletions(-) delete mode 100644 app/src/main/java/org/mozilla/fenix/browser/BrowserPerformanceTestActivity.kt diff --git a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt index b5171c98a..1bebe0c5c 100644 --- a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import android.content.Context -import android.os.Bundle import mozilla.components.browser.engine.gecko.autofill.GeckoLoginDelegateWrapper import mozilla.components.browser.engine.gecko.ext.toContentBlockingSetting import mozilla.components.browser.engine.gecko.glean.GeckoAdapter @@ -17,7 +16,6 @@ import org.mozilla.geckoview.GeckoRuntime import org.mozilla.geckoview.GeckoRuntimeSettings object GeckoProvider { - var testConfig: Bundle? = null private var runtime: GeckoRuntime? = null @Synchronized @@ -40,11 +38,6 @@ object GeckoProvider { ): GeckoRuntime { val builder = GeckoRuntimeSettings.Builder() - testConfig?.let { - builder.extras(it) - .remoteDebuggingEnabled(true) - } - val runtimeSettings = builder .crashHandler(CrashHandlerService::class.java) .telemetryDelegate(GeckoAdapter()) diff --git a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt index 43a2dd510..031c1c6c1 100644 --- a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import android.content.Context -import android.os.Bundle import mozilla.components.browser.engine.gecko.autofill.GeckoLoginDelegateWrapper import mozilla.components.browser.engine.gecko.ext.toContentBlockingSetting import mozilla.components.browser.engine.gecko.glean.GeckoAdapter @@ -17,7 +16,6 @@ import org.mozilla.geckoview.GeckoRuntime import org.mozilla.geckoview.GeckoRuntimeSettings object GeckoProvider { - var testConfig: Bundle? = null private var runtime: GeckoRuntime? = null @Synchronized @@ -40,11 +38,6 @@ object GeckoProvider { ): GeckoRuntime { val builder = GeckoRuntimeSettings.Builder() - testConfig?.let { - builder.extras(it) - .remoteDebuggingEnabled(true) - } - val runtimeSettings = builder .crashHandler(CrashHandlerService::class.java) .telemetryDelegate(GeckoAdapter()) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dedb00946..bb20352e0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -217,11 +217,6 @@ - - Date: Mon, 3 Aug 2020 14:28:07 -0700 Subject: [PATCH 09/10] For #4132: remove raptor property and isRaptorEnabled manifest placeholder. afaict, this is only used for BrowserPerformanceTestActivity, which is being removed in this PR. --- app/build.gradle | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0df1ecc6a..da39bfdcd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,7 +35,6 @@ android { def deepLinkSchemeValue = "fenix-dev" buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\"" manifestPlaceholders = [ - "isRaptorEnabled": "false", "deepLinkScheme": deepLinkSchemeValue ] } @@ -56,12 +55,10 @@ android { shrinkResources false minifyEnabled false applicationIdSuffix ".fenix.debug" - manifestPlaceholders.isRaptorEnabled = "true" resValue "bool", "IS_DEBUG", "true" pseudoLocalesEnabled true } forPerformanceTest releaseTemplate >> { // the ">>" concatenates the raptor-specific options with the template - manifestPlaceholders.isRaptorEnabled = "true" applicationIdSuffix ".fenix.performancetest" debuggable true manifestPlaceholders = [ @@ -556,10 +553,6 @@ dependencies { lintChecks project(":mozilla-lint-rules") } -if (project.hasProperty("raptor")) { - android.defaultConfig.manifestPlaceholders.isRaptorEnabled = "true" -} - if (project.hasProperty("coverage")) { tasks.withType(Test) { jacoco.includeNoLocationClasses = true From 6492773fc790004415c613a9212e13755951f46c Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Wed, 5 Aug 2020 12:40:43 -0700 Subject: [PATCH 10/10] Progress on new search experience with Toolbar and Awesomebar placeholders (#13314) * For #13272 - Adds the ToolbarView to the SearchDialogFragment * For #13273 - Replaces container dependency with context in AwesomebarView * For #13276 - Hacks together the awesomebar and toolbar in the new search experience --- .../mozilla/fenix/search/SearchFragment.kt | 2 +- .../fenix/search/awesomebar/AwesomeBarView.kt | 9 +- .../searchdialog/SearchDialogFragment.kt | 106 +++++++++++++++++- .../res/layout/fragment_search_dialog.xml | 51 +++++++-- app/src/main/res/values/styles.xml | 5 + 5 files changed, 157 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt index fb706bcda..e9882c3dc 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt @@ -141,7 +141,7 @@ class SearchFragment : Fragment(), UserInteractionHandler { searchController ) - awesomeBarView = AwesomeBarView(view.scrollable_area, searchInteractor, + awesomeBarView = AwesomeBarView(requireContext(), searchInteractor, view.findViewById(R.id.awesomeBar)) setShortcutsChangedListener(CustomSearchEngineStore.PREF_FILE_SEARCH_ENGINES) setShortcutsChangedListener(FenixSearchEngineProvider.PREF_FILE_SEARCH_ENGINES) diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt index 7d918a1e0..8ba8f3e20 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt @@ -4,7 +4,7 @@ package org.mozilla.fenix.search.awesomebar -import android.view.ViewGroup +import android.content.Context import androidx.appcompat.content.res.AppCompatResources.getDrawable import androidx.core.graphics.BlendModeColorFilterCompat.createBlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat.SRC_IN @@ -34,11 +34,10 @@ import org.mozilla.fenix.search.SearchFragmentState * View that contains and configures the BrowserAwesomeBar */ class AwesomeBarView( - private val container: ViewGroup, + private val context: Context, val interactor: AwesomeBarInteractor, val view: BrowserAwesomeBar ) { - private val sessionProvider: SessionSuggestionProvider private val historyStorageProvider: HistoryStorageSuggestionProvider private val shortcutsEnginePickerProvider: ShortcutsSuggestionProvider @@ -91,7 +90,6 @@ class AwesomeBarView( init { view.itemAnimator = null - val context = container.context val components = context.components val primaryTextColor = context.getColorFromAttr(R.attr.primaryText) @@ -255,7 +253,7 @@ class AwesomeBarView( } private fun isBrowsingModePrivate(): Boolean { - return (container.context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate + return (context.asActivity() as? HomeActivity)?.browsingModeManager?.mode?.isPrivate ?: false } @@ -280,7 +278,6 @@ class AwesomeBarView( private fun getSuggestionProviderForEngine(engine: SearchEngine): List { return searchSuggestionProviderMap.getOrPut(engine) { - val context = container.context val components = context.components val primaryTextColor = context.getColorFromAttr(R.attr.primaryText) diff --git a/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt index a8a97cc32..91b8bcf22 100644 --- a/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt @@ -9,12 +9,116 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatDialogFragment +import kotlinx.android.synthetic.main.fragment_search.view.* +import mozilla.components.browser.search.SearchEngine +import mozilla.components.browser.session.Session import org.mozilla.fenix.R +import org.mozilla.fenix.ext.logDebug +import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.search.SearchEngineSource +import org.mozilla.fenix.search.SearchFragmentState +import org.mozilla.fenix.search.awesomebar.AwesomeBarInteractor +import org.mozilla.fenix.search.awesomebar.AwesomeBarView +import org.mozilla.fenix.search.toolbar.ToolbarInteractor +import org.mozilla.fenix.search.toolbar.ToolbarView + +class TempSearchInteractor(val onTextChangedCallback: (String) -> Unit) : ToolbarInteractor, AwesomeBarInteractor { + override fun onUrlCommitted(url: String) { + logDebug("boek", "onUrlCommitted $url") + } + + override fun onEditingCanceled() { + logDebug("boek", "onEditingCanceled") + } + + override fun onTextChanged(text: String) { + onTextChangedCallback.invoke(text) + } + + override fun onUrlTapped(url: String) { + logDebug("boek", "onEditingCanceled") + } + + override fun onSearchTermsTapped(searchTerms: String) { + logDebug("boek", "onEditingCanceled") + } + + override fun onSearchShortcutEngineSelected(searchEngine: SearchEngine) { + logDebug("boek", "onEditingCanceled") + } + + override fun onClickSearchEngineSettings() { + logDebug("boek", "onEditingCanceled") + } + + override fun onExistingSessionSelected(session: Session) { + logDebug("boek", "onEditingCanceled") + } + + override fun onExistingSessionSelected(tabId: String) { + logDebug("boek", "onEditingCanceled") + } + + override fun onSearchShortcutsButtonClicked() { + logDebug("boek", "onEditingCanceled") + } +} class SearchDialogFragment : AppCompatDialogFragment() { + + private lateinit var toolbarView: ToolbarView + private lateinit var awesomeBarView: AwesomeBarView + private val tempInteractor = TempSearchInteractor { + view?.awesomeBar?.visibility = if (it.isEmpty()) View.INVISIBLE else View.VISIBLE + + awesomeBarView.update( + SearchFragmentState( + query = it, + url = "", + searchTerms = "", + searchEngineSource = SearchEngineSource.Default(requireComponents.search.provider.getDefaultEngine(requireContext())), + defaultEngineSource = SearchEngineSource.Default(requireComponents.search.provider.getDefaultEngine(requireContext())), + showSearchSuggestions = true, + showSearchSuggestionsHint = false, + showSearchShortcuts = false, + areShortcutsAvailable = false, + showClipboardSuggestions = true, + showHistorySuggestions = true, + showBookmarkSuggestions = true, + tabId = null, + pastedText = null, + searchAccessPoint = null + ) + ) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, R.style.SearchDialogStyle) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? = inflater.inflate(R.layout.fragment_search_dialog, container, false) + ): View? { + val view = inflater.inflate(R.layout.fragment_search_dialog, container, false) + + toolbarView = ToolbarView( + requireContext(), + tempInteractor, + null, + false, + view.toolbar, + requireComponents.core.engine + ) + + awesomeBarView = AwesomeBarView( + requireContext(), + tempInteractor, + view.awesomeBar + ) + + return view + } } diff --git a/app/src/main/res/layout/fragment_search_dialog.xml b/app/src/main/res/layout/fragment_search_dialog.xml index 10c211752..faac704e3 100644 --- a/app/src/main/res/layout/fragment_search_dialog.xml +++ b/app/src/main/res/layout/fragment_search_dialog.xml @@ -5,14 +5,49 @@ - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f71bd9753..d2421212f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -614,4 +614,9 @@ 90dp @null + +