diff --git a/app/src/main/assets/web/bookshelf.html b/app/src/main/assets/web/bookshelf.html index d5a37ae51..86639426f 100644 --- a/app/src/main/assets/web/bookshelf.html +++ b/app/src/main/assets/web/bookshelf.html @@ -28,6 +28,9 @@
+
+
+
diff --git a/app/src/main/assets/web/bookshelf.js b/app/src/main/assets/web/bookshelf.js index 19909b0f5..02e90a6ab 100644 --- a/app/src/main/assets/web/bookshelf.js +++ b/app/src/main/assets/web/bookshelf.js @@ -6,6 +6,8 @@ , books ; +var now_chapter = -1; + var formatTime = value => { return new Date(value).toLocaleString('zh-CN', { hour12: false, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit" @@ -62,6 +64,7 @@ var init = () => { }); $$('#books img').forEach(bookImg => bookImg.addEventListener("click", () => { + now_chapter = -1 $('#allcontent').classList.add("read"); var book = books[bookImg.getAttribute("data-series-num")]; $("#info").innerHTML = ` @@ -130,6 +133,24 @@ $('#showchapter').addEventListener("click", () => { window.location.hash = "#chapter"; }); +$('#up').addEventListener('click', e => { + if (now_chapter > 0) { + now_chapter--; + let clickEvent = document.createEvent('MouseEvents'); + clickEvent.initEvent("click", true, false); + $('[data-index="' + now_chapter + '"]').dispatchEvent(clickEvent); + } +}); + +$('#down').addEventListener('click', e => { + if (now_chapter > -1) { + now_chapter++; + let clickEvent = document.createEvent('MouseEvents'); + clickEvent.initEvent("click", true, false); + $('[data-index="' + now_chapter + '"]').dispatchEvent(clickEvent); + } +}); + $('#chapter').addEventListener("click", (e) => { if (e.target.tagName === "BUTTON") { var url = e.target.getAttribute("data-url"); @@ -141,6 +162,7 @@ $('#chapter').addEventListener("click", (e) => { if (!index && (0 != index)) { alert("未取得章节索引"); } + now_chapter = parseInt(index); $("#content").innerHTML = "

" + name + " 加载中...

"; fetch(apiAddress("getBookContent", url, index), { mode: "cors" }) .then(res => res.json()) diff --git a/app/src/main/java/io/legado/app/service/DownloadService.kt b/app/src/main/java/io/legado/app/service/DownloadService.kt index b5b983476..732506449 100644 --- a/app/src/main/java/io/legado/app/service/DownloadService.kt +++ b/app/src/main/java/io/legado/app/service/DownloadService.kt @@ -29,8 +29,10 @@ class DownloadService : BaseService() { private val handler = Handler() private var runnable: Runnable = Runnable { upDownload() } private val downloadMap = hashMapOf>() + private val downloadCount = hashMapOf(); private val finalMap = hashMapOf>() private var notificationContent = "正在启动下载" + private val notificationBuilder by lazy { val builder = NotificationCompat.Builder(this, AppConst.channelIdDownload) .setSmallIcon(R.drawable.ic_download) @@ -97,6 +99,11 @@ class DownloadService : BaseService() { finalMap.remove(bookUrl) } + private fun updateNotification(downloadCount:DownloadCount, totalCount: Int, content: String){ + notificationContent = + "进度:${downloadCount.downloadFinishedCount}/$totalCount,成功:${downloadCount.successCount},$content" + } + private fun download() { val task = Coroutine.async(this, context = searchPool) { downloadMap.forEach { entry -> @@ -106,6 +113,9 @@ class DownloadService : BaseService() { val bookSource = App.db.bookSourceDao().getBookSource(book.origin) ?: return@async val webBook = WebBook(bookSource) + + downloadCount[entry.key] = DownloadCount() + entry.value.forEach { chapter -> if (!isActive) return@async if (downloadMap.containsKey(book.bookUrl)) { @@ -116,16 +126,19 @@ class DownloadService : BaseService() { scope = this, context = searchPool ) - .onStart { - notificationContent = chapter.title - } + //.onStart { + // notificationContent = "启动:" + chapter.title + //} .onSuccess(IO) { content -> content?.let { + downloadCount[entry.key]?.increaseSuccess() BookHelp.saveContent(book, chapter, content) } } .onFinally(IO) { synchronized(this@DownloadService) { + downloadCount[entry.key]?.increaseFinished() + downloadCount[entry.key]?.let { updateNotification(it, entry.value.size, chapter.title) } val chapterMap = finalMap[book.bookUrl] ?: linkedSetOf().apply { @@ -135,9 +148,14 @@ class DownloadService : BaseService() { if (chapterMap.size == entry.value.size) { downloadMap.remove(book.bookUrl) finalMap.remove(book.bookUrl) + downloadCount.remove(entry.key) } } } + } else{ + //无需下载的,设置为增加成功 + downloadCount[entry.key]?.increaseSuccess() + downloadCount[entry.key]?.increaseFinished() } } } @@ -176,4 +194,17 @@ class DownloadService : BaseService() { val notification = builder.build() startForeground(AppConst.notificationIdDownload, notification) } +} + +class DownloadCount{ + @Volatile public var downloadFinishedCount = 0 // 下载完成的条目数量 + @Volatile public var successCount = 0 //下载成功的条目数量 + + fun increaseSuccess(){ + ++successCount; + } + + fun increaseFinished(){ + ++downloadFinishedCount; + } } \ No newline at end of file