mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-08 14:52:13 -04:00
Fixed: Application crashes on FetchDownloadNotificationManager.getCancelNotification
method.
* The issue occurred when the user paused a download from the notification while the application was in the background and only a single download was active. At that point, a paused notification was posted on the IO thread to inform the user, and shortly after, the same notification was set on the foreground service. Due to a timing conflict, both notifications were being processed simultaneously, leading to a crash. * To fix this, a synchronization lock is added inside the `getCancelNotification` method to ensure that only one thread can access the notification builder at a time.
This commit is contained in:
parent
ef9a7a2129
commit
56b94cb5cf
@ -73,6 +73,8 @@ class FetchDownloadNotificationManager @Inject constructor(
|
|||||||
val context: Context,
|
val context: Context,
|
||||||
private val downloadRoomDao: DownloadRoomDao
|
private val downloadRoomDao: DownloadRoomDao
|
||||||
) : DefaultFetchNotificationManager(context) {
|
) : DefaultFetchNotificationManager(context) {
|
||||||
|
private val notificationBuilderLock = Any()
|
||||||
|
|
||||||
private val downloadNotificationManager: NotificationManager by lazy {
|
private val downloadNotificationManager: NotificationManager by lazy {
|
||||||
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||||
}
|
}
|
||||||
@ -258,34 +260,36 @@ class FetchDownloadNotificationManager @Inject constructor(
|
|||||||
download: Download,
|
download: Download,
|
||||||
notificationBuilder: Builder
|
notificationBuilder: Builder
|
||||||
): Notification {
|
): Notification {
|
||||||
val downloadTitle = getDownloadNotificationTitle(download)
|
synchronized(notificationBuilderLock) {
|
||||||
val notificationTitle =
|
val downloadTitle = getDownloadNotificationTitle(download)
|
||||||
runBlocking(Dispatchers.IO) {
|
val notificationTitle =
|
||||||
downloadRoomDao.getEntityForFileName(downloadTitle)?.title
|
runBlocking(Dispatchers.IO) {
|
||||||
?: downloadTitle
|
downloadRoomDao.getEntityForFileName(downloadTitle)?.title
|
||||||
}
|
?: downloadTitle
|
||||||
return notificationBuilder.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
}
|
||||||
.setSmallIcon(android.R.drawable.stat_sys_download_done)
|
return notificationBuilder.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
||||||
.setContentTitle(notificationTitle)
|
.setSmallIcon(android.R.drawable.stat_sys_download_done)
|
||||||
.setContentText(context.getString(R.string.paused_state))
|
.setContentTitle(notificationTitle)
|
||||||
// Set the ongoing true so that could not cancel the pause notification.
|
.setContentText(context.getString(R.string.paused_state))
|
||||||
// However, on Android 14 and above user can cancel the notification by swipe right so we
|
// Set the ongoing true so that could not cancel the pause notification.
|
||||||
// can't control that see https://developer.android.com/about/versions/14/behavior-changes-all#non-dismissable-notifications
|
// However, on Android 14 and above user can cancel the notification by swipe right so we
|
||||||
.setOngoing(true)
|
// can't control that see https://developer.android.com/about/versions/14/behavior-changes-all#non-dismissable-notifications
|
||||||
.setGroup(download.id.toString())
|
.setOngoing(true)
|
||||||
.setGroupSummary(false)
|
.setGroup(download.id.toString())
|
||||||
.setProgress(HUNDERED, download.progress, false)
|
.setGroupSummary(false)
|
||||||
.addAction(
|
.setProgress(HUNDERED, download.progress, false)
|
||||||
drawable.fetch_notification_cancel,
|
.addAction(
|
||||||
context.getString(R.string.cancel),
|
drawable.fetch_notification_cancel,
|
||||||
getActionPendingIntent(fetch, download, DownloadNotification.ActionType.DELETE)
|
context.getString(R.string.cancel),
|
||||||
)
|
getActionPendingIntent(fetch, download, DownloadNotification.ActionType.DELETE)
|
||||||
.addAction(
|
)
|
||||||
drawable.fetch_notification_resume,
|
.addAction(
|
||||||
context.getString(R.string.notification_resume_button_text),
|
drawable.fetch_notification_resume,
|
||||||
getActionPendingIntent(fetch, download, DownloadNotification.ActionType.RESUME)
|
context.getString(R.string.notification_resume_button_text),
|
||||||
)
|
getActionPendingIntent(fetch, download, DownloadNotification.ActionType.RESUME)
|
||||||
.build()
|
)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getActionPendingIntent(
|
private fun getActionPendingIntent(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user