Using Dispatchers.IO allowed the observer to react faster to wallpaper state
updates but caused issues with updating the wallpaper in fragment layout.
Using Dispatchers.Main.immediate gives us a bit slower reaction time but still
faster than Dispatchers.Main and allows us to still execute before the fragment
is visible.
As part of a preventitive measure for home page regression loading, we
fixed the UpdateFirstFrameDrawn call to happen after the first layout in
the main RecyclerView is completed. In addition, we also make pocket
aware of this flag so that it renders itself after the first layout.
This helps prioritize current & future features that are visible first
to render before those that are off screen.
Co-authored-by: Arturo Mejia <arturomejiamarmol@gmail.com>
By using Store.observeManually in a standalone coroutine we can observe the
store and update the wallpapers even before onStart (in manual tests is right
around onStart, certainly before the other widgets shown on homescreen).
Created a new WallpapersObserver to have the functionality easier to reason
about and be easier to test.
If Total Cookie Protection is enabled when first accessing a normal tab
(not a custom tab) a new Contextual Feature Recommendation popup will be shown
informing about the added protection and allowing the user to open a support
page with more data about the new option for privacy protection.
This will allow for pinpoint accuracy when anchoring and resolve any color
disparities between the popup body and the indicator arrow by having everything
drawn programmatically as one shape.
Because of the async nature of the values for insets and screen rotation
immediately after an orientation change the popup will automatically get
dismissed to prevent any anchoring issues.
While not ideal the effect of this is better than accepting layout issues after
orientation changes and is the same approach used for other of our popups.
By using a feature tag we can avoid having to define new tags in the Glean
annotations repository.
The list of available tags needed to be regenerated to be able to reference the
new "Wallpapers" tag.
Because the tags regeneration also brought a change in tags from "TopSites" to
"Shortcuts" all previous telemetry using "TopSites" had to be migrated to use
the new "Shortcuts" tag.
A previous check for whether the persisted name of the current wallpaper is
empty made checking whether the default wallpaper is to be shown brittle.
Instead of duplicating such a check in multiple places it is now extracted in
one method that can be used in multiple places including the new telemetry.
These are mostly mechanical changes to replace usage of `testHasValue`
with `testGetValue`.
`testGetValue` will now return `null` instead of throwing an exception
if no data is available.
This avoids having to pass another LifecycleOwner from outside and will ensure
the View is update only in the bounds of it being attached.
The observe-update code is moved to bind(..) as that seems like a more
idiomatic callback for updating an already constructed View rather than
createView() which should only create and return a View.
* For #25397 - Telemetry for credit card save and update
* Use Fenix Issue fro Bugs
Co-authored-by: Gabriel Luong <gabriel.luong@gmail.com>
Co-authored-by: Roger Yang <royang@mozilla.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
A new way to be able to reliably record actual impressions of sponsored stories
was needed and based on this data we can ensure we are promoting fresh stories
(with fewer impressions) or the ones with a higher priority.
PocketStoriesChange was called only once - to clean the shown stories when the
user gets to the homescreen and the Pocket feature is disabled - useful for the
situations in which the user returns after disabling the feature in settings.
Populating the store with recommended stories to show was already happening
based on 'PocketStoriesCategoriesChange' and sponsored stories will be added by
using 'PocketSponsoredStoriesChange' so renaming 'PocketStoriesChange' will
help on reducing any confusion in the future.
Also added documentation for all Pocket related actions from AppStore and
removed the 'UndocumentedPublicClass' detekt suppressions.
The default was already 8. This is now being moved closer to the source from
where the stories to be shown are emitted.
With the addition of sponsored stories at fixed positions having to support a
variable number of stories being returned from AppState#getFilteredStories
means increased complexity with no benefit.
After the update `TestCoroutineDispatcher`, `TestCoroutineScope` and
`runBlockingTest` are deprecated.
Instead of these new `TestDispatcher`, `TestScope` and `runTest` APIs are used.
Took the oportunity to also replace most of the `runBlocking` calls with the
new `runTest` specially designed for running coroutines in tests API.
* Fixup breaking changes from AppServices upgrade to 93.0.0
* android-components RemoteTabsStorage now requires a Context param
* Update Android Components version to 102.0.20220509214046
Co-authored-by: James Hugman <james@hugman.tv>
Co-authored-by: Mark Hammond <mhammond@skippinet.com.au>
Co-authored-by: Jonathan Almeida <jalmeida@mozilla.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
* Closes#23665: make snackbar work after leaving the fragment it was initiated from
* Closes#23665: bring back the removed bookmark navigation test, sort imports alphabetically
Co-authored-by: mike a <mavduevskiy@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>