summaryrefslogtreecommitdiffstats
path: root/mobile/android/android-components/components/feature/downloads/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/android-components/components/feature/downloads/README.md')
-rw-r--r--mobile/android/android-components/components/feature/downloads/README.md183
1 files changed, 183 insertions, 0 deletions
diff --git a/mobile/android/android-components/components/feature/downloads/README.md b/mobile/android/android-components/components/feature/downloads/README.md
new file mode 100644
index 0000000000..a6e938389c
--- /dev/null
+++ b/mobile/android/android-components/components/feature/downloads/README.md
@@ -0,0 +1,183 @@
+# [Android Components](../../../README.md) > Feature > Downloads
+
+Feature implementation for apps that want to use [Android downloads manager](https://developer.android.com/reference/android/app/DownloadManager).
+
+## Usage
+
+### Setting up the dependency
+
+Use Gradle to download the library from [maven.mozilla.org](https://maven.mozilla.org/) ([Setup repository](../../../README.md#maven-repository)):
+
+```Groovy
+implementation "org.mozilla.components:feature-downloads:{latest-version}"
+```
+
+The `AbstractFetchDownloadService` also requires extra permissions needed to post notifications and to start downloads
+- `android.permission.POST_NOTIFICATIONS`
+- `android.permission.FOREGROUND_SERVICE`
+- `android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK`
+
+The implementing service in the client app also needs to declare `dataSync` as `foregroundServiceType` in the manifest for
+Android 14 compatibility. Adding the `FOREGROUND_SERVICE_DATA_SYNC` permission in the app manifest is not needed since it is declared in feature-downloads module.
+
+### DownloadsFeature
+Feature implementation for proving download functionality for the selected session.
+
+```kotlin
+
+
+//This will be called before starting each download in case you don't have the right permissions
+// or if the user removed your permissions.
+val onNeedToRequestPermissions = {
+ session: Session, download: Download ->
+ //request permission e.g (WRITE_EXTERNAL_STORAGE)
+
+ // After you get granted the permissions, remember to call downloadsFeature.onPermissionsGranted()
+ // to start downloading the pending download.
+}
+
+//This will be called after every download is completed.
+val onDownloadCompleted = {
+ download: Download, downloadId: Long ->
+ //Show some UI to let user know the download was completed.
+}
+
+val downloadsFeature =
+ DownloadsFeature(context,
+ onNeedToRequestPermissions /*Optional*/,
+ onDownloadCompleted /*Optional*/,
+ fragmentManager /*Optional, if it is provided, before every download a dialog will be shown*/,
+ dialog /*Optional, if it is not provided a simple dialog will be shown before every download, with a positive button and negative button.*/,
+ sessionManager = sessionManager)
+
+//Starts observing the selected session for new downloads and forward it to
+// the download manager
+downloadsFeature.start()
+
+//Stop observing the selected session
+downloadsFeature.stop()
+
+```
+
+### DownloadDialogFragment
+ This is general representation of a dialog meant to be used in collaboration with `DownloadsFeature`
+ to show a dialog before a download is triggered. If `SimpleDownloadDialogFragment` is not flexible enough for your use case you should inherit for this class.
+
+```kotlin
+class FocusDialogDownloadFragment : DownloadDialogFragment() {
+
+ /*Creating a customized the dialog*/
+ override fun onCreateDialog(bundle: Bundle?): AlertDialog {
+ //DownloadsFeature will add these metadata before calling show() on the dialog.
+ val fileName = arguments?.getString(KEY_FILE_NAME)
+ //Not used, just for the sake you can use this metadata
+ val url = arguments?.getString(KEY_URL)
+ val contentLength = arguments?.getString(KEY_CONTENT_LENGTH)
+
+ val builder = AlertDialog.Builder(requireContext())
+ builder.setCancelable(true)
+ builder.setTitle(getString(R.string.download_dialog_title))
+
+ val inflater = activity!!.layoutInflater
+ val dialogView = inflater.inflate(R.layout.download_dialog, null)
+ builder.setView(dialogView)
+
+ dialogView.download_dialog_icon.setImageResource(R.drawable.ic_download)
+ dialogView.download_dialog_file_name.text = fileName
+ dialogView.download_dialog_cancel.text = getString(R.string.download_dialog_action_cancel)
+ dialogView.download_dialog_download.text =
+ getString(R.string.download_dialog_action_download)
+
+ dialogView.download_dialog_warning.text = getString(R.string.download_dialog_warning)
+
+ setCancelButton(dialogView.download_dialog_cancel)
+ setDownloadButton(dialogView.download_dialog_download)
+
+ return builder.create()
+ }
+
+ private fun setDownloadButton(button: Button) {
+ button.setOnClickListener {
+ //Letting know DownloadFeature that can proceed with the download
+ onStartDownload()
+ TelemetryWrapper.downloadDialogDownloadEvent(true)
+ dismiss()
+ }
+ }
+
+ private fun setCancelButton(button: Button) {
+ button.setOnClickListener {
+ TelemetryWrapper.downloadDialogDownloadEvent(false)
+ dismiss()
+ }
+ }
+}
+
+//Adding our dialog to DownloadsFeature
+val downloadsFeature = DownloadsFeature(
+ context(),
+ sessionManager = sessionManager,
+ fragmentManager = fragmentManager,
+ dialog = FocusDialogDownloadFragment()
+ )
+
+downloadsFeature.start()
+```
+
+### SimpleDownloadDialogFragment
+
+A confirmation dialog to be called before a download is triggered.
+
+SimpleDownloadDialogFragment is the default dialog if you don't provide a value to DownloadsFeature.
+It is composed by a title, a negative and a positive bottoms. When the positive button is clicked the download is triggered.
+
+```kotlin
+//To use the default behavior, just provide a fragmentManager/childFragmentManager.
+ downloadsFeature = DownloadsFeature(
+ requireContext(),
+ sessionManager = components.sessionManager,
+ fragmentManager = fragmentManager /*If you're inside a Fragment use childFragmentManager '*/
+ )
+
+ downloadsFeature.start()
+```
+Customizing SimpleDownloadDialogFragment.
+
+```kotlin
+ val dialog = SimpleDownloadDialogFragment.newInstance(
+ dialogTitleText = R.string.dialog_title,
+ positiveButtonText = R.string.download,
+ negativeButtonText = R.string.cancel,
+ cancelable = true,
+ themeResId = R.style.your_theme
+ )
+
+ downloadsFeature = DownloadsFeature(
+ requireContext(),
+ sessionManager = components.sessionManager,
+ fragmentManager = fragmentManager,
+ dialog = dialog
+ )
+
+ downloadsFeature.start()
+ ```
+
+## Facts
+
+This component emits the following [Facts](../../support/base/README.md#Facts):
+
+| Action | Item | Description |
+|-----------|--------------|---------------------------------------------------|
+| RESUME | notification | The user resumes a download. |
+| PAUSE | notification | The user pauses a download. |
+| CANCEL | notification | The user cancels a download. |
+| TRY_AGAIN | notification | The user taps on try again when a download fails. |
+| OPEN | notification | The user opens a downloaded file. |
+| DISPLAY | prompt | A download prompt was shown. |
+| CANCEL | prompt | A download prompt was canceled. |
+
+## License
+
+ 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/