1
0
Fork 0

For #5958: Adds in app download notifications (#6506)

master
Sawyer Blatz 2019-11-11 14:08:51 -08:00 committed by GitHub
parent 18bfe8c97a
commit d6aeeb2dec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 222 additions and 21 deletions

View File

@ -39,6 +39,7 @@ import mozilla.components.feature.accounts.FxaWebChannelFeature
import mozilla.components.feature.app.links.AppLinksFeature
import mozilla.components.feature.contextmenu.ContextMenuCandidate
import mozilla.components.feature.contextmenu.ContextMenuFeature
import mozilla.components.feature.downloads.AbstractFetchDownloadService
import mozilla.components.feature.downloads.DownloadsFeature
import mozilla.components.feature.downloads.manager.FetchDownloadManager
import mozilla.components.feature.intent.ext.EXTRA_SESSION_ID
@ -72,10 +73,10 @@ import org.mozilla.fenix.components.toolbar.BrowserToolbarViewInteractor
import org.mozilla.fenix.components.toolbar.DefaultBrowserToolbarController
import org.mozilla.fenix.components.toolbar.QuickActionSheetState
import org.mozilla.fenix.components.toolbar.ToolbarIntegration
import org.mozilla.fenix.downloads.DownloadNotificationBottomSheetDialog
import org.mozilla.fenix.downloads.DownloadService
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.enterToImmersiveMode
import org.mozilla.fenix.ext.getDimenInDip
import org.mozilla.fenix.ext.getRootView
import org.mozilla.fenix.ext.metrics
import org.mozilla.fenix.ext.nav
@ -256,27 +257,40 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
view = view
)
downloadsFeature.set(
feature = DownloadsFeature(
val downloadFeature = DownloadsFeature(
context.applicationContext,
store = store,
useCases = context.components.useCases.downloadUseCases,
fragmentManager = childFragmentManager,
customTabId = customTabSessionId,
downloadManager = FetchDownloadManager(
context.applicationContext,
store = store,
useCases = context.components.useCases.downloadUseCases,
fragmentManager = childFragmentManager,
customTabId = customTabSessionId,
downloadManager = FetchDownloadManager(
context.applicationContext,
DownloadService::class
),
promptsStyling = DownloadsFeature.PromptsStyling(
gravity = Gravity.BOTTOM,
shouldWidthMatchParent = true,
positiveButtonBackgroundColor = ThemeManager.resolveAttribute(R.attr.accent, context),
positiveButtonTextColor = ThemeManager.resolveAttribute(R.attr.contrastText, context),
positiveButtonRadius = context.getDimenInDip(R.dimen.tab_corner_radius)
),
onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_DOWNLOAD_PERMISSIONS)
}),
DownloadService::class
),
promptsStyling = DownloadsFeature.PromptsStyling(
gravity = Gravity.BOTTOM,
shouldWidthMatchParent = true,
positiveButtonBackgroundColor = ThemeManager.resolveAttribute(R.attr.accent, context),
positiveButtonTextColor = ThemeManager.resolveAttribute(R.attr.contrastText, context),
positiveButtonRadius = (resources.getDimensionPixelSize(R.dimen.tab_corner_radius)).toFloat()
),
onNeedToRequestPermissions = { permissions ->
requestPermissions(permissions, REQUEST_CODE_DOWNLOAD_PERMISSIONS)
}
)
downloadFeature.onDownloadCompleted = { download, _, downloadJobStatus ->
val dialog = DownloadNotificationBottomSheetDialog(
context = context,
didFail = downloadJobStatus == AbstractFetchDownloadService.DownloadJobStatus.FAILED,
download = download,
tryAgain = downloadFeature::tryAgain
)
dialog.show()
}
downloadsFeature.set(
downloadFeature,
owner = this,
view = view
)

View File

