From 84aae93af2ff3c70c0095b4c512368e16352ef22 Mon Sep 17 00:00:00 2001
From: Christian Sadilek
Date: Tue, 26 Jan 2021 17:38:38 -0500
Subject: [PATCH 001/248] Update Android Components version to
73.0.20210126190058
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 9b992ca96..a841c050a 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "72.0.20210125143126"
+ const val VERSION = "73.0.20210126190058"
}
From 171c466adac01a17fa4acc51af727297f81d6e42 Mon Sep 17 00:00:00 2001
From: Gabriel Luong
Date: Wed, 14 Oct 2020 11:19:35 -0400
Subject: [PATCH 002/248] For #14302 - Skip one time pages visit from frecent
top sites
---
app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
index e0a769f5a..6c3b2160d 100644
--- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
@@ -69,6 +69,7 @@ import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine
import mozilla.components.browser.state.store.BrowserStore
+import mozilla.components.concept.storage.FrecencyThresholdOption
import mozilla.components.concept.sync.AccountObserver
import mozilla.components.concept.sync.AuthType
import mozilla.components.concept.sync.OAuthAccount
@@ -274,7 +275,10 @@ class HomeFragment : Fragment() {
*/
private fun getTopSitesConfig(): TopSitesConfig {
val settings = requireContext().settings()
- return TopSitesConfig(settings.topSitesMaxLimit, settings.showTopFrecentSites)
+ return TopSitesConfig(
+ settings.topSitesMaxLimit,
+ FrecencyThresholdOption.SKIP_ONE_TIME_PAGES
+ )
}
/**
From ef8d07fadf7f98e15084f121578f27f964c053b9 Mon Sep 17 00:00:00 2001
From: Christian Sadilek
Date: Tue, 26 Jan 2021 17:47:21 -0500
Subject: [PATCH 003/248] Fix breaking API change in FennecMigrator
---
.../java/org/mozilla/fenix/MigratingFenixApplication.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt b/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt
index d64043f14..b7d50eccc 100644
--- a/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt
+++ b/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt
@@ -24,7 +24,7 @@ class MigratingFenixApplication : FenixApplication() {
val migrator by lazy {
FennecMigrator.Builder(this, this.components.analytics.crashReporter)
- .migrateOpenTabs(this.components.core.sessionManager)
+ .migrateOpenTabs(this.components.useCases.tabsUseCases)
.migrateHistory(this.components.core.lazyHistoryStorage)
.migrateBookmarks(
this.components.core.lazyBookmarksStorage,
From 4877b7707362e1e7802e09c098a87c1c7cee8e9d Mon Sep 17 00:00:00 2001
From: Mozilla L10n Automation Bot
Date: Wed, 27 Jan 2021 00:02:04 +0000
Subject: [PATCH 004/248] Import l10n.
---
app/src/main/res/values-hr/strings.xml | 5 +++--
app/src/main/res/values-pa-rIN/strings.xml | 22 +++++++++++++---------
app/src/main/res/values-tg/strings.xml | 6 +++---
3 files changed, 19 insertions(+), 14 deletions(-)
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 595e1799b..2c36aef30 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -1094,6 +1094,8 @@
Prazni memoriju
Dozvole web-stranice
+
+ Preuzimanja
Izbriši podatke pregledavanja
@@ -1217,8 +1219,7 @@
- Dizajnirali smo %s tako, da ti vladaš onime što dijeliš
- na internetu i što dijeliš s nama.
+ %s smo stvorili za jednostavno upravljanje podacima koje dijeliš na mreži i koje dijeliš s nama.
Pročitaj naša pravila privatnosti
diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml
index d0c77e636..bcd118a1e 100644
--- a/app/src/main/res/values-pa-rIN/strings.xml
+++ b/app/src/main/res/values-pa-rIN/strings.xml
@@ -740,18 +740,22 @@
ਡਾਊਨਲੋਡ ਹਟਾਓ
ਕੀ ਤੁਸੀਂ ਆਪਣੇ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?
-
- ਡਾਊਨਲੋਡ ਹਟਾਏ ਗਏ
+
+ ਡਾਊਨਲੋਡ ਹਟਾਏ ਗਏ
+
+ %1$s ਹਟਾਏ
- ਡਾਊਨਲੋਡ ਨਹੀਂ ਹੈ
+ ਕੋਈ ਡਾਊਨਲੋਡ ਕੀਤੀ ਫਾਇਲ ਨਹੀਂ ਹੈ
%1$d ਚੁਣੇ
ਖੋਲ੍ਹੋ
-
- ਹਟਾਓ
+
+
+
+ ਹਟਾਓ
@@ -875,6 +879,8 @@
ਸੂਚਨਾਵਾਂ
ਪੱਕੀ ਸਟੋਰੇਜ਼
+
+ DRM-ਕੰਟਰੋਲ ਕੀਤੀ ਸਮੱਗਰੀ
ਆਗਿਆ ਲਈ ਪੁੱਛੋ
@@ -1102,6 +1108,8 @@
ਸਟੋਰੇਜ਼ ਥਾਂ ਖਾਲੀ ਕਰਦਾ ਹੈ
ਸਾਈਟ ਇਜਾਜ਼ਤਾਂ
+
+ ਡਾਊਨਲੋਡ
ਬਰਾਊਜ਼ ਕਰਨ ਵਾਲਾ ਡਾਟਾ ਹਟਾਓ
@@ -1223,10 +1231,6 @@
ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ
ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ
-
- ਅਸੀਂ %s ਨੂੰ ਤੁਹਾਨੂੰ ਕੰਟਰੋਲ ਦੇਣ ਵਾਸਤੇ ਬਣਾਇਆ ਹੈ ਕਿ ਤੁਸੀਂ ਆਨਲਾਈਨ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ ਅਤੇ ਸਾਡੇ ਨਾਲ ਤੁਸੀਂ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ।
-
ਸਾਡੀ ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ ਨੂੰ ਪੜ੍ਹੋ
diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml
index c7722a4d1..f380493ee 100644
--- a/app/src/main/res/values-tg/strings.xml
+++ b/app/src/main/res/values-tg/strings.xml
@@ -1089,6 +1089,8 @@
Фазои захирагоҳро озод намоед
Иҷозатҳои сомона
+
+ Боргириҳо
Нест кардани маълумоти тамошокунӣ
@@ -1214,9 +1216,7 @@
Махфияти шумо
- Мо %s-ро ҳамин тавр тарҳрезӣ кардаем, ки шумо тавонед он чизҳоеро, ки дар онлайн
- ва бо мо мубодила мекунед, идора намоед.
-
+ Мо %s-ро ҳамин тавр тарҳрезӣ кардаем, ки шумо тавонед он чизҳоеро, ки дар онлайн ва бо мо мубодила мекунед, идора намоед.
Огоҳиномаи махфияти моро хонед
From 3abda6daec508a648e30e7fa1e60b14e4447ec1b Mon Sep 17 00:00:00 2001
From: Aki Sasaki
Date: Tue, 26 Jan 2021 17:28:59 -0800
Subject: [PATCH 005/248] support staging release promotion projects (#17652)
Let's make mozilla-releng/staging-fenix the official staging repository.
By supporting it in the automation, we no longer need to maintain a
staging patchset to test things properly.
---
.taskcluster.yml | 2 +-
taskcluster/ci/config.yml | 5 ++++-
taskcluster/fenix_taskgraph/release_promotion.py | 1 +
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/.taskcluster.yml b/.taskcluster.yml
index 4ee1f0b8c..e11debf8a 100644
--- a/.taskcluster.yml
+++ b/.taskcluster.yml
@@ -166,7 +166,7 @@ tasks:
routes:
$flattenDeep:
- checks
- - $if: 'level == "3"'
+ - $if: 'level == "3" || repoUrl == "https://github.com/mozilla-releng/staging-fenix"'
then:
- tc-treeherder.v2.${project}.${head_sha}
# TODO Bug 1601928: Make this scope fork-friendly once ${project} is better defined. This will enable
diff --git a/taskcluster/ci/config.yml b/taskcluster/ci/config.yml
index 2f2caf9d8..4fb15565d 100644
--- a/taskcluster/ci/config.yml
+++ b/taskcluster/ci/config.yml
@@ -17,7 +17,10 @@ treeherder:
'Rap-P': 'Raptor power tests'
'TL': 'Toolchain builds for Linux 64-bits'
-task-priority: highest
+task-priority:
+ by-project:
+ "fenix": highest
+ "staging-fenix": low
taskgraph:
register: fenix_taskgraph:register
diff --git a/taskcluster/fenix_taskgraph/release_promotion.py b/taskcluster/fenix_taskgraph/release_promotion.py
index 414e19131..902e7371b 100644
--- a/taskcluster/fenix_taskgraph/release_promotion.py
+++ b/taskcluster/fenix_taskgraph/release_promotion.py
@@ -17,6 +17,7 @@ from taskgraph.util.taskgraph import find_decision_task, find_existing_tasks_fro
RELEASE_PROMOTION_PROJECTS = (
"https://github.com/mozilla-mobile/fenix",
+ "https://github.com/mozilla-releng/staging-fenix",
)
From 780e3362a5f3084d7d250fb2e985f8a71f39dbb9 Mon Sep 17 00:00:00 2001
From: mcarare
Date: Wed, 27 Jan 2021 11:59:04 +0200
Subject: [PATCH 006/248] For #17464: Handle selected item background
programmatically.
---
.../quicksettings/WebsitePermissionsView.kt | 28 +++++++++++++++++--
.../drawable/etp_spinner_item_background.xml | 2 +-
app/src/main/res/values/colors.xml | 3 ++
3 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt
index 8cc26d7fb..dc1735d33 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/WebsitePermissionsView.kt
@@ -12,6 +12,7 @@ import android.widget.ArrayAdapter
import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.appcompat.widget.AppCompatSpinner
+import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.quicksettings_permissions.view.*
@@ -151,11 +152,34 @@ class WebsitePermissionsView(
}
val selectedIndex = permissionState.options.indexOf(permissionState.autoplayValue)
- val adapter = ArrayAdapter(
+
+ val adapter = object : ArrayAdapter(
context,
R.layout.quicksettings_permission_spinner_item,
permissionState.options
- )
+ ) {
+ override fun getDropDownView(
+ position: Int,
+ convertView: View?,
+ parent: ViewGroup
+ ): View {
+ val view = super.getDropDownView(
+ position,
+ convertView,
+ parent
+ )
+ if (position == viewHolder.status.selectedItemPosition) {
+ view.setBackgroundColor(
+ ContextCompat.getColor(
+ context,
+ R.color.spinner_selected_item
+ )
+ )
+ }
+ return view
+ }
+ }
+
adapter.setDropDownViewResource(R.layout.quicksetting_permission_spinner_dropdown)
viewHolder.status.adapter = adapter
diff --git a/app/src/main/res/drawable/etp_spinner_item_background.xml b/app/src/main/res/drawable/etp_spinner_item_background.xml
index 642b276e3..05f0f2eea 100644
--- a/app/src/main/res/drawable/etp_spinner_item_background.xml
+++ b/app/src/main/res/drawable/etp_spinner_item_background.xml
@@ -5,7 +5,7 @@
-
-
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 169b32455..5f2d1b1a9 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -419,4 +419,7 @@
@color/primary_text_light_theme
@color/primary_text_light_theme
+
+
+ #1415141A
From eaef276345d018d8de6c2eff3ac0b00ecf0cbca2 Mon Sep 17 00:00:00 2001
From: Roger Yang
Date: Wed, 27 Jan 2021 10:51:03 -0500
Subject: [PATCH 007/248] Closes #17530: Update has open tabs metrics when tabs
are opened or closed (#17557)
---
.../org/mozilla/fenix/TelemetryMiddleware.kt | 5 +++++
.../mozilla/fenix/components/metrics/Event.kt | 2 ++
.../components/metrics/GleanMetricsService.kt | 6 ++++++
.../mozilla/fenix/TelemetryMiddlewareTest.kt | 21 ++++++++++++++++++-
4 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt b/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt
index c5c64df0a..c39b97e5f 100644
--- a/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt
+++ b/app/src/main/java/org/mozilla/fenix/TelemetryMiddleware.kt
@@ -104,6 +104,11 @@ class TelemetryMiddleware(
is TabListAction.RestoreAction -> {
// Update/Persist tabs count whenever it changes
settings.openTabsCount = context.state.normalTabs.count()
+ if (context.state.normalTabs.count() > 0) {
+ metrics.track(Event.HaveOpenTabs)
+ } else {
+ metrics.track(Event.HaveNoOpenTabs)
+ }
}
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
index f946077b2..3fa6b6589 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
@@ -197,6 +197,8 @@ sealed class Event {
object SyncedTabOpened : Event()
object RecentlyClosedTabsOpened : Event()
+ object HaveOpenTabs : Event()
+ object HaveNoOpenTabs : Event()
object ContextMenuCopyTapped : Event()
object ContextMenuSearchTapped : Event()
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
index 035605dc0..00fc6bc33 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
@@ -720,6 +720,12 @@ private val Event.wrapper: EventWrapper<*>?
is Event.ContextMenuShareTapped -> EventWrapper(
{ ContextualMenu.shareTapped.record(it) }
)
+ Event.HaveOpenTabs -> EventWrapper(
+ { Metrics.hasOpenTabs.set(true) }
+ )
+ Event.HaveNoOpenTabs -> EventWrapper(
+ { Metrics.hasOpenTabs.set(false) }
+ )
// Don't record other events in Glean:
is Event.AddBookmark -> null
diff --git a/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt b/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt
index 37fb3c1af..355c2bd10 100644
--- a/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/TelemetryMiddlewareTest.kt
@@ -6,6 +6,8 @@ package org.mozilla.fenix
import io.mockk.mockk
import io.mockk.verify
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestCoroutineDispatcher
import mozilla.components.browser.state.action.ContentAction
import mozilla.components.browser.state.action.DownloadAction
import mozilla.components.browser.state.action.TabListAction
@@ -15,10 +17,12 @@ import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.support.test.ext.joinBlocking
import mozilla.components.support.test.mock
import mozilla.components.support.test.robolectric.testContext
+import mozilla.components.support.test.rule.MainCoroutineRule
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.components.metrics.Event
@@ -28,6 +32,7 @@ import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
import org.mozilla.fenix.utils.Settings
@RunWith(FenixRobolectricTestRunner::class)
+@ExperimentalCoroutinesApi
class TelemetryMiddlewareTest {
private lateinit var store: BrowserStore
@@ -35,11 +40,15 @@ class TelemetryMiddlewareTest {
private lateinit var telemetryMiddleware: TelemetryMiddleware
private lateinit var metrics: MetricController
private lateinit var adsTelemetry: AdsTelemetry
+ private val testDispatcher = TestCoroutineDispatcher()
+
+ @get:Rule
+ val coroutinesTestRule = MainCoroutineRule(testDispatcher)
@Before
fun setUp() {
settings = Settings(testContext)
- metrics = mockk()
+ metrics = mockk(relaxed = true)
adsTelemetry = mockk()
telemetryMiddleware = TelemetryMiddleware(
settings,
@@ -55,6 +64,7 @@ class TelemetryMiddlewareTest {
store.dispatch(TabListAction.AddTabAction(createTab("https://mozilla.org"))).joinBlocking()
assertEquals(1, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveOpenTabs) }
}
@Test
@@ -63,6 +73,7 @@ class TelemetryMiddlewareTest {
store.dispatch(TabListAction.AddTabAction(createTab("https://mozilla.org", private = true))).joinBlocking()
assertEquals(0, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveNoOpenTabs) }
}
@Test
@@ -76,6 +87,7 @@ class TelemetryMiddlewareTest {
).joinBlocking()
assertEquals(2, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveOpenTabs) }
}
@Test
@@ -87,9 +99,11 @@ class TelemetryMiddlewareTest {
)
).joinBlocking()
assertEquals(2, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveOpenTabs) }
store.dispatch(TabListAction.RemoveTabAction("1")).joinBlocking()
assertEquals(1, settings.openTabsCount)
+ verify(exactly = 2) { metrics.track(Event.HaveOpenTabs) }
}
@Test
@@ -101,9 +115,11 @@ class TelemetryMiddlewareTest {
)
).joinBlocking()
assertEquals(2, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveOpenTabs) }
store.dispatch(TabListAction.RemoveAllTabsAction).joinBlocking()
assertEquals(0, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveNoOpenTabs) }
}
@Test
@@ -116,9 +132,11 @@ class TelemetryMiddlewareTest {
)
).joinBlocking()
assertEquals(2, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveOpenTabs) }
store.dispatch(TabListAction.RemoveAllNormalTabsAction).joinBlocking()
assertEquals(0, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveNoOpenTabs) }
}
@Test
@@ -131,6 +149,7 @@ class TelemetryMiddlewareTest {
store.dispatch(TabListAction.RestoreAction(tabsToRestore)).joinBlocking()
assertEquals(2, settings.openTabsCount)
+ verify(exactly = 1) { metrics.track(Event.HaveOpenTabs) }
}
@Test
From 67ff4d460abbd7744603796c1c5fef79a2250bfc Mon Sep 17 00:00:00 2001
From: Oana Horvath
Date: Wed, 27 Jan 2021 17:28:17 +0200
Subject: [PATCH 008/248] For #9188: wait for page load in Reader mode
---
.../androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt | 5 +++++
app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 1 +
2 files changed, 6 insertions(+)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt
index d7e0c50b8..c8ed91829 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt
@@ -119,12 +119,14 @@ class ReaderViewTest {
navigationToolbar {
verifyReaderViewDetected(true)
toggleReaderView()
+ mDevice.waitForIdle()
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.closeBrowserMenuToBrowser { }
navigationToolbar {
toggleReaderView()
+ mDevice.waitForIdle()
}.openThreeDotMenu {
verifyReaderViewAppearance(false)
}.close { }
@@ -150,6 +152,7 @@ class ReaderViewTest {
navigationToolbar {
verifyReaderViewDetected(true)
toggleReaderView()
+ mDevice.waitForIdle()
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
@@ -185,6 +188,7 @@ class ReaderViewTest {
navigationToolbar {
verifyReaderViewDetected(true)
toggleReaderView()
+ mDevice.waitForIdle()
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
@@ -226,6 +230,7 @@ class ReaderViewTest {
navigationToolbar {
verifyReaderViewDetected(true)
toggleReaderView()
+ mDevice.waitForIdle()
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
index 86fc7b286..a25b9421e 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
@@ -1144,6 +1144,7 @@ class SmokeTest {
navigationToolbar {
verifyReaderViewDetected(true)
toggleReaderView()
+ mDevice.waitForIdle()
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
From ac13f0dd468b37773c591485ceba88d997476dbe Mon Sep 17 00:00:00 2001
From: MickeyMoz
Date: Wed, 27 Jan 2021 15:35:19 +0000
Subject: [PATCH 009/248] Update Android Components version to
73.0.20210127143126.
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index a841c050a..580501ddc 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210126190058"
+ const val VERSION = "73.0.20210127143126"
}
From 124c2baf304704b807cbf5934ff2798b87a6845d Mon Sep 17 00:00:00 2001
From: Roger Yang
Date: Wed, 27 Jan 2021 12:46:16 -0500
Subject: [PATCH 010/248] Closes #17531: Use top sites count fact for top sites
telemetry (#17664)
---
.../mozilla/fenix/components/metrics/Event.kt | 3 +
.../components/metrics/GleanMetricsService.kt | 6 ++
.../components/metrics/MetricController.kt | 25 ++++++++
.../metrics/MetricControllerTest.kt | 60 +++++++++++++++++++
4 files changed, 94 insertions(+)
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
index 3fa6b6589..a6e43ea03 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
@@ -205,6 +205,9 @@ sealed class Event {
object ContextMenuSelectAllTapped : Event()
object ContextMenuShareTapped : Event()
+ object HaveTopSites : Event()
+ object HaveNoTopSites : Event()
+
// Interaction events with extras
data class TopSiteSwipeCarousel(val page: Int) : Event() {
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
index 00fc6bc33..3b8da8e11 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
@@ -726,6 +726,12 @@ private val Event.wrapper: EventWrapper<*>?
Event.HaveNoOpenTabs -> EventWrapper(
{ Metrics.hasOpenTabs.set(false) }
)
+ Event.HaveTopSites -> EventWrapper(
+ { Metrics.hasTopSites.set(true) }
+ )
+ Event.HaveNoTopSites -> EventWrapper(
+ { Metrics.hasTopSites.set(false) }
+ )
// Don't record other events in Glean:
is Event.AddBookmark -> null
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt
index 3b31385c2..013fd2422 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt
@@ -22,6 +22,7 @@ import mozilla.components.feature.findinpage.facts.FindInPageFacts
import mozilla.components.feature.media.facts.MediaFacts
import mozilla.components.feature.prompts.dialog.LoginDialogFacts
import mozilla.components.feature.pwa.ProgressiveWebAppFacts
+import mozilla.components.feature.top.sites.facts.TopSitesFacts
import mozilla.components.support.base.Component
import mozilla.components.support.base.facts.Action
import mozilla.components.support.base.facts.Fact
@@ -134,6 +135,13 @@ internal class ReleaseMetricController(
}
}
+ @VisibleForTesting
+ internal fun factToEvent(
+ fact: Fact
+ ): Event? {
+ return fact.toEvent()
+ }
+
private fun isInitialized(type: MetricServiceType): Boolean = initialized.contains(type)
private fun isTelemetryEnabled(type: MetricServiceType): Boolean = when (type) {
@@ -242,6 +250,23 @@ internal class ReleaseMetricController(
Component.FEATURE_PWA to ProgressiveWebAppFacts.Items.INSTALL_SHORTCUT -> {
Event.ProgressiveWebAppInstallAsShortcut
}
+ Component.FEATURE_TOP_SITES to TopSitesFacts.Items.COUNT -> {
+ value?.let {
+ var count = 0
+ try {
+ count = it.toInt()
+ } catch (e: NumberFormatException) {
+ // Do nothing
+ }
+
+ return if (count > 0) {
+ Event.HaveTopSites
+ } else {
+ Event.HaveNoTopSites
+ }
+ }
+ null
+ }
else -> null
}
diff --git a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt
index 97934c541..be97fd8a3 100644
--- a/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/components/metrics/MetricControllerTest.kt
@@ -10,7 +10,12 @@ import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.verify
import io.mockk.verifyAll
+import mozilla.components.feature.top.sites.facts.TopSitesFacts
+import mozilla.components.support.base.Component
+import mozilla.components.support.base.facts.Action
+import mozilla.components.support.base.facts.Fact
import mozilla.components.support.base.log.logger.Logger
+import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
@@ -167,4 +172,59 @@ class MetricControllerTest {
controller.track(Event.TabMediaPause)
verify { marketingService1.track(Event.TabMediaPause) }
}
+
+ @Test
+ fun `topsites fact should convert to the right events`() {
+ var enabled = true
+ val controller = ReleaseMetricController(
+ services = listOf(dataService1),
+ isDataTelemetryEnabled = { enabled },
+ isMarketingDataTelemetryEnabled = { enabled }
+ )
+
+ var fact = Fact(
+ Component.FEATURE_TOP_SITES,
+ Action.INTERACTION,
+ TopSitesFacts.Items.COUNT,
+ "1"
+ )
+
+ assertEquals(controller.factToEvent(fact), Event.HaveTopSites)
+
+ fact = Fact(
+ Component.FEATURE_TOP_SITES,
+ Action.INTERACTION,
+ TopSitesFacts.Items.COUNT,
+ "0"
+ )
+
+ assertEquals(controller.factToEvent(fact), Event.HaveNoTopSites)
+
+ fact = Fact(
+ Component.FEATURE_TOP_SITES,
+ Action.INTERACTION,
+ TopSitesFacts.Items.COUNT,
+ "10"
+ )
+
+ assertEquals(controller.factToEvent(fact), Event.HaveTopSites)
+
+ fact = Fact(
+ Component.FEATURE_TOP_SITES,
+ Action.INTERACTION,
+ TopSitesFacts.Items.COUNT,
+ "-4"
+ )
+
+ assertEquals(controller.factToEvent(fact), Event.HaveNoTopSites)
+
+ fact = Fact(
+ Component.FEATURE_TOP_SITES,
+ Action.INTERACTION,
+ TopSitesFacts.Items.COUNT,
+ "test"
+ )
+
+ assertEquals(controller.factToEvent(fact), Event.HaveNoTopSites)
+ }
}
From 45c0ac85ec1da90b16962ac5e4750ae31171c48e Mon Sep 17 00:00:00 2001
From: Christian Sadilek
Date: Wed, 27 Jan 2021 12:26:04 -0500
Subject: [PATCH 011/248] Remove SessionManager from
BrowserFragment/ToolbarGestureHandler
---
.../mozilla/fenix/browser/BrowserFragment.kt | 2 +-
.../fenix/browser/ToolbarGestureHandler.kt | 26 +++++++++----------
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt
index 042d33a3b..a2f3db7d9 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt
@@ -69,7 +69,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
tabPreview = tabPreview,
toolbarLayout = browserToolbarView.view,
store = components.core.store,
- sessionManager = components.core.sessionManager
+ selectTabUseCase = components.useCases.tabsUseCases.selectTab
)
)
}
diff --git a/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt b/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt
index da19ec785..d6284bc4b 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/ToolbarGestureHandler.kt
@@ -17,16 +17,16 @@ import androidx.core.graphics.contains
import androidx.core.graphics.toPoint
import androidx.core.view.isVisible
import androidx.interpolator.view.animation.LinearOutSlowInInterpolator
-import mozilla.components.browser.session.Session
-import mozilla.components.browser.session.SessionManager
+import mozilla.components.browser.state.selector.getNormalOrPrivateTabs
import mozilla.components.browser.state.selector.selectedTab
+import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.state.store.BrowserStore
+import mozilla.components.feature.tabs.TabsUseCases
import mozilla.components.support.ktx.android.view.getRectWithViewLocation
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.getRectWithScreenLocation
import org.mozilla.fenix.ext.getWindowInsets
import org.mozilla.fenix.ext.isKeyboardVisible
-import org.mozilla.fenix.ext.sessionsOfType
import org.mozilla.fenix.ext.settings
import kotlin.math.abs
import kotlin.math.max
@@ -43,7 +43,7 @@ class ToolbarGestureHandler(
private val tabPreview: TabPreview,
private val toolbarLayout: View,
private val store: BrowserStore,
- private val sessionManager: SessionManager
+ private val selectTabUseCase: TabsUseCases.SelectTabUseCase
) : SwipeGestureListener {
private enum class GestureDirection {
@@ -51,7 +51,7 @@ class ToolbarGestureHandler(
}
private sealed class Destination {
- data class Tab(val session: Session) : Destination()
+ data class Tab(val tab: TabSessionState) : Destination()
object None : Destination()
}
@@ -140,7 +140,7 @@ class ToolbarGestureHandler(
) {
val destination = getDestination()
if (destination is Destination.Tab && isGestureComplete(velocityX)) {
- animateToNextTab(destination.session)
+ animateToNextTab(destination.tab)
} else {
animateCanceledGesture(velocityX)
}
@@ -149,14 +149,14 @@ class ToolbarGestureHandler(
private fun getDestination(): Destination {
val isLtr = activity.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR
val currentTab = store.state.selectedTab ?: return Destination.None
- val currentIndex = sessionManager.sessionsOfType(currentTab.content.private).indexOfFirst {
+ val currentIndex = store.state.getNormalOrPrivateTabs(currentTab.content.private).indexOfFirst {
it.id == currentTab.id
}
return if (currentIndex == -1) {
Destination.None
} else {
- val sessions = sessionManager.sessionsOfType(currentTab.content.private)
+ val tabs = store.state.getNormalOrPrivateTabs(currentTab.content.private)
val index = when (gestureDirection) {
GestureDirection.RIGHT_TO_LEFT -> if (isLtr) {
currentIndex + 1
@@ -170,8 +170,8 @@ class ToolbarGestureHandler(
}
}
- if (index < sessions.count() && index >= 0) {
- Destination.Tab(sessions.elementAt(index))
+ if (index < tabs.count() && index >= 0) {
+ Destination.Tab(tabs.elementAt(index))
} else {
Destination.None
}
@@ -180,7 +180,7 @@ class ToolbarGestureHandler(
private fun preparePreview(destination: Destination) {
val thumbnailId = when (destination) {
- is Destination.Tab -> destination.session.id
+ is Destination.Tab -> destination.tab.id
is Destination.None -> return
}
@@ -233,7 +233,7 @@ class ToolbarGestureHandler(
}
}
- private fun animateToNextTab(session: Session) {
+ private fun animateToNextTab(tab: TabSessionState) {
val browserFinalXCoordinate: Float = when (gestureDirection) {
GestureDirection.RIGHT_TO_LEFT -> -windowWidth.toFloat() - previewOffset
GestureDirection.LEFT_TO_RIGHT -> windowWidth.toFloat() + previewOffset
@@ -243,7 +243,7 @@ class ToolbarGestureHandler(
getAnimator(browserFinalXCoordinate, FINISHED_GESTURE_ANIMATION_DURATION).apply {
doOnEnd {
contentLayout.translationX = 0f
- sessionManager.select(session)
+ selectTabUseCase(tab.id)
// Fade out the tab preview to prevent flickering
val shortAnimationDuration =
From 4f770e9792f2b8073ca0f79347aa81aa956605df Mon Sep 17 00:00:00 2001
From: amedyne <68711330+amedyne@users.noreply.github.com>
Date: Wed, 27 Jan 2021 16:53:04 -0500
Subject: [PATCH 012/248] Update ---bug-report.md (#17660)
Update Bug report template
---
.github/ISSUE_TEMPLATE/---bug-report.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/---bug-report.md b/.github/ISSUE_TEMPLATE/---bug-report.md
index b9d0ec5da..e27d73793 100644
--- a/.github/ISSUE_TEMPLATE/---bug-report.md
+++ b/.github/ISSUE_TEMPLATE/---bug-report.md
@@ -18,6 +18,6 @@ assignees: ''
### Device information
-* Android device: ?
-* Fenix version: ?
+* Device vendor / model and Android version: ?
+* Firefox for Android version: ? (go to Settings -> About Firefox)
From 8993a0acb28a03ee810fff42d6357ff2929417e5 Mon Sep 17 00:00:00 2001
From: Mihai Adrian Carare <48995920+mcarare@users.noreply.github.com>
Date: Wed, 27 Jan 2021 23:54:48 +0200
Subject: [PATCH 013/248] For #17655: Do not pass threshold if
showTopFrecentSites is false. (#17657)
* For #17655: Do not pass threshold if showTopFrecentSites is false.
* For #17655: Add unit tests for getTopSitesConfig.
---
.../org/mozilla/fenix/home/HomeFragment.kt | 9 ++-
.../mozilla/fenix/home/HomeFragmentTest.kt | 68 +++++++++++++++++++
2 files changed, 74 insertions(+), 3 deletions(-)
create mode 100644 app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt
diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
index 6c3b2160d..65ed19cfe 100644
--- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
@@ -21,6 +21,7 @@ import android.view.accessibility.AccessibilityEvent
import android.widget.Button
import android.widget.LinearLayout
import android.widget.PopupWindow
+import androidx.annotation.VisibleForTesting
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
@@ -273,11 +274,12 @@ class HomeFragment : Fragment() {
* Returns a [TopSitesConfig] which specifies how many top sites to display and whether or
* not frequently visited sites should be displayed.
*/
- private fun getTopSitesConfig(): TopSitesConfig {
+ @VisibleForTesting
+ internal fun getTopSitesConfig(): TopSitesConfig {
val settings = requireContext().settings()
return TopSitesConfig(
settings.topSitesMaxLimit,
- FrecencyThresholdOption.SKIP_ONE_TIME_PAGES
+ if (settings.showTopFrecentSites) FrecencyThresholdOption.SKIP_ONE_TIME_PAGES else null
)
}
@@ -428,7 +430,8 @@ class HomeFragment : Fragment() {
if (searchEngine != null) {
val iconSize =
requireContext().resources.getDimensionPixelSize(R.dimen.preference_icon_drawable_size)
- val searchIcon = BitmapDrawable(requireContext().resources, searchEngine.icon)
+ val searchIcon =
+ BitmapDrawable(requireContext().resources, searchEngine.icon)
searchIcon.setBounds(0, 0, iconSize, iconSize)
search_engine_icon?.setImageDrawable(searchIcon)
} else {
diff --git a/app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt
new file mode 100644
index 000000000..8f24fa8e8
--- /dev/null
+++ b/app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt
@@ -0,0 +1,68 @@
+/* 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.home
+
+import android.content.Context
+import io.mockk.every
+import io.mockk.mockk
+import io.mockk.spyk
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mozilla.fenix.ext.settings
+import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
+import org.mozilla.fenix.utils.Settings
+
+@ExperimentalCoroutinesApi
+@RunWith(FenixRobolectricTestRunner::class)
+class HomeFragmentTest {
+
+ private lateinit var settings: Settings
+ private lateinit var context: Context
+ private lateinit var homeFragment: HomeFragment
+
+ @Before
+ fun setup() {
+ context = mockk(relaxed = true)
+ settings = mockk(relaxed = true)
+
+ homeFragment = spyk(HomeFragment())
+
+ every { homeFragment.context } returns context
+ every { context.settings() } returns settings
+ }
+
+ @Test
+ fun `GIVEN showTopFrecentSites is false WHEN getTopSitesConfig is called THEN it returns TopSitesConfig with null frecencyConfig`() {
+ every { settings.showTopFrecentSites } returns false
+ every { settings.topSitesMaxLimit } returns 10
+
+ val topSitesConfig = homeFragment.getTopSitesConfig()
+
+ Assert.assertNull(topSitesConfig.frecencyConfig)
+ }
+
+ @Test
+ fun `GIVEN showTopFrecentSites is true WHEN getTopSitesConfig is called THEN it returns TopSitesConfig with non-null frecencyConfig`() {
+ every { context.settings().showTopFrecentSites } returns true
+ every { settings.topSitesMaxLimit } returns 10
+
+ val topSitesConfig = homeFragment.getTopSitesConfig()
+
+ Assert.assertNotNull(topSitesConfig.frecencyConfig)
+ }
+
+ @Test
+ fun `GIVEN a topSitesMaxLimit WHEN getTopSitesConfig is called THEN it returns TopSitesConfig with totalSites = topSitesMaxLimit`() {
+ val topSitesMaxLimit = 10
+ every { settings.topSitesMaxLimit } returns topSitesMaxLimit
+
+ val topSitesConfig = homeFragment.getTopSitesConfig()
+
+ Assert.assertEquals(topSitesMaxLimit, topSitesConfig.totalSites)
+ }
+}
From f3d332dd8b62207296e3d4dfc4515959aac08d63 Mon Sep 17 00:00:00 2001
From: Mozilla L10n Automation Bot
Date: Thu, 28 Jan 2021 00:04:39 +0000
Subject: [PATCH 014/248] Import l10n.
---
app/src/main/res/values-sl/strings.xml | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index a03e3a9c5..7e06ccef1 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -735,6 +735,8 @@
Ste prepričani, da želite počistiti vaše prenose?
Prenosi odstranjeni
+
+ %1$s odstranjen
Ni prenesenih datotek
Dovoljenja strani
+
+ Prenosi
Izbriši podatke brskanja
@@ -1220,8 +1224,7 @@
- %s smo zasnovali tako, da vam omogočimo nadzor nad tem, kaj delite
- na spletu in kaj delite z nami.
+ %s smo zasnovali tako, da vam omogočimo nadzor nad tem, kaj delite na spletu in kaj delite z nami.
Preberite naše obvestilo o zasebnosti
From d7b8af78c95260db90c8d49497045d24d8b74040 Mon Sep 17 00:00:00 2001
From: Oana Horvath
Date: Thu, 28 Jan 2021 16:41:45 +0200
Subject: [PATCH 015/248] For #9188: wait for page content to appear in Reader
mode tests
---
.../org/mozilla/fenix/ui/ReaderViewTest.kt | 18 ++++++++++++++++++
.../java/org/mozilla/fenix/ui/SmokeTest.kt | 5 +++++
2 files changed, 23 insertions(+)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt
index c8ed91829..d405215ab 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt
@@ -17,6 +17,7 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
+import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.mDevice
/**
@@ -32,6 +33,7 @@ import org.mozilla.fenix.ui.robots.mDevice
class ReaderViewTest {
private lateinit var mockWebServer: MockWebServer
private var readerViewNotification: ViewVisibilityIdlingResource? = null
+ private val estimatedReadingTime = "1 - 2 minutes"
@get:Rule
val activityIntentTestRule = HomeActivityIntentTestRule()
@@ -120,6 +122,10 @@ class ReaderViewTest {
verifyReaderViewDetected(true)
toggleReaderView()
mDevice.waitForIdle()
+ }
+
+ browserScreen {
+ verifyPageContent(estimatedReadingTime)
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.closeBrowserMenuToBrowser { }
@@ -153,6 +159,10 @@ class ReaderViewTest {
verifyReaderViewDetected(true)
toggleReaderView()
mDevice.waitForIdle()
+ }
+
+ browserScreen {
+ verifyPageContent(estimatedReadingTime)
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
@@ -189,6 +199,10 @@ class ReaderViewTest {
verifyReaderViewDetected(true)
toggleReaderView()
mDevice.waitForIdle()
+ }
+
+ browserScreen {
+ verifyPageContent(estimatedReadingTime)
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
@@ -231,6 +245,10 @@ class ReaderViewTest {
verifyReaderViewDetected(true)
toggleReaderView()
mDevice.waitForIdle()
+ }
+
+ browserScreen {
+ verifyPageContent(estimatedReadingTime)
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
index a25b9421e..697255bfc 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
@@ -1128,6 +1128,7 @@ class SmokeTest {
fun verifyReaderViewAppearanceUI() {
val readerViewPage =
TestAssetHelper.getLoremIpsumAsset(mockWebServer)
+ val estimatedReadingTime = "1 - 2 minutes"
navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
@@ -1145,6 +1146,10 @@ class SmokeTest {
verifyReaderViewDetected(true)
toggleReaderView()
mDevice.waitForIdle()
+ }
+
+ browserScreen {
+ verifyPageContent(estimatedReadingTime)
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
From c50dbb5bb91228ab58ca433b1b2c2ba102e8f756 Mon Sep 17 00:00:00 2001
From: MickeyMoz
Date: Thu, 28 Jan 2021 15:34:35 +0000
Subject: [PATCH 016/248] Update Android Components version to
73.0.20210128143151.
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 580501ddc..de44861f4 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210127143126"
+ const val VERSION = "73.0.20210128143151"
}
From 43b0b27819133fbbfd761a9c2cdd299d2894eb8e Mon Sep 17 00:00:00 2001
From: Elise Richards
Date: Thu, 28 Jan 2021 14:30:59 -0600
Subject: [PATCH 017/248] Update metrics when an addon is installed or enabled
(#17669)
---
.../java/org/mozilla/fenix/addons/AddonsManagementFragment.kt | 2 ++
.../org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt | 2 ++
2 files changed, 4 insertions(+)
diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt
index 5f6a6abfa..06a8555cc 100644
--- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt
@@ -29,6 +29,7 @@ import mozilla.components.feature.addons.ui.AddonInstallationDialogFragment
import mozilla.components.feature.addons.ui.AddonsManagerAdapter
import mozilla.components.feature.addons.ui.PermissionsDialogFragment
import mozilla.components.feature.addons.ui.translateName
+import org.mozilla.fenix.GleanMetrics.Addons
import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.components.metrics.Event
@@ -282,6 +283,7 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
adapter?.updateAddon(it)
addonProgressOverlay?.visibility = View.GONE
showInstallationDialog(it)
+ Addons.hasInstalledAddons.set(true)
}
},
onError = { _, e ->
diff --git a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt
index c3fbcce10..c154aa4f9 100644
--- a/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt
@@ -21,6 +21,7 @@ import kotlinx.coroutines.launch
import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.AddonManagerException
import mozilla.components.feature.addons.ui.translateName
+import org.mozilla.fenix.GleanMetrics.Addons
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
@@ -127,6 +128,7 @@ class InstalledAddonDetailsFragment : Fragment() {
)
)
}
+ Addons.hasEnabledAddons.set(true)
}
},
onError = {
From 41e6c7247e6d779804fd9e8e245092a50819e312 Mon Sep 17 00:00:00 2001
From: Mozilla L10n Automation Bot
Date: Fri, 29 Jan 2021 00:04:27 +0000
Subject: [PATCH 018/248] Import l10n.
---
app/src/main/res/values-be/strings.xml | 5 +++--
app/src/main/res/values-da/strings.xml | 5 +++--
app/src/main/res/values-gn/strings.xml | 5 +++--
app/src/main/res/values-in/strings.xml | 4 +++-
app/src/main/res/values-kab/strings.xml | 6 +++---
app/src/main/res/values-oc/strings.xml | 10 ++++++++++
l10n.toml | 1 +
7 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index 91d67a267..38df7ab9c 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -1101,6 +1101,8 @@
Вызваліць месца
Дазволы для сайтаў
+
+ Сцягванні
Выдаліць звесткі аглядання
@@ -1223,8 +1225,7 @@
Ваша прыватнасць
- Мы распрацавалі %s, каб даць вам кантроль над тым, чым дзяліцца
- ў Інтэрнэце і тым, чым вы падзеліцеся з намі.
+ Мы распрацавалі %s, каб даць вам кантроль над тым, чым дзяліцца ў Інтэрнэце, і тым, чым вы падзеліцеся з намі.
Паведамленне аб прыватнасці
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 0e01ba854..838fe1f53 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -1079,6 +1079,8 @@
Frigør lagerplads
Websteds-indstillinger
+
+ Filhentninger
Slet browserdata
@@ -1201,8 +1203,7 @@
Bedre beskyttelse af dit privatliv
- Vi har designet %s til at give dig kontrol over, hvad du deler på
- nettet - og hvad du deler med os.
+ Vi har designet %s til at give dig kontrol over, hvad du deler på nettet - og hvad du deler med os.
Læs vores privatlivspolitik
diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml
index d0da23ce6..9f8eb6a81 100644
--- a/app/src/main/res/values-gn/strings.xml
+++ b/app/src/main/res/values-gn/strings.xml
@@ -1107,6 +1107,8 @@
Emopotĩ pa’ũ ñembyatyha
Tenda ñemoneĩ
+
+ Ñemboguejy
Emboguete kundahára mba’ekuaarã
@@ -1230,8 +1232,7 @@
- Romoha’ãngáma %s eñangareko hag̃ua umi emoherakuãva rehe
- ñandutípe ha emoherakuã orendive.
+ Rojapo %s eñangareko hag̃ua emoherakuãva ñandutípe rehe ha emoherakuãva orendive avei.
Emoñe’ẽ ore marandu’i ñemigua
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 6e9623b70..95a0295e8 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -1105,6 +1105,8 @@
Membebaskan ruang penyimpanan
Izin situs
+
+ Unduhan
Hapus data penjelajahan
@@ -1229,7 +1231,7 @@
Privasi Anda
- Kami merancang %s untuk memberi Anda kendali atas apa yang Anda bagikan secara daring dan apa yang Anda bagikan kepada kami.
+ Kami merancang %s agar Anda dapat mengendalikan apa saja yang Anda bagikan secara daring dan apa yang Anda bagikan kepada kami.
Pelajari pemberitahuan privasi kami
diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml
index 2ae9c95b1..a81126fb4 100644
--- a/app/src/main/res/values-kab/strings.xml
+++ b/app/src/main/res/values-kab/strings.xml
@@ -1101,6 +1101,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara
Tisirag n usmel
+
+ Isidar
Kkes isefka n tunigin
@@ -1223,9 +1225,7 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara
- Nfeṣṣel %s akken ad nerr gar ifassen-ik ayen i tbeṭṭuḍ
- srid daɣen ayen i beṭṭuḍ yid-neɣ.
-
+ Nfeṣṣel %si w akken ad nerr gar ifassen-ik·im ayen i tbeṭṭuḍ srid aked wayen tbeṭṭuḍ yid-neɣ.
Ɣer tasertit-nneɣ n tbaḍnit
diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml
index f7a507e64..a6e822cc5 100644
--- a/app/src/main/res/values-oc/strings.xml
+++ b/app/src/main/res/values-oc/strings.xml
@@ -363,6 +363,12 @@
Colleccion de moduls complementaris modificada. Tampadura de l’aplicacion per aplicar las modificacions…
+
+
+ Lo modul complementari es pas pres en carga
+
+ Lo modul complementari es ja installat
+
Sincronizar ara
@@ -727,6 +733,8 @@
Telecargament suprimits
%1$s suprimit
+
+ Cap de fichièr pas telecargat
%1$d seleccionats
@@ -1091,6 +1099,8 @@
Libèra d’espaci d’emmagazinatge
Permissions dels sites
+
+ Telecargaments
Suprimir las donadas de navegacion
diff --git a/l10n.toml b/l10n.toml
index 077ea1753..ef8242192 100644
--- a/l10n.toml
+++ b/l10n.toml
@@ -53,6 +53,7 @@ locales = [
"ka",
"kab",
"kk",
+ "kmr",
"kn",
"ko",
"lij",
From e754c1acc03b560374e691b8942d3aee9f910fd7 Mon Sep 17 00:00:00 2001
From: ekager
Date: Thu, 28 Jan 2021 15:08:24 -0700
Subject: [PATCH 019/248] No issue - Update androidx dependencies newer stable
versions
---
buildSrc/src/main/java/Dependencies.kt | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt
index 27d9d713f..da3fe9a21 100644
--- a/buildSrc/src/main/java/Dependencies.kt
+++ b/buildSrc/src/main/java/Dependencies.kt
@@ -19,7 +19,7 @@ object Versions {
const val jna = "5.6.0"
const val androidx_appcompat = "1.2.0"
- const val androidx_biometric = "1.1.0-rc01"
+ const val androidx_biometric = "1.1.0"
const val androidx_coordinator_layout = "1.1.0"
const val androidx_constraint_layout = "2.0.4"
const val androidx_preference = "1.1.1"
@@ -27,12 +27,12 @@ object Versions {
const val androidx_annotation = "1.1.0"
const val androidx_lifecycle = "2.2.0"
const val androidx_fragment = "1.2.5"
- const val androidx_navigation = "2.3.1"
- const val androidx_recyclerview = "1.2.0-alpha06"
+ const val androidx_navigation = "2.3.3"
+ const val androidx_recyclerview = "1.2.0-beta01"
const val androidx_core = "1.3.2"
- const val androidx_paging = "2.1.0"
- const val androidx_transition = "1.3.0"
- const val androidx_work = "2.4.0"
+ const val androidx_paging = "2.1.2"
+ const val androidx_transition = "1.4.0"
+ const val androidx_work = "2.5.0"
const val google_material = "1.2.1"
const val mozilla_android_components = AndroidComponents.VERSION
From 81e08b2e7ff90774442342891dbbb59c4e2b8852 Mon Sep 17 00:00:00 2001
From: Jonathan Almeida
Date: Thu, 28 Jan 2021 15:20:07 +0400
Subject: [PATCH 020/248] Close #15979: Add MOZILLA_OFFICIAL flag for release
builds
When we build release APKs on Mozilla infrastructure, we want a way to
know this in code for features that would only work on them.
---
app/build.gradle | 10 ++++++++++
taskcluster/fenix_taskgraph/transforms/build.py | 12 ++++++++----
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index cd7c44f2d..e0ff4c67d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -360,6 +360,16 @@ android.applicationVariants.all { variant ->
buildConfigField 'String', 'NIMBUS_ENDPOINT', 'null'
println("--")
}
+
+// -------------------------------------------------------------------------------------------------
+// BuildConfig: Set flag for official builds; similar to MOZILLA_OFFICIAL in mozilla-central.
+// -------------------------------------------------------------------------------------------------
+
+ if (project.hasProperty("official") || gradle.hasProperty("localProperties.official")) {
+ buildConfigField 'Boolean', 'MOZILLA_OFFICIAL', 'true'
+ } else {
+ buildConfigField 'Boolean', 'MOZILLA_OFFICIAL', 'false'
+ }
}
androidExtensions {
diff --git a/taskcluster/fenix_taskgraph/transforms/build.py b/taskcluster/fenix_taskgraph/transforms/build.py
index a2ebdcf4f..032a746a6 100644
--- a/taskcluster/fenix_taskgraph/transforms/build.py
+++ b/taskcluster/fenix_taskgraph/transforms/build.py
@@ -104,7 +104,10 @@ def add_nightly_version(config, tasks):
for task in tasks:
if task.pop("include-nightly-version", False):
- task["run"]["gradlew"].append('-PversionName={}'.format(formated_date_time))
+ task["run"]["gradlew"].extend([
+ '-PversionName={}'.format(formated_date_time),
+ '-Pofficial'
+ ])
yield task
@@ -112,9 +115,10 @@ def add_nightly_version(config, tasks):
def add_release_version(config, tasks):
for task in tasks:
if task.pop("include-release-version", False):
- task["run"]["gradlew"].append(
- '-PversionName={}'.format(config.params["version"])
- )
+ task["run"]["gradlew"].extend([
+ '-PversionName={}'.format(config.params["version"]),
+ '-Pofficial'
+ ])
yield task
From e188185b15e48622ed1c804777df6f48e78d365d Mon Sep 17 00:00:00 2001
From: Codrut Topliceanu <60002907+codrut-topliceanu@users.noreply.github.com>
Date: Fri, 29 Jan 2021 10:14:32 +0200
Subject: [PATCH 021/248] For #16828 - Adds telemetry for open in app banner
(#17049)
* For #16828 - Adds telemetry for open in app banner
Specifically: Banner displayed, Dismiss action, Go to Settings action.
---
app/metrics.yaml | 41 +++++++++++++++++++
.../browser/OpenInAppOnboardingObserver.kt | 12 +++++-
.../mozilla/fenix/components/metrics/Event.kt | 4 ++
.../components/metrics/GleanMetricsService.kt | 11 +++++
.../OpenInAppOnboardingObserverTest.kt | 4 ++
docs/metrics.md | 3 ++
6 files changed, 74 insertions(+), 1 deletion(-)
diff --git a/app/metrics.yaml b/app/metrics.yaml
index 61bcfead0..038fa418e 100644
--- a/app/metrics.yaml
+++ b/app/metrics.yaml
@@ -4291,6 +4291,47 @@ tabs:
- fenix-core@mozilla.com
expires: "2021-08-01"
+banner_open_in_app:
+ displayed:
+ type: event
+ description: |
+ Open in App banner was shown.
+ bugs:
+ - https://github.com/mozilla-mobile/fenix/issues/16828
+ data_reviews:
+ - https://github.com/mozilla-mobile/fenix/pull/17049
+ data_sensitivity:
+ - interaction
+ notification_emails:
+ - fenix-core@mozilla.com
+ expires: "2021-08-01"
+ dismissed:
+ type: event
+ description: |
+ User tapped 'dismiss' on Open in App banner.
+ bugs:
+ - https://github.com/mozilla-mobile/fenix/issues/16828
+ data_reviews:
+ - https://github.com/mozilla-mobile/fenix/pull/17049
+ data_sensitivity:
+ - interaction
+ notification_emails:
+ - fenix-core@mozilla.com
+ expires: "2021-08-01"
+ go_to_settings:
+ type: event
+ description: |
+ User tapped 'go to settings' on Open in App banner.
+ bugs:
+ - https://github.com/mozilla-mobile/fenix/issues/16828
+ data_reviews:
+ - https://github.com/mozilla-mobile/fenix/pull/17049
+ data_sensitivity:
+ - interaction
+ notification_emails:
+ - fenix-core@mozilla.com
+ expires: "2021-08-01"
+
contextual_menu:
copy_tapped:
type: event
diff --git a/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt
index 1d129a027..65cb98795 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt
@@ -22,6 +22,9 @@ import mozilla.components.support.base.feature.LifecycleAwareFeature
import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged
import org.mozilla.fenix.R
+import org.mozilla.fenix.components.metrics.Event
+import org.mozilla.fenix.components.metrics.Event.BannerOpenInAppGoToSettings
+import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.utils.Settings
@@ -85,6 +88,7 @@ class OpenInAppOnboardingObserver(
infoBanner?.showBanner()
sessionDomainForDisplayedBanner = url.tryGetHostFromUrl()
settings.shouldShowOpenInAppBanner = false
+ context.components.analytics.metrics.track(Event.BannerOpenInAppDisplayed)
}
}
@@ -95,12 +99,18 @@ class OpenInAppOnboardingObserver(
message = context.getString(R.string.open_in_app_cfr_info_message),
dismissText = context.getString(R.string.open_in_app_cfr_negative_button_text),
actionText = context.getString(R.string.open_in_app_cfr_positive_button_text),
- container = container
+ container = container,
+ dismissAction = ::dismissAction
) {
val directions = BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment(
preferenceToScrollTo = context.getString(R.string.pref_key_open_links_in_external_app)
)
+ context.components.analytics.metrics.track(BannerOpenInAppGoToSettings)
navController.nav(R.id.browserFragment, directions)
}
}
+
+ private fun dismissAction() {
+ context.components.analytics.metrics.track(Event.BannerOpenInAppDismissed)
+ }
}
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
index a6e43ea03..983d228df 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt
@@ -200,6 +200,10 @@ sealed class Event {
object HaveOpenTabs : Event()
object HaveNoOpenTabs : Event()
+ object BannerOpenInAppDisplayed : Event()
+ object BannerOpenInAppDismissed : Event()
+ object BannerOpenInAppGoToSettings : Event()
+
object ContextMenuCopyTapped : Event()
object ContextMenuSearchTapped : Event()
object ContextMenuSelectAllTapped : Event()
diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
index 3b8da8e11..d1e653f09 100644
--- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt
@@ -17,6 +17,7 @@ import org.mozilla.fenix.GleanMetrics.AboutPage
import org.mozilla.fenix.GleanMetrics.Addons
import org.mozilla.fenix.GleanMetrics.AppTheme
import org.mozilla.fenix.GleanMetrics.Autoplay
+import org.mozilla.fenix.GleanMetrics.BannerOpenInApp
import org.mozilla.fenix.GleanMetrics.BookmarksManagement
import org.mozilla.fenix.GleanMetrics.BrowserSearch
import org.mozilla.fenix.GleanMetrics.Collections
@@ -733,6 +734,16 @@ private val Event.wrapper: EventWrapper<*>?
{ Metrics.hasTopSites.set(false) }
)
+ is Event.BannerOpenInAppDisplayed -> EventWrapper(
+ { BannerOpenInApp.displayed.record(it) }
+ )
+ is Event.BannerOpenInAppDismissed -> EventWrapper(
+ { BannerOpenInApp.dismissed.record(it) }
+ )
+ is Event.BannerOpenInAppGoToSettings -> EventWrapper(
+ { BannerOpenInApp.goToSettings.record(it) }
+ )
+
// Don't record other events in Glean:
is Event.AddBookmark -> null
is Event.OpenedBookmark -> null
diff --git a/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt b/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt
index ce0cf7f01..ec8405f3f 100644
--- a/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt
@@ -11,7 +11,9 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import androidx.navigation.NavController
import io.mockk.every
+import io.mockk.just
import io.mockk.mockk
+import io.mockk.runs
import io.mockk.spyk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -28,6 +30,7 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
+import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.utils.Settings
@@ -138,6 +141,7 @@ class OpenInAppOnboardingObserverTest {
every { settings.openLinksInExternalApp } returns false
every { settings.shouldShowOpenInAppCfr } returns true
every { appLinksUseCases.appLinkRedirect.invoke(any()).hasExternalApp() } returns true
+ every { context.components.analytics.metrics.track(any()) } just runs
store.dispatch(ContentAction.UpdateLoadingStateAction("1", true)).joinBlocking()
openInAppOnboardingObserver.start()
diff --git a/docs/metrics.md b/docs/metrics.md
index c301f0ec6..1ed8a6125 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -55,6 +55,9 @@ The following metrics are added to the ping:
| app_theme.dark_theme_selected |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected Dark Theme |[1](https://github.com/mozilla-mobile/fenix/pull/7968), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|- source: The source from where dark theme was selected. The source can be 'SETTINGS' or 'ONBOARDING'
|2021-04-01 |2 |
| autoplay.setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their autoplay setting to either block_cellular, block_audio, or block_all. |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)|- autoplay_setting: The new setting for autoplay: block_cellular, block_audio, or block_all.
|2021-02-01 |2 |
| autoplay.visited_setting |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user visited the autoplay settings screen |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)||2021-02-01 |2 |
+| banner_open_in_app.dismissed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'dismiss' on Open in App banner. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 |
+| banner_open_in_app.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Open in App banner was shown. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 |
+| banner_open_in_app.go_to_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'go to settings' on Open in App banner. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 |
| bookmarks_management.copied |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user copied a bookmark. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 |
| bookmarks_management.edited |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user edited the title and/or URL of an existing bookmark. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 |
| bookmarks_management.folder_add |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user added a new bookmark folder. |[1](https://github.com/mozilla-mobile/fenix/pull/1708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 |
From be0382fca76eef12ae3d19a4e0dfe1689219d897 Mon Sep 17 00:00:00 2001
From: rxu
Date: Fri, 30 Oct 2020 15:04:37 +0800
Subject: [PATCH 022/248] Pop out privacy notice in first launch in
MozillaOnline builds
Add privacy notice related strings
Pop out privacy notice with onboarding
Using embeded geckoview to display details about privacy
Present or hide privacy pop window according to isMozillaOnline
Add activity_privacy_content_display.xml into layoutNotToTest due to EngineView
---
app/src/main/AndroidManifest.xml | 3 +
.../org/mozilla/fenix/home/HomeFragment.kt | 8 ++
.../PrivacyContentDisplayActivity.kt | 84 +++++++++++++++++++
.../mozonline/PrivacyContentDisplayHelper.kt | 53 ++++++++++++
.../home/mozonline/PrivacyContentSpan.kt | 44 ++++++++++
.../java/org/mozilla/fenix/utils/Settings.kt | 5 ++
.../activity_privacy_content_display.xml | 43 ++++++++++
.../res/values-zh-rCN/mozonline_strings.xml | 22 +++++
app/src/main/res/values/mozonline_strings.xml | 22 +++++
app/src/main/res/values/preference_keys.xml | 3 +
.../fenix/perf/PerformanceInflaterTest.kt | 3 +-
11 files changed, 289 insertions(+), 1 deletion(-)
create mode 100644 app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayActivity.kt
create mode 100644 app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt
create mode 100644 app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentSpan.kt
create mode 100644 app/src/main/res/layout/activity_privacy_content_display.xml
create mode 100644 app/src/main/res/values-zh-rCN/mozonline_strings.xml
create mode 100644 app/src/main/res/values/mozonline_strings.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index efb94c3c0..0f4ac90f1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -119,6 +119,9 @@
+
+
(R.id.privacyContentEngineView) as EngineView
+ closeButton = findViewById(R.id.privacyContentCloseButton) as ImageButton
+ engineSession = components.core.engine.createSession()
+ }
+
+ override fun onCreateView(
+ parent: View?,
+ name: String,
+ context: Context,
+ attrs: AttributeSet
+ ): View? = when (name) {
+ EngineView::class.java.name -> components.core.engine.createView(context, attrs).apply {
+ selectionActionDelegate = DefaultSelectionActionDelegate(
+ BrowserStoreSearchAdapter(
+ components.core.store
+ ),
+ resources = context.resources,
+ shareTextClicked = { share(it) },
+ emailTextClicked = { email(it) },
+ callTextClicked = { call(it) }
+ )
+ }.asView()
+ else -> super.onCreateView(parent, name, context, attrs)
+ }
+
+ override fun onStart() {
+ super.onStart()
+ engineSession.register(this)
+ engineSession.let { engineSession ->
+ engineView.render(engineSession)
+ url?.let { engineSession.loadUrl(it) }
+ }
+ closeButton.setOnClickListener { finish() }
+ }
+
+ override fun onStop() {
+ super.onStop()
+ engineSession.unregister(this)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ engineSession.close()
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt b/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt
new file mode 100644
index 000000000..d34371a00
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentDisplayHelper.kt
@@ -0,0 +1,53 @@
+/* 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.home.mozonline
+
+import android.app.Activity
+import android.content.Context
+import android.content.DialogInterface
+import android.text.SpannableString
+import android.text.Spanned
+import android.text.method.LinkMovementMethod
+import android.widget.TextView
+import androidx.appcompat.app.AlertDialog
+import org.mozilla.fenix.R
+import org.mozilla.fenix.ext.settings
+import kotlin.system.exitProcess
+
+fun showPrivacyPopWindow(context: Context, activity: Activity) {
+ val content = context.getString(R.string.privacy_notice_content)
+
+ // Use hyperlinks to display details about privacy
+ val messageClickable1 = context.getString(R.string.privacy_notice_clickable1)
+ val messageClickable2 = context.getString(R.string.privacy_notice_clickable2)
+ val messageClickable3 = context.getString(R.string.privacy_notice_clickable3)
+ val messageSpannable = SpannableString(content)
+
+ val clickableSpan1 = PrivacyContentSpan(Position.POS1, context)
+ val clickableSpan2 = PrivacyContentSpan(Position.POS2, context)
+ val clickableSpan3 = PrivacyContentSpan(Position.POS3, context)
+
+ messageSpannable.setSpan(clickableSpan1, content.indexOf(messageClickable1),
+ content.indexOf(messageClickable1) + messageClickable1.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
+ messageSpannable.setSpan(clickableSpan2, content.indexOf(messageClickable2),
+ content.indexOf(messageClickable2) + messageClickable2.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
+ messageSpannable.setSpan(clickableSpan3, content.indexOf(messageClickable3),
+ content.indexOf(messageClickable3) + messageClickable3.length, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
+
+ // Users can only use fenix after they agree with the privacy notice
+ val builder = AlertDialog.Builder(activity)
+ .setPositiveButton(context.getString(R.string.privacy_notice_positive_button),
+ DialogInterface.OnClickListener { _, _ ->
+ context.settings().shouldShowPrivacyPopWindow = false
+ })
+ .setNeutralButton(context.getString(R.string.privacy_notice_neutral_button),
+ DialogInterface.OnClickListener { _, _ -> exitProcess(0) })
+ .setTitle(context.getString(R.string.privacy_notice_title))
+ .setMessage(messageSpannable)
+ .setCancelable(false)
+ val alertDialog: AlertDialog = builder.create()
+ alertDialog.show()
+ alertDialog.findViewById(android.R.id.message)?.movementMethod = LinkMovementMethod.getInstance()
+}
diff --git a/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentSpan.kt b/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentSpan.kt
new file mode 100644
index 000000000..c718a6654
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/home/mozonline/PrivacyContentSpan.kt
@@ -0,0 +1,44 @@
+/* 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.home.mozonline
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.text.style.ClickableSpan
+import android.view.View
+
+object Position {
+ const val POS1 = 1
+ const val POS2 = 2
+ const val POS3 = 3
+}
+
+object ADDR {
+ const val URL1 = "https://www.mozilla.org/en-US/MPL/"
+ const val URL2 = "https://www.mozilla.org/en-US/foundation/trademarks/policy/"
+ const val URL3 = "https://www.mozilla.org/zh-CN/privacy/firefox/"
+}
+
+class PrivacyContentSpan(var pos: Int, var context: Context) :
+ ClickableSpan() {
+ override fun onClick(widget: View) {
+ /**
+ * To avoid users directly using fenix by clicking these urls before
+ * they click positive button of privacy notice alert dialog, start
+ * PrivacyContentDisplayActivity to display them.
+ */
+ val engineViewIntent = Intent(context, PrivacyContentDisplayActivity::class.java)
+ engineViewIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ val addr = Bundle()
+ when (pos) {
+ Position.POS1 -> addr.putString("url", ADDR.URL1)
+ Position.POS2 -> addr.putString("url", ADDR.URL2)
+ Position.POS3 -> addr.putString("url", ADDR.URL3)
+ }
+ engineViewIntent.putExtras(addr)
+ context.startActivity(engineViewIntent)
+ }
+}
diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
index e12cc12f7..0ddb3c35e 100644
--- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
+++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
@@ -252,6 +252,11 @@ class Settings(private val appContext: Context) : PreferencesHolder {
val shouldShowSecurityPinWarning: Boolean
get() = loginsSecureWarningCount.underMaxCount()
+ var shouldShowPrivacyPopWindow by booleanPreference(
+ appContext.getPreferenceKey(R.string.pref_key_privacy_pop_window),
+ default = true
+ )
+
var shouldUseLightTheme by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_light_theme),
default = false
diff --git a/app/src/main/res/layout/activity_privacy_content_display.xml b/app/src/main/res/layout/activity_privacy_content_display.xml
new file mode 100644
index 000000000..c6ff55e47
--- /dev/null
+++ b/app/src/main/res/layout/activity_privacy_content_display.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-zh-rCN/mozonline_strings.xml b/app/src/main/res/values-zh-rCN/mozonline_strings.xml
new file mode 100644
index 000000000..d09a3e0b9
--- /dev/null
+++ b/app/src/main/res/values-zh-rCN/mozonline_strings.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ 关于您的权利
+
+ Mozilla Firefox 是一款自由开源软件,由来自世界各地成千上万的社区志愿者共同完成。以下几点您应该了解:
+ \n\n•Firefox 提供给您时依照的条款为 Mozilla 公共许可证(MPL)。这表示您可以使用、复制和向他人分发 Firefox。我们也非常欢迎您按自己的需要修改 Firefox 的源代码。Mozilla 公共许可证还授予您分发您自己修改过的软件版本的权利。
+ \n•您没有获得 Mozilla 基金会或其他任何一方的商标权利或许可,这包括但不限于 Firefox 的名称或标志。有关商标的其他信息在:这里。
+ \n•Firefox 的一些功能(例如崩溃报告器)使您可以向 Mozilla 提供反馈。提交反馈的同时,您授权 Mozilla 使用反馈信息改进产品、在其网站上发布反馈信息,以及分发反馈内容。
+ \n•关于我们如何使用您通过 Firefox 提交给 Mozilla 的个人信息和反馈,请参见 Firefox 隐私权政策。
+
+ Mozilla 公共许可证(MPL)
+
+ 这里
+
+ Firefox 隐私权政策
+
+ 同意并继续
+
+ 退出应用
+
\ No newline at end of file
diff --git a/app/src/main/res/values/mozonline_strings.xml b/app/src/main/res/values/mozonline_strings.xml
new file mode 100644
index 000000000..89c9fbc4c
--- /dev/null
+++ b/app/src/main/res/values/mozonline_strings.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ About your rights
+
+ Mozilla Firefox is free and open source software, built by a community of thousands from all over the world. There are a few things you should know:
+ \n\n•Firefox is made available to you under the terms of the Mozilla Public License. This means you may use, copy and distribute Firefox to others. You are also welcome to modify the source code of Firefox as you want to meet your needs. The Mozilla Public License also gives you the right to distribute your modified versions.
+ \n•You are not granted any trademark rights or licenses to the trademarks of the Mozilla Foundation or any party, including without limitation the Firefox name or logo. Additional information on trademarks may be found here.
+ \n•Some features in Firefox, such as the Crash Reporter, give you the option to provide feedback to Mozilla. By choosing to submit feedback, you give Mozilla permission to use the feedback to improve its products, to publish the feedback on its websites, and to distribute the feedback.
+ \n•How we use your personal information and feedback submitted to Mozilla through Firefox is described in the Firefox Privacy Policy.
+
+ Mozilla Public License
+
+ found here
+
+ Firefox Privacy Policy
+
+ Agree and Continue
+
+ Exit the App
+
\ No newline at end of file
diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml
index aea6b7180..e0ad6b502 100644
--- a/app/src/main/res/values/preference_keys.xml
+++ b/app/src/main/res/values/preference_keys.xml
@@ -126,6 +126,9 @@
pref_key_toolbar_top
pref_key_toolbar_bottom
+
+ pref_key_privacy_pop_window
+
pref_key_light_theme
pref_key_dark_theme
diff --git a/app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt b/app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt
index 59698c783..dc09d1fba 100644
--- a/app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt
@@ -26,7 +26,8 @@ class PerformanceInflaterTest {
private val layoutsNotToTest = setOf(
"fragment_browser",
- "fragment_add_on_internal_settings"
+ "fragment_add_on_internal_settings",
+ "activity_privacy_content_display"
)
@Before
From a97ea9ac530b955841f0c6e30ec38e21143092b5 Mon Sep 17 00:00:00 2001
From: Jonathan Almeida
Date: Fri, 29 Jan 2021 18:06:01 +0400
Subject: [PATCH 023/248] Update Android Components version to
73.0.20210129102924
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index de44861f4..5f110585a 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210128143151"
+ const val VERSION = "73.0.20210129102924"
}
From 66b94ced145b447140a4fa8bc573dd58d306a5e7 Mon Sep 17 00:00:00 2001
From: Jonathan Almeida
Date: Fri, 29 Jan 2021 18:17:54 +0400
Subject: [PATCH 024/248] Close #1340: Add support for WebAuthnFeature
---
app/build.gradle | 1 +
.../java/org/mozilla/fenix/FeatureFlags.kt | 2 +-
.../fenix/browser/BaseBrowserFragment.kt | 5 +-
.../mozilla/fenix/browser/WebAuthnFeature.kt | 62 -------------------
buildSrc/src/main/java/Dependencies.kt | 1 +
5 files changed, 7 insertions(+), 64 deletions(-)
delete mode 100644 app/src/main/java/org/mozilla/fenix/browser/WebAuthnFeature.kt
diff --git a/app/build.gradle b/app/build.gradle
index e0ff4c67d..9cded9b84 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -479,6 +479,7 @@ dependencies {
implementation Deps.mozilla_feature_top_sites
implementation Deps.mozilla_feature_share
implementation Deps.mozilla_feature_accounts_push
+ implementation Deps.mozilla_feature_webauthn
implementation Deps.mozilla_feature_webcompat
implementation Deps.mozilla_feature_webnotifications
implementation Deps.mozilla_feature_webcompat_reporter
diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
index 02445794c..170520d85 100644
--- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
+++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
@@ -48,7 +48,7 @@ object FeatureFlags {
val newMediaSessionApi = true
/**
- * Enables experimental WebAuthn support. This implementation should never reach release!
+ * Enables WebAuthn support.
*/
val webAuthFeature = Config.channel.isNightlyOrDebug
}
diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
index 60dfe78f3..7d5a95ea6 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
@@ -81,6 +81,7 @@ import mozilla.components.support.ktx.android.view.exitImmersiveModeIfNeeded
import mozilla.components.support.ktx.android.view.hideKeyboard
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
+import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.IntentReceiverActivity
@@ -125,6 +126,7 @@ import org.mozilla.fenix.utils.allowUndo
import org.mozilla.fenix.wifi.SitePermissionsWifiIntegration
import java.lang.ref.WeakReference
import mozilla.components.feature.media.fullscreen.MediaFullscreenOrientationFeature
+import mozilla.components.feature.webauthn.WebAuthnFeature
import org.mozilla.fenix.FeatureFlags.newMediaSessionApi
/**
@@ -643,7 +645,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler,
view = view
)
- if (FeatureFlags.webAuthFeature) {
+ // This component feature only works on Fenix when built on Mozilla infrastructure.
+ if (FeatureFlags.webAuthFeature && BuildConfig.MOZILLA_OFFICIAL) {
webAuthnFeature.set(
feature = WebAuthnFeature(
engine = requireComponents.core.engine,
diff --git a/app/src/main/java/org/mozilla/fenix/browser/WebAuthnFeature.kt b/app/src/main/java/org/mozilla/fenix/browser/WebAuthnFeature.kt
deleted file mode 100644
index 24576f932..000000000
--- a/app/src/main/java/org/mozilla/fenix/browser/WebAuthnFeature.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/* 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.browser
-
-import android.app.Activity
-import android.content.Intent
-import android.content.IntentSender
-import mozilla.components.concept.engine.Engine
-import mozilla.components.concept.engine.activity.ActivityDelegate
-import mozilla.components.support.base.feature.ActivityResultHandler
-import mozilla.components.support.base.feature.LifecycleAwareFeature
-import mozilla.components.support.base.log.logger.Logger
-import org.mozilla.fenix.FeatureFlags
-
-/**
- * This implementation of the WebAuthnFeature is only for testing in a nightly signed build.
- *
- * ⚠️ This should always be behind the [FeatureFlags.webAuthFeature] nightly flag.
- */
-class WebAuthnFeature(
- private val engine: Engine,
- private val activity: Activity
-) : LifecycleAwareFeature, ActivityResultHandler {
- val logger = Logger("WebAuthnFeature")
- var requestCode = ACTIVITY_REQUEST_CODE
- var resultCallback: ((Intent?) -> Unit)? = null
- private val delegate = object : ActivityDelegate {
- override fun startIntentSenderForResult(intent: IntentSender, onResult: (Intent?) -> Unit) {
- val code = requestCode++
- logger.info("Received activity delegate request with code: $code intent: $intent")
- activity.startIntentSenderForResult(intent, code, null, 0, 0, 0)
- resultCallback = onResult
- }
- }
-
- override fun start() {
- logger.info("Feature started.")
- engine.registerActivityDelegate(delegate)
- }
-
- override fun stop() {
- logger.info("Feature stopped.")
- engine.unregisterActivityDelegate()
- }
-
- override fun onActivityResult(requestCode: Int, data: Intent?, resultCode: Int): Boolean {
- logger.info("Received activity result with code: $requestCode\ndata: $data")
- if (this.requestCode == requestCode) {
- logger.info("Invoking callback!")
- resultCallback?.invoke(data)
- return true
- }
-
- return false
- }
-
- companion object {
- const val ACTIVITY_REQUEST_CODE = 10
- }
-}
diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt
index da3fe9a21..b132351d4 100644
--- a/buildSrc/src/main/java/Dependencies.kt
+++ b/buildSrc/src/main/java/Dependencies.kt
@@ -124,6 +124,7 @@ object Deps {
const val mozilla_feature_accounts_push = "org.mozilla.components:feature-accounts-push:${Versions.mozilla_android_components}"
const val mozilla_feature_top_sites = "org.mozilla.components:feature-top-sites:${Versions.mozilla_android_components}"
const val mozilla_feature_share = "org.mozilla.components:feature-share:${Versions.mozilla_android_components}"
+ const val mozilla_feature_webauthn = "org.mozilla.components:feature-webauthn:${Versions.mozilla_android_components}"
const val mozilla_feature_webcompat = "org.mozilla.components:feature-webcompat:${Versions.mozilla_android_components}"
const val mozilla_feature_webnotifications = "org.mozilla.components:feature-webnotifications:${Versions.mozilla_android_components}"
const val mozilla_feature_webcompat_reporter = "org.mozilla.components:feature-webcompat-reporter:${Versions.mozilla_android_components}"
From d434ff13a56aa7e97bc0137244752306366dff28 Mon Sep 17 00:00:00 2001
From: Roger Yang
Date: Fri, 29 Jan 2021 15:16:21 -0500
Subject: [PATCH 025/248] For #17092: Dismiss toolbar menu when configuration
change occurs (#17682)
---
.../org/mozilla/fenix/browser/BaseBrowserFragment.kt | 7 +++++++
.../fenix/components/toolbar/BrowserToolbarView.kt | 4 ++++
.../main/java/org/mozilla/fenix/home/HomeFragment.kt | 10 ++++++++++
.../org/mozilla/fenix/browser/BrowserFragmentTest.kt | 11 +++++++++++
.../java/org/mozilla/fenix/home/HomeFragmentTest.kt | 11 +++++++++++
5 files changed, 43 insertions(+)
diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
index 7d5a95ea6..869be62a9 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
@@ -6,6 +6,7 @@ package org.mozilla.fenix.browser
import android.content.Context
import android.content.Intent
+import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import android.view.Gravity
@@ -1317,6 +1318,12 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler,
}
}
+ override fun onConfigurationChanged(newConfig: Configuration) {
+ super.onConfigurationChanged(newConfig)
+
+ _browserToolbarView?.dismissMenu()
+ }
+
// This method is called in response to native web extension messages from
// content scripts (e.g the reader view extension). By the time these
// messages are processed the fragment/view may no longer be attached.
diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt
index fdad11b3b..aff4b03d2 100644
--- a/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt
@@ -235,6 +235,10 @@ class BrowserToolbarView(
}
}
+ fun dismissMenu() {
+ view.dismissMenu()
+ }
+
/**
* Dynamically sets scroll flags for the toolbar when the user does not have a screen reader enabled
* Note that the toolbar will have the flags set and be able to be hidden
diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
index 412d286ae..ca828cfac 100644
--- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
@@ -7,6 +7,7 @@ package org.mozilla.fenix.home
import android.animation.Animator
import android.content.Context
import android.content.DialogInterface
+import android.content.res.Configuration
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
@@ -168,6 +169,9 @@ class HomeFragment : Fragment() {
private val topSitesFeature = ViewBoundFeatureWrapper()
+ @VisibleForTesting
+ internal var getMenuButton: () -> MenuButton? = { menuButton }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -274,6 +278,12 @@ class HomeFragment : Fragment() {
return view
}
+ override fun onConfigurationChanged(newConfig: Configuration) {
+ super.onConfigurationChanged(newConfig)
+
+ getMenuButton()?.dismissMenu()
+ }
+
private fun dismissTip(tip: Tip) {
sessionControlInteractor.onCloseTip(tip)
}
diff --git a/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt
index adeb7b36b..cd32d5ee0 100644
--- a/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt
@@ -346,6 +346,17 @@ class BrowserFragmentTest {
verify(exactly = 1) { toolbarIntegration.invalidateMenu() }
}
+ @Test
+ fun `WHEN fragment configuration changed THEN menu is dismissed`() {
+ val browserToolbarView: BrowserToolbarView = mockk(relaxed = true)
+ every { browserFragment.context } returns null
+ browserFragment._browserToolbarView = browserToolbarView
+
+ browserFragment.onConfigurationChanged(mockk(relaxed = true))
+
+ verify(exactly = 1) { browserToolbarView.dismissMenu() }
+ }
+
private fun addAndSelectTab(tab: TabSessionState) {
store.dispatch(TabListAction.AddTabAction(tab)).joinBlocking()
store.dispatch(TabListAction.SelectTabAction(tab.id)).joinBlocking()
diff --git a/app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt b/app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt
index 8f24fa8e8..b201fd2e5 100644
--- a/app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/home/HomeFragmentTest.kt
@@ -8,7 +8,9 @@ import android.content.Context
import io.mockk.every
import io.mockk.mockk
import io.mockk.spyk
+import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import mozilla.components.browser.menu.view.MenuButton
import org.junit.Assert
import org.junit.Before
import org.junit.Test
@@ -65,4 +67,13 @@ class HomeFragmentTest {
Assert.assertEquals(topSitesMaxLimit, topSitesConfig.totalSites)
}
+
+ @Test
+ fun `WHEN configuration changed menu is dismissed`() {
+ val menuButton: MenuButton = mockk(relaxed = true)
+ homeFragment.getMenuButton = { menuButton }
+ homeFragment.onConfigurationChanged(mockk(relaxed = true))
+
+ verify(exactly = 1) { menuButton.dismissMenu() }
+ }
}
From 8586b689f0776f1e781ee17cb7501f46ed675b76 Mon Sep 17 00:00:00 2001
From: Mickey Moz <33347735+MickeyMoz@users.noreply.github.com>
Date: Fri, 29 Jan 2021 23:25:21 +0100
Subject: [PATCH 026/248] Update Android Components version to
73.0.20210129143134. (#17695)
Co-authored-by: Roger Yang
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 5f110585a..261dac0b0 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210129102924"
+ const val VERSION = "73.0.20210129143134"
}
From d48bb2a4ccb8dbb3409cca0280f21e7e0f8a756f Mon Sep 17 00:00:00 2001
From: Michael Comella
Date: Thu, 28 Jan 2021 16:07:26 -0800
Subject: [PATCH 027/248] Revert "For #17447: add intentional delay to cold
start up in debug and nightly."
This reverts commit 093470a8b347a56195cda0d368b8b9bda8119fe2. This
intentional regression was only intended to be temporary so now we're
removing it.
---
app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 7 -------
app/src/main/java/org/mozilla/fenix/FenixApplication.kt | 7 -------
2 files changed, 14 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
index 170520d85..2aedb9361 100644
--- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
+++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
@@ -34,13 +34,6 @@ object FeatureFlags {
// users are still experiencing crashes.
const val nimbusExperiments = false
- /**
- * Enables an intentional regression to validate perftest alerting. See
- * https://github.com/mozilla-mobile/fenix/issues/17447 for details. This
- * is expected to be removed within several days.
- */
- val intentionalRegressionToValidatePerfTestAlerting = Config.channel.isNightlyOrDebug
-
/**
* Enables the new MediaSession API.
*/
diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
index 88d950629..fdcbad404 100644
--- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
+++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
@@ -119,13 +119,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
@CallSuper
open fun setupInMainProcessOnly() {
- // See feature flags kdoc for details.
- if (FeatureFlags.intentionalRegressionToValidatePerfTestAlerting) {
- logger.info("Intentional thread sleep. See #17447")
- @Suppress("MagicNumber") // it's fine for a quick patch.
- Thread.sleep(100)
- }
-
run {
// Attention: Do not invoke any code from a-s in this scope.
val megazordSetup = setupMegazord()
From 9afb78de3f26d92e0609d5dec022cffe634f36c3 Mon Sep 17 00:00:00 2001
From: Mozilla L10n Automation Bot
Date: Sat, 30 Jan 2021 00:04:09 +0000
Subject: [PATCH 028/248] Import l10n.
---
app/src/main/res/values-ar/strings.xml | 21 ++++++++++++++++++++-
app/src/main/res/values-zh-rCN/strings.xml | 8 ++++----
2 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index f04e157ef..dce2059be 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -631,6 +631,8 @@
قائمة الألسنة المحددة
أزِل اللسان من المجموعة
+
+ اختر ألسنة
أغلِق اللسان
@@ -1012,6 +1014,8 @@
أُغلقت الألسنة!
حُفظت العلامات!
+
+ اعرض
أُضيف إلى المواقع الشائعة!
@@ -1088,6 +1092,8 @@
يحرّر مساحة التخزين
تصاريح المواقع
+
+ التنزيلات
احذف بيانات التصفح
@@ -1207,7 +1213,7 @@
خصوصيتك
- صمّمنا لك %s لتقدر على التحكّم فيما تُشاركه عبر الشبكة، وما تُشاركه معنا.
+ صمّمنا لك %s لتقدر على التحكّم فيما تُشاركه عبر الشبكة، وما تُشاركه معنا.
اقرأ تنويه الخصوصية
@@ -1357,6 +1363,11 @@
The first parameter is the app name -->
%s | المكتبات مفتوحة المصدر
+
+ متعقّبات التحويلات
+
+ يمسح الكعكات التي ضبطتها التحويلات إلى مواقع تعقّب معروفة.
+
الدعم
@@ -1612,6 +1623,12 @@
احذف
خيارات الولوج
+
+ حقل نصوص قابل للتعديل لعنوان وِب الولوج.
+
+ حقل نصوص قابل للتعديل لاسم مستخدم الولوج.
+
+ حقل نصوص قابل للتعديل لكلمة سر الولوج.
احفظ التغييرات على الولوج.
@@ -1657,6 +1674,8 @@
الاسم
+
+ اسم الموقع الأكثر زيارة
حسنا
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 9b9f7cc5e..ff7cc6fce 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -531,7 +531,7 @@
屏幕截图
- 下载项
+ 下载
书签
@@ -738,11 +738,11 @@
- 删除下载项
+ 清除下载记录
- 您确定要清除下载项吗?
+ 您确定要清除下载记录吗?
- 下载项已移除
+ 下载记录已清除
已移除 %1$s
From 450756032561d6f7a2a239b54aa9446c287f6c91 Mon Sep 17 00:00:00 2001
From: Mozilla L10n Automation Bot
Date: Sun, 31 Jan 2021 00:03:55 +0000
Subject: [PATCH 029/248] Import l10n.
---
app/src/main/res/values-es-rES/strings.xml | 5 +++--
app/src/main/res/values-pa-rIN/strings.xml | 4 ++++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index 733006fb9..0285eea56 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -1119,6 +1119,8 @@
Libera espacio de almacenamiento
Permisos del sitio
+
+ Descargas
Eliminar datos de navegación
@@ -1243,8 +1245,7 @@
Tu privacidad
- Hemos diseñado %s para darte control sobre lo que compartes
- en línea y lo que compartes con nosotros.
+ Hemos diseñado %s para darte el control sobre lo que compartes en línea y lo que compartes con nosotros.
Lee nuestro aviso de privacidad
diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml
index bcd118a1e..68bdccd77 100644
--- a/app/src/main/res/values-pa-rIN/strings.xml
+++ b/app/src/main/res/values-pa-rIN/strings.xml
@@ -1231,6 +1231,10 @@
ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ
ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ
+
+ ਅਸੀਂ %s ਨੂੰ ਇੰਝ ਬਣਾਇਆ ਹੈ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਪੂਰਾ ਕੰਟਰੋਲ ਹੋਵੇ ਕਿ ਤੁਸੀਂ
+ਆਨਲਾਈਨ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ ਅਤੇ ਸਾਡੇ ਨਾਲ ਕੀ ਸਾਂਝਾ ਕਰਦੇ ਹੋ।
ਸਾਡੀ ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ ਨੂੰ ਪੜ੍ਹੋ
From 4bc6b852374ddb340c71ebe07a121e42111d4feb Mon Sep 17 00:00:00 2001
From: MickeyMoz
Date: Sat, 30 Jan 2021 15:37:04 +0000
Subject: [PATCH 030/248] Update Android Components version to
73.0.20210129195412.
---
app/src/main/java/org/mozilla/fenix/components/Analytics.kt | 1 +
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
index 1ef9581fd..2feadad1b 100644
--- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
@@ -133,6 +133,7 @@ class Analytics(
// Nimbus should look after downloading experiment definitions from remote settings
// on another thread, and making sure we don't hit the server each time we start.
+ @Suppress("Deprecation")
updateExperiments()
}
} else {
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 261dac0b0..dd2adb25e 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210129143134"
+ const val VERSION = "73.0.20210129195412"
}
From 98737327907d74db1f57c9253abb7d631c0e745f Mon Sep 17 00:00:00 2001
From: MickeyMoz
Date: Sun, 31 Jan 2021 15:35:01 +0000
Subject: [PATCH 031/248] Update Android Components version to
73.0.20210131143119.
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index dd2adb25e..24daea91a 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210129195412"
+ const val VERSION = "73.0.20210131143119"
}
From 1df656cd0e89b00f619f18fa1e6646409081ebb4 Mon Sep 17 00:00:00 2001
From: mawen7
Date: Mon, 1 Feb 2021 09:17:49 +0100
Subject: [PATCH 032/248] Include selected session in session suggestions if
opened from home fragment (#17127)
---
.../java/org/mozilla/fenix/search/SearchDialogFragment.kt | 8 ++++++--
.../org/mozilla/fenix/search/awesomebar/AwesomeBarView.kt | 5 +++--
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
index 6e20a2972..394252af6 100644
--- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
@@ -116,6 +116,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
}
}
+ @SuppressWarnings("LongMethod")
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -172,10 +173,13 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
val awesomeBar = view.awesome_bar
awesomeBar.customizeForBottomToolbar = requireContext().settings().shouldUseBottomToolbar
+ val fromHomeFragment =
+ findNavController().previousBackStackEntry?.destination?.id == R.id.homeFragment
awesomeBarView = AwesomeBarView(
activity,
interactor,
- awesomeBar
+ awesomeBar,
+ fromHomeFragment
)
view.awesome_bar.setOnTouchListener { _, _ ->
@@ -191,7 +195,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
requireComponents.core.engine.speculativeCreateSession(isPrivate)
- if (findNavController().previousBackStackEntry?.destination?.id == R.id.homeFragment) {
+ if (fromHomeFragment) {
// When displayed above home, dispatches the touch events to scrim area to the HomeFragment
view.search_wrapper.background = ColorDrawable(Color.TRANSPARENT)
dialog?.window?.decorView?.setOnTouchListener { _, event ->
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 7d97dea8f..2df4afa1d 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
@@ -42,7 +42,8 @@ import mozilla.components.browser.search.SearchEngine as LegacySearchEngine
class AwesomeBarView(
private val activity: HomeActivity,
val interactor: AwesomeBarInteractor,
- val view: BrowserAwesomeBar
+ val view: BrowserAwesomeBar,
+ private val fromHomeFragment: Boolean
) {
private val sessionProvider: SessionSuggestionProvider
private val historyStorageProvider: HistoryStorageSuggestionProvider
@@ -111,7 +112,7 @@ class AwesomeBarView(
selectTabUseCase,
components.core.icons,
getDrawable(activity, R.drawable.ic_search_results_tab),
- excludeSelectedSession = true
+ excludeSelectedSession = !fromHomeFragment
)
historyStorageProvider =
From 89ad370eb27906f24b04ea198d9bc664f53fd8e3 Mon Sep 17 00:00:00 2001
From: Christian Sadilek
Date: Fri, 29 Jan 2021 19:08:22 -0500
Subject: [PATCH 033/248] Remove SessionManager references from UI tests
---
.../mozilla/fenix/helpers/SessionLoadedIdlingResource.kt | 8 ++++----
.../java/org/mozilla/fenix/ui/robots/BrowserRobot.kt | 5 +++--
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/SessionLoadedIdlingResource.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/SessionLoadedIdlingResource.kt
index a32fe743d..0d3537f65 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/helpers/SessionLoadedIdlingResource.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/SessionLoadedIdlingResource.kt
@@ -5,6 +5,7 @@ package org.mozilla.fenix.helpers
import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.IdlingResource
+import mozilla.components.browser.state.selector.selectedTab
import org.mozilla.fenix.FenixApplication
/**
@@ -21,13 +22,12 @@ class SessionLoadedIdlingResource : IdlingResource {
override fun isIdleNow(): Boolean {
val context = ApplicationProvider.getApplicationContext()
- val sessionManager = context.components.core.sessionManager
- val session = sessionManager.selectedSession
+ val selectedTab = context.components.core.store.state.selectedTab
- return if (session?.loading == true) {
+ return if (selectedTab?.content?.loading == true) {
false
} else {
- if (session?.progress == 100) {
+ if (selectedTab?.content?.progress == 100) {
invokeCallback()
true
} else {
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt
index efce62eec..8446019b7 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt
@@ -32,6 +32,7 @@ import androidx.test.uiautomator.By.text
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until
+import mozilla.components.browser.state.selector.selectedTab
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.containsString
import org.hamcrest.Matchers.not
@@ -49,8 +50,8 @@ class BrowserRobot {
private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource
fun verifyCurrentPrivateSession(context: Context) {
- val session = context.components.core.sessionManager.selectedSession
- assertTrue("Current session is private", session?.private!!)
+ val selectedTab = context.components.core.store.state.selectedTab
+ assertTrue("Current session is private", selectedTab?.content?.private ?: false)
}
fun verifyUrl(url: String) {
From cdc008f6a3ef490482f26938431d4f1456b93c0e Mon Sep 17 00:00:00 2001
From: Michael Comella
Date: Fri, 29 Jan 2021 14:52:56 -0800
Subject: [PATCH 034/248] For #17553: renew storage.stats metrics.
---
app/metrics.yaml | 12 ++++++++----
docs/metrics.md | 8 ++++----
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/app/metrics.yaml b/app/metrics.yaml
index 038fa418e..7e12f19bc 100644
--- a/app/metrics.yaml
+++ b/app/metrics.yaml
@@ -4105,6 +4105,7 @@ storage.stats:
- https://github.com/mozilla-mobile/fenix/issues/12802
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732
+ - https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127
data_sensitivity:
- technical
- interaction
@@ -4112,7 +4113,7 @@ storage.stats:
- fenix-core@mozilla.com
- perf-android-fe@mozilla.com
- mcomella@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
app_bytes:
send_in_pings:
- metrics
@@ -4129,6 +4130,7 @@ storage.stats:
- https://github.com/mozilla-mobile/fenix/issues/12802
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732
+ - https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127
data_sensitivity:
- technical
- interaction
@@ -4136,7 +4138,7 @@ storage.stats:
- fenix-core@mozilla.com
- perf-android-fe@mozilla.com
- mcomella@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
cache_bytes:
send_in_pings:
- metrics
@@ -4150,6 +4152,7 @@ storage.stats:
- https://github.com/mozilla-mobile/fenix/issues/12802
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732
+ - https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127
data_sensitivity:
- technical
- interaction
@@ -4157,7 +4160,7 @@ storage.stats:
- fenix-core@mozilla.com
- perf-android-fe@mozilla.com
- mcomella@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
data_dir_bytes:
send_in_pings:
- metrics
@@ -4173,6 +4176,7 @@ storage.stats:
- https://github.com/mozilla-mobile/fenix/issues/12802
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732
+ - https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127
data_sensitivity:
- technical
- interaction
@@ -4180,7 +4184,7 @@ storage.stats:
- fenix-core@mozilla.com
- perf-android-fe@mozilla.com
- mcomella@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
progressive_web_app:
homescreen_tap:
diff --git a/docs/metrics.md b/docs/metrics.md
index 1ed8a6125..2a80a4fff 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -330,10 +330,10 @@ The following metrics are added to the ping:
| search.default_engine.code |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |If the search engine is pre-loaded with Fenix this value will be the search engine identifier. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 |
| search.default_engine.name |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |If the search engine is pre-loaded with Fenix this value will be the search engine name. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 |
| search.default_engine.submission_url |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |If the search engine is pre-loaded with Fenix this value will be he base URL we use to build the search query for the search engine. For example: https://mysearchengine.com/?query=%s. If it's a custom search engine (defined: https://github.com/mozilla-mobile/fenix/issues/1607) the value will be "custom" |[1](https://github.com/mozilla-mobile/fenix/pull/1606), [2](https://github.com/mozilla-mobile/fenix/pull/5216), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1, 2 |
-| storage.stats.app_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of the app's APK and related files as installed: this is expected to be larger than download size. This is the output of [StorageStats.getAppBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getAppBytes()) so see that for details. This value is only available on Android 8+. A similar value may be available on the Google Play dashboard: we can use this value to see if that value is reliable enough. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732)||2021-02-01 |1, 2 |
-| storage.stats.cache_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of all cached data in the app. This is the output of [StorageStats.getCacheBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getCacheBytes()) so see that for details. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732)||2021-02-01 |1, 2 |
-| storage.stats.data_dir_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of all data minus `cache_bytes`. This is the output of [StorageStats.getDataBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getDataBytes()) except we subtract the value of `cache_bytes` so the cache is not measured redundantly; see that method for details. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732)||2021-02-01 |1, 2 |
-| storage.stats.query_stats_duration |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |How long it took to query the device for the StorageStats that contain the file size information. The docs say it may be expensive so we want to ensure it's not too expensive. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732)||2021-02-01 |1, 2 |
+| storage.stats.app_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of the app's APK and related files as installed: this is expected to be larger than download size. This is the output of [StorageStats.getAppBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getAppBytes()) so see that for details. This value is only available on Android 8+. A similar value may be available on the Google Play dashboard: we can use this value to see if that value is reliable enough. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 |
+| storage.stats.cache_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of all cached data in the app. This is the output of [StorageStats.getCacheBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getCacheBytes()) so see that for details. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 |
+| storage.stats.data_dir_bytes |[memory_distribution](https://mozilla.github.io/glean/book/user/metrics/memory_distribution.html) |The size of all data minus `cache_bytes`. This is the output of [StorageStats.getDataBytes](https://developer.android.com/reference/android/app/usage/StorageStats#getDataBytes()) except we subtract the value of `cache_bytes` so the cache is not measured redundantly; see that method for details. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 |
+| storage.stats.query_stats_duration |[timing_distribution](https://mozilla.github.io/glean/book/user/metrics/timing_distribution.html) |How long it took to query the device for the StorageStats that contain the file size information. The docs say it may be expensive so we want to ensure it's not too expensive. This value is only available on Android 8+. |[1](https://github.com/mozilla-mobile/fenix/pull/12876#issuecomment-666770732), [2](https://github.com/mozilla-mobile/fenix/pull/17704#issue-564299127)||2021-08-01 |1, 2 |
## startup-timeline
From d8085480ad8b3715e03ea563ddc95809301d46ae Mon Sep 17 00:00:00 2001
From: Christian Sadilek
Date: Mon, 1 Feb 2021 14:28:14 -0500
Subject: [PATCH 035/248] Increase AMO collection cache timeout to 2 days
---
.../main/java/org/mozilla/fenix/components/Components.kt | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt
index bd3981f72..457c7f638 100644
--- a/app/src/main/java/org/mozilla/fenix/components/Components.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt
@@ -31,7 +31,7 @@ import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.wifi.WifiConnectionMonitor
import java.util.concurrent.TimeUnit
-private const val DAY_IN_MINUTES = 24 * 60L
+private const val AMO_COLLECTION_MAX_CACHE_AGE = 2 * 24 * 60L // Two days in minutes
/**
* Provides access to all components. This class is an implementation of the Service Locator
@@ -102,12 +102,12 @@ class Components(private val context: Context) {
serverURL = BuildConfig.AMO_SERVER_URL,
collectionUser = BuildConfig.AMO_COLLECTION_USER,
collectionName = BuildConfig.AMO_COLLECTION_NAME,
- maxCacheAgeInMinutes = DAY_IN_MINUTES
+ maxCacheAgeInMinutes = AMO_COLLECTION_MAX_CACHE_AGE
)
}
// Fall back to defaults
else {
- AddonCollectionProvider(context, core.client, maxCacheAgeInMinutes = DAY_IN_MINUTES)
+ AddonCollectionProvider(context, core.client, maxCacheAgeInMinutes = AMO_COLLECTION_MAX_CACHE_AGE)
}
}
From 72f977771d0eedb94ce4097ac621c0320c147862 Mon Sep 17 00:00:00 2001
From: jhugman
Date: Mon, 1 Feb 2021 23:50:07 +0000
Subject: [PATCH 036/248] Re-enable Nimbus with Off the main thread I/O and
non-blocking networking (#17684)
* Moved Nimbus setup from Analytics to its own file
* Change experiment identifiers to fit new run of the experiment
* Re-enable nimbus for debug and nightly builds
* ./gradlew ktlint && detekt
---
.../java/org/mozilla/fenix/FeatureFlags.kt | 12 +---
.../org/mozilla/fenix/components/Analytics.kt | 33 +--------
.../mozilla/fenix/experiments/Experiments.kt | 6 +-
.../mozilla/fenix/experiments/NimbusSetup.kt | 72 +++++++++++++++++++
4 files changed, 79 insertions(+), 44 deletions(-)
create mode 100644 app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt
diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
index 2aedb9361..35e89de46 100644
--- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
+++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
@@ -22,17 +22,9 @@ object FeatureFlags {
val syncedTabsInTabsTray = Config.channel.isNightlyOrDebug
/**
- * Enables the Nimbus experiments library, especially the settings toggle to opt-out of
- * all experiments.
+ * Enables the Nimbus experiments library.
*/
- // IMPORTANT: Only turn this back on once the following issues are resolved:
- // - https://github.com/mozilla-mobile/fenix/issues/17086: Calls to
- // getExperimentBranch seem to block on updateExperiments causing a
- // large performance regression loading the home screen.
- // - https://github.com/mozilla-mobile/fenix/issues/17143: Despite
- // having wrapped getExperimentBranch/withExperiments in a catch-all
- // users are still experiencing crashes.
- const val nimbusExperiments = false
+ val nimbusExperiments = Config.channel.isNightlyOrDebug
/**
* Enables the new MediaSession API.
diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
index 2feadad1b..00bfb6647 100644
--- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
+++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt
@@ -8,17 +8,13 @@ import android.app.Application
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
-import android.net.Uri
-import android.os.StrictMode
import mozilla.components.lib.crash.CrashReporter
import mozilla.components.lib.crash.service.CrashReporterService
import mozilla.components.lib.crash.service.GleanCrashReporterService
import mozilla.components.lib.crash.service.MozillaSocorroService
import mozilla.components.lib.crash.service.SentryService
import mozilla.components.service.nimbus.NimbusApi
-import mozilla.components.service.nimbus.Nimbus as NimbusEnabled
import mozilla.components.service.nimbus.NimbusDisabled
-import mozilla.components.service.nimbus.NimbusServerSettings
import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.Config
import org.mozilla.fenix.FeatureFlags
@@ -29,6 +25,7 @@ import org.mozilla.fenix.components.metrics.AdjustMetricsService
import org.mozilla.fenix.components.metrics.GleanMetricsService
import org.mozilla.fenix.components.metrics.LeanplumMetricsService
import org.mozilla.fenix.components.metrics.MetricController
+import org.mozilla.fenix.experiments.createNimbus
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.perf.lazyMonitored
@@ -109,33 +106,7 @@ class Analytics(
val experiments: NimbusApi by lazyMonitored {
if (FeatureFlags.nimbusExperiments) {
- // Eventually we'll want to use `NimbusDisabled` when we have no NIMBUS_ENDPOINT.
- // but we keep this here to not mix feature flags and how we configure Nimbus.
- val url: String? = BuildConfig.NIMBUS_ENDPOINT
- val serverSettings = if (!url.isNullOrBlank()) {
- NimbusServerSettings(url = Uri.parse(url))
- } else {
- null
- }
-
- NimbusEnabled(context, serverSettings).apply {
- // Global opt out state is stored in Nimbus, and shouldn't be toggled to `true`
- // from the app unless the user does so from a UI control.
- // However, the user may have opt-ed out of mako experiments already, so
- // we should respect that setting here.
- val enabled =
- context.components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) {
- context.settings().isExperimentationEnabled
- }
- if (!enabled) {
- globalUserParticipation = enabled
- }
-
- // Nimbus should look after downloading experiment definitions from remote settings
- // on another thread, and making sure we don't hit the server each time we start.
- @Suppress("Deprecation")
- updateExperiments()
- }
+ createNimbus(context, BuildConfig.NIMBUS_ENDPOINT)
} else {
NimbusDisabled()
}
diff --git a/app/src/main/java/org/mozilla/fenix/experiments/Experiments.kt b/app/src/main/java/org/mozilla/fenix/experiments/Experiments.kt
index 5b5f67b34..ab11ec8f4 100644
--- a/app/src/main/java/org/mozilla/fenix/experiments/Experiments.kt
+++ b/app/src/main/java/org/mozilla/fenix/experiments/Experiments.kt
@@ -6,7 +6,7 @@ package org.mozilla.fenix.experiments
class Experiments {
companion object {
- const val A_A_NIMBUS_VALIDATION = "fenix-nimbus-validation"
+ const val A_A_NIMBUS_VALIDATION = "fenix-nimbus-validation-v2"
const val BOOKMARK_ICON = "fenix-bookmark-list-icon"
}
}
@@ -15,7 +15,7 @@ class ExperimentBranch {
companion object {
const val TREATMENT = "treatment"
const val CONTROL = "control"
- const val A1 = "A1"
- const val A2 = "A2"
+ const val A1 = "a1"
+ const val A2 = "a2"
}
}
diff --git a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt
new file mode 100644
index 000000000..1622e79da
--- /dev/null
+++ b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt
@@ -0,0 +1,72 @@
+/* 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.experiments
+
+import android.content.Context
+import android.net.Uri
+import android.os.StrictMode
+import io.sentry.Sentry
+import mozilla.components.service.nimbus.NimbusApi
+import mozilla.components.service.nimbus.Nimbus
+import mozilla.components.service.nimbus.NimbusDisabled
+import mozilla.components.service.nimbus.NimbusServerSettings
+import mozilla.components.support.base.log.logger.Logger
+import org.mozilla.fenix.components.isSentryEnabled
+import org.mozilla.fenix.ext.components
+import org.mozilla.fenix.ext.settings
+
+@Suppress("TooGenericExceptionCaught")
+fun createNimbus(context: Context, url: String?): NimbusApi =
+ try {
+ // Eventually we'll want to use `NimbusDisabled` when we have no NIMBUS_ENDPOINT.
+ // but we keep this here to not mix feature flags and how we configure Nimbus.
+ val serverSettings = if (!url.isNullOrBlank()) {
+ NimbusServerSettings(url = Uri.parse(url))
+ } else {
+ null
+ }
+
+ // Global opt out state is stored in Nimbus, and shouldn't be toggled to `true`
+ // from the app unless the user does so from a UI control.
+ // However, the user may have opt-ed out of mako experiments already, so
+ // we should respect that setting here.
+ val enabled =
+ context.components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) {
+ context.settings().isExperimentationEnabled
+ }
+
+ Nimbus(context, serverSettings).apply {
+ // This performs the minimal amount of work required to load branch and enrolment data
+ // into memory. If `getExperimentBranch` is called from another thread between here
+ // and the next nimbus disk write (setting `globalUserParticipation` or
+ // `applyPendingExperiments()`) then this has you covered.
+ // This call does its work on the db thread.
+ initialize()
+
+ if (!enabled) {
+ // This opts out of nimbus experiments. It involves writing to disk, so does its
+ // work on the db thread.
+ globalUserParticipation = enabled
+ }
+
+ // We may have downloaded experiments on a previous run, so let's start using them
+ // now. We didn't do this earlier, so as to make getExperimentBranch and friends returns
+ // the same thing throughout the session. This call does its work on the db thread.
+ applyPendingExperiments()
+
+ // Now fetch the experiments from the server. These will be available for feature
+ // configuration on the next run of the app. This call launches on the fetch thread.
+ fetchExperiments()
+ }
+ } catch (e: Throwable) {
+ // Something went wrong. We'd like not to, but stability of the app is more important than
+ // failing fast here.
+ if (isSentryEnabled()) {
+ Sentry.capture(e)
+ } else {
+ Logger.error("Failed to initialize Nimbus", e)
+ }
+ NimbusDisabled()
+ }
From 21c95f38ec6ef97f3eb8fbe6e88cd401de5fb2b2 Mon Sep 17 00:00:00 2001
From: MickeyMoz
Date: Mon, 1 Feb 2021 15:36:42 +0000
Subject: [PATCH 037/248] Update Android Components version to
73.0.20210201143120.
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 24daea91a..65c1f1c54 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210131143119"
+ const val VERSION = "73.0.20210201143120"
}
From 4c2a4f4d2e3f4269220cb71309d0e072dcf65c10 Mon Sep 17 00:00:00 2001
From: Mozilla L10n Automation Bot
Date: Tue, 2 Feb 2021 00:01:17 +0000
Subject: [PATCH 038/248] Import l10n.
---
app/src/main/res/values-eu/strings.xml | 6 +--
app/src/main/res/values-hi-rIN/strings.xml | 50 +++++++++++++++-------
app/src/main/res/values-ja/strings.xml | 5 +--
app/src/main/res/values-sk/strings.xml | 3 ++
4 files changed, 43 insertions(+), 21 deletions(-)
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 38d615fca..d0a3ea701 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -1101,6 +1101,8 @@
Biltegiratze tokia libratzen du
Gunearen baimenak
+
+ Deskargak
Ezabatu nabigatze-datuak
@@ -1224,9 +1226,7 @@
Zure pribatutasuna
- Online partekatzen duzunaren eta gurekin partekatzen
- duzunaren inguruko kontrola emateko diseinatu dugu %s.
-
+ Online partekatzen duzunaren eta gurekin partekatzen duzunaren inguruko kontrola emateko diseinatu dugu %s.
Irakurri gure pribatutasun-oharra
diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml
index c3c0ba5f9..c6f044e44 100644
--- a/app/src/main/res/values-hi-rIN/strings.xml
+++ b/app/src/main/res/values-hi-rIN/strings.xml
@@ -20,6 +20,8 @@
आपके निजी टैब यहाँ दिखाए जाएंगे।
+
+ JD
1 खुला टैब। टैब स्विच करने के लिए टैप करें।
@@ -70,20 +72,15 @@
नहीं धन्यवाद
-
-
- ओर तेज Firefox करने के लिए, अपने होम स्क्रीन पर एक विजेट जोड़ें।
-
- विजेट जोड़ें
-
- अभी नहीं
-
सेटिंग पर जाएं
सेटिंग पर जाएं
+
+ सेटिंग पर जाएं
+
नया टैब
@@ -132,8 +129,6 @@
पृष्ठ में ढूँढें
निजी टैब
-
- नया टैब
संग्रहण में सहेजें
@@ -200,6 +195,8 @@
अधिक जानें
+
+ एक नया Firefox टैब खोलें
खोजें
@@ -273,6 +270,8 @@
टूलबार
थीम
+
+ मुख्य पृष्ठ
अनुकूलित करें
@@ -308,6 +307,8 @@
ब्राउज़िंग इतिहास खोजें
बुकमार्क खोजें
+
+ सिंक किए गए टैब खोजें
खाता सेटिंग
@@ -318,6 +319,12 @@
अधिसूचनाएं
+
+ रद्द करें
+
+
+ ऐड-ऑन पहले से इंस्टॉल है
+
अब सिंक करें
@@ -491,6 +498,8 @@
%d टैब
+
+ टैब
टैब बंद करें
@@ -531,6 +540,10 @@
मुख्य पृष्ठ पर जाएं
टैब मोड को टॉगल करें
+
+ बुकमार्क
+
+ बंद करें
संग्रहण से टैब हटायें
@@ -567,7 +580,7 @@
खुले टैब
- हटाएं
+ हटाएं
इतिहास से मिटाएं
@@ -615,6 +628,7 @@
यहां कोई इतिहास नहीं
+
माफ़ कीजिए। %1$s उस पृष्ठ को लोड नहीं कर सकता हैं।
@@ -878,6 +892,8 @@
टैब बंद हो गया
टैब बंद हो गया
+
+ बुकमार्क सहेजा गया!
शीर्ष साइटों में जोड़ा गया!
@@ -1070,10 +1086,6 @@
सेटिंग खोलें
आपकी गोपनीयता
-
- आपने जो हमारे साथ साझा करते है या जो आप ऑनलाइन साझा करते हैं
- उस पर नियंत्रण देने के लिए हमने %s डिज़ाइन किया हैं।
हमारी गोपनीयता सूचना पढ़ें
@@ -1535,10 +1547,18 @@
ठीक है, समझ गए
+
+ नाम
+
+ रद्द करें
+
%s का अधिकतम लाभ उठाएं।
+
+ अधिक जानकारी के लिए क्लिक करें
+
जो चीजें आपके लिए मायने रखती हैं, उन्हें इकट्ठा करें
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index b3834ea38..9b8f339bd 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -1107,6 +1107,8 @@
ストレージ領域を空けます
サイトの許可設定
+
+ ダウンロード一覧
閲覧データを削除
@@ -1227,9 +1229,6 @@
設定を開く
あなたのプライバシー
-
- %s は、あなたがオンラインで共有するものと、私たちと共有するものをコントロールできるように設計されています。
個人情報保護方針を読む
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index ac5877ff9..9355c3540 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -1219,6 +1219,9 @@
Otvoriť nastavenia
Vaše súkromie
+
+ %s vám dáva kontrolu nad tým, čo zdieľate na internete a čo zdieľate s nami.
Prečítajte si naše zásady ochrany súkromia
From 23e6f7aa915c0c9df15d59e5b160c6cc41063e80 Mon Sep 17 00:00:00 2001
From: AndiAJ
Date: Tue, 26 Jan 2021 15:39:44 +0200
Subject: [PATCH 039/248] For #16615: UI Smoke Tests for Tab Crash Reporter
---
.../java/org/mozilla/fenix/ui/SmokeTest.kt | 28 +++++++++++++++++++
.../mozilla/fenix/ui/robots/BrowserRobot.kt | 25 +++++++++++++++++
.../fenix/ui/robots/NavigationToolbarRobot.kt | 25 +++++++++++++++++
3 files changed, 78 insertions(+)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
index 697255bfc..f194fddf7 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
@@ -26,6 +26,7 @@ import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.deleteDownloadFromStorage
import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource
import org.mozilla.fenix.ui.robots.browserScreen
+import org.mozilla.fenix.ui.robots.clickTabCrashedRestoreButton
import org.mozilla.fenix.ui.robots.clickUrlbar
import org.mozilla.fenix.ui.robots.downloadRobot
import org.mozilla.fenix.ui.robots.enhancedTrackingProtection
@@ -1164,4 +1165,31 @@ class SmokeTest {
verifyAppearanceColorSepia(true)
}
}
+
+ @Test
+ fun closeTabCrashedReporterTest() {
+
+ homeScreen {
+ }.openNavigationToolbar {
+ }.openTabCrashReporter {
+ }.clickTabCrashedCloseButton {
+ }.openTabDrawer {
+ verifyNoTabsOpened()
+ }
+ }
+
+ @Test
+ fun restoreTabCrashedReporterTest() {
+ val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
+
+ homeScreen {
+ }.openNavigationToolbar {
+ }.enterURLAndEnterToBrowser(website.url) {}
+
+ navigationToolbar {
+ }.openTabCrashReporter {
+ clickTabCrashedRestoreButton()
+ verifyPageContent(website.content)
+ }
+ }
}
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt
index 8446019b7..2e7343f36 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt
@@ -466,6 +466,20 @@ class BrowserRobot {
HomeScreenRobot().interact()
return HomeScreenRobot.Transition()
}
+
+ fun clickTabCrashedCloseButton(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition {
+
+ assertTrue(
+ mDevice.findObject(UiSelector().resourceId("$packageName:id/closeTabButton"))
+ .waitForExists(waitingTime)
+ )
+
+ val tabCrashedCloseButton = mDevice.findObject(text("Close tab"))
+ tabCrashedCloseButton.click()
+
+ HomeScreenRobot().interact()
+ return HomeScreenRobot.Transition()
+ }
}
}
@@ -526,3 +540,14 @@ private fun mediaPlayerPlayButton() =
.className("android.widget.Button")
.text("Play")
)
+
+fun clickTabCrashedRestoreButton() {
+
+ assertTrue(
+ mDevice.findObject(UiSelector().resourceId("$packageName:id/restoreTabButton"))
+ .waitForExists(waitingTime)
+ )
+
+ val tabCrashRestoreButton = mDevice.findObject(UiSelector().resourceIdMatches("$packageName:id/restoreTabButton"))
+ tabCrashRestoreButton.click()
+}
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt
index 3c63c7eb9..1a0ad0075 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt
@@ -30,6 +30,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiSelector
import androidx.test.uiautomator.Until
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.anyOf
@@ -121,6 +122,30 @@ class NavigationToolbarRobot {
return BrowserRobot.Transition()
}
+ fun openTabCrashReporter(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
+ val crashUrl = "about:crashcontent"
+
+ sessionLoadedIdlingResource = SessionLoadedIdlingResource()
+
+ mDevice.waitNotNull(Until.findObject(By.res("$packageName:id/toolbar")),
+ waitingTime
+ )
+ urlBar().click()
+ mDevice.waitNotNull(
+ Until.findObject(By.res("$packageName:id/mozac_browser_toolbar_edit_url_view")),
+ waitingTime
+ )
+
+ awesomeBar().perform(replaceText(crashUrl), pressImeActionButton())
+
+ runWithIdleRes(sessionLoadedIdlingResource) {
+ mDevice.findObject(UiSelector().resourceId("$packageName:id/crash_tab_image"))
+ }
+
+ BrowserRobot().interact()
+ return BrowserRobot.Transition()
+ }
+
fun openThreeDotMenu(interact: ThreeDotMenuMainRobot.() -> Unit): ThreeDotMenuMainRobot.Transition {
mDevice.waitNotNull(Until.findObject(By.res("$packageName:id/mozac_browser_toolbar_menu")), waitingTime)
threeDotButton().click()
From 5eb1a3d2107aa197717ab8293018c3ada1114758 Mon Sep 17 00:00:00 2001
From: AndiAJ
Date: Mon, 1 Feb 2021 15:11:05 +0200
Subject: [PATCH 040/248] For #17641 Fix Intermittent test
addPredefinedSearchEngineTest
---
.../java/org/mozilla/fenix/ui/robots/SearchRobot.kt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt
index 5f565b257..6bf120a16 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt
@@ -270,6 +270,9 @@ private fun assertSearchEngineList() {
}
private fun assertEngineListShortcutContains(searchEngineName: String) {
+ mDevice.findObject(UiSelector().resourceId("$packageName:id/awesome_bar"))
+ .waitForExists(waitingTime)
+
onView(withId(R.id.awesome_bar))
.perform(swipeDown())
.check(matches(hasDescendant(withText(searchEngineName))))
From c8c0131d00a83c943fd9db2d9634082428dfe710 Mon Sep 17 00:00:00 2001
From: AndiAJ
Date: Fri, 29 Jan 2021 16:51:48 +0200
Subject: [PATCH 041/248] Go Forward Test Fix
---
.../java/org/mozilla/fenix/ui/NavigationToolbarTest.kt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt
index b29837983..ee42a73e6 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTest.kt
@@ -66,7 +66,6 @@ class NavigationToolbarTest {
}
}
- @Ignore("Flaky test: https://github.com/mozilla-mobile/fenix/issues/12894")
@Test
fun goForwardTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@@ -79,7 +78,8 @@ class NavigationToolbarTest {
}.enterURLAndEnterToBrowser(nextWebPage.url) {
mDevice.waitForIdle()
verifyUrl(nextWebPage.url.toString())
- mDevice.pressBack()
+ }.openThreeDotMenu {
+ }.goBack {
mDevice.waitForIdle()
verifyUrl(defaultWebPage.url.toString())
}
From f180d932c83556a39b39e07214db5e804db4e502 Mon Sep 17 00:00:00 2001
From: Oana Horvath
Date: Mon, 1 Feb 2021 17:04:12 +0200
Subject: [PATCH 042/248] For #16959: verify page url not content in
swipeToSwitchTabTest
---
app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
index f194fddf7..10b38c0ad 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt
@@ -531,9 +531,9 @@ class SmokeTest {
}.openNewTab {
}.submitQuery(secondWebPage.url.toString()) {
swipeNavBarRight(secondWebPage.url.toString())
- verifyPageContent(firstWebPage.content)
+ verifyUrl(firstWebPage.url.toString())
swipeNavBarLeft(firstWebPage.url.toString())
- verifyPageContent(secondWebPage.content)
+ verifyUrl(secondWebPage.url.toString())
}
}
From 06c1734aa5126de41035e12f02fd7a0b74efe1a7 Mon Sep 17 00:00:00 2001
From: isabelrios
Date: Tue, 2 Feb 2021 14:39:07 +0100
Subject: [PATCH 043/248] Run UI tests nightly def (#17513)
* run-ui-test-nightly
* Run ui tests on nightly build
* set correct number of shard according to tests running
* fix typo
* removing testing file
Co-authored-by: isabel rios
---
.../androidTest/flank-x86-start-test.yml | 4 +++-
automation/taskcluster/androidTest/ui-test.sh | 2 +-
taskcluster/ci/build/kind.yml | 18 +++++++++++++++---
taskcluster/ci/signing/kind.yml | 1 +
taskcluster/ci/ui-test/kind.yml | 13 +++++++++++++
5 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/automation/taskcluster/androidTest/flank-x86-start-test.yml b/automation/taskcluster/androidTest/flank-x86-start-test.yml
index 16292c98e..ba3eddac4 100644
--- a/automation/taskcluster/androidTest/flank-x86-start-test.yml
+++ b/automation/taskcluster/androidTest/flank-x86-start-test.yml
@@ -42,7 +42,9 @@ gcloud:
flank:
project: GOOGLE_PROJECT
+ # test shards - the amount of groups to split the test suite into
+ # set to -1 to use one shard per test.
+ max-test-shards: 1
# num-test-runs: the amount of times to run the tests.
# 1 runs the tests once. 10 runs all the tests 10x
num-test-runs: 1
-
diff --git a/automation/taskcluster/androidTest/ui-test.sh b/automation/taskcluster/androidTest/ui-test.sh
index 8e02e4be0..ae11d9d96 100755
--- a/automation/taskcluster/androidTest/ui-test.sh
+++ b/automation/taskcluster/androidTest/ui-test.sh
@@ -76,7 +76,7 @@ set +e
if [[ "${device_type}" =~ ^(arm64-v8a|armeabi-v7a|x86_64|x86)$ ]]; then
flank_template="${PATH_TEST}/flank-${device_type}.yml"
-elif [[ "${device_type}" == "x86-start-test" ]]; then
+elif [[ "${device_type}" == "x86-start-nightly-test" ]]; then
flank_template="${PATH_TEST}/flank-x86-start-test.yml"
elif [[ "${device_type}" == "arm-start-test" ]]; then
flank_template="${PATH_TEST}/flank-armeabi-v7a-start-test.yml"
diff --git a/taskcluster/ci/build/kind.yml b/taskcluster/ci/build/kind.yml
index 335abd497..2c3643f66 100644
--- a/taskcluster/ci/build/kind.yml
+++ b/taskcluster/ci/build/kind.yml
@@ -63,6 +63,15 @@ jobs:
treeherder:
symbol: beta(Bf)
+ nightly-firebase:
+ disable-optimization: true
+ run-on-tasks-for: [github-push] # We want this on push so that we detect problem before triggering a new beta
+ run:
+ gradle-build-type: nightly
+ test-build-type: nightly
+ treeherder:
+ symbol: nightly(Bf)
+
android-test-debug:
attributes:
code-review: true
@@ -85,13 +94,16 @@ jobs:
android-test-nightly:
attributes:
nightly: true
- run:
- gradle-build-type: androidTest
apk-artifact-template:
# 2 differences here:
# * "androidTest/" is added
# * "{gradle_build_type}" is forced to "debug"
- path: '/builds/worker/checkouts/src/app/build/outputs/apk/androidTest/debug/{fileName}'
+ path: '/builds/worker/checkouts/src/app/build/outputs/apk/androidTest/nightly/app-nightly-androidTest.apk'
+ disable-optimization: true
+ run:
+ gradle-build-type: androidTest
+ test-build-type: nightly
+ run-on-tasks-for: [github-push]
treeherder:
symbol: nightly(Bat)
diff --git a/taskcluster/ci/signing/kind.yml b/taskcluster/ci/signing/kind.yml
index 87e55c0e7..c2817e496 100644
--- a/taskcluster/ci/signing/kind.yml
+++ b/taskcluster/ci/signing/kind.yml
@@ -56,6 +56,7 @@ job-template:
by-build-type:
android-test.+: Bats
beta-firebase: Bfs
+ nightly-firebase: Bfs
default: Bs
kind: build
platform: android-all/opt
diff --git a/taskcluster/ci/ui-test/kind.yml b/taskcluster/ci/ui-test/kind.yml
index f4c7ed80b..d942c92e2 100644
--- a/taskcluster/ci/ui-test/kind.yml
+++ b/taskcluster/ci/ui-test/kind.yml
@@ -80,3 +80,16 @@ jobs:
- [automation/taskcluster/androidTest/ui-test.sh, x86-beta-tests, app.apk, android-test.apk, '50']
treeherder:
symbol: beta(ui-test-x86-beta)
+ x86-nightly:
+ attributes:
+ build-type: nightly-firebase
+ description: Test Fenix
+ run-on-tasks-for: [github-push]
+ dependencies:
+ signing: signing-nightly-firebase
+ signing-android-test: signing-android-test-nightly
+ run:
+ commands:
+ - [automation/taskcluster/androidTest/ui-test.sh, x86-start-nightly-test, app.apk, android-test.apk, '-1']
+ treeherder:
+ symbol: nightly(ui-test-x86-nightly)
From 824f3fd82138b2e93dcfeddcf6310f7878e1de2d Mon Sep 17 00:00:00 2001
From: Jonathan Almeida
Date: Mon, 1 Feb 2021 14:52:56 +0400
Subject: [PATCH 044/248] Issue #1340: Forward Activity results to the fragment
---
app/src/main/java/org/mozilla/fenix/HomeActivity.kt | 10 ++++++++++
.../org/mozilla/fenix/browser/BaseBrowserFragment.kt | 9 +++++----
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
index 64cfb7740..c39d42e6d 100644
--- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
+++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
@@ -52,6 +52,7 @@ import mozilla.components.feature.privatemode.notification.PrivateNotificationFe
import mozilla.components.feature.search.BrowserStoreSearchAdapter
import mozilla.components.feature.search.ext.legacy
import mozilla.components.service.fxa.sync.SyncReason
+import mozilla.components.support.base.feature.ActivityResultHandler
import mozilla.components.support.base.feature.UserInteractionHandler
import mozilla.components.support.ktx.android.arch.lifecycle.addObservers
import mozilla.components.support.ktx.android.content.call
@@ -536,6 +537,15 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
super.onBackPressed()
}
+ final override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach {
+ if (it is ActivityResultHandler && it.onActivityResult(requestCode, data, resultCode)) {
+ return
+ }
+ }
+ super.onActivityResult(requestCode, resultCode, data)
+ }
+
private fun shouldUseCustomBackLongPress(): Boolean {
val isAndroidN =
Build.VERSION.SDK_INT == Build.VERSION_CODES.N || Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1
diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
index 869be62a9..7aa83991e 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
@@ -128,6 +128,7 @@ import org.mozilla.fenix.wifi.SitePermissionsWifiIntegration
import java.lang.ref.WeakReference
import mozilla.components.feature.media.fullscreen.MediaFullscreenOrientationFeature
import mozilla.components.feature.webauthn.WebAuthnFeature
+import mozilla.components.support.base.feature.ActivityResultHandler
import org.mozilla.fenix.FeatureFlags.newMediaSessionApi
/**
@@ -137,7 +138,7 @@ import org.mozilla.fenix.FeatureFlags.newMediaSessionApi
*/
@ExperimentalCoroutinesApi
@Suppress("TooManyFunctions", "LargeClass")
-abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler,
+abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, ActivityResultHandler,
OnBackLongPressedListener, AccessibilityManager.AccessibilityStateChangeListener {
private lateinit var browserFragmentStore: BrowserFragmentStore
@@ -1037,10 +1038,10 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler,
}
/**
- * Forwards activity results to the prompt feature.
+ * Forwards activity results to the [ActivityResultHandler] features.
*/
- final override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- listOf(
+ override fun onActivityResult(requestCode: Int, data: Intent?, resultCode: Int): Boolean {
+ return listOf(
promptsFeature,
webAuthnFeature
).any { it.onActivityResult(requestCode, data, resultCode) }
From 47d7476f9c479b899c86b11a0905ab8bbef72e16 Mon Sep 17 00:00:00 2001
From: isabelrios
Date: Tue, 2 Feb 2021 17:39:51 +0100
Subject: [PATCH 045/248] Revert "Run UI tests nightly def (#17513)" (#17761)
This reverts commit 06c1734aa5126de41035e12f02fd7a0b74efe1a7.
---
.../androidTest/flank-x86-start-test.yml | 4 +---
automation/taskcluster/androidTest/ui-test.sh | 2 +-
taskcluster/ci/build/kind.yml | 18 +++---------------
taskcluster/ci/signing/kind.yml | 1 -
taskcluster/ci/ui-test/kind.yml | 13 -------------
5 files changed, 5 insertions(+), 33 deletions(-)
diff --git a/automation/taskcluster/androidTest/flank-x86-start-test.yml b/automation/taskcluster/androidTest/flank-x86-start-test.yml
index ba3eddac4..16292c98e 100644
--- a/automation/taskcluster/androidTest/flank-x86-start-test.yml
+++ b/automation/taskcluster/androidTest/flank-x86-start-test.yml
@@ -42,9 +42,7 @@ gcloud:
flank:
project: GOOGLE_PROJECT
- # test shards - the amount of groups to split the test suite into
- # set to -1 to use one shard per test.
- max-test-shards: 1
# num-test-runs: the amount of times to run the tests.
# 1 runs the tests once. 10 runs all the tests 10x
num-test-runs: 1
+
diff --git a/automation/taskcluster/androidTest/ui-test.sh b/automation/taskcluster/androidTest/ui-test.sh
index ae11d9d96..8e02e4be0 100755
--- a/automation/taskcluster/androidTest/ui-test.sh
+++ b/automation/taskcluster/androidTest/ui-test.sh
@@ -76,7 +76,7 @@ set +e
if [[ "${device_type}" =~ ^(arm64-v8a|armeabi-v7a|x86_64|x86)$ ]]; then
flank_template="${PATH_TEST}/flank-${device_type}.yml"
-elif [[ "${device_type}" == "x86-start-nightly-test" ]]; then
+elif [[ "${device_type}" == "x86-start-test" ]]; then
flank_template="${PATH_TEST}/flank-x86-start-test.yml"
elif [[ "${device_type}" == "arm-start-test" ]]; then
flank_template="${PATH_TEST}/flank-armeabi-v7a-start-test.yml"
diff --git a/taskcluster/ci/build/kind.yml b/taskcluster/ci/build/kind.yml
index 2c3643f66..335abd497 100644
--- a/taskcluster/ci/build/kind.yml
+++ b/taskcluster/ci/build/kind.yml
@@ -63,15 +63,6 @@ jobs:
treeherder:
symbol: beta(Bf)
- nightly-firebase:
- disable-optimization: true
- run-on-tasks-for: [github-push] # We want this on push so that we detect problem before triggering a new beta
- run:
- gradle-build-type: nightly
- test-build-type: nightly
- treeherder:
- symbol: nightly(Bf)
-
android-test-debug:
attributes:
code-review: true
@@ -94,16 +85,13 @@ jobs:
android-test-nightly:
attributes:
nightly: true
+ run:
+ gradle-build-type: androidTest
apk-artifact-template:
# 2 differences here:
# * "androidTest/" is added
# * "{gradle_build_type}" is forced to "debug"
- path: '/builds/worker/checkouts/src/app/build/outputs/apk/androidTest/nightly/app-nightly-androidTest.apk'
- disable-optimization: true
- run:
- gradle-build-type: androidTest
- test-build-type: nightly
- run-on-tasks-for: [github-push]
+ path: '/builds/worker/checkouts/src/app/build/outputs/apk/androidTest/debug/{fileName}'
treeherder:
symbol: nightly(Bat)
diff --git a/taskcluster/ci/signing/kind.yml b/taskcluster/ci/signing/kind.yml
index c2817e496..87e55c0e7 100644
--- a/taskcluster/ci/signing/kind.yml
+++ b/taskcluster/ci/signing/kind.yml
@@ -56,7 +56,6 @@ job-template:
by-build-type:
android-test.+: Bats
beta-firebase: Bfs
- nightly-firebase: Bfs
default: Bs
kind: build
platform: android-all/opt
diff --git a/taskcluster/ci/ui-test/kind.yml b/taskcluster/ci/ui-test/kind.yml
index d942c92e2..f4c7ed80b 100644
--- a/taskcluster/ci/ui-test/kind.yml
+++ b/taskcluster/ci/ui-test/kind.yml
@@ -80,16 +80,3 @@ jobs:
- [automation/taskcluster/androidTest/ui-test.sh, x86-beta-tests, app.apk, android-test.apk, '50']
treeherder:
symbol: beta(ui-test-x86-beta)
- x86-nightly:
- attributes:
- build-type: nightly-firebase
- description: Test Fenix
- run-on-tasks-for: [github-push]
- dependencies:
- signing: signing-nightly-firebase
- signing-android-test: signing-android-test-nightly
- run:
- commands:
- - [automation/taskcluster/androidTest/ui-test.sh, x86-start-nightly-test, app.apk, android-test.apk, '-1']
- treeherder:
- symbol: nightly(ui-test-x86-nightly)
From acae32095038ffef7569152aa43c5650bdac72fe Mon Sep 17 00:00:00 2001
From: MickeyMoz
Date: Tue, 2 Feb 2021 15:35:15 +0000
Subject: [PATCH 046/248] Update Android Components version to
73.0.20210202143148.
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 65c1f1c54..432fe7914 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210201143120"
+ const val VERSION = "73.0.20210202143148"
}
From e3b6f060aee03f0639ac63e1316b203ab0e4544b Mon Sep 17 00:00:00 2001
From: Arturo Mejia
Date: Fri, 29 Jan 2021 15:51:47 -0500
Subject: [PATCH 047/248] For #12822 - Opt-in of scoped storage
---
app/build.gradle | 17 +++++++++++++----
app/src/main/AndroidManifest.xml | 2 +-
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 9cded9b84..a0ad61917 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -46,7 +46,8 @@ android {
def deepLinkSchemeValue = "fenix-dev"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
manifestPlaceholders = [
- "deepLinkScheme": deepLinkSchemeValue
+ "deepLinkScheme": deepLinkSchemeValue,
+ "requestLegacyExternalStorage": true
]
// Build flag for "Mozilla Online" variants. See `Config.isMozillaOnline`.
@@ -81,13 +82,19 @@ android {
applicationIdSuffix ".fenix.debug"
resValue "bool", "IS_DEBUG", "true"
pseudoLocalesEnabled true
+ def deepLinkSchemeValue = "fenix-dev"
+ buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
+ manifestPlaceholders = [
+ "deepLinkScheme": deepLinkSchemeValue,
+ "requestLegacyExternalStorage": false
+ ]
}
nightly releaseTemplate >> {
applicationIdSuffix ".fenix"
buildConfigField "boolean", "USE_RELEASE_VERSIONING", "true"
def deepLinkSchemeValue = "fenix-nightly"
buildConfigField "String", "DEEP_LINK_SCHEME", "\"$deepLinkSchemeValue\""
- manifestPlaceholders = ["deepLinkScheme": deepLinkSchemeValue]
+ manifestPlaceholders = ["deepLinkScheme": deepLinkSchemeValue, "requestLegacyExternalStorage": false]
}
beta releaseTemplate >> {
buildConfigField "boolean", "USE_RELEASE_VERSIONING", "true"
@@ -103,7 +110,8 @@ android {
// - https://issuetracker.google.com/issues/36924841
// - https://issuetracker.google.com/issues/36905922
"sharedUserId": "org.mozilla.firefox.sharedID",
- "deepLinkScheme": deepLinkSchemeValue
+ "deepLinkScheme": deepLinkSchemeValue,
+ "requestLegacyExternalStorage": true
]
}
release releaseTemplate >> {
@@ -120,7 +128,8 @@ android {
// - https://issuetracker.google.com/issues/36924841
// - https://issuetracker.google.com/issues/36905922
"sharedUserId": "org.mozilla.firefox.sharedID",
- "deepLinkScheme": deepLinkSchemeValue
+ "deepLinkScheme": deepLinkSchemeValue,
+ "requestLegacyExternalStorage": true
]
}
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0f4ac90f1..660175dfc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,7 +23,7 @@
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
- android:requestLegacyExternalStorage="true"
+ android:requestLegacyExternalStorage="${requestLegacyExternalStorage}"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/NormalTheme"
From 854a5e676f9a9c2802b63c65fa1e3491711b4af8 Mon Sep 17 00:00:00 2001
From: Elise Richards
Date: Tue, 2 Feb 2021 12:27:10 -0600
Subject: [PATCH 048/248] Increase date on expired metrics (#17766)
---
app/metrics.yaml | 12 ++++++------
docs/metrics.md | 12 ++++++------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/app/metrics.yaml b/app/metrics.yaml
index 7e12f19bc..6148f67c2 100644
--- a/app/metrics.yaml
+++ b/app/metrics.yaml
@@ -623,7 +623,7 @@ login_dialog:
- interaction
notification_emails:
- fenix-core@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
cancelled:
type: event
description: |
@@ -636,7 +636,7 @@ login_dialog:
- interaction
notification_emails:
- fenix-core@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
saved:
type: event
description: |
@@ -649,7 +649,7 @@ login_dialog:
- interaction
notification_emails:
- fenix-core@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
never_save:
type: event
description: |
@@ -662,7 +662,7 @@ login_dialog:
- interaction
notification_emails:
- fenix-core@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
find_in_page:
opened:
@@ -4070,7 +4070,7 @@ autoplay:
- interaction
notification_emails:
- fenix-core@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
setting_changed:
type: event
description: |
@@ -4089,7 +4089,7 @@ autoplay:
- interaction
notification_emails:
- fenix-core@mozilla.com
- expires: "2021-02-01"
+ expires: "2021-08-01"
storage.stats:
query_stats_duration:
diff --git a/docs/metrics.md b/docs/metrics.md
index 2a80a4fff..8d0b6ea25 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -53,8 +53,8 @@ The following metrics are added to the ping:
| addons.open_addon_in_toolbar_menu |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user interacted with an installed add-on in the toolbar menu |[1](https://github.com/mozilla-mobile/fenix/pull/8318), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|- addon_id: The id of the add-on that was interacted with in the toolbar menu
|2021-04-01 |2 |
| addons.open_addons_in_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed "Add-ons" from the Settings |[1](https://github.com/mozilla-mobile/fenix/pull/8318), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 |
| app_theme.dark_theme_selected |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user selected Dark Theme |[1](https://github.com/mozilla-mobile/fenix/pull/7968), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|- source: The source from where dark theme was selected. The source can be 'SETTINGS' or 'ONBOARDING'
|2021-04-01 |2 |
-| autoplay.setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their autoplay setting to either block_cellular, block_audio, or block_all. |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)|- autoplay_setting: The new setting for autoplay: block_cellular, block_audio, or block_all.
|2021-02-01 |2 |
-| autoplay.visited_setting |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user visited the autoplay settings screen |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)||2021-02-01 |2 |
+| autoplay.setting_changed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user changed their autoplay setting to either block_cellular, block_audio, or block_all. |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)|- autoplay_setting: The new setting for autoplay: block_cellular, block_audio, or block_all.
|2021-08-01 |2 |
+| autoplay.visited_setting |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user visited the autoplay settings screen |[1](https://github.com/mozilla-mobile/fenix/pull/13041#issuecomment-665777411)||2021-08-01 |2 |
| banner_open_in_app.dismissed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'dismiss' on Open in App banner. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 |
| banner_open_in_app.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Open in App banner was shown. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 |
| banner_open_in_app.go_to_settings |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |User tapped 'go to settings' on Open in App banner. |[1](https://github.com/mozilla-mobile/fenix/pull/17049)||2021-08-01 |2 |
@@ -131,10 +131,10 @@ The following metrics are added to the ping:
| history.removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 |
| history.removed_all |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed all history items |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 |
| history.shared |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user shared a history item |[1](https://github.com/mozilla-mobile/fenix/pull/3940), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 |
-| login_dialog.cancelled |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt was cancelled |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 |
-| login_dialog.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 |
-| login_dialog.never_save |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt "never save" button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 |
-| login_dialog.saved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt "save" button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-02-01 |2 |
+| login_dialog.cancelled |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt was cancelled |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-01 |2 |
+| login_dialog.displayed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-01 |2 |
+| login_dialog.never_save |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt "never save" button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-01 |2 |
+| login_dialog.saved |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The login dialog prompt "save" button was pressed |[1](https://github.com/mozilla-mobile/fenix/pull/13050)||2021-08-01 |2 |
| logins.copy_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user copied a piece of a login in saved logins |[1](https://github.com/mozilla-mobile/fenix/pull/6352), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 |
| logins.delete_saved_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user confirms delete of a saved login |[1](https://github.com/mozilla-mobile/fenix/issues/11208), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 |
| logins.open_individual_login |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user accessed an individual login in saved logins |[1](https://github.com/mozilla-mobile/fenix/pull/6352), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 |
From 28c105dcb312254f015da3a2cc4f1e0f3df79c00 Mon Sep 17 00:00:00 2001
From: Sebastian Kaspari
Date: Tue, 2 Feb 2021 17:36:09 +0100
Subject: [PATCH 049/248] Remove SessionManager dependency from
CustomTabsIntegration.
---
.../fenix/customtabs/CustomTabsIntegration.kt | 16 +++-------------
.../customtabs/ExternalAppBrowserFragment.kt | 1 -
2 files changed, 3 insertions(+), 14 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt
index 04e902d51..0d5a6fb0f 100644
--- a/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt
+++ b/app/src/main/java/org/mozilla/fenix/customtabs/CustomTabsIntegration.kt
@@ -6,7 +6,6 @@ package org.mozilla.fenix.customtabs
import android.app.Activity
import androidx.appcompat.content.res.AppCompatResources.getDrawable
-import mozilla.components.browser.session.SessionManager
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.browser.toolbar.BrowserToolbar
import mozilla.components.browser.toolbar.display.DisplayToolbar
@@ -19,7 +18,6 @@ import org.mozilla.fenix.components.toolbar.ToolbarMenu
import org.mozilla.fenix.ext.settings
class CustomTabsIntegration(
- sessionManager: SessionManager,
store: BrowserStore,
useCases: CustomTabsUseCases,
toolbar: BrowserToolbar,
@@ -61,16 +59,6 @@ class CustomTabsIntegration(
// If in private mode, override toolbar background to use private color
// See #5334
if (isPrivate) {
- sessionManager.findSessionById(sessionId)?.apply {
- val config = customTabConfig
- customTabConfig = config?.copy(
- // Don't set toolbar background automatically
- toolbarColor = null,
- // Force tinting the action button
- actionButtonConfig = config.actionButtonConfig?.copy(tint = true)
- )
- }
-
toolbar.background = getDrawable(activity, R.drawable.toolbar_background)
}
}
@@ -94,7 +82,9 @@ class CustomTabsIntegration(
menuItemIndex = START_OF_MENU_ITEMS_INDEX,
window = activity.window,
shareListener = { onItemTapped.invoke(ToolbarMenu.Item.Share) },
- closeListener = { activity.finishAndRemoveTask() }
+ closeListener = { activity.finishAndRemoveTask() },
+ updateToolbarBackground = !isPrivate,
+ forceActionButtonTinting = isPrivate
)
override fun start() = feature.start()
diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt
index 016f220c0..c22e30482 100644
--- a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt
@@ -61,7 +61,6 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler
customTabsIntegration.set(
feature = CustomTabsIntegration(
- sessionManager = requireComponents.core.sessionManager,
store = requireComponents.core.store,
useCases = requireComponents.useCases.customTabsUseCases,
toolbar = toolbar,
From f4c0fe7643a3bef8ff8866cc10c63940544cd282 Mon Sep 17 00:00:00 2001
From: MickeyMoz
Date: Tue, 2 Feb 2021 20:23:58 +0000
Subject: [PATCH 050/248] Update Android Components version to
73.0.20210202194906.
---
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 432fe7914..615dd3520 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210202143148"
+ const val VERSION = "73.0.20210202194906"
}
From 3dc638700f6f328a46caa92142aacdf4e73162d0 Mon Sep 17 00:00:00 2001
From: Christian Sadilek
Date: Tue, 2 Feb 2021 16:14:34 -0500
Subject: [PATCH 051/248] Refactor tryReloadTabBy to use browser store
---
.../settings/sitepermissions/Extensions.kt | 16 +++++--
.../sitepermissions/ExtensionsTest.kt | 45 +++++++++++++++++++
2 files changed, 57 insertions(+), 4 deletions(-)
create mode 100644 app/src/test/java/org/mozilla/fenix/components/settings/sitepermissions/ExtensionsTest.kt
diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/Extensions.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/Extensions.kt
index 4c7daaed0..4f459f84e 100644
--- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/Extensions.kt
+++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/Extensions.kt
@@ -13,12 +13,20 @@ import org.mozilla.fenix.components.Components
import org.mozilla.fenix.settings.PhoneFeature
/**
- * Try to reload a session if a session with the given [origin] it is found.
- * @param origin The origin the session to be reloaded.
+ * Reloads the last used tab matching the provided origin. For performance
+ * reasons we don't want to reload all matching tabs. Reloading the last used
+ * tab is a good compromise as it's likely the reason for a change in site
+ * permissions.
+ *
+ * @param origin The origin of the tab to reload.
*/
internal fun Components.tryReloadTabBy(origin: String) {
- val session = core.sessionManager.all.find { it.url.toUri().host == origin }
- useCases.sessionUseCases.reload(session)
+ core.store.state.tabs
+ .sortedByDescending { it.lastAccess }
+ .find { it.content.url.toUri().host == origin }
+ ?.let {
+ useCases.sessionUseCases.reload(it.id)
+ }
}
internal fun initBlockedByAndroidView(phoneFeature: PhoneFeature, blockedByAndroidView: View) {
diff --git a/app/src/test/java/org/mozilla/fenix/components/settings/sitepermissions/ExtensionsTest.kt b/app/src/test/java/org/mozilla/fenix/components/settings/sitepermissions/ExtensionsTest.kt
new file mode 100644
index 000000000..0c91f91d0
--- /dev/null
+++ b/app/src/test/java/org/mozilla/fenix/components/settings/sitepermissions/ExtensionsTest.kt
@@ -0,0 +1,45 @@
+/* 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.components.settings.sitepermissions
+
+import io.mockk.every
+import io.mockk.mockk
+import io.mockk.verify
+import mozilla.components.browser.state.state.BrowserState
+import mozilla.components.browser.state.state.createTab
+import mozilla.components.browser.state.store.BrowserStore
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mozilla.fenix.components.Components
+import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
+import org.mozilla.fenix.settings.sitepermissions.tryReloadTabBy
+
+@RunWith(FenixRobolectricTestRunner::class)
+class ExtensionsTest {
+
+ @Test
+ fun `tryReloadTabBy reloads latest tab matching origin`() {
+ val store = BrowserStore(
+ BrowserState(tabs = listOf(
+ createTab(id = "1", url = "https://www.mozilla.org/1", lastAccess = 1),
+ createTab(id = "2", url = "https://www.mozilla.org/2", lastAccess = 2),
+ createTab(id = "3", url = "https://www.firefox.com")
+ )
+ )
+ )
+
+ val components: Components = mockk(relaxed = true)
+ every { components.core.store } returns store
+
+ components.tryReloadTabBy("www.getpocket.com")
+ verify(exactly = 0) { components.useCases.sessionUseCases.reload(any()) }
+
+ components.tryReloadTabBy("www.mozilla.org")
+ verify { components.useCases.sessionUseCases.reload("2") }
+
+ components.tryReloadTabBy("www.firefox.com")
+ verify { components.useCases.sessionUseCases.reload("3") }
+ }
+}
From dca0cb8c1061ca9b90161dd08a77d88d4c02bab9 Mon Sep 17 00:00:00 2001
From: Mozilla L10n Automation Bot
Date: Wed, 3 Feb 2021 00:05:53 +0000
Subject: [PATCH 052/248] Import l10n.
---
app/src/main/res/values-cs/strings.xml | 3 +--
app/src/main/res/values-hy-rAM/strings.xml | 5 +++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 736a0b90e..530ab0a9c 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -1229,8 +1229,7 @@
Vaše soukromí
- %s vám dává kontrolu nad tím, co sdílíte online a co sdílíte s námi.
-
+ %s vám dává kontrolu nad tím, co sdílíte online a co sdílíte s námi.
Přečíst zásady ochrany osobních údajů
diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml
index bfb6ee09f..e955db150 100644
--- a/app/src/main/res/values-hy-rAM/strings.xml
+++ b/app/src/main/res/values-hy-rAM/strings.xml
@@ -1088,6 +1088,8 @@
Ազատում է պահեստային տարածք
Կայքերի թույլտվություններ
+
+ Ներբեռնումներ
Ջնջել դիտարկման տվյալները
@@ -1210,8 +1212,7 @@
- Մենք պատրաստել ենք %s-ը, որպեսզի Ձեզ տանք հսկողություն սահմանելը այն ամենի նկատմամբ, ինչ որ համօգտագործում եք
- առցանց և մեզ հետ:
+ Մենք պատրաստել ենք %s-ը, որպեսզի դուք կառավարեք այն, ինչ համօգտագործում եք առցանց և թե ինչով եք կիսվում մեզ հետ:
Կարդացեք մեր գաղտնիության ծանուցումը
From e76445b299a56b56eaf0d66db5e93d4ba9efd8e6 Mon Sep 17 00:00:00 2001
From: Christian Sadilek
Date: Tue, 2 Feb 2021 19:17:55 -0500
Subject: [PATCH 053/248] Refactor WebAppSiteControlsBuilder to use browser
store
---
.../fenix/customtabs/ExternalAppBrowserFragment.kt | 2 +-
.../fenix/customtabs/WebAppSiteControlsBuilder.kt | 11 ++++++-----
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt
index c22e30482..dd6eeda75 100644
--- a/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt
@@ -138,7 +138,7 @@ class ExternalAppBrowserFragment : BaseBrowserFragment(), UserInteractionHandler
customTabSessionId,
manifest,
WebAppSiteControlsBuilder(
- requireComponents.core.sessionManager,
+ requireComponents.core.store,
requireComponents.useCases.sessionUseCases.reload,
customTabSessionId,
manifest
diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/WebAppSiteControlsBuilder.kt b/app/src/main/java/org/mozilla/fenix/customtabs/WebAppSiteControlsBuilder.kt
index f592ea839..1244b7a11 100644
--- a/app/src/main/java/org/mozilla/fenix/customtabs/WebAppSiteControlsBuilder.kt
+++ b/app/src/main/java/org/mozilla/fenix/customtabs/WebAppSiteControlsBuilder.kt
@@ -7,15 +7,16 @@ package org.mozilla.fenix.customtabs
import android.app.Notification
import android.content.Context
import android.content.Intent
-import mozilla.components.browser.session.SessionManager
+import mozilla.components.browser.state.selector.findCustomTab
import mozilla.components.browser.state.state.CustomTabSessionState
+import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.manifest.WebAppManifest
import mozilla.components.feature.pwa.feature.SiteControlsBuilder
import mozilla.components.feature.session.SessionUseCases
import org.mozilla.fenix.R
class WebAppSiteControlsBuilder(
- private val sessionManager: SessionManager,
+ private val store: BrowserStore,
reloadUrlUseCase: SessionUseCases.ReloadUrlUseCase,
private val sessionId: String,
private val manifest: WebAppManifest
@@ -26,9 +27,9 @@ class WebAppSiteControlsBuilder(
override fun buildNotification(context: Context, builder: Notification.Builder) {
inner.buildNotification(context, builder)
- val isPrivateSession = sessionManager.findSessionById(sessionId)?.private ?: false
-
- if (!isPrivateSession) { return }
+ if (store.state.findCustomTab(sessionId)?.content?.private != true) {
+ return
+ }
builder.setSmallIcon(R.drawable.ic_private_browsing)
builder.setContentTitle(context.getString(R.string.pwa_site_controls_title_private, manifest.name))
From 542071a34407917ad787eafe78b48989defb84aa Mon Sep 17 00:00:00 2001
From: rxu
Date: Tue, 2 Feb 2021 11:33:39 +0800
Subject: [PATCH 054/248] Add mozcn safebrowsing for release variant
---
.../org/mozilla/fenix/engine/GeckoProvider.kt | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt
index ef75ce688..3c9cc3306 100644
--- a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt
+++ b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt
@@ -15,10 +15,15 @@ import org.mozilla.fenix.Config
import org.mozilla.fenix.ext.components
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoRuntimeSettings
+import org.mozilla.geckoview.ContentBlocking.SafeBrowsingProvider
object GeckoProvider {
var testConfig: Bundle? = null
private var runtime: GeckoRuntime? = null
+ const val CN_UPDATE_URL =
+ "https://sb.firefox.com.cn/downloads?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2"
+ const val CN_GET_HASH_URL =
+ "https://sb.firefox.com.cn/gethash?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2"
@Synchronized
fun getOrCreateRuntime(
@@ -63,6 +68,28 @@ object GeckoProvider {
runtimeSettings.fontSizeFactor = fontSize
}
+ // Add safebrowsing providers for China
+ if (Config.channel.isMozillaOnline) {
+ val mozcn = SafeBrowsingProvider
+ .withName("mozcn")
+ .version("2.2")
+ .lists("m6eb-phish-shavar", "m6ib-phish-shavar")
+ .updateUrl(CN_UPDATE_URL)
+ .getHashUrl(CN_GET_HASH_URL)
+ .build()
+
+ runtimeSettings.contentBlocking.setSafeBrowsingProviders(mozcn,
+ // Keep the existing configuration
+ ContentBlocking.GOOGLE_SAFE_BROWSING_PROVIDER,
+ ContentBlocking.GOOGLE_LEGACY_SAFE_BROWSING_PROVIDER)
+
+ runtimeSettings.contentBlocking.setSafeBrowsingPhishingTable(
+ "m6eb-phish-shavar",
+ "m6ib-phish-shavar",
+ // Existing configuration
+ "goog-phish-proto")
+ }
+
val geckoRuntime = GeckoRuntime.create(context, runtimeSettings)
val loginStorageDelegate = GeckoLoginStorageDelegate(storage)
geckoRuntime.loginStorageDelegate = GeckoLoginDelegateWrapper(loginStorageDelegate)
From d7ad20354434ac8d8ecd0a861586813ee90cda2a Mon Sep 17 00:00:00 2001
From: mcarare
Date: Thu, 21 Jan 2021 14:51:29 +0200
Subject: [PATCH 055/248] For #17364: Do not show search suggestion hint before
starting to type.
---
.../java/org/mozilla/fenix/search/SearchDialogFragment.kt | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
index 394252af6..aa9db5b0b 100644
--- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
@@ -487,7 +487,10 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
private fun updateSearchSuggestionsHintVisibility(state: SearchFragmentState) {
view?.apply {
- val showHint = state.showSearchSuggestionsHint && !state.showSearchShortcuts
+ val showHint = state.showSearchSuggestionsHint &&
+ !state.showSearchShortcuts &&
+ state.url != state.query
+
findViewById(R.id.search_suggestions_hint)?.isVisible = showHint
search_suggestions_hint_divider?.isVisible = showHint
}
From 994ec4d55a5e16871eed1318b565424be5d13a58 Mon Sep 17 00:00:00 2001
From: mcarare
Date: Thu, 21 Jan 2021 14:57:06 +0200
Subject: [PATCH 056/248] For #17364: Make hint scrollable and do not overlap
other elements.
---
.../fenix/search/SearchDialogFragment.kt | 7 +
.../res/layout/fragment_search_dialog.xml | 62 +++----
.../res/layout/search_suggestions_hint.xml | 169 ++++++++++--------
3 files changed, 130 insertions(+), 108 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
index aa9db5b0b..f1b5adcdb 100644
--- a/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/search/SearchDialogFragment.kt
@@ -471,8 +471,15 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler {
clear(pill_wrapper.id, BOTTOM)
connect(pill_wrapper.id, BOTTOM, toolbar.id, TOP)
+ clear(awesome_bar.id, TOP)
+ clear(awesome_bar.id, BOTTOM)
+ connect(awesome_bar.id, TOP, search_suggestions_hint.id, BOTTOM)
+ connect(awesome_bar.id, BOTTOM, pill_wrapper.id, TOP)
+
clear(search_suggestions_hint.id, TOP)
+ clear(search_suggestions_hint.id, BOTTOM)
connect(search_suggestions_hint.id, TOP, PARENT_ID, TOP)
+ connect(search_suggestions_hint.id, BOTTOM, search_hint_bottom_barrier.id, TOP)
clear(fill_link_from_clipboard.id, TOP)
connect(fill_link_from_clipboard.id, BOTTOM, pill_wrapper.id, TOP)
diff --git a/app/src/main/res/layout/fragment_search_dialog.xml b/app/src/main/res/layout/fragment_search_dialog.xml
index 14ff932e4..153723799 100644
--- a/app/src/main/res/layout/fragment_search_dialog.xml
+++ b/app/src/main/res/layout/fragment_search_dialog.xml
@@ -5,12 +5,12 @@
+ android:background="?attr/scrimBackground">
-
-
-
-
+ app:layout_constraintTop_toBottomOf="@id/toolbar"
+ app:layout_constraintHeight_default="wrap"/>
+
+
+
+
-
-
-
+ android:layout_height="match_parent"
+ android:scrollbars="vertical"
+ android:fadeScrollbars="false"
+ app:layout_constraintBottom_toBottomOf="@id/search_divider"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/toolbar">
-
+ android:background="?attr/foundation"
+ android:paddingStart="20dp"
+ android:paddingTop="20dp"
+ android:paddingEnd="20dp"
+ android:paddingBottom="10dp">
-
+
-
+
-
+
+
+
+
+
-
+
-
+
+
\ No newline at end of file
From fedc2e1187862b79dbc06be1c4f864428e554e63 Mon Sep 17 00:00:00 2001
From: Michael Droettboom
Date: Thu, 14 Jan 2021 11:20:34 -0500
Subject: [PATCH 057/248] Update bug numbers to URLs for activation ping
Earlier versions of Glean supported bug numbers of the metadata, but this causes
ambiguity, particularly for Fenix where issues exist in both Bugzilla and
Github. This just updates the Bugzilla numbers to full URLs.
We made the use of numbers an error sometime ago, but neglected to enforce this
on "pings" in addition to "metrics". A future version of `glean_parser` [1] will make
this an error and this will set Fenix up to be ready for that.
[1] https://github.com/mozilla/glean_parser/pull/262
---
app/pings.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/pings.yaml b/app/pings.yaml
index ae1474c71..771cde2b7 100644
--- a/app/pings.yaml
+++ b/app/pings.yaml
@@ -12,8 +12,8 @@ activation:
an hashed version of the Google Advertising ID.
include_client_id: false
bugs:
- - 1538011
- - 1501822
+ - https://bugzilla.mozilla.com/1538011/
+ - https://bugzilla.mozilla.com/1501822/
data_reviews:
- https://github.com/mozilla-mobile/fenix/pull/1707#issuecomment-486972209
notification_emails:
From 40fc9c108531add956f925550073f82bb0a49e47 Mon Sep 17 00:00:00 2001
From: Mugurell
Date: Fri, 15 Jan 2021 17:33:47 +0200
Subject: [PATCH 058/248] For #12414 - Support sharing images through
ShareDownloadFeature
Register a ViewBoundFeatureWrapper that will respond to
"Share image" from the browser contextual menu
---
.../mozilla/fenix/browser/BaseBrowserFragment.kt | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
index 7aa83991e..392dc5458 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
@@ -58,6 +58,7 @@ import mozilla.components.feature.contextmenu.ContextMenuCandidate
import mozilla.components.feature.contextmenu.ContextMenuFeature
import mozilla.components.feature.downloads.DownloadsFeature
import mozilla.components.feature.downloads.manager.FetchDownloadManager
+import mozilla.components.feature.downloads.share.ShareDownloadFeature
import mozilla.components.feature.intent.ext.EXTRA_SESSION_ID
import mozilla.components.feature.media.fullscreen.MediaSessionFullscreenFeature
import mozilla.components.feature.privatemode.feature.SecureWindowFeature
@@ -161,6 +162,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
private val sessionFeature = ViewBoundFeatureWrapper()
private val contextMenuFeature = ViewBoundFeatureWrapper()
private val downloadsFeature = ViewBoundFeatureWrapper()
+ private val shareDownloadsFeature = ViewBoundFeatureWrapper()
private val appLinksFeature = ViewBoundFeatureWrapper()
private val promptsFeature = ViewBoundFeatureWrapper()
private val findInPageIntegration = ViewBoundFeatureWrapper()
@@ -429,6 +431,13 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
)
}
+ val shareDownloadFeature = ShareDownloadFeature(
+ context = context.applicationContext,
+ httpClient = context.components.core.client,
+ store = store,
+ tabId = customTabSessionId
+ )
+
val downloadFeature = DownloadsFeature(
context.applicationContext,
store = store,
@@ -508,6 +517,12 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
store, view, context, toolbarHeight
)
+ shareDownloadsFeature.set(
+ shareDownloadFeature,
+ owner = this,
+ view = view
+ )
+
downloadsFeature.set(
downloadFeature,
owner = this,
From ebca575e261f7eeb84c984617c18af909e419e33 Mon Sep 17 00:00:00 2001
From: Grisha Kruglov
Date: Tue, 2 Feb 2021 13:24:30 -0800
Subject: [PATCH 059/248] Reuse helper functions in bookmark tests
---
.../org/mozilla/fenix/ext/BookmarkNode.kt | 2 +-
.../org/mozilla/fenix/ext/BookmarkNodeTest.kt | 35 +++---
.../fenix/library/bookmarks/UtilsKtTest.kt | 102 +++++-------------
3 files changed, 41 insertions(+), 98 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/ext/BookmarkNode.kt b/app/src/main/java/org/mozilla/fenix/ext/BookmarkNode.kt
index 2152f3fb8..1d6f5388f 100644
--- a/app/src/main/java/org/mozilla/fenix/ext/BookmarkNode.kt
+++ b/app/src/main/java/org/mozilla/fenix/ext/BookmarkNode.kt
@@ -15,6 +15,6 @@ val Context.bookmarkStorage: PlacesBookmarksStorage
* Removes [children] from [BookmarkNode.children] and returns the new modified [BookmarkNode].
*/
operator fun BookmarkNode.minus(children: Set): BookmarkNode {
- val removedChildrenGuids = children.map { it.guid }.toSet()
+ val removedChildrenGuids = children.map { it.guid }
return this.copy(children = this.children?.filterNot { removedChildrenGuids.contains(it.guid) })
}
diff --git a/app/src/test/java/org/mozilla/fenix/ext/BookmarkNodeTest.kt b/app/src/test/java/org/mozilla/fenix/ext/BookmarkNodeTest.kt
index 5f291061a..0f15ea076 100644
--- a/app/src/test/java/org/mozilla/fenix/ext/BookmarkNodeTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/ext/BookmarkNodeTest.kt
@@ -5,22 +5,21 @@
package org.mozilla.fenix.ext
import mozilla.components.concept.storage.BookmarkNode
-import mozilla.components.concept.storage.BookmarkNodeType
import org.junit.Assert.assertEquals
import org.junit.Test
+import org.mozilla.fenix.library.bookmarks.testBookmarkItem
+import org.mozilla.fenix.library.bookmarks.testFolder
class BookmarkNodeTest {
- private val bookmarkChild1 = newBookmarkNode("Child 1", 1, null)
- private val bookmarkChild2 = newBookmarkNode("Child 2", 2, null)
- private val bookmarkChild3 = newBookmarkNode("Child 3", 3, null)
+ private val bookmarkChild1 = testBookmarkItem("someFolder", "http://www.mockurl.com/1", "Child 1")
+ private val bookmarkChild2 = testBookmarkItem("someFolder", "http://www.mockurl.com/2", "Child 2")
+ private val bookmarkChild3 = testBookmarkItem("someFolder", "http://www.mockurl.com/3", "Child 3")
private val allChildren = listOf(bookmarkChild1, bookmarkChild2)
- private var uniqueId = 0
-
@Test
fun `GIVEN a bookmark node with children WHEN minusing a sub set of children THEN the children subset is removed and rest remains`() {
- val bookmarkNode = newBookmarkNode("Parent 1", 0, allChildren)
+ val bookmarkNode = testFolder("parent1", "root", allChildren)
val subsetToSubtract = setOf(bookmarkChild1)
val expectedRemainingSubset = listOf(bookmarkChild2)
val bookmarkNodeSubsetRemoved = bookmarkNode.minus(subsetToSubtract)
@@ -29,7 +28,7 @@ class BookmarkNodeTest {
@Test
fun `GIVEN a bookmark node with children WHEN minusing a set of all children THEN all children are removed and empty list remains`() {
- val bookmarkNode = newBookmarkNode("Parent 1", 0, allChildren)
+ val bookmarkNode = testFolder("parent1", "root", allChildren)
val setofAllChildren = setOf(bookmarkChild1, bookmarkChild2)
val bookmarkNodeAllChildrenRemoved = bookmarkNode.minus(setofAllChildren)
assertEquals(emptyList(), bookmarkNodeAllChildrenRemoved.children)
@@ -38,21 +37,21 @@ class BookmarkNodeTest {
@Test
fun `GIVEN a bookmark node with children WHEN minusing a set of non-children THEN no children are removed`() {
val setofNonChildren = setOf(bookmarkChild3)
- val bookmarkNode = newBookmarkNode("Parent 1", 0, allChildren)
+ val bookmarkNode = testFolder("parent1", "root", allChildren)
val bookmarkNodeNonChildrenRemoved = bookmarkNode.minus(setofNonChildren)
assertEquals(allChildren, bookmarkNodeNonChildrenRemoved.children)
}
@Test
fun `GIVEN a bookmark node with children WHEN minusing an empty set THEN no children are removed`() {
- val bookmarkNode = newBookmarkNode("Parent 1", 0, allChildren)
+ val bookmarkNode = testFolder("parent1", "root", allChildren)
val bookmarkNodeEmptySetRemoved = bookmarkNode.minus(emptySet())
assertEquals(allChildren, bookmarkNodeEmptySetRemoved.children)
}
@Test
fun `GIVEN a bookmark node with an empty list as children WHEN minusing a set of non-children from an empty parent THEN an empty list remains`() {
- val parentWithEmptyList = newBookmarkNode("Parent 1", 0, emptyList())
+ val parentWithEmptyList = testFolder("parent1", "root", emptyList())
val setofAllChildren = setOf(bookmarkChild1, bookmarkChild2)
val parentWithEmptyListNonChildRemoved = parentWithEmptyList.minus(setofAllChildren)
assertEquals(emptyList(), parentWithEmptyListNonChildRemoved.children)
@@ -60,14 +59,14 @@ class BookmarkNodeTest {
@Test
fun `GIVEN a bookmark node with null as children WHEN minusing a set of non-children from a parent with null children THEN null remains`() {
- val parentWithNullList = newBookmarkNode("Parent 1", 0, null)
+ val parentWithNullList = testFolder("parent1", "root", null)
val parentWithNullListNonChildRemoved = parentWithNullList.minus(allChildren.toSet())
assertEquals(null, parentWithNullListNonChildRemoved.children)
}
@Test
fun `GIVEN a bookmark node with children WHEN minusing a sub-set of children THEN the rest of the parents object should remain the same`() {
- val bookmarkNode = newBookmarkNode("Parent 1", 0, allChildren)
+ val bookmarkNode = testFolder("parent1", "root", allChildren)
val subsetToSubtract = setOf(bookmarkChild1)
val expectedRemainingSubset = listOf(bookmarkChild2)
val resultBookmarkNode = bookmarkNode.minus(subsetToSubtract)
@@ -77,14 +76,4 @@ class BookmarkNodeTest {
val restofOriginal = bookmarkNode.copy(children = expectedRemainingSubset)
assertEquals(restOfResult, restofOriginal)
}
-
- private fun newBookmarkNode(title: String, position: Int, children: List?) = BookmarkNode(
- type = BookmarkNodeType.ITEM,
- guid = uniqueId++.toString(),
- parentGuid = "12",
- position = position,
- title = title,
- url = "www.mockurl.com",
- children = children
- )
}
diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt
index 42f185f32..df0a2ec14 100644
--- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt
@@ -16,26 +16,10 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
class UtilsKtTest {
@Test
fun `friendly root titles`() {
- val url = BookmarkNode(
- BookmarkNodeType.ITEM,
- "456",
- "folder",
- 0,
- "Mozilla",
- "http://mozilla.org",
- null
- )
+ val url = testBookmarkItem("folder","http://mozilla.org", "Mozilla")
assertEquals("Mozilla", friendlyRootTitle(testContext, url))
- val folder = BookmarkNode(
- BookmarkNodeType.FOLDER,
- "456",
- "folder",
- 0,
- "Folder",
- null,
- null
- )
+ val folder = testFolder("456", "folder", null, "Folder")
assertEquals("Folder", friendlyRootTitle(testContext, folder))
val root = folder.copy(guid = "root________", title = "root")
@@ -65,67 +49,17 @@ class UtilsKtTest {
@Test
fun `flatNodeList various cases`() {
- val url = BookmarkNode(
- BookmarkNodeType.ITEM,
- "456",
- "folder",
- 0,
- "Mozilla",
- "http://mozilla.org",
- null
- )
- val url2 = BookmarkNode(
- BookmarkNodeType.ITEM,
- "8674",
- "folder2",
- 0,
- "Mozilla",
- "http://mozilla.org",
- null
- )
+ val url = testBookmarkItem("folder", "http://mozilla.org")
+ val url2 = testBookmarkItem( "folder2", "http://mozilla.org")
assertEquals(emptyList(), url.flatNodeList(null))
- val root = BookmarkNode(
- BookmarkNodeType.FOLDER,
- "root",
- null,
- 0,
- "root",
- null,
- null
- )
+ val root = testFolder("root", null, null)
assertEquals(listOf(BookmarkNodeWithDepth(0, root, null)), root.flatNodeList(null))
assertEquals(emptyList(), root.flatNodeList("root"))
- val folder = BookmarkNode(
- BookmarkNodeType.FOLDER,
- "folder",
- root.guid,
- 0,
- "folder",
- null,
- listOf(url)
- )
-
- val folder3 = BookmarkNode(
- BookmarkNodeType.FOLDER,
- "folder3",
- "folder2",
- 0,
- "folder3",
- null,
- null
- )
-
- val folder2 = BookmarkNode(
- BookmarkNodeType.FOLDER,
- "folder2",
- root.guid,
- 0,
- "folder2",
- null,
- listOf(folder3, url2)
- )
+ val folder = testFolder("folder", root.guid, listOf(url))
+ val folder3 = testFolder("folder3", "folder2", null)
+ val folder2 = testFolder("folder2", root.guid, listOf(folder3, url2))
val rootWithChildren = root.copy(children = listOf(folder, folder2))
assertEquals(
@@ -145,3 +79,23 @@ class UtilsKtTest {
)
}
}
+
+internal fun testBookmarkItem(parentGuid: String, url: String, title: String = "Item for $url") = BookmarkNode(
+ BookmarkNodeType.ITEM,
+ "guid#${Math.random() * 1000}",
+ parentGuid,
+ 0,
+ title,
+ url,
+ null
+)
+
+internal fun testFolder(guid: String, parentGuid: String?, children: List?, title: String = "Folder: $guid") = BookmarkNode(
+ BookmarkNodeType.FOLDER,
+ guid,
+ parentGuid,
+ 0,
+ title,
+ null,
+ children
+)
From 3ce9bf93bc4118f262b501f4c0c0cd1674802468 Mon Sep 17 00:00:00 2001
From: Grisha Kruglov
Date: Tue, 2 Feb 2021 16:22:20 -0800
Subject: [PATCH 060/248] Exclude separators from the bookmarks UI
---
.../library/bookmarks/BookmarkAdapter.kt | 16 ++--
.../library/bookmarks/BookmarkAdapterTest.kt | 96 +++++++++++++------
.../fenix/library/bookmarks/UtilsKtTest.kt | 8 +-
3 files changed, 84 insertions(+), 36 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt
index f6f6a368d..e85ded68a 100644
--- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt
+++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt
@@ -21,23 +21,25 @@ import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkSeparatorViewHold
class BookmarkAdapter(private val emptyView: View, private val interactor: BookmarkViewInteractor) :
RecyclerView.Adapter() {
- private var tree: List = listOf()
+ @VisibleForTesting var tree: List = listOf()
private var mode: BookmarkFragmentState.Mode = BookmarkFragmentState.Mode.Normal()
private var isFirstRun = true
fun updateData(tree: BookmarkNode?, mode: BookmarkFragmentState.Mode) {
- // Display folders above all other bookmarks.
val allNodes = tree?.children.orEmpty()
val folders: MutableList = mutableListOf()
val notFolders: MutableList = mutableListOf()
+ val separators: MutableList = mutableListOf()
allNodes.forEach {
- if (it.type == BookmarkNodeType.FOLDER) {
- folders.add(it)
- } else {
- notFolders.add(it)
+ when (it.type) {
+ BookmarkNodeType.SEPARATOR -> separators.add(it)
+ BookmarkNodeType.FOLDER -> folders.add(it)
+ else -> notFolders.add(it)
}
}
- val newTree = folders + notFolders
+ // Display folders above all other bookmarks. Exclude separators.
+ // For separator removal, see discussion in https://github.com/mozilla-mobile/fenix/issues/15214
+ val newTree = folders + notFolders - separators
val diffUtil = DiffUtil.calculateDiff(
BookmarkDiffUtil(
diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt
index b80e584a7..bc04b618b 100644
--- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt
@@ -8,29 +8,20 @@ import io.mockk.mockk
import io.mockk.spyk
import io.mockk.verifyOrder
import mozilla.components.concept.storage.BookmarkNode
-import mozilla.components.concept.storage.BookmarkNodeType
-import org.junit.Assert.assertFalse
+import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
+import org.junit.Assert.assertFalse
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
+import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkNodeViewHolder
@RunWith(FenixRobolectricTestRunner::class)
internal class BookmarkAdapterTest {
private lateinit var bookmarkAdapter: BookmarkAdapter
- private val item = BookmarkNode(
- BookmarkNodeType.ITEM,
- "456",
- "123",
- 0,
- "Mozilla",
- "http://mozilla.org",
- null
- )
-
@Before
fun setup() {
bookmarkAdapter = spyk(
@@ -40,33 +31,83 @@ internal class BookmarkAdapterTest {
@Test
fun `update adapter from tree of bookmark nodes, null tree returns empty list`() {
- val tree = BookmarkNode(
- BookmarkNodeType.FOLDER, "123", null, 0, "Mobile", null, listOf(
- item,
- BookmarkNode(BookmarkNodeType.SEPARATOR, "789", "123", 1, null, null, null),
- BookmarkNode(
- BookmarkNodeType.ITEM,
- "987",
- "123",
- 2,
- "Firefox",
- "https://www.mozilla.org/en-US/firefox/",
- null
- )
+ val tree = testFolder("123", "root", listOf(
+ testBookmarkItem("someFolder", "http://mozilla.org"),
+ testSeparator("123"),
+ testBookmarkItem("123", "https://www.mozilla.org/en-US/firefox/")
)
)
bookmarkAdapter.updateData(tree, BookmarkFragmentState.Mode.Normal())
bookmarkAdapter.updateData(null, BookmarkFragmentState.Mode.Normal())
verifyOrder {
bookmarkAdapter.updateData(tree, BookmarkFragmentState.Mode.Normal())
- bookmarkAdapter.notifyItemRangeInserted(0, 3)
+ bookmarkAdapter.notifyItemRangeInserted(0, 2)
bookmarkAdapter.updateData(null, BookmarkFragmentState.Mode.Normal())
- bookmarkAdapter.notifyItemRangeRemoved(0, 3)
+ bookmarkAdapter.notifyItemRangeRemoved(0, 2)
}
}
+ @Test
+ fun `update adapter from tree of bookmark nodes, separators are excluded`() {
+ val sep1 = testSeparator("123")
+ val sep2 = testSeparator("123")
+ val item1 = testBookmarkItem("123", "http://mozilla.org")
+ val item2 = testBookmarkItem("123", "https://www.mozilla.org/en-US/firefox/")
+ val folder = testFolder("123", "root", title = "Mobile", children = listOf(item1, sep1, item2, sep2))
+ bookmarkAdapter.updateData(folder, BookmarkFragmentState.Mode.Normal())
+ verifyOrder {
+ bookmarkAdapter.updateData(folder, BookmarkFragmentState.Mode.Normal())
+ bookmarkAdapter.notifyItemRangeInserted(0, 2)
+ }
+
+ assertEquals(2, bookmarkAdapter.itemCount)
+ assertEquals(listOf(item1, item2), bookmarkAdapter.tree)
+ }
+
+ @Test
+ fun `update adapter from tree of bookmark nodes, folders are moved to the top`() {
+ val sep1 = testSeparator("123")
+ val item1 = testBookmarkItem("123", "http://mozilla.org")
+ val item2 = testBookmarkItem("123", "https://www.mozilla.org/en-US/firefox/")
+ val item3 = testBookmarkItem("123", "https://www.mozilla.org/en-US/firefox/2")
+ val item4 = testBookmarkItem("125", "https://www.mozilla.org/en-US/firefox/3")
+ val folder2 = testFolder("124", "123", title = "Mobile 2", children = emptyList())
+ val folder3 = testFolder("125", "123", title = "Mobile 3", children = listOf(item4))
+ val folder4 = testFolder("126", "123", title = "Mobile 3", children = emptyList())
+ val folder = testFolder("123", "root", title = "Mobile", children = listOf(
+ folder4, item1, sep1, item2, folder2, folder3, item3
+ ))
+ bookmarkAdapter.updateData(folder, BookmarkFragmentState.Mode.Normal())
+ verifyOrder {
+ bookmarkAdapter.updateData(folder, BookmarkFragmentState.Mode.Normal())
+ bookmarkAdapter.notifyItemRangeInserted(0, 6)
+ }
+
+ assertEquals(6, bookmarkAdapter.itemCount)
+ assertEquals(listOf(folder4, folder2, folder3, item1, item2, item3), bookmarkAdapter.tree)
+ }
+
+ @Test
+ fun `get item view type for different types of nodes`() {
+ val sep1 = testSeparator("123")
+ val item1 = testBookmarkItem("123", "https://www.mozilla.org/en-US/firefox/")
+ val folder1 = testFolder("124", "123", title = "Mobile 2", children = emptyList())
+ bookmarkAdapter.updateData(
+ testFolder("123", "root", listOf(sep1, item1, folder1)),
+ BookmarkFragmentState.Mode.Normal()
+ )
+
+ assertEquals(2, bookmarkAdapter.itemCount)
+ // item1
+ assertEquals(BookmarkNodeViewHolder.LAYOUT_ID, bookmarkAdapter.getItemViewType(0))
+ // folder1
+ assertEquals(BookmarkNodeViewHolder.LAYOUT_ID, bookmarkAdapter.getItemViewType(1))
+ // sep is dropped during update
+ }
+
@Test
fun `items are the same if they have the same guids`() {
+ val item = testBookmarkItem("someFolder", "http://mozilla.org")
assertTrue(createSingleItemDiffUtil(item, item).areItemsTheSame(0, 0))
assertTrue(
createSingleItemDiffUtil(
@@ -84,6 +125,7 @@ internal class BookmarkAdapterTest {
@Test
fun `equal items have same contents unless their selected state changes`() {
+ val item = testBookmarkItem("someFolder", "http://mozilla.org")
assertTrue(createSingleItemDiffUtil(item, item).areContentsTheSame(0, 0))
assertFalse(
createSingleItemDiffUtil(item, item.copy(position = 1)).areContentsTheSame(0, 0)
diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt
index df0a2ec14..3ea5539dc 100644
--- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/UtilsKtTest.kt
@@ -16,7 +16,7 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
class UtilsKtTest {
@Test
fun `friendly root titles`() {
- val url = testBookmarkItem("folder","http://mozilla.org", "Mozilla")
+ val url = testBookmarkItem("folder", "http://mozilla.org", "Mozilla")
assertEquals("Mozilla", friendlyRootTitle(testContext, url))
val folder = testFolder("456", "folder", null, "Folder")
@@ -50,7 +50,7 @@ class UtilsKtTest {
@Test
fun `flatNodeList various cases`() {
val url = testBookmarkItem("folder", "http://mozilla.org")
- val url2 = testBookmarkItem( "folder2", "http://mozilla.org")
+ val url2 = testBookmarkItem("folder2", "http://mozilla.org")
assertEquals(emptyList(), url.flatNodeList(null))
val root = testFolder("root", null, null)
@@ -99,3 +99,7 @@ internal fun testFolder(guid: String, parentGuid: String?, children: List
Date: Wed, 3 Feb 2021 11:31:01 +0100
Subject: [PATCH 061/248] Remove TabsUseCases methods that take a Session
object.
---
.../java/org/mozilla/fenix/engine/GeckoProvider.kt | 1 +
.../mozilla/fenix/browser/BaseBrowserFragment.kt | 2 +-
.../fenix/search/awesomebar/AwesomeBarView.kt | 5 -----
.../mozilla/fenix/tabtray/TabTrayDialogFragment.kt | 13 -------------
buildSrc/src/main/java/AndroidComponents.kt | 2 +-
5 files changed, 3 insertions(+), 20 deletions(-)
diff --git a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt
index 3c9cc3306..16ad137f4 100644
--- a/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt
+++ b/app/src/geckoRelease/java/org/mozilla/fenix/engine/GeckoProvider.kt
@@ -13,6 +13,7 @@ import mozilla.components.lib.crash.handler.CrashHandlerService
import mozilla.components.service.sync.logins.GeckoLoginStorageDelegate
import org.mozilla.fenix.Config
import org.mozilla.fenix.ext.components
+import org.mozilla.geckoview.ContentBlocking
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoRuntimeSettings
import org.mozilla.geckoview.ContentBlocking.SafeBrowsingProvider
diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
index 392dc5458..817a5ba2b 100644
--- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
@@ -1070,7 +1070,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
getSessionById()?.let { session ->
return if (session.source == SessionState.Source.ACTION_VIEW) {
activity?.finish()
- requireComponents.useCases.tabsUseCases.removeTab(session)
+ requireComponents.useCases.tabsUseCases.removeTab(session.id)
true
} else {
if (session.hasParentSession) {
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 2df4afa1d..cd9fa8c8b 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
@@ -10,7 +10,6 @@ import androidx.core.graphics.BlendModeCompat.SRC_IN
import androidx.core.graphics.drawable.toBitmap
import mozilla.components.browser.awesomebar.BrowserAwesomeBar
import mozilla.components.browser.search.DefaultSearchEngineProvider
-import mozilla.components.browser.session.Session
import mozilla.components.browser.state.search.SearchEngine
import mozilla.components.concept.awesomebar.AwesomeBar
import mozilla.components.concept.engine.EngineSession
@@ -86,10 +85,6 @@ class AwesomeBarView(
}
private val selectTabUseCase = object : TabsUseCases.SelectTabUseCase {
- override fun invoke(session: Session) {
- interactor.onExistingSessionSelected(session.id)
- }
-
override fun invoke(tabId: String) {
interactor.onExistingSessionSelected(tabId)
}
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 fbf222d8a..a06f4a08a 100644
--- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt
+++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt
@@ -32,7 +32,6 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
import kotlinx.coroutines.plus
import mozilla.appservices.places.BookmarkRoot
-import mozilla.components.browser.session.Session
import mozilla.components.browser.state.selector.findTab
import mozilla.components.browser.state.selector.getNormalOrPrivateTabs
import mozilla.components.browser.state.selector.normalTabs
@@ -105,12 +104,6 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
requireComponents.useCases.tabsUseCases.selectTab(tabId)
navigateToBrowser()
}
-
- override fun invoke(session: Session) {
- requireContext().components.analytics.metrics.track(Event.OpenedExistingTab)
- requireComponents.useCases.tabsUseCases.selectTab(session)
- navigateToBrowser()
- }
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
@@ -127,12 +120,6 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
showUndoSnackbarForTab(sessionId)
removeIfNotLastTab(sessionId)
}
-
- override fun invoke(session: Session) {
- requireContext().components.analytics.metrics.track(Event.ClosedExistingTab)
- showUndoSnackbarForTab(session.id)
- removeIfNotLastTab(session.id)
- }
}
private fun removeIfNotLastTab(sessionId: String) {
diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt
index 615dd3520..f0cdce4dc 100644
--- a/buildSrc/src/main/java/AndroidComponents.kt
+++ b/buildSrc/src/main/java/AndroidComponents.kt
@@ -3,5 +3,5 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
object AndroidComponents {
- const val VERSION = "73.0.20210202194906"
+ const val VERSION = "73.0.20210203143122"
}
From c488bb0e110450297495d931dbd9eab6e51afcec Mon Sep 17 00:00:00 2001
From: hwinnemo
Date: Mon, 1 Feb 2021 21:10:58 +0100
Subject: [PATCH 062/248] For #17724: Wait for tab to be fully created before
showing ETP Onboarding if ETP is active
---
.../TrackingProtectionOverlay.kt | 14 +++++++++-----
.../TrackingProtectionOverlayTest.kt | 16 ++++++++++++++++
2 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt
index 6e098fa12..167c78d18 100644
--- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt
+++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlay.kt
@@ -62,9 +62,9 @@ class TrackingProtectionOverlay(
}.ifChanged { tab ->
tab.content.loading
}
- .collect { tab ->
- onLoadingStateChanged(tab)
- }
+ .collect { tab ->
+ onLoadingStateChanged(tab)
+ }
}
}
@@ -77,7 +77,10 @@ class TrackingProtectionOverlay(
@VisibleForTesting
internal fun onLoadingStateChanged(tab: SessionState) {
- if (!tab.content.loading && shouldShowTrackingProtectionOnboarding(tab)) {
+ if (shouldShowTrackingProtectionOnboarding(tab) &&
+ tab.content.progress == FULL_PROGRESS &&
+ settings.shouldUseTrackingProtection
+ ) {
showTrackingProtectionOnboarding()
}
}
@@ -85,7 +88,7 @@ class TrackingProtectionOverlay(
private fun shouldShowTrackingProtectionOnboarding(tab: SessionState) =
tab.trackingProtection.enabled &&
tab.trackingProtection.blockedTrackers.isNotEmpty() &&
- settings.shouldShowTrackingProtectionCfr
+ settings.shouldShowTrackingProtectionCfr
@Suppress("MagicNumber", "InflateParams")
private fun showTrackingProtectionOnboarding() {
@@ -184,6 +187,7 @@ class TrackingProtectionOverlay(
}
private companion object {
+ private const val FULL_PROGRESS = 100
private const val BUTTON_INCREASE_DPS = 12
}
}
diff --git a/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlayTest.kt b/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlayTest.kt
index 59f5753c7..98da76499 100644
--- a/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlayTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/trackingprotection/TrackingProtectionOverlayTest.kt
@@ -156,7 +156,9 @@ class TrackingProtectionOverlayTest {
fun `show onboarding when trackers are blocked`() {
every { toolbar.hasWindowFocus() } returns true
every { settings.shouldShowTrackingProtectionCfr } returns true
+ every { session.content.progress } returns 100
every { session.content.loading } returns false
+ every { settings.shouldUseTrackingProtection } returns true
every { session.trackingProtection } returns TrackingProtectionState(
enabled = true,
blockedTrackers = listOf(mockk())
@@ -165,6 +167,20 @@ class TrackingProtectionOverlayTest {
verify { settings.incrementTrackingProtectionOnboardingCount() }
}
+ @Test
+ fun `no-op when trackers are blocked but not finished loading`() {
+ every { toolbar.hasWindowFocus() } returns true
+ every { settings.shouldShowTrackingProtectionCfr } returns true
+ every { session.content.progress } returns 50
+ every { session.content.loading } returns false
+ every { session.trackingProtection } returns TrackingProtectionState(
+ enabled = true,
+ blockedTrackers = listOf(mockk())
+ )
+ overlay.onLoadingStateChanged(session)
+ verify(exactly = 0) { settings.incrementTrackingProtectionOnboardingCount() }
+ }
+
@Test
fun `no-op when toolbar doesn't have focus`() {
every { toolbar.hasWindowFocus() } returns false
From a4a2a59b7d5049d973d508718383ea99e8a56d7d Mon Sep 17 00:00:00 2001
From: AndiAJ
Date: Wed, 3 Feb 2021 12:20:59 +0200
Subject: [PATCH 063/248] For #12895 Fix Intermittent test
navigateBookmarksFoldersTest
---
.../java/org/mozilla/fenix/ui/BookmarksTest.kt | 4 ++++
.../org/mozilla/fenix/ui/robots/BookmarksRobot.kt | 12 ++++++++++++
2 files changed, 16 insertions(+)
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt
index dcf5a6c4f..3b50a489f 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt
@@ -494,12 +494,16 @@ class BookmarksTest {
}.openBookmarks {
createFolder("1")
getInstrumentation().waitForIdleSync()
+ waitForBookmarksFolderContentToExist("Bookmarks", "1")
selectFolder("1")
+ verifyCurrentFolderTitle("1")
createFolder("2")
getInstrumentation().waitForIdleSync()
+ waitForBookmarksFolderContentToExist("1", "2")
selectFolder("2")
verifyCurrentFolderTitle("2")
navigateUp()
+ waitForBookmarksFolderContentToExist("1", "2")
verifyCurrentFolderTitle("1")
mDevice.pressBack()
verifyBookmarksMenuView()
diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt
index 8eddc0384..3f15b840e 100644
--- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt
+++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt
@@ -105,6 +105,10 @@ class BookmarksRobot {
fun verifySelectDefaultFolderSnackBarText() = assertSnackBarText("Can’t edit default folders")
fun verifyCurrentFolderTitle(title: String) {
+ mDevice.findObject(UiSelector().resourceId("$packageName:id/navigationToolbar")
+ .textContains(title))
+ .waitForExists(waitingTime)
+
onView(
allOf(
withText(title),
@@ -114,6 +118,14 @@ class BookmarksRobot {
.check(matches(isDisplayed()))
}
+ fun waitForBookmarksFolderContentToExist(parentFolderName: String, childFolderName: String) {
+ mDevice.findObject(UiSelector().resourceId("$packageName:id/navigationToolbar")
+ .textContains(parentFolderName))
+ .waitForExists(waitingTime)
+
+ mDevice.waitNotNull(Until.findObject(By.text(childFolderName)), waitingTime)
+ }
+
fun verifySignInToSyncButton() =
signInToSyncButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
From 9783930ac543347df12749f10c95aa7a2e310609 Mon Sep 17 00:00:00 2001
From: Oana Horvath
Date: Wed, 3 Feb 2021 17:32:45 +0200
Subject: [PATCH 064/248] For #16615: UI smoke test
customTrackingProtectionSettingsTest
---
.../assets/pages/trackingPage.html | 66 +++++++++++++++++++
.../java/org/mozilla/fenix/ui/SmokeTest.kt | 31 ++++++++-
.../StrictEnhancedTrackingProtectionTest.kt | 4 +-
.../robots/EnhancedTrackingProtectionRobot.kt | 57 ++++++++++++++++
...sSubMenuEnhancedTrackingProtectionRobot.kt | 39 +++++++++--
5 files changed, 189 insertions(+), 8 deletions(-)
diff --git a/app/src/androidTest/assets/pages/trackingPage.html b/app/src/androidTest/assets/pages/trackingPage.html
index 1a0d735a6..a0a53c954 100644
--- a/app/src/androidTest/assets/pages/trackingPage.html
+++ b/app/src/androidTest/assets/pages/trackingPage.html
@@ -9,5 +9,71 @@
+
+ Level 1 (Basic) List
+ social-track-digest256:
+
+
+ ads-track-digest256:
+
+
+ analytics-track-digest256:
+
+
+ Fingerprinting:
+
test not run
+
+
+
+ Cryptomining:
+
+
+
+ Cookie blocking
+
+
+
+
+
+ * Facebook-cookies
+ * LinkedIn-cookies
+ * Twitter-cookies
+
+
+