Fixed Downloader Notifaction + added placeholder download
This commit is contained in:
parent
0f228a6967
commit
887c5fefae
5 changed files with 86 additions and 74 deletions
|
@ -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)
|
||||||
|
|
|
@ -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(
|
||||||
|
R.drawable.ic_av_play_arrow_grey_img,
|
||||||
context.getString(R.string.action_resume),
|
context.getString(R.string.action_resume),
|
||||||
NotificationReceiver.resumeDownloadsPendingBroadcast(context))
|
NotificationReceiver.resumeDownloadsPendingBroadcast(context)
|
||||||
|
)
|
||||||
//Clear action
|
//Clear action
|
||||||
addAction(R.drawable.ic_clear_grey_24dp_img,
|
addAction(
|
||||||
|
R.drawable.ic_clear_grey_24dp_img,
|
||||||
context.getString(R.string.action_cancel_all),
|
context.getString(R.string.action_cancel_all),
|
||||||
NotificationReceiver.clearDownloadsPendingBroadcast(context))
|
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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) {
|
||||||
|
if (queue.isEmpty()) {
|
||||||
|
notifier.dismiss()
|
||||||
|
}
|
||||||
|
else {
|
||||||
notifier.paused = false
|
notifier.paused = false
|
||||||
if (queue.isEmpty()) notifier.dismiss()
|
notifier.onDownloadPaused()
|
||||||
else notifier.onDownloadPaused()
|
}
|
||||||
} else if (notifier.isSingleChapter && !notifier.errorThrown) {
|
}else {
|
||||||
notifier.isSingleChapter = false
|
|
||||||
} 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.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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
|
||||||
|
|
Reference in a new issue