We looked into taking a screenshot right before leaving the
BrowserFragment, however this call will always fail since it's
non-blocking (we never want it to be blocking too), and we will never
receive a screenshot when a session is detached from an EngineView
before the callback is complete.
In Fenix, we can nicely evade this by taking a screenshot when click
the tabs tray icon, which is where you would want to see the most
up-to-date thumbnail of the tab and also does not leave the
BrowserFragment as well.
* For #13935: Enhanced File Type List Icons
* For #13935 - Pulls out and tests logic for getting the icon for a DownloadItem
Co-authored-by: Kate Glazko <kglazko@Kates-MacBook-Pro.local>
Co-authored-by: Jeff Boek <jeff@jeffboek.com>
After the change from AC #8054 specifying different addons icons backgrounds
is not possible anymore.
All favicons used all throughout the app will have the same background.
* Add notifications pref in top level settings to route to Android app and notification settings
* Make pref visible on Oreo and higher
* Only show notifications pref when Oreo and above
As Google's library for showing licences isn't open-source, this commit
reimplements its main Activity. This is in prevision to having an OSS
flavor of fenix.
We chose to not introduce dependencies to third-party libraries
such as AboutLibraries for now, and we'll stick to using Google's gradle
plugin for the dependencies extraction.
Fixes#7584
See also #162
Now that we're passing the mode to the viewholders in their bind
methods, there's no real need to pass them into their constructors. This
also allows us to remove the indirection of having the adapter implement
the SelectionHolder interface and have the mode implement it directly.
Change the DiffUtil callback for bookmarks to use the generated equals()
method instead of only checking the title and url fields. This prevents
the BookmarkNode in our state from getting out of sync with the
BookmarkNode the viewholder is bound to.
* For #13320 - Wires up the search store, controller and interactor for the new search experience
* For #13323 - Navigates to new search experience from the browser when enabled
* For #13272 - Adds the ToolbarView to the SearchDialogFragment
* For #13273 - Replaces container dependency with context in AwesomebarView
* For #13276 - Hacks together the awesomebar and toolbar in the new search experience
* Add PWA events to metrics.
Track events for add to homescreen and install.
Map PWA facts to events
* Map component facts to local metrics
Add events pings to fragments
Supress long method for events
Move install event to AC and collect facts
Retrieve fg and bg events from Facts. Do not track intent fg/bg events, only views
* Allow onPause in base fragment to send telemetry for PWA in the external app fragment. Track foreground and bg locally in fenix, and route install and home screen taps from AC facts
* Rebase
App can be installed on devices with no camera modules. Like Android TV boxes.
Will skip presenting the option to sign in by scanning a qr code in this case
and default to login with email and password.
Item is now refreshed by calling notifyDataSetChanged on the adapter when the last tab from the collection has been swiped away and the user cancels the deletion by pressing the cancel button from the dialog.
Also added a "wasSwiped" flag to onCollectionRemoveTab in order to check if the tab was deleted from a swipe action and not by pressing the "X" button.
Our kotlin code is not catching the `MissingResourceException` in the `LeanplumMetricsService` which results in the app crashing when the locale isn't known by the device.
Catches the exception, and falls back to the ISO 639 language code. This isn't a great solution, because ISO 639 isn't especially stable.
In practice however this is almost certainly never going to be a problem because Leanplum isn't going to be supported in such exotic locales.
In this case, using the ISO 639 language code allows the error message to be more informative.
lint check
renamed the intentReceived telemetry to appOpenedAllSource
added comments
removed unused code
moved lifecycle process to AppAllSourceStartTelemetry
moved tracking event out of init function
lint fix
moved appAllStartTelemetry to components
added bit more info about the metrics
added the onReceivedIntent metric back
minor fix
change discriptions based on the comments frm MR
wrote test cases for AppAllSourceStartTelemetry.kt
lint fix
test case to mock application going background
post rebase:
post rebase:
fixed nit from comments
fixed nit from comments
fixed nit from comments
lint fix
lint fix
Changing the root view of BaseBrowserFragment from a CoordinatorLayout
to a SwipeGestureLayout has caused some regressions, particularly in
snackbar behavior. Lets prevent those regressions from occuring in
builds where the feature flag for gestures is off by only adding the
SwipeGestureLayout when the feature flag is on.
Using the ConcatAdapter, we're now able to insert multiple data sources
of information into one RecyclerView and preserve layout/scrolling in
addition to adding the 'Save to Collection' button.
We set the ContentBlockingSettings directly on the GeckoRuntime now to
improve the startup of the engine.
This change has requirements from Android Components and GeckoView, so
we would only see the full perf benefits in Nightly as the changes ride
the train, although we might start to see some of them as we're updating
the GeckoProvider for the `geckoBeta` variant as well.
Co-authored-by: Arturo Mejia <arturomejiamarmol@gmail.com>
We need to pass a CoordinatorLayout instead of a SwipeGestureLayout to
FenixSnackbar.make() in BaseBrowserFragment to prevent UI tests from
breaking. We also need to remove a few view IDs from the tab preview.
Using `onNextLayout` has the side-effect of showing the thumbnail with
the tab.id from a recycled view.
The root cause of needing that call is to retrieve the measured
height/width from the view first before requesting. A simpler solution
to avoid the complexity is to retrieve these values from the dimen
resources.
Co-authored-by: Gabriel Luong <gabriel.luong@gmail.com>
- Added the undo action for deleting individual history items by creating a new field to the history state containing the id's of the history items that are pending for deletion; This field is used inside the update function from the view to show/hide the items.
- Added a new check inside the "deleteMulti" method from BookmarkFragment that calls the showRemoveFoldersDialog to prevent the user from being able to delete one or more bookmark folders without being asked for confirmation, as in #8648.
Co-authored-by: Mihai Eduard Badea <mihai.badea@softvision.ro>
* Extract controller into it's own class. Implement find dupes and filter based on username.
Create edit login controller. Add text watchers and check for duplicates.
Edit controller test
* Find duplicates and save to store
* Retrieve duplicates from AC and check list on username text changed
Move duplicates logic into the controller
* Add glean pings for delete and edit. Move logic for login manipulation into the datastore.
* Use correct threads in controller. Enable save button when applicable.
Save enabled in datastore.
Move login data to datastore
Rebase with password error states
Update metrics to be more specific for edit
* Create logins controller for AC calls
* Interactor and controller methods for edit login. Add edit view to separate out some layout manipulation.
Inflate view in edit fragment. Double layout showing up.
Edit view
Controller tests
Controller tests passing
Interactor tests
Lint and detekt cleanup
* Remove datastore and use storage controller for all logins calls to password storage.
Addressed comments
Lint
:
Rebase - 1
* For #11227 - Cleanup saved logins list when one is selected
Selecting a saved login will open a detail screen for it from where users can
change details or even delete that particular login.
After the change is made the user is brought back to the list of saved logins
where for a brief moment (< 1s) until we get a new response from
passwordsStorage.list() the user can see and even interact with the old list
of items, which may still contain the just deleted one.
To avoid users seeing obsolete logins or even interacting with them (selecting
a previosuly deleted item will result in a crash) we will clean the list of
logins just before the selected login is opened in the detailed view.
When returning for a brief moment the users may see the "loading" UX until
passwordsStorage.list() returns the up-to-date list of logins to display.
* For #11227 - Refactor SavedLoginsView to be closer to MVI
- Interactors should only get passed other Interactors or Controllers as
dependencies to which they should delegate user actions.
- Controllers should hold most of the business logic and get passed all final
dependencies they need to do their job.
* For 11657: add LP attribute for tracking protection
* For #11704: added tracking_protection_enabled attribute
* Added docs for the new attributes, linking to data-review to the mma.md
* Rename null to none when no ETP is enabled
Stricter synchronization by always using the same "loadedSearchEngines"
variable.
With "loadedSearchEngines" calling "refreshAsync()" we also get the fallback
engines to contain reddit and youtube (which are programatically added) and
also now we properly remember and display the engines added by user.
We have two search engine types:
- one based on MLS reported region,
- one based only on Locale.
There are multiple steps involved in returning the default search engine for
example and though at each step we could verify if a certain operation is
completed we are still exposed to concurrency issues.
Simplest and most effective way to make sure the MLS engines do not mix with
Locale based engines is to use the same type of engines for the entire duration
of the app. At the next cold start we'll verify again which engines to use.
Using the Locale based engines (fallbacks) is expected to only happen once, at
the first run of the application after being installed.
New API (installBuiltIn/ensureBuiltin) requires
- Gecko IDs and new permissions
- Extension will only be re-installed if it has a new version
This includes a gradle task to automatically generate a
new version in manifest.json for every build so we don't
forget to update the version and end up with changes that
are never applied.
Also I changed the adding tabs to collection confirmation string from
tabtray to take into account the number of tabs.
Example: 1 tab-"Tab saved!"; multiple tabs-"Tabs saved!"