diff --git a/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt b/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt index c20eba2c2..8e43dd82d 100644 --- a/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt +++ b/app/src/main/java/org/mozilla/reference/browser/addons/WebExtensionPromptFeature.kt @@ -286,7 +286,7 @@ class WebExtensionPromptFeature( } is WebExtensionInstallException.SoftBlocked -> { - context.getString(addonsR.string.mozac_feature_addons_soft_blocked_1, addonName, R.string.app_name) + context.getString(addonsR.string.mozac_feature_addons_soft_blocked_2, addonName, R.string.app_name) } is WebExtensionInstallException.UserCancelled -> { diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt index 2ad302b97..99085a7b2 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/BaseBrowserFragment.kt @@ -8,6 +8,7 @@ import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle +import android.os.Environment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -44,6 +45,7 @@ import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.ktx.android.view.enterImmersiveMode import mozilla.components.support.ktx.android.view.exitImmersiveMode +import mozilla.components.support.utils.DefaultDownloadFileUtils import mozilla.components.ui.widgets.behavior.DependencyGravity import mozilla.components.ui.widgets.behavior.EngineViewClippingBehavior import mozilla.components.ui.widgets.behavior.EngineViewScrollingGesturesBehavior @@ -242,6 +244,12 @@ abstract class BaseBrowserFragment : store = requireComponents.core.store, useCases = requireComponents.useCases.downloadsUseCases, fragmentManager = childFragmentManager, + downloadFileUtils = DefaultDownloadFileUtils( + context = requireContext().applicationContext, + downloadLocation = { + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + }, + ), downloadManager = FetchDownloadManager( requireContext().applicationContext, requireComponents.core.store, diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt index 390a1b496..a18d4b739 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/BrowserFragment.kt @@ -95,7 +95,7 @@ class BrowserFragment : ) awesomeBar.setOnRemoveSuggestionButtonClicked { awesomeBar.addHiddenSuggestion(it) - deleteHistorySuggestion(it.suggestion) + (it.suggestion as? Suggestion)?.let { s -> deleteHistorySuggestion(s) } } TabsToolbarFeature( diff --git a/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt b/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt index 057458d6a..bb85f0618 100644 --- a/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt +++ b/app/src/main/java/org/mozilla/reference/browser/browser/ContextMenuIntegration.kt @@ -5,6 +5,7 @@ package org.mozilla.reference.browser.browser import android.content.Context +import android.os.Environment import android.view.View import androidx.fragment.app.FragmentManager import mozilla.components.browser.state.store.BrowserStore @@ -39,11 +40,25 @@ class ContextMenuIntegration( createCopyLinkCandidate(context, parentView, snackbarDelegate), createShareLinkCandidate(context), createOpenImageInNewTabCandidate(context, tabsUseCases, parentView, snackbarDelegate), - createSaveImageCandidate(context, contextMenuUseCases), + createSaveImageCandidate( + context, + contextMenuUseCases, + downloadsLocation = { + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + }, + ), createCopyImageLocationCandidate(context, parentView, snackbarDelegate), ) } else { - ContextMenuCandidate.defaultCandidates(context, tabsUseCases, contextMenuUseCases, parentView) + ContextMenuCandidate.defaultCandidates( + context, + tabsUseCases, + contextMenuUseCases, + parentView, + downloadsLocation = { + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + }, + ) } } diff --git a/app/src/main/java/org/mozilla/reference/browser/components/Core.kt b/app/src/main/java/org/mozilla/reference/browser/components/Core.kt index 9905d2cd7..9f7ae0eeb 100644 --- a/app/src/main/java/org/mozilla/reference/browser/components/Core.kt +++ b/app/src/main/java/org/mozilla/reference/browser/components/Core.kt @@ -6,6 +6,7 @@ package org.mozilla.reference.browser.components import android.content.Context import android.content.SharedPreferences +import android.os.Environment import androidx.preference.PreferenceManager import mozilla.components.browser.engine.gecko.permission.GeckoSitePermissionsStorage import mozilla.components.browser.icons.BrowserIcons @@ -43,6 +44,7 @@ import mozilla.components.lib.dataprotect.SecureAbove22Preferences import mozilla.components.service.location.LocationService import mozilla.components.service.sync.logins.SyncableLoginsStorage import mozilla.components.support.base.worker.Frequency +import mozilla.components.support.utils.DefaultDownloadFileUtils import org.mozilla.reference.browser.AppRequestInterceptor import org.mozilla.reference.browser.BrowserActivity import org.mozilla.reference.browser.EngineProvider @@ -100,7 +102,17 @@ class Core( val store by lazy { BrowserStore( middleware = listOf( - DownloadMiddleware(context, DownloadService::class.java, { false }), + DownloadMiddleware( + applicationContext = context, + downloadServiceClass = DownloadService::class.java, + deleteFileFromStorage = { false }, + downloadFileUtils = DefaultDownloadFileUtils( + context = context, + downloadLocation = { + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + }, + ), + ), ThumbnailsMiddleware(thumbnailStorage), ReaderViewMiddleware(), RegionMiddleware( diff --git a/app/src/main/java/org/mozilla/reference/browser/components/UseCases.kt b/app/src/main/java/org/mozilla/reference/browser/components/UseCases.kt index 9ce84041f..f1e80981f 100644 --- a/app/src/main/java/org/mozilla/reference/browser/components/UseCases.kt +++ b/app/src/main/java/org/mozilla/reference/browser/components/UseCases.kt @@ -5,6 +5,7 @@ package org.mozilla.reference.browser.components import android.content.Context +import android.os.Environment import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.Engine import mozilla.components.feature.contextmenu.ContextMenuUseCases @@ -16,6 +17,7 @@ import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.SettingsUseCases import mozilla.components.feature.tabs.CustomTabsUseCases import mozilla.components.feature.tabs.TabsUseCases +import mozilla.components.support.utils.DefaultDownloadFileUtils /** * Component group for all use cases. Use cases are provided by feature @@ -62,7 +64,17 @@ class UseCases( /** * Use cases related to the downloads feature. */ - val downloadsUseCases: DownloadsUseCases by lazy { DownloadsUseCases(store, context) } + val downloadsUseCases: DownloadsUseCases by lazy { + DownloadsUseCases( + store = store, + downloadFileUtils = DefaultDownloadFileUtils( + context = context, + downloadLocation = { + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + }, + ), + ) + } /** * Use cases related to Custom Tabs. diff --git a/app/src/main/java/org/mozilla/reference/browser/downloads/DownloadService.kt b/app/src/main/java/org/mozilla/reference/browser/downloads/DownloadService.kt index be91dcbc1..922332957 100644 --- a/app/src/main/java/org/mozilla/reference/browser/downloads/DownloadService.kt +++ b/app/src/main/java/org/mozilla/reference/browser/downloads/DownloadService.kt @@ -11,6 +11,8 @@ import mozilla.components.feature.downloads.DefaultPackageNameProvider import mozilla.components.feature.downloads.DownloadEstimator import mozilla.components.feature.downloads.FileSizeFormatter import mozilla.components.feature.downloads.PackageNameProvider +import mozilla.components.feature.downloads.filewriter.DefaultDownloadFileWriter +import mozilla.components.feature.downloads.filewriter.DownloadFileWriter import mozilla.components.support.base.android.NotificationsDelegate import mozilla.components.support.utils.DefaultDownloadFileUtils import mozilla.components.support.utils.DownloadFileUtils @@ -30,5 +32,11 @@ class DownloadService : AbstractFetchDownloadService() { }, ) } + override val downloadFileWriter: DownloadFileWriter by lazy { + DefaultDownloadFileWriter( + context = applicationContext, + downloadFileUtils = downloadFileUtils, + ) + } override val packageNameProvider: PackageNameProvider by lazy { DefaultPackageNameProvider(applicationContext) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8298c912f..11e9bf185 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] # Android Components -android-components = "149.0.20260223091613" +android-components = "150.0.20260226092447" # AGP android-gradle-plugin = "9.0.0"