@ -0,0 +1,96 @@
/* 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.downloads
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import com.google.android.material.bottomsheet.BottomSheetDialog
import kotlinx.android.synthetic.main.download_notification_layout.*
import mozilla.components.browser.state.state.content.DownloadState
import mozilla.components.feature.downloads.AbstractFetchDownloadService
import mozilla.components.feature.downloads.toMegabyteString
import org.mozilla.fenix.R
import org.mozilla.fenix.theme.ThemeManager
class DownloadNotificationBottomSheetDialog(
context: Context,
private val download: DownloadState,
private val didFail: Boolean,
private val tryAgain: (Long) -> Unit
// We must pass in the BottomSheetDialog theme for the transparent window background to apply properly
) : BottomSheetDialog(context, R.style.Theme_MaterialComponents_BottomSheetDialog) {
override fun onCreate(savedInstanceState: Bundle?) {
setContentView(R.layout.download_notification_layout)
if (didFail) {
download_notification_title.text =
context.getString(R.string.mozac_feature_downloads_failed_notification_text2)
download_notification_icon.setImageDrawable(context.getDrawable(
mozilla.components.feature.downloads.R.drawable.mozac_feature_download_ic_download_failed
))
download_notification_action_button.apply {
text = context.getString(
mozilla.components.feature.downloads.R.string.mozac_feature_downloads_button_try_again
)
setOnClickListener {
tryAgain(download.id)
dismiss()
}
}
} else {
val titleText = context.getString(
R.string.mozac_feature_downloads_completed_notification_text2
) + " (${download.contentLength?.toMegabyteString()})"
download_notification_title.text = titleText
download_notification_icon.setImageDrawable(context.getDrawable(
mozilla.components.feature.downloads.R.drawable.mozac_feature_download_ic_download_complete
))
download_notification_action_button.apply {
text = context.getString(
mozilla.components.feature.downloads.R.string.mozac_feature_downloads_button_open
)
setOnClickListener {
AbstractFetchDownloadService.openFile(
context = context,
contentType = download.contentType,
filePath = download.filePath
)
dismiss()
}
}
}
download_notification_close_button.setOnClickListener {
dismiss()
}
download_notification_filename.text = download.fileName
setOnShowListener {
window?.apply {
// setBackgroundDrawableResource(android.R.color.transparent)
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
navigationBarColor = ContextCompat.getColor(
context,
ThemeManager.resolveAttribute(R.attr.foundation, context
)
)
}
}
}
}

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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/. -->
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="16dp"
android:background="?foundation">
<ImageView
android:id="@+id/download_notification_icon"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:scaleType="center"
app:srcCompat="@drawable/mozac_feature_download_ic_download_complete"
android:importantForAccessibility="no"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:tint="?primaryText"/>
<TextView
android:id="@+id/download_notification_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="11dp"
android:layout_marginStart="3dp"
android:textSize="16sp"
android:textColor="?primaryText"
android:paddingTop="4dp"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:layout_alignParentTop="true"
android:layout_marginTop="16dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintEnd_toStartOf="@id/download_notification_close_button"
app:layout_constraintStart_toEndOf="@id/download_notification_icon"
tools:text="Download (85.7 MB)"/>
<ImageButton
android:id="@+id/download_notification_close_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:layout_marginStart="3dp"
android:contentDescription="@string/mozac_feature_downloads_button_close"
android:background="@null"
android:tint="?primaryText"
app:srcCompat="@drawable/mozac_ic_close"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp"/>
<TextView
android:id="@+id/download_notification_filename"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:textColor="?primaryText"
android:paddingTop="4dp"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@id/download_notification_title"
app:layout_constraintStart_toEndOf="@id/download_notification_icon"
tools:text="Firefox_Preview_v2.1.apk"/>
<Button
android:id="@+id/download_notification_action_button"
android:textColor="?contrastText"
android:backgroundTint="?accentBright"
android:background="@drawable/rounded_all_corners"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/download_notification_filename"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="4dp"
android:layout_marginStart="8dp"
android:textAllCaps="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/mozac_feature_downloads_button_open"/>
</androidx.constraintlayout.widget.ConstraintLayout>