Revert "Bug 1867717 - Add DownloadsFeature to AddonPopupBaseFragment."
This reverts commit cc65693e4f8811906f344d0e902af0bccbb7edbf. (cherry picked from commit 15c6eb2c4a22e68b65f982b59ea83c8e7a6886ef)fenix/124.1.0
parent
0705b9b9f6
commit
8a082c4c0d
@ -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.content.Context
|
|
||||||
import androidx.annotation.VisibleForTesting
|
|
||||||
import mozilla.components.browser.state.state.SessionState
|
|
||||||
import mozilla.components.browser.state.state.content.DownloadState
|
|
||||||
import mozilla.components.browser.state.state.content.DownloadState.Status
|
|
||||||
import mozilla.components.feature.downloads.AbstractFetchDownloadService
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utilities for handling download dialogs.
|
|
||||||
*/
|
|
||||||
object DownloadDialogUtils {
|
|
||||||
|
|
||||||
internal fun handleOnDownloadFinished(
|
|
||||||
context: Context,
|
|
||||||
downloadState: DownloadState,
|
|
||||||
downloadJobStatus: Status,
|
|
||||||
currentTab: SessionState?,
|
|
||||||
onFinishedDialogShown: () -> Unit = {},
|
|
||||||
onCannotOpenFile: (DownloadState) -> Unit,
|
|
||||||
) {
|
|
||||||
// If the download is just paused, don't show any in-app notification
|
|
||||||
if (shouldShowCompletedDownloadDialog(downloadState, downloadJobStatus, currentTab)) {
|
|
||||||
if (downloadState.openInApp && downloadJobStatus == Status.COMPLETED) {
|
|
||||||
val fileWasOpened = openFile(context, downloadState)
|
|
||||||
if (!fileWasOpened) {
|
|
||||||
onCannotOpenFile(downloadState)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
onFinishedDialogShown()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
internal var openFile: (Context, DownloadState) -> (Boolean) = { context, downloadState ->
|
|
||||||
AbstractFetchDownloadService.openFile(
|
|
||||||
applicationContext = context.applicationContext,
|
|
||||||
download = downloadState,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates whether or not a completed download dialog should be shown.
|
|
||||||
*/
|
|
||||||
fun shouldShowCompletedDownloadDialog(
|
|
||||||
downloadState: DownloadState,
|
|
||||||
status: Status,
|
|
||||||
currentTab: SessionState?,
|
|
||||||
): Boolean {
|
|
||||||
val isValidStatus =
|
|
||||||
status in listOf(Status.COMPLETED, Status.FAILED)
|
|
||||||
val isSameTab = downloadState.sessionId == (currentTab?.id ?: false)
|
|
||||||
|
|
||||||
return isValidStatus && isSameTab
|
|
||||||
}
|
|
||||||
}
|
|
@ -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.browser
|
||||||
|
|
||||||
|
import mozilla.components.browser.state.state.content.DownloadState
|
||||||
|
import mozilla.components.browser.state.state.content.DownloadState.Status
|
||||||
|
import mozilla.components.feature.downloads.AbstractFetchDownloadService
|
||||||
|
import org.mozilla.fenix.R
|
||||||
|
import org.mozilla.fenix.downloads.DynamicDownloadDialog
|
||||||
|
|
||||||
|
internal fun BaseBrowserFragment.handleOnDownloadFinished(
|
||||||
|
downloadState: DownloadState,
|
||||||
|
downloadJobStatus: Status,
|
||||||
|
tryAgain: (String) -> Unit,
|
||||||
|
) {
|
||||||
|
// If the download is just paused, don't show any in-app notification
|
||||||
|
if (shouldShowCompletedDownloadDialog(downloadState, downloadJobStatus)) {
|
||||||
|
val safeContext = context ?: return
|
||||||
|
val onCannotOpenFile: (DownloadState) -> Unit = {
|
||||||
|
showCannotOpenFileError(binding.dynamicSnackbarContainer, safeContext, it)
|
||||||
|
}
|
||||||
|
if (downloadState.openInApp && downloadJobStatus == Status.COMPLETED) {
|
||||||
|
val fileWasOpened = AbstractFetchDownloadService.openFile(
|
||||||
|
applicationContext = safeContext.applicationContext,
|
||||||
|
download = downloadState,
|
||||||
|
)
|
||||||
|
if (!fileWasOpened) {
|
||||||
|
onCannotOpenFile(downloadState)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
saveDownloadDialogState(
|
||||||
|
downloadState.sessionId,
|
||||||
|
downloadState,
|
||||||
|
downloadJobStatus,
|
||||||
|
)
|
||||||
|
|
||||||
|
val dynamicDownloadDialog = DynamicDownloadDialog(
|
||||||
|
context = safeContext,
|
||||||
|
downloadState = downloadState,
|
||||||
|
didFail = downloadJobStatus == Status.FAILED,
|
||||||
|
tryAgain = tryAgain,
|
||||||
|
onCannotOpenFile = onCannotOpenFile,
|
||||||
|
binding = binding.viewDynamicDownloadDialog,
|
||||||
|
toolbarHeight = resources.getDimensionPixelSize(R.dimen.browser_toolbar_height),
|
||||||
|
) { sharedViewModel.downloadDialogState.remove(downloadState.sessionId) }
|
||||||
|
|
||||||
|
dynamicDownloadDialog.show()
|
||||||
|
browserToolbarView.expand()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,36 +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.components
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.Gravity
|
|
||||||
import mozilla.components.feature.downloads.DownloadsFeature
|
|
||||||
import org.mozilla.fenix.R
|
|
||||||
import org.mozilla.fenix.theme.ThemeManager
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides access to all Fenix download styling.
|
|
||||||
*/
|
|
||||||
object DownloadStyling {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* creates [DownloadsFeature.PromptsStyling].
|
|
||||||
*/
|
|
||||||
fun createPrompt(context: Context): DownloadsFeature.PromptsStyling {
|
|
||||||
return DownloadsFeature.PromptsStyling(
|
|
||||||
gravity = Gravity.BOTTOM,
|
|
||||||
shouldWidthMatchParent = true,
|
|
||||||
positiveButtonBackgroundColor = ThemeManager.resolveAttribute(
|
|
||||||
R.attr.accent,
|
|
||||||
context,
|
|
||||||
),
|
|
||||||
positiveButtonTextColor = ThemeManager.resolveAttribute(
|
|
||||||
R.attr.textOnColorPrimary,
|
|
||||||
context,
|
|
||||||
),
|
|
||||||
positiveButtonRadius = (context.resources.getDimensionPixelSize(R.dimen.tab_corner_radius)).toFloat(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,53 +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.addons
|
|
||||||
|
|
||||||
import io.mockk.every
|
|
||||||
import io.mockk.mockk
|
|
||||||
import io.mockk.spyk
|
|
||||||
import io.mockk.verify
|
|
||||||
import mozilla.components.browser.state.action.ContentAction
|
|
||||||
import mozilla.components.browser.state.state.SessionState
|
|
||||||
import mozilla.components.browser.state.store.BrowserStore
|
|
||||||
import mozilla.components.concept.fetch.Response
|
|
||||||
import org.junit.Before
|
|
||||||
import org.junit.Test
|
|
||||||
import org.junit.runner.RunWith
|
|
||||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
|
||||||
|
|
||||||
@RunWith(FenixRobolectricTestRunner::class)
|
|
||||||
class AddonPopupBaseFragmentTest {
|
|
||||||
|
|
||||||
private lateinit var fragment: AddonPopupBaseFragment
|
|
||||||
|
|
||||||
@Before
|
|
||||||
fun setup() {
|
|
||||||
fragment = spyk()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `WHEN onExternalResource is call THEN dispatch an UpdateDownloadAction`() {
|
|
||||||
val store = mockk<BrowserStore>(relaxed = true)
|
|
||||||
val session = mockk<SessionState>(relaxed = true)
|
|
||||||
val response = mockk<Response>(relaxed = true)
|
|
||||||
every { fragment.provideBrowserStore() } returns store
|
|
||||||
|
|
||||||
fragment.session = session
|
|
||||||
|
|
||||||
fragment.onExternalResource(
|
|
||||||
url = "url",
|
|
||||||
fileName = "fileName",
|
|
||||||
contentLength = 1,
|
|
||||||
contentType = "contentType",
|
|
||||||
userAgent = "userAgent",
|
|
||||||
isPrivate = true,
|
|
||||||
skipConfirmation = false,
|
|
||||||
openInApp = false,
|
|
||||||
response = response,
|
|
||||||
)
|
|
||||||
|
|
||||||
verify { store.dispatch(any<ContentAction.UpdateDownloadAction>()) }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,173 +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 androidx.test.ext.junit.runners.AndroidJUnit4
|
|
||||||
import mozilla.components.browser.state.state.content.DownloadState
|
|
||||||
import mozilla.components.browser.state.state.content.DownloadState.Status.COMPLETED
|
|
||||||
import mozilla.components.browser.state.state.content.DownloadState.Status.FAILED
|
|
||||||
import mozilla.components.browser.state.state.createTab
|
|
||||||
import mozilla.components.support.test.robolectric.testContext
|
|
||||||
import org.junit.Assert.assertFalse
|
|
||||||
import org.junit.Assert.assertTrue
|
|
||||||
import org.junit.Test
|
|
||||||
import org.junit.runner.RunWith
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
|
||||||
class DownloadDialogUtilsTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Suppress("MaxLineLength")
|
|
||||||
fun `GIVEN final status WHEN handleOnDownloadFinished try to open the file fails THEN show error message`() {
|
|
||||||
val downloadUtils = DownloadDialogUtils
|
|
||||||
val currentTab = createTab(id = "1", url = "")
|
|
||||||
val download = DownloadState(
|
|
||||||
url = "",
|
|
||||||
sessionId = currentTab.id,
|
|
||||||
destinationDirectory = "/",
|
|
||||||
openInApp = true,
|
|
||||||
)
|
|
||||||
var dialogWasShown = false
|
|
||||||
var onCannotOpenFileWasCalled = false
|
|
||||||
|
|
||||||
downloadUtils.openFile = { _, _ -> false }
|
|
||||||
|
|
||||||
downloadUtils.handleOnDownloadFinished(
|
|
||||||
context = testContext,
|
|
||||||
downloadState = download,
|
|
||||||
downloadJobStatus = COMPLETED,
|
|
||||||
currentTab = currentTab,
|
|
||||||
onFinishedDialogShown = { dialogWasShown = true },
|
|
||||||
onCannotOpenFile = {
|
|
||||||
onCannotOpenFileWasCalled = true
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
assertTrue(onCannotOpenFileWasCalled)
|
|
||||||
assertFalse(dialogWasShown)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN final status and openInApp WHEN calling handleOnDownloadFinished THEN try to open the file`() {
|
|
||||||
val downloadUtils = DownloadDialogUtils
|
|
||||||
val download = DownloadState(
|
|
||||||
url = "",
|
|
||||||
sessionId = "1",
|
|
||||||
destinationDirectory = "/",
|
|
||||||
openInApp = true,
|
|
||||||
)
|
|
||||||
val currentTab = createTab(id = "1", url = "")
|
|
||||||
var dialogWasShown = false
|
|
||||||
var onCannotOpenFileWasCalled = false
|
|
||||||
|
|
||||||
downloadUtils.openFile = { _, _ -> true }
|
|
||||||
|
|
||||||
downloadUtils.handleOnDownloadFinished(
|
|
||||||
context = testContext,
|
|
||||||
downloadState = download,
|
|
||||||
downloadJobStatus = COMPLETED,
|
|
||||||
currentTab = currentTab,
|
|
||||||
onFinishedDialogShown = { dialogWasShown = true },
|
|
||||||
onCannotOpenFile = {
|
|
||||||
onCannotOpenFileWasCalled = true
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
assertFalse(onCannotOpenFileWasCalled)
|
|
||||||
assertFalse(dialogWasShown)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `GIVEN final status WHEN calling handleOnDownloadFinished THEN show a finished download dialog`() {
|
|
||||||
val downloadUtils = DownloadDialogUtils
|
|
||||||
val download = DownloadState(
|
|
||||||
url = "",
|
|
||||||
sessionId = "1",
|
|
||||||
destinationDirectory = "/",
|
|
||||||
)
|
|
||||||
val currentTab = createTab(id = "1", url = "")
|
|
||||||
var dialogWasShown = false
|
|
||||||
|
|
||||||
downloadUtils.handleOnDownloadFinished(
|
|
||||||
context = testContext,
|
|
||||||
downloadState = download,
|
|
||||||
downloadJobStatus = COMPLETED,
|
|
||||||
currentTab = currentTab,
|
|
||||||
onFinishedDialogShown = { dialogWasShown = true },
|
|
||||||
onCannotOpenFile = {},
|
|
||||||
)
|
|
||||||
|
|
||||||
assertTrue(dialogWasShown)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `WHEN status is final and is same tab THEN shouldShowCompletedDownloadDialog will be true`() {
|
|
||||||
val currentTab = createTab(id = "1", url = "")
|
|
||||||
|
|
||||||
val download = DownloadState(
|
|
||||||
url = "",
|
|
||||||
sessionId = "1",
|
|
||||||
destinationDirectory = "/",
|
|
||||||
)
|
|
||||||
|
|
||||||
val status = DownloadState.Status.values().filter { it == COMPLETED || it == FAILED }
|
|
||||||
|
|
||||||
status.forEach {
|
|
||||||
val result = DownloadDialogUtils.shouldShowCompletedDownloadDialog(
|
|
||||||
downloadState = download,
|
|
||||||
status = it,
|
|
||||||
currentTab = currentTab,
|
|
||||||
)
|
|
||||||
|
|
||||||
assertTrue(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `WHEN status is different from FAILED or COMPLETED then shouldShowCompletedDownloadDialog will be false`() {
|
|
||||||
val currentTab = createTab(id = "1", url = "")
|
|
||||||
|
|
||||||
val download = DownloadState(
|
|
||||||
url = "",
|
|
||||||
sessionId = "1",
|
|
||||||
destinationDirectory = "/",
|
|
||||||
)
|
|
||||||
|
|
||||||
val completedStatus = listOf(COMPLETED, FAILED)
|
|
||||||
val status = DownloadState.Status.values().filter { it !in completedStatus }
|
|
||||||
|
|
||||||
status.forEach {
|
|
||||||
val result = DownloadDialogUtils.shouldShowCompletedDownloadDialog(
|
|
||||||
downloadState = download,
|
|
||||||
status = it,
|
|
||||||
currentTab = currentTab,
|
|
||||||
)
|
|
||||||
|
|
||||||
assertFalse(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `WHEN the tab is different from the initial one then shouldShowCompletedDownloadDialog will be false`() {
|
|
||||||
val currentTab = createTab(id = "1", url = "")
|
|
||||||
|
|
||||||
val download = DownloadState(
|
|
||||||
url = "",
|
|
||||||
sessionId = "2",
|
|
||||||
destinationDirectory = "/",
|
|
||||||
)
|
|
||||||
val completedStatus = listOf(COMPLETED, FAILED)
|
|
||||||
val status = DownloadState.Status.values().filter { it !in completedStatus }
|
|
||||||
status.forEach {
|
|
||||||
val result =
|
|
||||||
DownloadDialogUtils.shouldShowCompletedDownloadDialog(
|
|
||||||
downloadState = download,
|
|
||||||
status = it,
|
|
||||||
currentTab = currentTab,
|
|
||||||
)
|
|
||||||
assertFalse(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue