Fixed Downloader Notifaction + added placeholder download

This commit is contained in:
Jay 2020-02-06 16:57:27 -08:00
parent 0f228a6967
commit 887c5fefae
5 changed files with 86 additions and 74 deletions

View file

@ -77,6 +77,10 @@ class DownloadManager(val context: Context) {
downloader.stop(reason) downloader.stop(reason)
} }
fun setPlaceholder() {
downloader.setPlaceholder()
}
/** /**
* Tells the downloader to pause downloads. * Tells the downloader to pause downloads.
*/ */
@ -218,7 +222,7 @@ class DownloadManager(val context: Context) {
if(!wasPaused && downloader.queue.isNotEmpty()){ if(!wasPaused && downloader.queue.isNotEmpty()){
downloader.start() downloader.start()
} }
else if (downloader.queue.isEmpty()) { else if (downloader.queue.isEmpty() && DownloadService.isRunning(context)) {
DownloadService.stop(context) DownloadService.stop(context)
} }
queue.remove(chapters) queue.remove(chapters)

View file

@ -33,27 +33,11 @@ internal class DownloadNotifier(private val context: Context) {
*/ */
private var isDownloading = false private var isDownloading = false
/**
* The size of queue on start download.
*/
var initialQueueSize = 0
set(value) {
if (value != 0) {
isSingleChapter = (value == 1)
}
field = value
}
/** /**
* Updated when error is thrown * Updated when error is thrown
*/ */
var errorThrown = false var errorThrown = false
/**
* Updated when only single page is downloaded
*/
var isSingleChapter = false
/** /**
* Updated when paused * Updated when paused
*/ */
@ -84,6 +68,48 @@ internal class DownloadNotifier(private val context: Context) {
context.notificationManager.cancel(Notifications.ID_DOWNLOAD_CHAPTER) context.notificationManager.cancel(Notifications.ID_DOWNLOAD_CHAPTER)
} }
fun setPlaceholder(download: Download?) {
with(notification) {
// Check if first call.
if (!isDownloading) {
setSmallIcon(android.R.drawable.stat_sys_download)
setAutoCancel(false)
clearActions()
// Open download manager when clicked
setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context))
isDownloading = true
// Pause action
addAction(R.drawable.ic_av_pause_grey_24dp_img,
context.getString(R.string.action_pause),
NotificationReceiver.pauseDownloadsPendingBroadcast(context))
}
if (download != null) {
val title = download.manga.currentTitle().chop(15)
val quotedTitle = Pattern.quote(title)
val chapter = download.chapter.name.replaceFirst("$quotedTitle[\\s]*[-]*[\\s]*"
.toRegex(RegexOption.IGNORE_CASE), "")
setContentTitle("$title - $chapter".chop(30))
setContentText(
context.getString(R.string.chapter_downloading)
)
}
else {
setContentTitle(
context.getString(
R.string.chapter_downloading
)
)
setContentText(null)
}
setProgress(0,0, true)
setStyle(null)
}
// Displays the progress bar on notification
notification.show()
}
/** /**
* Called when download progress changes. * Called when download progress changes.
* *
@ -133,13 +159,17 @@ internal class DownloadNotifier(private val context: Context) {
// Open download manager when clicked // Open download manager when clicked
setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context)) setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context))
// Resume action // Resume action
addAction(R.drawable.ic_av_play_arrow_grey_img, addAction(
context.getString(R.string.action_resume), R.drawable.ic_av_play_arrow_grey_img,
NotificationReceiver.resumeDownloadsPendingBroadcast(context)) context.getString(R.string.action_resume),
NotificationReceiver.resumeDownloadsPendingBroadcast(context)
)
//Clear action //Clear action
addAction(R.drawable.ic_clear_grey_24dp_img, addAction(
context.getString(R.string.action_cancel_all), R.drawable.ic_clear_grey_24dp_img,
NotificationReceiver.clearDownloadsPendingBroadcast(context)) context.getString(R.string.action_cancel_all),
NotificationReceiver.clearDownloadsPendingBroadcast(context)
)
} }
// Show notification. // Show notification.
@ -147,40 +177,6 @@ internal class DownloadNotifier(private val context: Context) {
// Reset initial values // Reset initial values
isDownloading = false isDownloading = false
initialQueueSize = 0
}
/**
* Called when chapter is downloaded.
*
* @param download download object containing download information.
*/
fun onDownloadCompleted(download: Download, queue: DownloadQueue) {
// Check if last download
if (!queue.isEmpty()) {
return
}
// Create notification.
with(notification) {
val title = download.manga.currentTitle().chop(15)
val quotedTitle = Pattern.quote(title)
val chapter = download.chapter.name.replaceFirst("$quotedTitle[\\s]*[-]*[\\s]*".toRegex(RegexOption.IGNORE_CASE), "")
setContentTitle("$title - $chapter".chop(30))
setContentText(context.getString(R.string.update_check_notification_download_complete))
setSmallIcon(android.R.drawable.stat_sys_download_done)
setAutoCancel(true)
clearActions()
setContentIntent(NotificationReceiver.openChapterPendingActivity(context, download
.manga, download.chapter))
setProgress(0, 0, false)
}
// Show notification.
notification.show()
// Reset initial values
isDownloading = false
initialQueueSize = 0
} }
/** /**

View file

@ -18,6 +18,7 @@ import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.util.lang.plusAssign import eu.kanade.tachiyomi.util.lang.plusAssign
import eu.kanade.tachiyomi.util.system.connectivityManager import eu.kanade.tachiyomi.util.system.connectivityManager
import eu.kanade.tachiyomi.util.system.isServiceRunning
import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.powerManager
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import rx.android.schedulers.AndroidSchedulers import rx.android.schedulers.AndroidSchedulers
@ -61,6 +62,16 @@ class DownloadService : Service() {
fun stop(context: Context) { fun stop(context: Context) {
context.stopService(Intent(context, DownloadService::class.java)) context.stopService(Intent(context, DownloadService::class.java))
} }
/**
* Returns the status of the service.
*
* @param context the application context.
* @return true if the service is running, false otherwise.
*/
fun isRunning(context: Context): Boolean {
return context.isServiceRunning(DownloadService::class.java)
}
} }
/** /**
@ -91,6 +102,7 @@ class DownloadService : Service() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
startForeground(Notifications.ID_DOWNLOAD_CHAPTER, getPlaceholderNotification()) startForeground(Notifications.ID_DOWNLOAD_CHAPTER, getPlaceholderNotification())
downloadManager.setPlaceholder()
runningRelay.call(true) runningRelay.call(true)
subscriptions = CompositeSubscription() subscriptions = CompositeSubscription()
listenDownloaderState() listenDownloaderState()

View file

@ -15,12 +15,12 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.fetchAllImageUrlsFromPageList import eu.kanade.tachiyomi.source.online.fetchAllImageUrlsFromPageList
import eu.kanade.tachiyomi.util.lang.RetryWithDelay import eu.kanade.tachiyomi.util.lang.RetryWithDelay
import eu.kanade.tachiyomi.util.system.launchNow
import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.lang.plusAssign import eu.kanade.tachiyomi.util.lang.plusAssign
import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.storage.saveTo import eu.kanade.tachiyomi.util.storage.saveTo
import eu.kanade.tachiyomi.util.system.ImageUtil import eu.kanade.tachiyomi.util.system.ImageUtil
import eu.kanade.tachiyomi.util.system.launchNow
import eu.kanade.tachiyomi.util.system.launchUI
import kotlinx.coroutines.async import kotlinx.coroutines.async
import okhttp3.Response import okhttp3.Response
import rx.Observable import rx.Observable
@ -126,12 +126,14 @@ class Downloader(
notifier.onWarning(reason) notifier.onWarning(reason)
} else { } else {
if (notifier.paused) { if (notifier.paused) {
notifier.paused = false if (queue.isEmpty()) {
if (queue.isEmpty()) notifier.dismiss() notifier.dismiss()
else notifier.onDownloadPaused() }
} else if (notifier.isSingleChapter && !notifier.errorThrown) { else {
notifier.isSingleChapter = false notifier.paused = false
} else { notifier.onDownloadPaused()
}
}else {
notifier.dismiss() notifier.dismiss()
} }
} }
@ -185,7 +187,7 @@ class Downloader(
} }
queue.remove(manga) queue.remove(manga)
if (queue.isEmpty()) { if (queue.isEmpty()) {
DownloadService.stop(context) if (DownloadService.isRunning(context)) DownloadService.stop(context)
stop() stop()
} }
notifier.dismiss() notifier.dismiss()
@ -253,9 +255,6 @@ class Downloader(
if (chaptersToQueue.isNotEmpty()) { if (chaptersToQueue.isNotEmpty()) {
queue.addAll(chaptersToQueue) queue.addAll(chaptersToQueue)
// Initialize queue size.
notifier.initialQueueSize = queue.size
if (isRunning) { if (isRunning) {
// Send the list of downloads to the downloader. // Send the list of downloads to the downloader.
downloadsRelay.call(chaptersToQueue) downloadsRelay.call(chaptersToQueue)
@ -276,7 +275,7 @@ class Downloader(
private fun downloadChapter(download: Download): Observable<Download> = Observable.defer { private fun downloadChapter(download: Download): Observable<Download> = Observable.defer {
val chapterDirname = provider.getChapterDirName(download.chapter) val chapterDirname = provider.getChapterDirName(download.chapter)
val mangaDir = provider.getMangaDir(download.manga, download.source) val mangaDir = provider.getMangaDir(download.manga, download.source)
val tmpDir = mangaDir.createDirectory("${chapterDirname}_tmp") val tmpDir = mangaDir.createDirectory(chapterDirname + TMP_DIR_SUFFIX)
val pageListObservable = if (download.pages == null) { val pageListObservable = if (download.pages == null) {
// Pull page list from network and add them to download object // Pull page list from network and add them to download object
@ -479,13 +478,14 @@ class Downloader(
queue.remove(download) queue.remove(download)
} }
if (areAllDownloadsFinished()) { if (areAllDownloadsFinished()) {
if (notifier.isSingleChapter && !notifier.errorThrown) {
notifier.onDownloadCompleted(download, queue)
}
DownloadService.stop(context) DownloadService.stop(context)
} }
} }
fun setPlaceholder() {
notifier.setPlaceholder(queue.firstOrNull())
}
/** /**
* Returns true if all the queued downloads are in DOWNLOADED or ERROR state. * Returns true if all the queued downloads are in DOWNLOADED or ERROR state.
*/ */

View file

@ -85,7 +85,7 @@ open class MainActivity : BaseActivity() {
this.snackBar = snackBar this.snackBar = snackBar
canDismissSnackBar = false canDismissSnackBar = false
launchUI { launchUI {
delay(1000) delay(5000)
canDismissSnackBar = true canDismissSnackBar = true
} }
extraViewForUndo = extraViewToCheck extraViewForUndo = extraViewToCheck