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