From c33a4b19b901bfd26fa80d74c559037ed18fff8b Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 15:02:24 +0800 Subject: [PATCH 001/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/read/ReadMenu.kt | 2 +- app/src/main/res/values-es-rES/strings.xml | 2 +- app/src/main/res/values-ja-rJP/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values-zh/strings.xml | 2 +- app/src/main/res/values/strings.xml | 30 +++++++++---------- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 9da9c7097..219715aa7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -185,7 +185,7 @@ class ReadMenu @JvmOverloads constructor( if (ReadBook.isLocalBook) { return@OnLongClickListener true } - context.alert(R.string.Open_fan) { + context.alert(R.string.open_fun) { setMessage(R.string.use_browser_open) okButton { AppConfig.readUrlInBrowser = true diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 2ef67ef1b..fc76b9c25 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -893,7 +893,7 @@ 横屏双页 浏览器打开 拷贝url - 打开方式 + 打开方式 是否使用外部浏览器打开? 查看 打开 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 3d274d698..3db3094d9 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -897,7 +897,7 @@ 横屏双页 浏览器打开 拷贝url - 打开方式 + 打开方式 是否使用外部浏览器打开? 查看 打开 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2953fc98e..497af4b2b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -897,7 +897,7 @@ 横屏双页 浏览器打开 拷贝url - 打开方式 + 打开方式 是否使用外部浏览器打开? 查看 打开 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 800c0f971..179177f1d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -894,7 +894,7 @@ 横屏双页 浏览器打开 拷贝url - 打开方式 + 打开方式 是否使用外部浏览器打开? 查看 打开 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 03efde1c7..0c6b605d1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -896,7 +896,7 @@ 横屏双页 浏览器打开 拷贝url - 打开方式 + 打开方式 是否使用外部浏览器打开? 查看 打开 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 59f15564e..2d865a2a2 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -896,7 +896,7 @@ 横屏双页 浏览器打开 拷贝url - 打开方式 + 打开方式 是否使用外部浏览器打开? 查看 打开 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 594a64f3b..a3859ebb3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -886,25 +886,25 @@ 封面上显示作者 朗读上一段 朗读下一段 - 待下载 - 下载完成 - 下载失败 - 下载中 + wait download + download success + download failure + downloading 未知状态 禁用源 - 删除源 - 购买 + delete source + pay 横屏双页 - 浏览器打开 - 拷贝url - 打开方式 + open in browser + copy url + open function 是否使用外部浏览器打开? - 查看 - 打开 - 删除登录头 - 查看登录头 - 登录头 - 字体大小 + see + open + del login header + show login header + login header + font scale 当前字体大小:%.1f From a54e020de6cb22bd24c5447f0a7e65dd93140b37 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 15:04:38 +0800 Subject: [PATCH 002/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3859ebb3..8cfea66a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -855,8 +855,8 @@ Export file name Reset Null url - 字典 - 未知错误 + dict + unknown error No export chapter names Autobackup failed end @@ -866,23 +866,23 @@ 及时翻页,翻页时会停顿一下 Check book source shows debug message Show network status and timestamp during source checking - 需登录 + need login 使用Cronet网络组件 上传URL 下载URL规则 - 导出成功 - 路径 + export success + path 直链上传规则 用于导出书源书单时生成直链url 拷贝播放Url 设置源变量 设置书籍变量 - 注释 - 封面设置 + summary + cover config 设置默认封面样式 - 显示书名 + show name 封面上显示书名 - 显示作者 + show author 封面上显示作者 朗读上一段 朗读下一段 @@ -890,8 +890,8 @@ download success download failure downloading - 未知状态 - 禁用源 + unknown + disable source delete source pay 横屏双页 From ffc11d760488e757ce521e441f73dbb8a950fd55 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 15:06:25 +0800 Subject: [PATCH 003/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8cfea66a9..681ac87ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -867,8 +867,8 @@ Check book source shows debug message Show network status and timestamp during source checking need login - 使用Cronet网络组件 - 上传URL + use Cronet access network + upload url 下载URL规则 export success path @@ -905,6 +905,6 @@ show login header login header font scale - 当前字体大小:%.1f + font scale:%.1f From a57eaf63037dfdb5a78e645bc717c86e5d3cb4cb Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 21:02:38 +0800 Subject: [PATCH 004/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/config/OtherConfigFragment.kt | 8 +----- .../io/legado/app/utils/ContextExtensions.kt | 28 +++++++++++++------ .../java/io/legado/app/utils/SystemUtils.kt | 16 ----------- 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt index 38eda3429..5322e8967 100644 --- a/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt @@ -2,11 +2,9 @@ package io.legado.app.ui.config import android.annotation.SuppressLint import android.content.ComponentName -import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager import android.os.Bundle -import android.os.Process import android.view.View import androidx.preference.ListPreference import androidx.preference.Preference @@ -21,7 +19,6 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.primaryColor import io.legado.app.receiver.SharedReceiverActivity import io.legado.app.service.WebService -import io.legado.app.ui.main.MainActivity import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.utils.* import splitties.init.appCtx @@ -113,10 +110,7 @@ class OtherConfigFragment : BasePreferenceFragment(), } PreferKey.showDiscovery, PreferKey.showRss -> postEvent(EventBus.NOTIFY_MAIN, true) PreferKey.language -> listView.postDelayed({ - val intent = Intent(appCtx, MainActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - appCtx.startActivity(intent) - Process.killProcess(Process.myPid()) + appCtx.restart() }, 1000) PreferKey.userAgent -> listView.post { upPreferenceSummary(PreferKey.userAgent, AppConfig.userAgent) diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index 00546c8ad..3e2985c9e 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -15,6 +15,7 @@ import android.graphics.drawable.Drawable import android.net.Uri import android.os.BatteryManager import android.os.Build +import android.os.Process import android.provider.Settings import android.widget.Toast import androidx.annotation.ColorRes @@ -148,19 +149,30 @@ fun Context.getCompatDrawable(@DrawableRes id: Int): Drawable? = ContextCompat.g fun Context.getCompatColorStateList(@ColorRes id: Int): ColorStateList? = ContextCompat.getColorStateList(this, id) +fun Context.restart() { + val intent: Intent? = packageManager.getLaunchIntentForPackage(packageName) + intent?.let { + intent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK + or Intent.FLAG_ACTIVITY_CLEAR_TASK + or Intent.FLAG_ACTIVITY_CLEAR_TOP + ) + startActivity(intent) + //杀掉以前进程 + Process.killProcess(Process.myPid()) + } +} + /** * 系统息屏时间 */ val Context.sysScreenOffTime: Int get() { - var screenOffTime = 0 - try { - screenOffTime = - Settings.System.getInt(contentResolver, Settings.System.SCREEN_OFF_TIMEOUT) - } catch (e: Exception) { - Timber.e(e) - } - return screenOffTime + return kotlin.runCatching { + Settings.System.getInt(contentResolver, Settings.System.SCREEN_OFF_TIMEOUT) + }.onFailure { + Timber.e(it) + }.getOrDefault(0) } val Context.statusBarHeight: Int diff --git a/app/src/main/java/io/legado/app/utils/SystemUtils.kt b/app/src/main/java/io/legado/app/utils/SystemUtils.kt index af953f294..1b6df2df6 100644 --- a/app/src/main/java/io/legado/app/utils/SystemUtils.kt +++ b/app/src/main/java/io/legado/app/utils/SystemUtils.kt @@ -2,32 +2,16 @@ package io.legado.app.utils import android.annotation.SuppressLint import android.app.Activity -import android.content.Context import android.content.Context.POWER_SERVICE import android.content.Intent import android.net.Uri import android.os.PowerManager import android.provider.Settings -import timber.log.Timber @Suppress("unused") object SystemUtils { - fun getScreenOffTime(context: Context): Int { - var screenOffTime = 0 - kotlin.runCatching { - screenOffTime = Settings.System.getInt( - context.contentResolver, - Settings.System.SCREEN_OFF_TIMEOUT - ) - }.onFailure { - Timber.e(it) - } - - return screenOffTime - } - fun ignoreBatteryOptimization(activity: Activity) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) return From 9753d0c6082040652b80ea5aa3af7b46f2fe7eed Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 22:14:24 +0800 Subject: [PATCH 005/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/local/ImportBookAdapter.kt | 2 +- .../{ConvertUtils.kt => ConvertExtensions.kt} | 37 ++++++++++++++----- .../java/io/legado/app/utils/FileUtils.kt | 2 +- .../java/io/legado/app/utils/IntExtensions.kt | 20 ---------- .../java/io/legado/app/utils/StringUtils.kt | 27 -------------- 5 files changed, 29 insertions(+), 59 deletions(-) rename app/src/main/java/io/legado/app/utils/{ConvertUtils.kt => ConvertExtensions.kt} (73%) delete mode 100644 app/src/main/java/io/legado/app/utils/IntExtensions.kt diff --git a/app/src/main/java/io/legado/app/ui/book/local/ImportBookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/local/ImportBookAdapter.kt index 800faf5e2..91d35d437 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/ImportBookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/ImportBookAdapter.kt @@ -51,7 +51,7 @@ class ImportBookAdapter(context: Context, val callBack: CallBack) : } llBrief.visible() tvTag.text = item.name.substringAfterLast(".") - tvSize.text = StringUtils.toSize(item.size) + tvSize.text = ConvertUtils.formatFileSize(item.size) tvDate.text = AppConst.dateFormat.format(item.date) cbSelect.isChecked = selectedUris.contains(item.toString()) } diff --git a/app/src/main/java/io/legado/app/utils/ConvertUtils.kt b/app/src/main/java/io/legado/app/utils/ConvertExtensions.kt similarity index 73% rename from app/src/main/java/io/legado/app/utils/ConvertUtils.kt rename to app/src/main/java/io/legado/app/utils/ConvertExtensions.kt index 4609a3711..9a7e63722 100644 --- a/app/src/main/java/io/legado/app/utils/ConvertUtils.kt +++ b/app/src/main/java/io/legado/app/utils/ConvertExtensions.kt @@ -9,6 +9,8 @@ import java.io.BufferedReader import java.io.InputStream import java.io.InputStreamReader import java.text.DecimalFormat +import kotlin.math.log10 +import kotlin.math.pow /** * 数据类型转换、单位转换 @@ -80,15 +82,13 @@ object ConvertUtils { return toDrawable(toBitmap(bytes)) } - fun toFileSizeString(fileSize: Long): String { - val df = DecimalFormat("0.00") - val fileSizeString: String = when { - fileSize < KB -> fileSize.toString() + "B" - fileSize < MB -> df.format(fileSize.toDouble() / KB) + "K" - fileSize < GB -> df.format(fileSize.toDouble() / MB) + "M" - else -> df.format(fileSize.toDouble() / GB) + "G" - } - return fileSizeString + fun formatFileSize(length: Long): String { + if (length <= 0) return "0" + val units = arrayOf("b", "kb", "M", "G", "T") + //计算单位的,原理是利用lg,公式是 lg(1024^n) = nlg(1024),最后 nlg(1024)/lg(1024) = n。 + val digitGroups = (log10(length.toDouble()) / log10(1024.0)).toInt() + //计算原理是,size/单位值。单位值指的是:比如说b = 1024,KB = 1024^2 + return DecimalFormat("#,##0.##").format(length / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups] } @JvmOverloads @@ -110,4 +110,21 @@ object ConvertUtils { return sb.toString() } -} \ No newline at end of file +} + +val Int.dp: Int + get() = android.util.TypedValue.applyDimension( + android.util.TypedValue.COMPLEX_UNIT_DIP, + this.toFloat(), + Resources.getSystem().displayMetrics + ).toInt() + +val Int.sp: Int + get() = android.util.TypedValue.applyDimension( + android.util.TypedValue.COMPLEX_UNIT_SP, + this.toFloat(), + Resources.getSystem().displayMetrics + ).toInt() + +val Int.hexString: String + get() = Integer.toHexString(this) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/FileUtils.kt b/app/src/main/java/io/legado/app/utils/FileUtils.kt index b654fd158..288e6da50 100644 --- a/app/src/main/java/io/legado/app/utils/FileUtils.kt +++ b/app/src/main/java/io/legado/app/utils/FileUtils.kt @@ -622,7 +622,7 @@ object FileUtils { */ fun getSize(path: String): String { val fileSize = getLength(path) - return ConvertUtils.toFileSizeString(fileSize) + return ConvertUtils.formatFileSize(fileSize) } /** diff --git a/app/src/main/java/io/legado/app/utils/IntExtensions.kt b/app/src/main/java/io/legado/app/utils/IntExtensions.kt deleted file mode 100644 index dc03d0258..000000000 --- a/app/src/main/java/io/legado/app/utils/IntExtensions.kt +++ /dev/null @@ -1,20 +0,0 @@ -package io.legado.app.utils - -import android.content.res.Resources - -val Int.dp: Int - get() = android.util.TypedValue.applyDimension( - android.util.TypedValue.COMPLEX_UNIT_DIP, - this.toFloat(), - Resources.getSystem().displayMetrics - ).toInt() - -val Int.sp: Int - get() = android.util.TypedValue.applyDimension( - android.util.TypedValue.COMPLEX_UNIT_SP, - this.toFloat(), - Resources.getSystem().displayMetrics - ).toInt() - -val Int.hexString: String - get() = Integer.toHexString(this) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/StringUtils.kt b/app/src/main/java/io/legado/app/utils/StringUtils.kt index 6d9d49eca..43440fa86 100644 --- a/app/src/main/java/io/legado/app/utils/StringUtils.kt +++ b/app/src/main/java/io/legado/app/utils/StringUtils.kt @@ -9,8 +9,6 @@ import java.util.* import java.util.regex.Matcher import java.util.regex.Pattern import kotlin.math.abs -import kotlin.math.log10 -import kotlin.math.pow @Suppress("unused", "MemberVisibilityCanBePrivate") object StringUtils { @@ -42,17 +40,6 @@ object StringUtils { return map } - /** - * 将时间转换成日期 - */ - fun dateConvert(time: Long, pattern: String): String { - val date = Date(time) - - @SuppressLint("SimpleDateFormat") - val format = SimpleDateFormat(pattern) - return format.format(date) - } - /** * 将日期转换成昨天、今天、明天 */ @@ -101,20 +88,6 @@ object StringUtils { return "" } - /** - * 单位转换 - */ - fun toSize(length: Long): String { - if (length <= 0) return "0" - val units = arrayOf("b", "kb", "M", "G", "T") - //计算单位的,原理是利用lg,公式是 lg(1024^n) = nlg(1024),最后 nlg(1024)/lg(1024) = n。 - val digitGroups = - (log10(length.toDouble()) / log10(1024.0)).toInt() - //计算原理是,size/单位值。单位值指的是:比如说b = 1024,KB = 1024^2 - return DecimalFormat("#,##0.##") - .format(length / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups] - } - /** * 首字母大写 */ From 8100913489aa2f1c89692635920c7564ee1d9726 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 22:28:10 +0800 Subject: [PATCH 006/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/local/ImportBookActivity.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt index 0d48016db..5ca79f230 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt @@ -138,13 +138,14 @@ class ImportBookActivity : VMBaseActivity { val rootUri = Uri.parse(lastPath) kotlin.runCatching { - DocumentFile.fromTreeUri(this, rootUri)?.let { - subDocs.clear() - rootDoc = FileDoc.fromDocumentFile(it) - upDocs(rootDoc!!) - } ?: let { + val doc = DocumentFile.fromTreeUri(this, rootUri) + if (doc == null || doc.name.isNullOrEmpty()) { binding.tvEmptyMsg.visible() selectFolder.launch(null) + } else { + subDocs.clear() + rootDoc = FileDoc.fromDocumentFile(doc) + upDocs(rootDoc!!) } }.onFailure { binding.tvEmptyMsg.visible() From 351b4340b8b31d929bba1a1056075c351fa9c862 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 23:34:01 +0800 Subject: [PATCH 007/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/group/GroupEditDialog.kt | 2 +- .../app/ui/book/info/edit/BookInfoEditActivity.kt | 2 +- .../app/ui/book/read/config/BgTextConfigDialog.kt | 2 +- .../legado/app/ui/config/CoverConfigFragment.kt | 9 +++++---- .../legado/app/ui/config/ThemeConfigFragment.kt | 15 ++++++++------- .../io/legado/app/ui/qrcode/QrCodeActivity.kt | 2 +- .../legado/app/utils/ActivityResultContracts.kt | 13 +++++++++---- 7 files changed, 26 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/group/GroupEditDialog.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupEditDialog.kt index 022cadb05..fad9e35f7 100644 --- a/app/src/main/java/io/legado/app/ui/book/group/GroupEditDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupEditDialog.kt @@ -26,7 +26,7 @@ class GroupEditDialog() : BaseDialogFragment(R.layout.dialog_book_group_edit) { private val viewModel by viewModels() private var bookGroup: BookGroup? = null val selectImage = registerForActivityResult(SelectImageContract()) { - readUri(it?.second) { name, bytes -> + readUri(it?.uri) { name, bytes -> var file = requireContext().externalFiles file = FileUtils.createFileIfNotExist(file, "covers", name) file.writeBytes(bytes) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index 9a7ebc192..d813cae00 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -19,7 +19,7 @@ class BookInfoEditActivity : ChangeCoverDialog.CallBack { private val selectCover = registerForActivityResult(SelectImageContract()) { - it?.second?.let { uri -> + it.uri?.let { uri -> coverChangeTo(uri) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 61efde2aa..ba8d839d4 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -48,7 +48,7 @@ class BgTextConfigDialog : BaseDialogFragment(R.layout.dialog_read_bg_text) { private var secondaryTextColor = 0 private val importFormNet = "网络导入" private val selectBgImage = registerForActivityResult(SelectImageContract()) { - it?.second?.let { uri -> + it.uri?.let { uri -> setBgFromUri(uri) } } diff --git a/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt index 2ad33e459..3e6664953 100644 --- a/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt @@ -21,10 +21,11 @@ class CoverConfigFragment : BasePreferenceFragment(), private val requestCodeCover = 111 private val requestCodeCoverDark = 112 private val selectImage = registerForActivityResult(SelectImageContract()) { - val uri = it?.second ?: return@registerForActivityResult - when (it.first) { - requestCodeCover -> setCoverFromUri(PreferKey.defaultCover, uri) - requestCodeCoverDark -> setCoverFromUri(PreferKey.defaultCoverDark, uri) + it.uri?.let { uri -> + when (it.requestCode) { + requestCodeCover -> setCoverFromUri(PreferKey.defaultCover, uri) + requestCodeCoverDark -> setCoverFromUri(PreferKey.defaultCoverDark, uri) + } } } diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 3d90863ad..06828f99d 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -38,13 +38,14 @@ class ThemeConfigFragment : BasePreferenceFragment(), private val requestCodeBgLight = 121 private val requestCodeBgDark = 122 private val selectImage = registerForActivityResult(SelectImageContract()) { - val uri = it?.second ?: return@registerForActivityResult - when (it.first) { - requestCodeBgLight -> setBgFromUri(uri, PreferKey.bgImage) { - upTheme(false) - } - requestCodeBgDark -> setBgFromUri(uri, PreferKey.bgImageN) { - upTheme(true) + it.uri?.let { uri -> + when (it.requestCode) { + requestCodeBgLight -> setBgFromUri(uri, PreferKey.bgImage) { + upTheme(false) + } + requestCodeBgDark -> setBgFromUri(uri, PreferKey.bgImageN) { + upTheme(true) + } } } } diff --git a/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt index 9fd550b08..920d318b9 100644 --- a/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt +++ b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeActivity.kt @@ -20,7 +20,7 @@ class QrCodeActivity : BaseActivity(), OnScanResul override val binding by viewBinding(ActivityQrcodeCaptureBinding::inflate) private val selectQrImage = registerForActivityResult(SelectImageContract()) { - it?.second?.readBytes(this)?.let { bytes -> + it?.uri?.readBytes(this)?.let { bytes -> val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) onScanResultCallback(QRCodeUtils.parseCodeResult(bitmap)) } diff --git a/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt b/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt index 5aebe1890..cf1ce1262 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt @@ -7,7 +7,7 @@ import android.net.Uri import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContract -class SelectImageContract : ActivityResultContract?>() { +class SelectImageContract : ActivityResultContract() { var requestCode: Int? = null @@ -18,13 +18,18 @@ class SelectImageContract : ActivityResultContract?>() { .setType("image/*") } - override fun parseResult(resultCode: Int, intent: Intent?): Pair? { + override fun parseResult(resultCode: Int, intent: Intent?): Result { if (resultCode == RESULT_OK) { - return Pair(requestCode, intent?.data) + return Result(requestCode, intent?.data) } - return null + return Result(requestCode, null) } + data class Result( + val requestCode: Int?, + val uri: Uri? = null + ) + } class StartActivityForResult(private val cls: Class<*>) : From d2c7512e6d59ded88278d830a55393974c14e82e Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 23:52:46 +0800 Subject: [PATCH 008/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/audio/AudioPlayActivity.kt | 3 +-- .../io/legado/app/ui/book/changesource/ChangeSourceDialog.kt | 2 +- .../main/java/io/legado/app/ui/book/info/BookInfoActivity.kt | 2 +- .../main/java/io/legado/app/ui/book/read/ReadBookActivity.kt | 3 +-- .../main/java/io/legado/app/ui/rss/article/RssSortActivity.kt | 4 ++-- .../main/java/io/legado/app/utils/ActivityResultContracts.kt | 4 ++-- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index 6f4edd3d5..4b2303df0 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -61,8 +61,7 @@ class AudioPlayActivity : } } private val sourceEditResult = - registerForActivityResult(StartActivityForResult(BookSourceEditActivity::class.java)) { - it ?: return@registerForActivityResult + registerForActivityResult(StartActivityContract(BookSourceEditActivity::class.java)) { if (it.resultCode == RESULT_OK) { viewModel.upSource() } diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt index 0847b10fd..918c8b4f5 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceDialog.kt @@ -48,7 +48,7 @@ class ChangeSourceDialog() : BaseDialogFragment(R.layout.dialog_change_source), private val viewModel: ChangeSourceViewModel by viewModels() private val adapter by lazy { ChangeSourceAdapter(requireContext(), viewModel, this) } private val editSourceResult = - registerForActivityResult(StartActivityForResult(BookSourceEditActivity::class.java)) { + registerForActivityResult(StartActivityContract(BookSourceEditActivity::class.java)) { viewModel.startSearch() } diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 60f39936e..12e8d132f 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -85,7 +85,7 @@ class BookInfoActivity : } } private val infoEditResult = registerForActivityResult( - StartActivityForResult(BookInfoEditActivity::class.java) + StartActivityContract(BookInfoEditActivity::class.java) ) { if (it.resultCode == RESULT_OK) { viewModel.upEditBook() diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index c566d6aab..755ddade9 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -79,8 +79,7 @@ class ReadBookActivity : BaseReadBookActivity(), } } private val sourceEditActivity = - registerForActivityResult(StartActivityForResult(BookSourceEditActivity::class.java)) { - it ?: return@registerForActivityResult + registerForActivityResult(StartActivityContract(BookSourceEditActivity::class.java)) { if (it.resultCode == RESULT_OK) { viewModel.upBookSource { upMenuView() diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt index 81289c08c..296965a1e 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt @@ -16,7 +16,7 @@ import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.lib.dialogs.alert import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.rss.source.edit.RssSourceEditActivity -import io.legado.app.utils.StartActivityForResult +import io.legado.app.utils.StartActivityContract import io.legado.app.utils.gone import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding @@ -33,7 +33,7 @@ class RssSortActivity : VMBaseActivity>() private val fragmentMap = hashMapOf() private val editSourceResult = registerForActivityResult( - StartActivityForResult(RssSourceEditActivity::class.java) + StartActivityContract(RssSourceEditActivity::class.java) ) { if (it.resultCode == RESULT_OK) { viewModel.initData(intent) { diff --git a/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt b/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt index cf1ce1262..3c3a89b75 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt @@ -32,7 +32,7 @@ class SelectImageContract : ActivityResultContract) : +class StartActivityContract(private val cls: Class<*>) : ActivityResultContract Unit, ActivityResult>() { override fun createIntent(context: Context, input: Intent.() -> Unit): Intent { @@ -47,4 +47,4 @@ class StartActivityForResult(private val cls: Class<*>) : return ActivityResult(resultCode, intent) } -} \ No newline at end of file +} From 262db8515be8afd5294d63b2d6e1c5eaf1f2ec1f Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 24 Oct 2021 23:55:54 +0800 Subject: [PATCH 009/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/LogUtils.kt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/LogUtils.kt b/app/src/main/java/io/legado/app/utils/LogUtils.kt index 96bda9b86..c525a90de 100644 --- a/app/src/main/java/io/legado/app/utils/LogUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LogUtils.kt @@ -69,11 +69,3 @@ object LogUtils { return sdf.format(date) } } - -fun dLog(tag: String, msg: String) { - LogUtils.d(tag, msg) -} - -fun eLog(tag: String, msg: String) { - LogUtils.e(tag, msg) -} \ No newline at end of file From 099b9b21dbba4576833377fc554023d7385d4bbf Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 08:40:20 +0800 Subject: [PATCH 010/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/AppDatabase.kt | 1 + app/src/main/java/io/legado/app/data/entities/HttpTTS.kt | 2 +- .../main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index 9f3457204..5d645e824 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -86,6 +86,7 @@ abstract class AppDatabase : RoomDatabase() { db.execSQL("update book_sources set loginUi = null where loginUi = 'null'") db.execSQL("update rssSources set loginUi = null where loginUi = 'null'") db.execSQL("update httpTTS set loginUi = null where loginUi = 'null'") + db.execSQL("update httpTTS set concurrentRate = '0' where loginUi is null") } } diff --git a/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt b/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt index 77d8eee64..3b1db4512 100644 --- a/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt +++ b/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt @@ -18,7 +18,7 @@ data class HttpTTS( var name: String = "", var url: String = "", var contentType: String? = null, - override var concurrentRate: String? = null, + override var concurrentRate: String? = "0", override var loginUrl: String? = null, override var loginUi: String? = null, override var header: String? = null, diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index afce393e0..966cbb96a 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -285,9 +285,10 @@ class AnalyzeUrl( if (concurrentRate.isNullOrEmpty()) { return } - val fetchRecord = accessTime[source.getKey()] + var fetchRecord = accessTime[source.getKey()] if (fetchRecord == null) { - accessTime[source.getKey()] = FetchRecord(System.currentTimeMillis(), 1) + fetchRecord = FetchRecord(System.currentTimeMillis(), 1) + accessTime[source.getKey()] = fetchRecord return } val waitTime = synchronized(fetchRecord) { From fb5e178678c5e5a74abe838890e0e7a63d2801ce Mon Sep 17 00:00:00 2001 From: du Date: Mon, 25 Oct 2021 11:36:45 +0800 Subject: [PATCH 011/102] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=BB=9A=E5=8A=A8?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=EF=BC=8C=E9=95=BF=E6=8C=89=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=94=99=E4=B9=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/page/ContentTextView.kt | 2 +- .../main/java/io/legado/app/ui/book/read/page/PageView.kt | 4 ++++ .../main/java/io/legado/app/ui/book/read/page/ReadView.kt | 5 +++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index 14e2f8f68..91e182c47 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -524,7 +524,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at } } - private fun relativePage(relativePos: Int): TextPage { + fun relativePage(relativePos: Int): TextPage { return when (relativePos) { 0 -> textPage 1 -> pageFactory.nextPage diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 2cc6c5b46..f838c3166 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -271,6 +271,10 @@ class PageView(context: Context) : FrameLayout(context) { return binding.contentTextView.createBookmark() } + fun relativePage(relativePos: Int): TextPage { + return binding.contentTextView.relativePage(relativePos) + } + val selectedText: String get() = binding.contentTextView.selectedText val textPage get() = binding.contentTextView.textPage diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt index 2fd5e12c9..0c05ae0b2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt @@ -265,8 +265,9 @@ class ReadView(context: Context, attrs: AttributeSet) : */ private fun onLongPress() { kotlin.runCatching { - with(curPage.textPage) { - curPage.selectText(startX, startY) { relativePage, lineIndex, charIndex -> + curPage.selectText(startX, startY) { relativePage, lineIndex, charIndex -> + val page = if (isScroll) curPage.relativePage(relativePage) else curPage.textPage + with(page) { isTextSelected = true firstRelativePage = relativePage firstLineIndex = lineIndex From 787064dd217df6e8f9955f66de385edf5a38ac2d Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 14:42:43 +0800 Subject: [PATCH 012/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/model/Exceptions.kt | 2 +- .../app/model/analyzeRule/AnalyzeUrl.kt | 86 ++++++++++++------- 2 files changed, 56 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/Exceptions.kt b/app/src/main/java/io/legado/app/model/Exceptions.kt index 433967b3e..01a0026df 100644 --- a/app/src/main/java/io/legado/app/model/Exceptions.kt +++ b/app/src/main/java/io/legado/app/model/Exceptions.kt @@ -40,7 +40,7 @@ class ContentEmptyException(msg: String) : Exception(msg) { /** * 并发限制 */ -class ConcurrentException(msg: String, val waitTime: Long) : Exception(msg) { +class ConcurrentException(msg: String, val waitTime: Int) : Exception(msg) { override fun fillInStackTrace(): Throwable { return this diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 966cbb96a..cd0d02fcd 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -46,7 +46,7 @@ class AnalyzeUrl( companion object { val paramPattern: Pattern = Pattern.compile("\\s*,\\s*(?=\\{)") private val pagePattern = Pattern.compile("<(.*?)>") - private val accessTime = hashMapOf() + private val concurrentRecordMap = hashMapOf() } var ruleUrl = "" @@ -277,31 +277,34 @@ class AnalyzeUrl( } /** - * 并发判断 + * 开始访问,并发判断 */ - private fun judgmentConcurrent() { - source ?: return + private fun fetchStart(): ConcurrentRecord? { + source ?: return null val concurrentRate = source.concurrentRate if (concurrentRate.isNullOrEmpty()) { - return + return null } - var fetchRecord = accessTime[source.getKey()] + val rateIndex = concurrentRate.indexOf("/") + var fetchRecord = concurrentRecordMap[source.getKey()] if (fetchRecord == null) { - fetchRecord = FetchRecord(System.currentTimeMillis(), 1) - accessTime[source.getKey()] = fetchRecord - return + fetchRecord = ConcurrentRecord(rateIndex > 0, System.currentTimeMillis(), 1) + concurrentRecordMap[source.getKey()] = fetchRecord + return fetchRecord } - val waitTime = synchronized(fetchRecord) { + val waitTime: Int = synchronized(fetchRecord) { try { - val rateIndex = concurrentRate.indexOf("/") if (rateIndex == -1) { + if (fetchRecord.frequency > 0) { + return@synchronized concurrentRate.toInt() + } val nextTime = fetchRecord.time + concurrentRate.toInt() if (System.currentTimeMillis() >= nextTime) { fetchRecord.time = System.currentTimeMillis() fetchRecord.frequency = 1 return@synchronized 0 } - return@synchronized nextTime - System.currentTimeMillis() + return@synchronized (nextTime - System.currentTimeMillis()).toInt() } else { val sj = concurrentRate.substring(rateIndex + 1) val nextTime = fetchRecord.time + sj.toInt() @@ -312,7 +315,7 @@ class AnalyzeUrl( } val cs = concurrentRate.substring(0, rateIndex) if (fetchRecord.frequency > cs.toInt()) { - return@synchronized nextTime - System.currentTimeMillis() + return@synchronized (nextTime - System.currentTimeMillis()).toInt() } else { fetchRecord.frequency = fetchRecord.frequency + 1 return@synchronized 0 @@ -325,6 +328,18 @@ class AnalyzeUrl( if (waitTime > 0) { throw ConcurrentException("根据并发率还需等待${waitTime}毫秒才可以访问", waitTime = waitTime) } + return fetchRecord + } + + /** + * 访问结束 + */ + private fun fetchEnd(concurrentRecord: ConcurrentRecord?) { + if (concurrentRecord != null && !concurrentRecord.concurrent) { + synchronized(concurrentRecord) { + concurrentRecord.frequency = concurrentRecord.frequency - 1 + } + } } /** @@ -338,10 +353,11 @@ class AnalyzeUrl( if (type != null) { return StrResponse(url, StringUtils.byteToHexString(getByteArrayAwait())) } - judgmentConcurrent() + val concurrentRecord = fetchStart() setCookie(source?.getKey()) + val strResponse: StrResponse if (this.useWebView && useWebView) { - return when (method) { + strResponse = when (method) { RequestMethod.POST -> { val body = getProxyClient(proxy).newCallStrResponse(retry) { addHeaders(headerMap) @@ -369,21 +385,24 @@ class AnalyzeUrl( headerMap = headerMap ).getStrResponse() } - } - return getProxyClient(proxy).newCallStrResponse(retry) { - addHeaders(headerMap) - when (method) { - RequestMethod.POST -> { - url(urlNoQuery) - if (fieldMap.isNotEmpty() || body.isNullOrBlank()) { - postForm(fieldMap, true) - } else { - postJson(body) + } else { + strResponse = getProxyClient(proxy).newCallStrResponse(retry) { + addHeaders(headerMap) + when (method) { + RequestMethod.POST -> { + url(urlNoQuery) + if (fieldMap.isNotEmpty() || body.isNullOrBlank()) { + postForm(fieldMap, true) + } else { + postJson(body) + } } + else -> get(urlNoQuery, fieldMap, true) } - else -> get(urlNoQuery, fieldMap, true) } } + fetchEnd(concurrentRecord) + return strResponse } @JvmOverloads @@ -401,10 +420,10 @@ class AnalyzeUrl( * 访问网站,返回Response */ suspend fun getResponseAwait(): Response { - judgmentConcurrent() + val concurrentRecord = fetchStart() setCookie(source?.getKey()) @Suppress("BlockingMethodInNonBlockingContext") - return getProxyClient(proxy).newCallResponse(retry) { + val response = getProxyClient(proxy).newCallResponse(retry) { addHeaders(headerMap) when (method) { RequestMethod.POST -> { @@ -418,6 +437,8 @@ class AnalyzeUrl( else -> get(urlNoQuery, fieldMap, true) } } + fetchEnd(concurrentRecord) + return response } fun getResponse(): Response { @@ -430,10 +451,10 @@ class AnalyzeUrl( * 访问网站,返回ByteArray */ suspend fun getByteArrayAwait(): ByteArray { - judgmentConcurrent() + val concurrentRecord = fetchStart() setCookie(source?.getKey()) @Suppress("BlockingMethodInNonBlockingContext") - return getProxyClient(proxy).newCallResponseBody(retry) { + val byteArray = getProxyClient(proxy).newCallResponseBody(retry) { addHeaders(headerMap) when (method) { RequestMethod.POST -> { @@ -447,6 +468,8 @@ class AnalyzeUrl( else -> get(urlNoQuery, fieldMap, true) } }.bytes() + fetchEnd(concurrentRecord) + return byteArray } fun getByteArray(): ByteArray { @@ -522,7 +545,8 @@ class AnalyzeUrl( val webJs: String?, ) - data class FetchRecord( + data class ConcurrentRecord( + val concurrent: Boolean, var time: Long, var frequency: Int ) From 49bfcc1be2d9a78fcceb5b9ed8911bf562b6f4da Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 15:24:28 +0800 Subject: [PATCH 013/102] =?UTF-8?q?=E4=BC=98=E5=8C=96toast=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/HttpReadAloudService.kt | 5 +- .../io/legado/app/utils/ContextExtensions.kt | 25 ------- .../java/io/legado/app/utils/ToastUtils.kt | 66 +++++++++++++++++++ .../main/java/io/legado/app/utils/Toasts.kt | 35 ---------- 4 files changed, 70 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/ToastUtils.kt delete mode 100644 app/src/main/java/io/legado/app/utils/Toasts.kt diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 0516531a2..eda18ee5c 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -8,6 +8,7 @@ import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus import io.legado.app.help.AppConfig import io.legado.app.help.coroutine.Coroutine +import io.legado.app.model.ConcurrentException import io.legado.app.model.NoStackTraceException import io.legado.app.model.ReadAloud import io.legado.app.model.ReadBook @@ -163,13 +164,15 @@ class HttpReadAloudService : BaseReadAloudService(), } catch (e: CancellationException) { removeSpeakCache(fileName) //任务取消,不处理 + } catch (e: ConcurrentException) { + removeSpeakCache(fileName) + downloadAudio() } catch (e: SocketTimeoutException) { removeSpeakCache(fileName) downloadErrorNo++ if (playErrorNo > 5) { createSilentSound(fileName) } else { - toastOnUi("tts接口超时,尝试重新获取") downloadAudio() } } catch (e: ConnectException) { diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index 3e2985c9e..7d90fff72 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -17,7 +17,6 @@ import android.os.BatteryManager import android.os.Build import android.os.Process import android.provider.Settings -import android.widget.Toast import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import androidx.core.content.ContextCompat @@ -79,30 +78,6 @@ inline fun Context.broadcastPendingIntent( return getBroadcast(this, 0, intent, FLAG_CANCEL_CURRENT) } -fun Context.toastOnUi(message: Int) { - runOnUI { - Toast.makeText(this, message, Toast.LENGTH_SHORT).show() - } -} - -fun Context.toastOnUi(message: CharSequence?) { - runOnUI { - Toast.makeText(this, message, Toast.LENGTH_SHORT).show() - } -} - -fun Context.longToastOnUi(message: Int) { - runOnUI { - Toast.makeText(this, message, Toast.LENGTH_LONG).show() - } -} - -fun Context.longToastOnUi(message: CharSequence?) { - runOnUI { - Toast.makeText(this, message, Toast.LENGTH_LONG).show() - } -} - val Context.defaultSharedPreferences: SharedPreferences get() = PreferenceManager.getDefaultSharedPreferences(this) diff --git a/app/src/main/java/io/legado/app/utils/ToastUtils.kt b/app/src/main/java/io/legado/app/utils/ToastUtils.kt new file mode 100644 index 000000000..7a5f2cc83 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/ToastUtils.kt @@ -0,0 +1,66 @@ +@file:Suppress("unused") + +package io.legado.app.utils + +import android.content.Context +import android.widget.Toast +import androidx.fragment.app.Fragment + +private var toast: Toast? = null + +fun Context.toastOnUi(message: Int) { + runOnUI { + if (toast == null) { + toast = Toast.makeText(this, message, Toast.LENGTH_SHORT) + } else { + toast?.setText(message) + toast?.duration = Toast.LENGTH_SHORT + } + toast?.show() + } +} + +fun Context.toastOnUi(message: CharSequence?) { + runOnUI { + if (toast == null) { + toast = Toast.makeText(this, message, Toast.LENGTH_SHORT) + } else { + toast?.setText(message) + toast?.duration = Toast.LENGTH_SHORT + } + toast?.show() + } +} + +fun Context.longToastOnUi(message: Int) { + runOnUI { + if (toast == null) { + toast = Toast.makeText(this, message, Toast.LENGTH_LONG) + } else { + toast?.setText(message) + toast?.duration = Toast.LENGTH_LONG + } + toast?.show() + } +} + +fun Context.longToastOnUi(message: CharSequence?) { + runOnUI { + if (toast == null) { + toast = Toast.makeText(this, message, Toast.LENGTH_LONG) + } else { + toast?.setText(message) + toast?.duration = Toast.LENGTH_LONG + } + toast?.show() + } +} + + +fun Fragment.toastOnUi(message: Int) = requireActivity().toastOnUi(message) + +fun Fragment.toastOnUi(message: CharSequence) = requireActivity().toastOnUi(message) + +fun Fragment.longToast(message: Int) = requireContext().longToastOnUi(message) + +fun Fragment.longToast(message: CharSequence) = requireContext().longToastOnUi(message) diff --git a/app/src/main/java/io/legado/app/utils/Toasts.kt b/app/src/main/java/io/legado/app/utils/Toasts.kt deleted file mode 100644 index c98f3561c..000000000 --- a/app/src/main/java/io/legado/app/utils/Toasts.kt +++ /dev/null @@ -1,35 +0,0 @@ -@file:Suppress("unused") - -package io.legado.app.utils - -import android.widget.Toast -import androidx.fragment.app.Fragment - - -/** - * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration. - * - * @param message the message text resource. - */ -fun Fragment.toastOnUi(message: Int) = requireActivity().toastOnUi(message) - -/** - * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration. - * - * @param message the message text. - */ -fun Fragment.toastOnUi(message: CharSequence) = requireActivity().toastOnUi(message) - -/** - * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. - * - * @param message the message text resource. - */ -fun Fragment.longToast(message: Int) = requireContext().longToastOnUi(message) - -/** - * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. - * - * @param message the message text. - */ -fun Fragment.longToast(message: CharSequence) = requireContext().longToastOnUi(message) From eb9581e65549ffd5b7cefeea44008f76f037c224 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 15:40:01 +0800 Subject: [PATCH 014/102] =?UTF-8?q?=E4=BC=98=E5=8C=96toast=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/service/HttpReadAloudService.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index eda18ee5c..00f49746a 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -26,6 +26,7 @@ import java.io.IOException import java.net.ConnectException import java.net.SocketTimeoutException import java.util.* +import javax.script.ScriptException class HttpReadAloudService : BaseReadAloudService(), MediaPlayer.OnPreparedListener, @@ -167,6 +168,12 @@ class HttpReadAloudService : BaseReadAloudService(), } catch (e: ConcurrentException) { removeSpeakCache(fileName) downloadAudio() + } catch (e: ScriptException) { + AppLog.put("tts接口错误\n${e.localizedMessage}", e) + toastOnUi("js错误\n${e.localizedMessage}") + Timber.e(e) + cancel() + stopSelf() } catch (e: SocketTimeoutException) { removeSpeakCache(fileName) downloadErrorNo++ From 941a21513ac80881989ef30d4e6ad6fce8871fc2 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 16:09:05 +0800 Subject: [PATCH 015/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/HttpReadAloudService.kt | 88 +++++++++---------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 00f49746a..a064aec34 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -18,11 +18,11 @@ import kotlinx.coroutines.* import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import okhttp3.Response +import org.mozilla.javascript.WrappedException import timber.log.Timber import java.io.File import java.io.FileDescriptor import java.io.FileInputStream -import java.io.IOException import java.net.ConnectException import java.net.SocketTimeoutException import java.util.* @@ -123,7 +123,7 @@ class HttpReadAloudService : BaseReadAloudService(), createSilentSound(fileName) return@forEachIndexed } else { - try { + runCatching { createSpeakCache(fileName) val analyzeUrl = AnalyzeUrl( httpTts.url, @@ -162,52 +162,46 @@ class HttpReadAloudService : BaseReadAloudService(), } } downloadErrorNo = 0 - } catch (e: CancellationException) { - removeSpeakCache(fileName) - //任务取消,不处理 - } catch (e: ConcurrentException) { - removeSpeakCache(fileName) - downloadAudio() - } catch (e: ScriptException) { - AppLog.put("tts接口错误\n${e.localizedMessage}", e) - toastOnUi("js错误\n${e.localizedMessage}") - Timber.e(e) - cancel() - stopSelf() - } catch (e: SocketTimeoutException) { - removeSpeakCache(fileName) - downloadErrorNo++ - if (playErrorNo > 5) { - createSilentSound(fileName) - } else { - downloadAudio() - } - } catch (e: ConnectException) { - removeSpeakCache(fileName) - downloadErrorNo++ - if (playErrorNo > 5) { - createSilentSound(fileName) - } else { - AppLog.put("tts接口网络错误\n${e.localizedMessage}", e) - toastOnUi("tts接口网络错误\n${e.localizedMessage}") - downloadAudio() - } - } catch (e: IOException) { - removeSpeakCache(fileName) - downloadErrorNo++ - if (playErrorNo > 5) { - createSilentSound(fileName) - } else { - AppLog.put("tts下载音频错误\n${e.localizedMessage}", e) - toastOnUi("tts下载音频错误\n${e.localizedMessage}") - downloadAudio() + }.onFailure { + when (it) { + is CancellationException -> removeSpeakCache(fileName) + is ConcurrentException -> { + removeSpeakCache(fileName) + delay(it.waitTime.toLong()) + downloadAudio() + } + is ScriptException, is WrappedException -> { + AppLog.put("js错误\n${it.localizedMessage}", it) + toastOnUi("js错误\n${it.localizedMessage}") + Timber.e(it) + cancel() + stopSelf() + } + is SocketTimeoutException, is ConnectException -> { + removeSpeakCache(fileName) + downloadErrorNo++ + if (playErrorNo > 5) { + val msg = "tts超时或连接错误超过5次\n${it.localizedMessage}" + AppLog.put(msg, it) + toastOnUi(msg) + createSilentSound(fileName) + if (playErrorNo > 10) { + cancel() + stopSelf() + } + } else { + downloadAudio() + } + } + else -> { + removeSpeakCache(fileName) + createSilentSound(fileName) + val msg = "tts下载错误\n${it.localizedMessage}" + AppLog.put(msg, it) + toastOnUi(msg) + Timber.e(it) + } } - } catch (e: Exception) { - removeSpeakCache(fileName) - createSilentSound(fileName) - AppLog.put("tts接口错误\n${e.localizedMessage}", e) - toastOnUi("tts接口错误\n${e.localizedMessage}") - Timber.e(e) } } } From c0a110b5230ea1c68d841d0fef287469db811022 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 16:28:51 +0800 Subject: [PATCH 016/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/service/HttpReadAloudService.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index a064aec34..d05f11312 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -181,14 +181,11 @@ class HttpReadAloudService : BaseReadAloudService(), removeSpeakCache(fileName) downloadErrorNo++ if (playErrorNo > 5) { + downloadErrorNo = 0 + createSilentSound(fileName) val msg = "tts超时或连接错误超过5次\n${it.localizedMessage}" AppLog.put(msg, it) toastOnUi(msg) - createSilentSound(fileName) - if (playErrorNo > 10) { - cancel() - stopSelf() - } } else { downloadAudio() } @@ -196,7 +193,6 @@ class HttpReadAloudService : BaseReadAloudService(), else -> { removeSpeakCache(fileName) createSilentSound(fileName) - val msg = "tts下载错误\n${it.localizedMessage}" AppLog.put(msg, it) toastOnUi(msg) Timber.e(it) From 191fb895892ff333cd643bace4313a8fdcd15aef Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 16:29:08 +0800 Subject: [PATCH 017/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/HttpReadAloudService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index d05f11312..5a67cd902 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -193,8 +193,8 @@ class HttpReadAloudService : BaseReadAloudService(), else -> { removeSpeakCache(fileName) createSilentSound(fileName) + val msg = "tts下载错误\n${it.localizedMessage}" AppLog.put(msg, it) - toastOnUi(msg) Timber.e(it) } } From 6857d7f74e18653b8db0bf74c0f3365858d5e73a Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 21:06:00 +0800 Subject: [PATCH 018/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/assets/defaultData/bookSources.json | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/app/src/main/assets/defaultData/bookSources.json b/app/src/main/assets/defaultData/bookSources.json index 2709b5a0b..8377fa0f8 100644 --- a/app/src/main/assets/defaultData/bookSources.json +++ b/app/src/main/assets/defaultData/bookSources.json @@ -12,26 +12,13 @@ "searchUrl": "https://www.kaixin7days.com/book-service/bookMgt/findBookName,{\"method\":\"POST\",\"body\":{\"title\": \"searchKey\",\"pageNum\": {{searchPage}},\"pageSize\": 100}}", "lastUpdateTime": 1630656684531, "loginCheckJs": "var strRes = result\nvar c = JSON.parse(result.body())\nif (c.statusCode == 301) {\n var loginInfo = source.getLoginInfo()\n var dl = null\n if (loginInfo) {\n dl = java.connect('https://www.kaixin7days.com/login,{\"method\":\"POST\",\"body\":' + loginInfo + '}').body()\n } else {\n dl = java.connect('https://www.kaixin7days.com/visitorLogin,{\"method\":\"POST\",\"body\":{}}').body()\n }\n c = JSON.parse(dl)\n var accessToken = {\n Authorization: \"Bearer \" + c.content.accessToken\n }\n var header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n strRes = java.connect(url, header)\n}\nstrRes", - "loginUi": [ - { - "name": "telephone", - "type": "text" - }, - { - "name": "password", - "type": "password" - }, - { - "name": "注册", - "type": "button", - "action": "http://www.yooike.com/xiaoshuo/#/register?title=%E6%B3%A8%E5%86%8C" - } - ], + "loginUi": "[{\"name\": \"telephone\",\"type\": \"text\"},{\"name\": \"password\",\"type\": \"password\"},{\"name\": \"注册\",\"type\": \"button\",\"action\": \"http://www.yooike.com/xiaoshuo/#/register?title=%E6%B3%A8%E5%86%8C\"}]", "loginUrl": "var loginInfo = source.getLoginInfo()\nvar json = java.connect('https://www.kaixin7days.com/login,{\"method\":\"POST\",\"body\":' + loginInfo + '}').body()\nvar loginRes = JSON.parse(json)\nvar header = null\nif (loginRes.statusCode == 200) {\n var accessToken = {\n Authorization: \"Bearer \" + loginRes.content.accessToken\n }\n header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n}\nheader", "respondTime": 180000, "ruleBookInfo": {}, "ruleContent": { - "content": "" + "content": "", + "payAction": "var header = JSON.parse(source.getLoginHeader()); var bookId = book.getVariableMap().get('bookId');var chapterId = java.get('chapterId');\n'http://www.shuidi.online/?name=' + book.getName() + '&type=2&cover=' + book.getCoverUrl() + '&chapterId=' + chapterId + '&chapter=203&allNumber=' + book.getTotalChapterNum() + '&bookId=' + bookId + '&chapterIds=' + chapterId + '&number=' + chapter.getIndex() + '&accessToken=' + header.Authorization.substring(7) + '#/pay'" }, "ruleExplore": { "author": "$.author", From 18445c505ed4593fa69d3739c8c2ab014df60848 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 25 Oct 2021 23:55:50 +0800 Subject: [PATCH 019/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/JsExtensions.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index dc61a8f0e..964708b48 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -4,6 +4,7 @@ import android.net.Uri import android.util.Base64 import androidx.annotation.Keep import io.legado.app.BuildConfig +import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst.dateFormat import io.legado.app.data.entities.BaseSource import io.legado.app.help.http.* @@ -644,4 +645,8 @@ interface JsExtensions { return aesEncodeToBase64ByteArray(data, key, transformation, iv)?.let { String(it) } } + fun android(): String { + return AppConst.androidId + } + } From 4e41f2cd1b80f99b970b6b1a394c35bd588ebced Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 08:10:39 +0800 Subject: [PATCH 020/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/defaultData/bookSources.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/defaultData/bookSources.json b/app/src/main/assets/defaultData/bookSources.json index 8377fa0f8..1bf485925 100644 --- a/app/src/main/assets/defaultData/bookSources.json +++ b/app/src/main/assets/defaultData/bookSources.json @@ -8,7 +8,7 @@ "customOrder": 0, "enabled": true, "enabledExplore": true, - "exploreUrl": "@js:var header = source.getLoginHeader()\nvar json = ''\nvar j = null\nif (header != null) {\n json = java.connect('https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy,{\"method\":\"POST\",\"body\":{}}', header).body()\n j = JSON.parse(json)\n}\nif (j == null || j.statusCode != 200) {\n json = java.connect('https://www.kaixin7days.com/visitorLogin,{\"method\":\"POST\", \"body\":{} }').body()\n j = JSON.parse(json)\n var accessToken = {\n Authorization: 'Bearer ' + j.content.accessToken\n }\n header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n json = java.connect('https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy,{\"method\":\"POST\",\"body\":{} }', header).body()\n j = JSON.parse(json)\n}\nvar fls = j.content\nvar fx = []\nfor (var i = 0; i < fls.length; i++) {\n fx.push({\n title: fls[i].categoryName,\n url: '/book-service/bookMgt/getAllBookByCategroyId,{\"method\":\"POST\",\"body\":{\"categoryIds\": \"' + fls[i].associationCategoryIDs + '\",\"pageNum\": {{page}},\"pageSize\": 100}}'\n })\n}\nJSON.stringify(fx)", + "exploreUrl": "@js:var header = JSON.parsesource.getLoginHeader()\nvar json = ''\nvar j = null\nif (header != null) {\n json = java.connect('https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy,{\"method\":\"POST\",\"body\":{}}', header).body()\n j = JSON.parse(json)\n}\nif (j == null || j.statusCode != 200) {\n json = java.connect('https://www.kaixin7days.com/visitorLogin,{\"method\":\"POST\", \"body\":{} }').body()\n j = JSON.parse(json)\n var accessToken = {\n Authorization: 'Bearer ' + j.content.accessToken\n }\n header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n json = java.connect('https://www.kaixin7days.com/book-service/bookMgt/getBookCategroy,{\"method\":\"POST\",\"body\":{} }', header).body()\n j = JSON.parse(json)\n}\nvar fls = j.content\nvar fx = []\nfor (var i = 0; i < fls.length; i++) {\n fx.push({\n title: fls[i].categoryName,\n url: '/book-service/bookMgt/getAllBookByCategroyId,{\"method\":\"POST\",\"body\":{\"categoryIds\": \"' + fls[i].associationCategoryIDs + '\",\"pageNum\": {{page}},\"pageSize\": 100}}'\n })\n}\nJSON.stringify(fx)", "searchUrl": "https://www.kaixin7days.com/book-service/bookMgt/findBookName,{\"method\":\"POST\",\"body\":{\"title\": \"searchKey\",\"pageNum\": {{searchPage}},\"pageSize\": 100}}", "lastUpdateTime": 1630656684531, "loginCheckJs": "var strRes = result\nvar c = JSON.parse(result.body())\nif (c.statusCode == 301) {\n var loginInfo = source.getLoginInfo()\n var dl = null\n if (loginInfo) {\n dl = java.connect('https://www.kaixin7days.com/login,{\"method\":\"POST\",\"body\":' + loginInfo + '}').body()\n } else {\n dl = java.connect('https://www.kaixin7days.com/visitorLogin,{\"method\":\"POST\",\"body\":{}}').body()\n }\n c = JSON.parse(dl)\n var accessToken = {\n Authorization: \"Bearer \" + c.content.accessToken\n }\n var header = JSON.stringify(accessToken)\n source.putLoginHeader(header)\n strRes = java.connect(url, header)\n}\nstrRes", From 48eed794e128695dba5ac06bb79cb3617ff737dc Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 11:11:33 +0800 Subject: [PATCH 021/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/analyzeRule/AnalyzeRule.kt | 28 +++++++++++-------- .../legado/app/model/rss/RssParserByRule.kt | 2 +- .../app/model/webBook/BookChapterList.kt | 2 +- .../legado/app/model/webBook/BookContent.kt | 4 +-- .../io/legado/app/model/webBook/BookInfo.kt | 2 +- .../io/legado/app/model/webBook/BookList.kt | 2 +- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 4837ffe7d..bf685944e 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -129,16 +129,20 @@ class AnalyzeRule( * 获取文本列表 */ @JvmOverloads - fun getStringList(rule: String?, isUrl: Boolean = false): List? { + fun getStringList(rule: String?, mContent: Any? = null, isUrl: Boolean = false): List? { if (rule.isNullOrEmpty()) return null val ruleList = splitSourceRule(rule, false) - return getStringList(ruleList, isUrl) + return getStringList(ruleList, mContent, isUrl) } @JvmOverloads - fun getStringList(ruleList: List, isUrl: Boolean = false): List? { + fun getStringList( + ruleList: List, + mContent: Any? = null, + isUrl: Boolean = false + ): List? { var result: Any? = null - val content = this.content + val content = mContent ?: this.content if (content != null && ruleList.isNotEmpty()) { result = content if (content is NativeObject) { @@ -194,22 +198,22 @@ class AnalyzeRule( * 获取文本 */ @JvmOverloads - fun getString(ruleStr: String?, isUrl: Boolean = false, value: String? = null): String { + fun getString(ruleStr: String?, mContent: Any? = null, isUrl: Boolean = false): String { if (TextUtils.isEmpty(ruleStr)) return "" val ruleList = splitSourceRule(ruleStr) - return getString(ruleList, isUrl, value) + return getString(ruleList, mContent, isUrl) } @JvmOverloads fun getString( ruleList: List, - isUrl: Boolean = false, - value: String? = null + mContent: Any? = null, + isUrl: Boolean = false ): String { - var result: Any? = value - val content = this.content - if ((content != null || result != null) && ruleList.isNotEmpty()) { - if (result == null) result = content + var result: Any? = null + val content = mContent ?: this.content + if (content != null && ruleList.isNotEmpty()) { + result = content if (result is NativeObject) { result = result[ruleList[0].rule]?.toString() } else { diff --git a/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt b/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt index 501d5007d..aabe26f98 100644 --- a/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt +++ b/app/src/main/java/io/legado/app/model/rss/RssParserByRule.kt @@ -112,7 +112,7 @@ object RssParserByRule { Debug.log(sourceUrl, "└${rssArticle.description}", log) } Debug.log(sourceUrl, "┌获取图片url", log) - rssArticle.image = analyzeRule.getString(ruleImage, true) + rssArticle.image = analyzeRule.getString(ruleImage, isUrl = true) Debug.log(sourceUrl, "└${rssArticle.image}", log) Debug.log(sourceUrl, "┌获取文章链接", log) rssArticle.link = NetworkUtils.getAbsoluteURL(sourceUrl, analyzeRule.getString(ruleLink)) diff --git a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt index ee74215e6..db8a7c775 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt @@ -156,7 +156,7 @@ object BookChapterList { val nextTocRule = tocRule.nextTocUrl if (getNextUrl && !nextTocRule.isNullOrEmpty()) { Debug.log(bookSource.bookSourceUrl, "┌获取目录下一页列表", log) - analyzeRule.getStringList(nextTocRule, true)?.let { + analyzeRule.getStringList(nextTocRule, isUrl = true)?.let { for (item in it) { if (item != baseUrl) { nextUrlList.add(item) diff --git a/app/src/main/java/io/legado/app/model/webBook/BookContent.kt b/app/src/main/java/io/legado/app/model/webBook/BookContent.kt index e3ed695f0..c51a4e44e 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookContent.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookContent.kt @@ -112,7 +112,7 @@ object BookContent { var contentStr = content.toString() val replaceRegex = contentRule.replaceRegex if (!replaceRegex.isNullOrEmpty()) { - contentStr = analyzeRule.getString(replaceRegex, value = contentStr) + contentStr = analyzeRule.getString(replaceRegex, contentStr) } Debug.log(bookSource.bookSourceUrl, "┌获取章节名称") Debug.log(bookSource.bookSourceUrl, "└${bookChapter.title}") @@ -150,7 +150,7 @@ object BookContent { val nextUrlRule = contentRule.nextContentUrl if (!nextUrlRule.isNullOrEmpty()) { Debug.log(bookSource.bookSourceUrl, "┌获取正文下一页链接", printLog) - analyzeRule.getStringList(nextUrlRule, true)?.let { + analyzeRule.getStringList(nextUrlRule, isUrl = true)?.let { nextUrlList.addAll(it) } Debug.log(bookSource.bookSourceUrl, "└" + nextUrlList.joinToString(","), printLog) diff --git a/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt b/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt index 193a12339..ceb1b3b75 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookInfo.kt @@ -129,7 +129,7 @@ object BookInfo { } scope.ensureActive() Debug.log(bookSource.bookSourceUrl, "┌获取目录链接") - book.tocUrl = analyzeRule.getString(infoRule.tocUrl, true) + book.tocUrl = analyzeRule.getString(infoRule.tocUrl, isUrl = true) if (book.tocUrl.isEmpty()) book.tocUrl = redirectUrl if (book.tocUrl == redirectUrl) { book.tocHtml = body diff --git a/app/src/main/java/io/legado/app/model/webBook/BookList.kt b/app/src/main/java/io/legado/app/model/webBook/BookList.kt index e40501576..8bc9dacad 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookList.kt @@ -231,7 +231,7 @@ object BookList { } scope.ensureActive() Debug.log(bookSource.bookSourceUrl, "┌获取详情页链接", log) - searchBook.bookUrl = analyzeRule.getString(ruleBookUrl, true) + searchBook.bookUrl = analyzeRule.getString(ruleBookUrl, isUrl = true) if (searchBook.bookUrl.isEmpty()) { searchBook.bookUrl = baseUrl } From 89fae49fd31cedc934538621eb71ee538709c77f Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 11:16:45 +0800 Subject: [PATCH 022/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/model/analyzeRule/AnalyzeRule.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index bf685944e..6d3bae885 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -262,9 +262,10 @@ class AnalyzeRule( /** * 获取Element */ - fun getElement(ruleStr: String): Any? { + fun getElement(ruleStr: String, mContent: Any? = null): Any? { if (TextUtils.isEmpty(ruleStr)) return null var result: Any? = null + val content = mContent ?: this.content val ruleList = splitSourceRule(ruleStr, true) content?.let { o -> if (ruleList.isNotEmpty()) result = o @@ -295,8 +296,9 @@ class AnalyzeRule( * 获取列表 */ @Suppress("UNCHECKED_CAST") - fun getElements(ruleStr: String): List { + fun getElements(ruleStr: String, mContent: Any? = null): List { var result: Any? = null + val content = mContent ?: this.content val ruleList = splitSourceRule(ruleStr, true) content?.let { o -> if (ruleList.isNotEmpty()) result = o From 264f94994d4e7ca917c98487060c3f07db87538e Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 11:25:07 +0800 Subject: [PATCH 023/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/model/analyzeRule/AnalyzeRule.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 6d3bae885..45667c83a 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -267,8 +267,8 @@ class AnalyzeRule( var result: Any? = null val content = mContent ?: this.content val ruleList = splitSourceRule(ruleStr, true) - content?.let { o -> - if (ruleList.isNotEmpty()) result = o + if (content != null && ruleList.isNotEmpty()) { + result = content for (sourceRule in ruleList) { putRule(sourceRule.putMap) sourceRule.makeUpRule(result) @@ -300,8 +300,8 @@ class AnalyzeRule( var result: Any? = null val content = mContent ?: this.content val ruleList = splitSourceRule(ruleStr, true) - content?.let { o -> - if (ruleList.isNotEmpty()) result = o + if (content != null && ruleList.isNotEmpty()) { + result = content for (sourceRule in ruleList) { putRule(sourceRule.putMap) result?.let { From 85c2bdb930b1abe0f599d0536961e4e05ecfd65a Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 13:27:31 +0800 Subject: [PATCH 024/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/model/analyzeRule/AnalyzeRule.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 45667c83a..1e1b87915 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -262,10 +262,10 @@ class AnalyzeRule( /** * 获取Element */ - fun getElement(ruleStr: String, mContent: Any? = null): Any? { + fun getElement(ruleStr: String): Any? { if (TextUtils.isEmpty(ruleStr)) return null var result: Any? = null - val content = mContent ?: this.content + val content = this.content val ruleList = splitSourceRule(ruleStr, true) if (content != null && ruleList.isNotEmpty()) { result = content @@ -296,9 +296,9 @@ class AnalyzeRule( * 获取列表 */ @Suppress("UNCHECKED_CAST") - fun getElements(ruleStr: String, mContent: Any? = null): List { + fun getElements(ruleStr: String): List { var result: Any? = null - val content = mContent ?: this.content + val content = this.content val ruleList = splitSourceRule(ruleStr, true) if (content != null && ruleList.isNotEmpty()) { result = content From 9e2ef90337a12862e73bec30111f7078bc4e3c07 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 14:18:25 +0800 Subject: [PATCH 025/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 127a497a1..8d45f2344 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,6 +11,11 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! +**2021/10/26** + +* 修复朗读错误时提示不消失的bug +* 修复滚动阅读选择文字错位bug by DuShuYuan + **2021/10/24** * 修复夜间模式不随系统变化的bug From 5df6c303ad4f030c3fc2fb074a3a165916796f82 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 14:43:48 +0800 Subject: [PATCH 026/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/explore/ExploreDiffCallBack.kt | 34 ------------------- .../main/explore/ExploreDiffItemCallBack.kt | 20 +++++++++++ .../app/ui/main/explore/ExploreFragment.kt | 6 +--- 3 files changed, 21 insertions(+), 39 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffCallBack.kt create mode 100644 app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffItemCallBack.kt diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffCallBack.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffCallBack.kt deleted file mode 100644 index 7f3c7d020..000000000 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffCallBack.kt +++ /dev/null @@ -1,34 +0,0 @@ -package io.legado.app.ui.main.explore - -import androidx.recyclerview.widget.DiffUtil -import io.legado.app.data.entities.BookSource - - -class ExploreDiffCallBack( - private val oldItems: List, - private val newItems: List -) : - DiffUtil.Callback() { - - override fun getOldListSize(): Int { - return oldItems.size - } - - override fun getNewListSize(): Int { - return newItems.size - } - - override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - return true - } - - override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val oldItem = oldItems[oldItemPosition] - val newItem = newItems[newItemPosition] - if (oldItem.bookSourceName != newItem.bookSourceName) { - return false - } - return true - } - -} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffItemCallBack.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffItemCallBack.kt new file mode 100644 index 000000000..67d527d2a --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreDiffItemCallBack.kt @@ -0,0 +1,20 @@ +package io.legado.app.ui.main.explore + +import androidx.recyclerview.widget.DiffUtil +import io.legado.app.data.entities.BookSource + + +class ExploreDiffItemCallBack : DiffUtil.ItemCallback() { + + override fun areItemsTheSame(oldItem: BookSource, newItem: BookSource): Boolean { + return true + } + + override fun areContentsTheSame(oldItem: BookSource, newItem: BookSource): Boolean { + if (oldItem.bookSourceName != newItem.bookSourceName) { + return false + } + return true + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt index 65e61300a..80ccfef1d 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt @@ -9,7 +9,6 @@ import androidx.appcompat.widget.SearchView import androidx.core.view.isGone import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.legado.app.R @@ -128,10 +127,7 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo } exploreFlow.collect { binding.tvEmptyMsg.isGone = it.isNotEmpty() || searchView.query.isNotEmpty() - val diffResult = DiffUtil - .calculateDiff(ExploreDiffCallBack(ArrayList(adapter.getItems()), it)) - adapter.setItems(it) - diffResult.dispatchUpdatesTo(adapter) + adapter.setItems(it, ExploreDiffItemCallBack()) } } } From 23c57d61ae86c42ec387a04be2a0d55368694774 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 26 Oct 2021 15:26:44 +0800 Subject: [PATCH 027/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/widget/dialog/CodeDialog.kt | 3 ++- app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/CodeDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/CodeDialog.kt index 8be9c4bcf..3010e422b 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/CodeDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/CodeDialog.kt @@ -2,6 +2,7 @@ package io.legado.app.ui.widget.dialog import android.os.Bundle import android.view.View +import android.view.ViewGroup import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.databinding.DialogCodeViewBinding @@ -28,7 +29,7 @@ class CodeDialog() : BaseDialogFragment(R.layout.dialog_code_view) { override fun onStart() { super.onStart() - setLayout(0.9f, 0.9f) + setLayout(ViewGroup.LayoutParams.MATCH_PARENT, 0.9f) } override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt index 5cd23167d..3bc4f79c4 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt @@ -2,6 +2,7 @@ package io.legado.app.ui.widget.dialog import android.os.Bundle import android.view.View +import android.view.ViewGroup import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.databinding.DialogTextViewBinding @@ -43,7 +44,7 @@ class TextDialog() : BaseDialogFragment(R.layout.dialog_text_view) { override fun onStart() { super.onStart() - setLayout(0.9f, 0.9f) + setLayout(ViewGroup.LayoutParams.MATCH_PARENT, 0.9f) } override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { From 238f341015c40fc5e7a4b9fa6ed26a0f7e8b1018 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 27 Oct 2021 20:56:34 +0800 Subject: [PATCH 028/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/constant/AppConst.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index 70caafc8d..7ba4c73a1 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -21,7 +21,7 @@ object AppConst { const val UA_NAME = "User-Agent" - const val MAX_THREAD = 6 + const val MAX_THREAD = 9 val SCRIPT_ENGINE: ScriptEngine by lazy { ScriptEngineManager().getEngineByName("rhino") From 722efa9998a14f5fa0e89bf3d26b85069d35e7fd Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 28 Oct 2021 09:11:14 +0800 Subject: [PATCH 029/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/AppConst.kt | 3 +++ app/src/main/res/xml/about.xml | 18 +++++++++--------- app/src/main/res/xml/donate.xml | 12 ++++++------ 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index 7ba4c73a1..0f6317d46 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -106,6 +106,9 @@ object AppConst { var versionName: String = "" ) + /** + * The authority of a FileProvider defined in a element in your app's manifest. + */ const val authority = BuildConfig.APPLICATION_ID + ".fileProvider" } diff --git a/app/src/main/res/xml/about.xml b/app/src/main/res/xml/about.xml index 15a6c1523..e961053bd 100644 --- a/app/src/main/res/xml/about.xml +++ b/app/src/main/res/xml/about.xml @@ -4,8 +4,8 @@ diff --git a/app/src/main/res/xml/donate.xml b/app/src/main/res/xml/donate.xml index 5cca150ea..1b4d7af60 100644 --- a/app/src/main/res/xml/donate.xml +++ b/app/src/main/res/xml/donate.xml @@ -11,14 +11,14 @@ @@ -34,20 +34,20 @@ @@ -63,8 +63,8 @@ From dc5f09243ad08f6f13273852e24a8741b1cac7f5 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 29 Oct 2021 10:54:24 +0800 Subject: [PATCH 030/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/webBook/SearchModel.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt index 8a3fe58a3..2ff2ccc59 100644 --- a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt +++ b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt @@ -56,7 +56,12 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB if (searchGroup.isBlank()) { bookSourceList.addAll(appDb.bookSourceDao.allEnabled) } else { - bookSourceList.addAll(appDb.bookSourceDao.getEnabledByGroup(searchGroup)) + val sources = appDb.bookSourceDao.getEnabledByGroup(searchGroup) + if (sources.isEmpty()) { + bookSourceList.addAll(appDb.bookSourceDao.allEnabled) + } else { + bookSourceList.addAll(sources) + } } } else { searchPage++ From 3538db3fe599d3cad54562ec517e9ecebf99b8e0 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 29 Oct 2021 10:56:33 +0800 Subject: [PATCH 031/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/changesource/ChangeSourceViewModel.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt index 5771fde07..9249edc92 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceViewModel.kt @@ -116,7 +116,12 @@ class ChangeSourceViewModel(application: Application) : BaseViewModel(applicatio if (searchGroup.isBlank()) { bookSourceList.addAll(appDb.bookSourceDao.allEnabled) } else { - bookSourceList.addAll(appDb.bookSourceDao.getEnabledByGroup(searchGroup)) + val sources = appDb.bookSourceDao.getEnabledByGroup(searchGroup) + if (sources.isEmpty()) { + bookSourceList.addAll(appDb.bookSourceDao.allEnabled) + } else { + bookSourceList.addAll(sources) + } } searchStateData.postValue(true) initSearchPool() From 29e70299e2bee27c042c623daff8ec0867196122 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 2 Nov 2021 09:56:25 +0800 Subject: [PATCH 032/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/constant/AppPattern.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/constant/AppPattern.kt b/app/src/main/java/io/legado/app/constant/AppPattern.kt index 82cd13e4a..2c9d60130 100644 --- a/app/src/main/java/io/legado/app/constant/AppPattern.kt +++ b/app/src/main/java/io/legado/app/constant/AppPattern.kt @@ -29,5 +29,5 @@ object AppPattern { /** * 不发音段落判断 */ - val notReadAloudRegex = Regex("^(\\s|\\p{C}|\\p{P}|\\p{Z}|\\p{S})+\$") + val notReadAloudRegex = Regex("^(\\s|\\p{C}|\\p{P}|\\p{Z}|\\p{S})+$") } From c2c46a11aa2cf677e32f942f0c36038b5d49e4c7 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 2 Nov 2021 09:59:13 +0800 Subject: [PATCH 033/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 8d45f2344..149e98065 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,10 +11,11 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! -**2021/10/26** +**2021/11/02** * 修复朗读错误时提示不消失的bug * 修复滚动阅读选择文字错位bug by DuShuYuan +* 其它bug修复,最近在高苹果系统,更新比较少 **2021/10/24** From 237e20835cec9c03d9cfcbe71af9f5178a658579 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 2 Nov 2021 14:04:40 +0800 Subject: [PATCH 034/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drawable/{ic_remove.xml => ic_reduce.xml} | 0 app/src/main/res/layout/dialog_read_aloud.xml | 48 +++++++++++++++---- .../main/res/layout/view_detail_seek_bar.xml | 2 +- app/src/main/res/values-es-rES/strings.xml | 2 + app/src/main/res/values-ja-rJP/strings.xml | 2 + app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-zh-rHK/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values-zh/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 10 files changed, 55 insertions(+), 9 deletions(-) rename app/src/main/res/drawable/{ic_remove.xml => ic_reduce.xml} (100%) diff --git a/app/src/main/res/drawable/ic_remove.xml b/app/src/main/res/drawable/ic_reduce.xml similarity index 100% rename from app/src/main/res/drawable/ic_remove.xml rename to app/src/main/res/drawable/ic_reduce.xml diff --git a/app/src/main/res/layout/dialog_read_aloud.xml b/app/src/main/res/layout/dialog_read_aloud.xml index 180221729..f93ebc4f6 100644 --- a/app/src/main/res/layout/dialog_read_aloud.xml +++ b/app/src/main/res/layout/dialog_read_aloud.xml @@ -32,7 +32,8 @@ android:paddingBottom="10dp" android:text="@string/previous_chapter" android:textColor="@color/primaryText" - android:textSize="14sp" /> + android:textSize="14sp" + tools:ignore="TouchTargetSizeCheck" /> + android:textSize="14sp" + tools:ignore="TouchTargetSizeCheck" /> @@ -141,6 +143,7 @@ android:id="@+id/tv_timer" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textColor="@color/primaryText" android:text="@string/timer_m" /> @@ -175,17 +178,46 @@ android:layout_gravity="center_vertical" android:contentDescription="@string/flow_sys" android:text="@string/flow_sys" - tools:ignore="RtlHardcoded" /> + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> - + android:paddingLeft="6dp" + android:paddingRight="6dp" + android:gravity="center" + android:orientation="horizontal"> + + + + + + + + diff --git a/app/src/main/res/layout/view_detail_seek_bar.xml b/app/src/main/res/layout/view_detail_seek_bar.xml index 1b5adcf89..8ff8a3e2f 100644 --- a/app/src/main/res/layout/view_detail_seek_bar.xml +++ b/app/src/main/res/layout/view_detail_seek_bar.xml @@ -20,7 +20,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:contentDescription="@string/reduce" - android:src="@drawable/ic_remove" + android:src="@drawable/ic_reduce" android:background="?android:attr/selectableItemBackgroundBorderless" android:tint="@color/primaryText" /> diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index fc76b9c25..8c21d2461 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -902,5 +902,7 @@ 登录头 字体大小 当前字体大小:%.1f + 语速减 + 语速加 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 3db3094d9..9a780a16d 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -906,5 +906,7 @@ 登录头 字体大小 当前字体大小:%.1f + 语速减 + 语速加 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 497af4b2b..6318b9952 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -906,5 +906,7 @@ 登录头 字体大小 当前字体大小:%.1f + 语速减 + 语速加 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 179177f1d..c95631c01 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -903,5 +903,7 @@ 登录头 字体大小 当前字体大小:%.1f + 语速减 + 语速加 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0c6b605d1..8384e375d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -905,5 +905,7 @@ 登录头 字体大小 当前字体大小:%.1f + 语速减 + 语速加 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 2d865a2a2..1e966bab3 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -905,5 +905,7 @@ 登录头 字体大小 当前字体大小:%.1f + 语速减 + 语速加 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 681ac87ca..967010a8e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -906,5 +906,7 @@ login header font scale font scale:%.1f + 语速减 + 语速加 From de0cece1a8d90509c37eb2a29f82892be7a57fd8 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 2 Nov 2021 14:39:47 +0800 Subject: [PATCH 035/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 + .../app/ui/book/read/config/ReadAloudDialog.kt | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 149e98065..4ffedd9e0 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -15,6 +15,7 @@ * 修复朗读错误时提示不消失的bug * 修复滚动阅读选择文字错位bug by DuShuYuan +* 朗读语速调节添加微调按钮 * 其它bug修复,最近在高苹果系统,更新比较少 **2021/10/24** diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt index bbe5b060f..39911df6b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt @@ -64,7 +64,9 @@ class ReadAloudDialog : BaseDialogFragment(R.layout.dialog_read_aloud) { ivStop.setColorFilter(textColor) ivTimer.setColorFilter(textColor) tvTimer.setTextColor(textColor) + ivTtsSpeechReduce.setColorFilter(textColor) tvTtsSpeed.setTextColor(textColor) + ivTtsSpeechAdd.setColorFilter(textColor) ivCatalog.setColorFilter(textColor) tvCatalog.setTextColor(textColor) ivMainMenu.setColorFilter(textColor) @@ -112,6 +114,16 @@ class ReadAloudDialog : BaseDialogFragment(R.layout.dialog_read_aloud) { seekTtsSpeechRate.isEnabled = !isChecked upTtsSpeechRate() } + ivTtsSpeechReduce.setOnClickListener { + seekTtsSpeechRate.progress = AppConfig.ttsSpeechRate - 1 + AppConfig.ttsSpeechRate = AppConfig.ttsSpeechRate - 1 + upTtsSpeechRate() + } + ivTtsSpeechAdd.setOnClickListener { + seekTtsSpeechRate.progress = AppConfig.ttsSpeechRate + 1 + AppConfig.ttsSpeechRate = AppConfig.ttsSpeechRate + 1 + upTtsSpeechRate() + } //设置保存的默认值 seekTtsSpeechRate.progress = AppConfig.ttsSpeechRate seekTtsSpeechRate.setOnSeekBarChangeListener(object : SeekBarChangeListener { From c4c70fb197cb34db6568c44d1ef1e77104d3d1fa Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 3 Nov 2021 21:16:07 +0800 Subject: [PATCH 036/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/model/ReadBook.kt | 13 ++++++++++++- .../io/legado/app/ui/book/read/ReadBookViewModel.kt | 10 +--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index e7d105bad..cbf85bf4f 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -52,7 +52,6 @@ object ReadBook : CoroutineScope by MainScope() { durChapterIndex = book.durChapterIndex durChapterPos = book.durChapterPos isLocalBook = book.origin == BookType.local - chapterSize = book.totalChapterNum clearTextChapter() callBack?.upMenuView() callBack?.upPageAnim() @@ -63,6 +62,18 @@ object ReadBook : CoroutineScope by MainScope() { } } + fun upData(book: Book) { + ReadBook.book = book + chapterSize = appDb.bookChapterDao.getChapterCount(book.bookUrl) + if (durChapterIndex != book.durChapterIndex) { + durChapterIndex = book.durChapterIndex + durChapterPos = book.durChapterPos + clearTextChapter() + } + callBack?.upMenuView() + upWebBook(book) + } + fun upWebBook(book: Book) { if (book.origin == BookType.local) { bookSource = null diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index d5f016c18..34a026e8e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -68,16 +68,8 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } syncBookProgress(book) } else { - ReadBook.book = book - if (ReadBook.durChapterIndex != book.durChapterIndex) { - ReadBook.durChapterIndex = book.durChapterIndex - ReadBook.durChapterPos = book.durChapterPos - ReadBook.clearTextChapter() - } - ReadBook.callBack?.upMenuView() - ReadBook.upWebBook(book) + ReadBook.upData(book) isInitFinish = true - ReadBook.chapterSize = appDb.bookChapterDao.getChapterCount(book.bookUrl) if (ReadBook.chapterSize == 0) { if (book.tocUrl.isEmpty()) { loadBookInfo(book) From 61f90728a19d40b5cc9811ba11d731862a1e04dd Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 3 Nov 2021 22:54:56 +0800 Subject: [PATCH 037/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 4ffedd9e0..c9ae78b09 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,12 +11,16 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! +**2021/11/03** + +* 修复没有目录时进入阅读界面不自动更新目录的bug + **2021/11/02** * 修复朗读错误时提示不消失的bug * 修复滚动阅读选择文字错位bug by DuShuYuan * 朗读语速调节添加微调按钮 -* 其它bug修复,最近在高苹果系统,更新比较少 +* 其它bug修复,最近在搞苹果系统,更新比较少 **2021/10/24** From 4de11cb0ce89cb2d521ee27a10c2d12b0b6dd966 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 6 Nov 2021 22:22:26 +0800 Subject: [PATCH 038/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/BaseReadAloudService.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index c694a6da1..5c832ec14 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -275,14 +275,14 @@ abstract class BaseReadAloudService : BaseService(), override fun onAudioFocusChange(focusChange: Int) { when (focusChange) { AudioManager.AUDIOFOCUS_GAIN -> { - // 重新获得焦点, 可做恢复播放,恢复后台音量的操作 + AppLog.put("重新获得焦点, 恢复播放") if (!pause) resumeReadAloud() } AudioManager.AUDIOFOCUS_LOSS -> { - // 永久丢失焦点除非重新主动获取,这种情况是被其他播放器抢去了焦点, 为避免与其他播放器混音,可将音乐暂停 + AppLog.put("永久丢失焦点") } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { - // 暂时丢失焦点,这种情况是被其他应用申请了短暂的焦点,可压低后台音量 + AppLog.put("暂时丢失焦点, 暂停播放") if (!pause) pauseReadAloud(false) } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { From 77d830663e3eaa76458ce9be26eeeafc4011376b Mon Sep 17 00:00:00 2001 From: neihobatho <76517199+neihobatho@users.noreply.github.com> Date: Mon, 8 Nov 2021 13:17:00 +0800 Subject: [PATCH 039/102] Update strings.xml --- app/src/main/res/values-zh-rHK/strings.xml | 96 +++++++++++----------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index c95631c01..fc8c09771 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -389,10 +389,10 @@ 源URL (sourceUrl) 源分組 (sourceGroup) 分類 Url(sortUrl) - 并发率(concurrentRate) + 並發率(concurrentRate) 登錄 URL(loginUrl) - 登录UI(loginUi) - 登录检查JS(loginCheckJs) + 登錄UI(loginUi) + 登錄檢查JS(loginCheckJs) 源注釋(sourceComment) 搜索地址 (url) 發現地址規則 (url) @@ -431,9 +431,9 @@ 內容規則 (ruleContent) 樣式 (style) 鏈接規則 (ruleLink) - 校验关键字(checkKeyWord) + 校驗關鍵字(checkKeyWord) 操作(actions) - 购买标识(isPay) + 購買標誌(isPay) @@ -856,54 +856,54 @@ 未知錯誤 TXT不導出章節名 end - 关闭替换分组/开启添加分组 - 媒体按钮•上一首|下一首 + 關閉替換分組/開啟添加分組 + 媒體按鈕•上一首|下一首 上一段|下一段/上一章|下一章 - 及时翻页,翻页时会停顿一下 + 及時翻頁,翻頁時會停頓一下 校驗書源顯示詳細信息 書源校驗時顯示網絡請求步驟和時間 - 需登录 - 使用Cronet网络组件 - 上传URL - 下载URL规则 + 需登錄 + 使用Cronet網絡組件 + 上傳URL + 下載URL規則 響應時間排序 - 导出成功 - 路径 - 直链上传规则 - 用于导出书源书单时生成直链url - 拷贝播放Url - 设置源变量 - 设置书籍变量 - 注释 - 封面设置 - 设置默认封面样式 - 显示书名 - 封面上显示书名 - 显示作者 - 封面上显示作者 - 朗读上一段 - 朗读下一段 - 待下载 - 下载完成 - 下载失败 - 下载中 - 未知状态 + 導出成功 + 路徑 + 直鏈上傳規則 + 用於導出書源書單時生成直鏈url + 複製播放Url + 設置源變量 + 設置書籍變量 + 注釋 + 封面設置 + 設置默認封面樣式 + 顯示書名 + 封面上顯示書名 + 顯示作者 + 封面上顯示作者 + 朗讀上一段 + 朗讀下一段 + 待下載 + 下載完成 + 下載失敗 + 下載中 + 未知狀態 禁用源 - 删除源 - 购买 - 横屏双页 - 浏览器打开 - 拷贝url - 打开方式 - 是否使用外部浏览器打开? + 刪除源 + 購買 + 橫屏雙頁 + 瀏覽器打開 + 複製url + 打開方式 + 是否使用外部瀏覽器打開? 查看 - 打开 - 删除登录头 - 查看登录头 - 登录头 - 字体大小 - 当前字体大小:%.1f - 语速减 - 语速加 + 打開 + 刪除登錄頭 + 查看登錄頭 + 登錄頭 + 字體大小 + 當前字亂大小:%.1f + 語速减 + 語速加 From c8445593fee97aec8733114c09669593dd0b7dd0 Mon Sep 17 00:00:00 2001 From: neihobatho <76517199+neihobatho@users.noreply.github.com> Date: Mon, 8 Nov 2021 13:24:56 +0800 Subject: [PATCH 040/102] Update strings.xml --- app/src/main/res/values-zh-rTW/strings.xml | 62 +++++++++++----------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 8384e375d..b11a9b323 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -438,9 +438,9 @@ 內容規則(ruleContent) 樣式(style) 連結規則(ruleLink) - 校验关键字(checkKeyWord) + 校驗關鍵字(checkKeyWord) 操作(actions) - 购买标识(isPay) + 購買標誌(isPay) @@ -876,36 +876,36 @@ 複製播放Url 設定源變數 設定書籍變數 - 注释 - 封面设置 - 设置默认封面样式 - 显示书名 - 封面上显示书名 - 显示作者 - 封面上显示作者 - 朗读上一段 - 朗读下一段 - 待下载 - 下载完成 - 下载失败 - 下载中 - 未知状态 + 注釋 + 封面設置 + 設置默認封面樣式 + 顯示書名 + 封面上顯示書名 + 顯示作者 + 封面上顯示作者 + 朗讀上一段 + 朗讀下一段 + 待下載 + 下載完成 + 下載失敗 + 下載中 + 未知狀態 禁用源 - 删除源 - 购买 - 横屏双页 - 浏览器打开 - 拷贝url - 打开方式 - 是否使用外部浏览器打开? + 刪除源 + 購買 + 橫屏雙頁 + 瀏覽器打開 + 複製url + 打開方式 + 是否使用外部瀏覽器打開? 查看 - 打开 - 删除登录头 - 查看登录头 - 登录头 - 字体大小 - 当前字体大小:%.1f - 语速减 - 语速加 + 打開 + 刪除登錄頭 + 查看登錄頭 + 登錄頭 + 字體大小 + 當前字體大小:%.1f + 語速减 + 語速加 From 8e47b3c25121a54c79496a40c7446adc88ea139f Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 9 Nov 2021 09:36:32 +0800 Subject: [PATCH 041/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/BaseReadAloudService.kt | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 5c832ec14..9823148b4 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -44,10 +44,16 @@ abstract class BaseReadAloudService : BaseService(), } } - private lateinit var audioManager: AudioManager - private var mFocusRequest: AudioFocusRequestCompat? = null - private var broadcastReceiver: BroadcastReceiver? = null - private lateinit var mediaSessionCompat: MediaSessionCompat + private val audioManager: AudioManager by lazy { + getSystemService(Context.AUDIO_SERVICE) as AudioManager + } + private val mFocusRequest: AudioFocusRequestCompat by lazy { + MediaHelp.getFocusRequest(this) + } + private val mediaSessionCompat: MediaSessionCompat by lazy { + MediaSessionCompat(this, "readAloud") + } + private var hasFocus = requestFocus() internal val contentList = arrayListOf() internal var nowSpeak: Int = 0 internal var readAloudNumber: Int = 0 @@ -55,13 +61,18 @@ abstract class BaseReadAloudService : BaseService(), internal var pageIndex = 0 private var dsJob: Job? = null + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (AudioManager.ACTION_AUDIO_BECOMING_NOISY == intent.action) { + pauseReadAloud(true) + } + } + } + override fun onCreate() { super.onCreate() isRun = true pause = false - audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager - mFocusRequest = MediaHelp.getFocusRequest(this) - mediaSessionCompat = MediaSessionCompat(this, "readAloud") initMediaSession() initBroadcastReceiver() upNotification() @@ -258,13 +269,6 @@ abstract class BaseReadAloudService : BaseService(), * 断开耳机监听 */ private fun initBroadcastReceiver() { - broadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (AudioManager.ACTION_AUDIO_BECOMING_NOISY == intent.action) { - pauseReadAloud(true) - } - } - } val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY) registerReceiver(broadcastReceiver, intentFilter) } @@ -276,13 +280,18 @@ abstract class BaseReadAloudService : BaseService(), when (focusChange) { AudioManager.AUDIOFOCUS_GAIN -> { AppLog.put("重新获得焦点, 恢复播放") + hasFocus = true if (!pause) resumeReadAloud() } AudioManager.AUDIOFOCUS_LOSS -> { AppLog.put("永久丢失焦点") + if (!hasFocus) { + pauseReadAloud(true) + } } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { AppLog.put("暂时丢失焦点, 暂停播放") + hasFocus = false if (!pause) pauseReadAloud(false) } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { @@ -356,4 +365,5 @@ abstract class BaseReadAloudService : BaseService(), stopSelf() } } + } \ No newline at end of file From 3244cc9ccde5b98398666ac2aecc0f410531db6c Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 9 Nov 2021 11:47:14 +0800 Subject: [PATCH 042/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/service/BaseReadAloudService.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 9823148b4..49e2a907e 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -53,7 +53,7 @@ abstract class BaseReadAloudService : BaseService(), private val mediaSessionCompat: MediaSessionCompat by lazy { MediaSessionCompat(this, "readAloud") } - private var hasFocus = requestFocus() + private var audioFocusLossTransient = false internal val contentList = arrayListOf() internal var nowSpeak: Int = 0 internal var readAloudNumber: Int = 0 @@ -280,18 +280,18 @@ abstract class BaseReadAloudService : BaseService(), when (focusChange) { AudioManager.AUDIOFOCUS_GAIN -> { AppLog.put("重新获得焦点, 恢复播放") - hasFocus = true + audioFocusLossTransient = false if (!pause) resumeReadAloud() } AudioManager.AUDIOFOCUS_LOSS -> { AppLog.put("永久丢失焦点") - if (!hasFocus) { + if (audioFocusLossTransient) { pauseReadAloud(true) } } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { AppLog.put("暂时丢失焦点, 暂停播放") - hasFocus = false + audioFocusLossTransient = true if (!pause) pauseReadAloud(false) } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { From ba07fc49386fa22b643fdefe2f18f0a8d76ae287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=AD=90=E5=B0=A2=E4=B9=82?= Date: Tue, 9 Nov 2021 16:40:19 +0800 Subject: [PATCH 043/102] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ed61c6013..baef2b894 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,9 @@ Legado / 开源阅读 #### Telegram [![Telegram-group](https://img.shields.io/badge/Telegram-%E7%BE%A4%E7%BB%84-blue)](https://t.me/yueduguanfang) [![Telegram-channel](https://img.shields.io/badge/Telegram-%E9%A2%91%E9%81%93-blue)](https://t.me/legado_channels) -[![Telegram-group](https://img.shields.io/badge/Telegram-group-blue)](https://t.me/yueduguanfang) [![Telegram-channel](https://img.shields.io/badge/Telegram-channel-blue)](https://t.me/legado_channels) + +#### Discord +[![Discord](https://img.shields.io/discord/560731361414086666?color=%235865f2&label=Discord)](https://discord.gg/VtUfRyzRXn) #### Other https://www.yuque.com/legado/wiki/community From 4549e7ec6b4e088b56c316b37b8fa393d810bb9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=AD=90=E5=B0=A2=E4=B9=82?= Date: Tue, 9 Nov 2021 17:08:48 +0800 Subject: [PATCH 044/102] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index baef2b894..ddbb7af13 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Legado / 开源阅读
gedoor.github.io / legado.top +
+Legado is a free and open source novel reader for Android. [![](https://img.shields.io/badge/-Contents:-696969.svg)](#contents) [![](https://img.shields.io/badge/-Function-F5F5F5.svg)](#Function-主要功能-) [![](https://img.shields.io/badge/-Download-F5F5F5.svg)](#Download-下载-) [![](https://img.shields.io/badge/-Community-F5F5F5.svg)](#Community-交流社区-) [![](https://img.shields.io/badge/-API-F5F5F5.svg)](#API-) [![](https://img.shields.io/badge/-Other-F5F5F5.svg)](#Other-其他-) [![](https://img.shields.io/badge/-Grateful-F5F5F5.svg)](#Grateful-感谢-) [![](https://img.shields.io/badge/-Interface-F5F5F5.svg)](#Interface-界面-) From 935dcc89ae2d63ff4b298ccf559e0762123f41cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=AD=90=E5=B0=A2=E4=B9=82?= Date: Tue, 9 Nov 2021 17:28:46 +0800 Subject: [PATCH 045/102] Update README.md --- README.md | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ddbb7af13..e05e6f1c7 100644 --- a/README.md +++ b/README.md @@ -22,15 +22,28 @@ Legado is a free and open source novel reader for Android. >看看 [官方帮助文档](https://www.yuque.com/legado/wiki),也许里面就有你要的答案。 # Function-主要功能 [![](https://img.shields.io/badge/-Function-F5F5F5.svg)](#Function-主要功能-) -1. 自定义书源,自己设置规则,抓取网页数据,规则简单易懂,软件内有规则说明。 -2. 列表书架,网格书架自由切换。 -3. 书源规则支持搜索及发现,所有找书看书功能全部自定义,找书更方便。 -4. 订阅内容,可以订阅想看的任何内容,看你想看 -5. 支持替换净化,去除广告替换内容很方便。 -6. 支持本地TXT、EPUB阅读,手动浏览,智能扫描。 -7. 支持高度自定义阅读界面,切换字体、颜色、背景、行距、段距、加粗、简繁转换等。 -8. 支持多种翻页模式,覆盖、仿真、滑动、滚动等。 -9. 软件开源,持续优化,无广告。 +
English +1. Online reading from a variety of sources.
+2. Local reading of downloaded content.
+3. A configurable reader with multiple viewers, reading directions and other settings.
+4. Categories to organize your library.
+5. Light and dark themes.
+6. Schedule updating your library for new chapters.
+7. read offline or to your desired cloud service +
+ +
中文 +1.自定义书源,自己设置规则,抓取网页数据,规则简单易懂,软件内有规则说明。
+2.列表书架,网格书架自由切换。
+3.书源规则支持搜索及发现,所有找书看书功能全部自定义,找书更方便。
+4.订阅内容,可以订阅想看的任何内容,看你想看
+5.支持替换净化,去除广告替换内容很方便。
+6.支持本地TXT、EPUB阅读,手动浏览,智能扫描。
+7.支持高度自定义阅读界面,切换字体、颜色、背景、行距、段距、加粗、简繁转换等。
+8.支持多种翻页模式,覆盖、仿真、滑动、滚动等。
+9.软件开源,持续优化,无广告。 +
+ # From c1a845185ca2141343f9c7eaaee2120502fae3e7 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 10 Nov 2021 13:40:02 +0800 Subject: [PATCH 046/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/model/webBook/SearchModel.kt | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt index 2ff2ccc59..97d897759 100644 --- a/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt +++ b/app/src/main/java/io/legado/app/model/webBook/SearchModel.kt @@ -79,20 +79,22 @@ class SearchModel(private val scope: CoroutineScope, private val callBack: CallB } searchIndex++ val source = bookSourceList[searchIndex] - val task = WebBook.searchBook( - scope, - source, - searchKey, - searchPage, - context = searchPool!! - ).timeout(30000L) - .onSuccess(searchPool) { - onSuccess(searchId, it) - } - .onFinally(searchPool) { - onFinally(searchId) - } - tasks.add(task) + searchPool?.let { searchPool -> + val task = WebBook.searchBook( + scope, + source, + searchKey, + searchPage, + context = searchPool + ).timeout(30000L) + .onSuccess(searchPool) { + onSuccess(searchId, it) + } + .onFinally(searchPool) { + onFinally(searchId) + } + tasks.add(task) + } } @Synchronized From b693cb79d39466aa89678d0bba313893a764a55b Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 13 Nov 2021 19:26:17 +0800 Subject: [PATCH 047/102] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E9=80=89=E6=8B=A9=E5=99=A8=E5=87=BA?= =?UTF-8?q?=E9=94=99=E6=97=B6=E8=87=AA=E5=8A=A8=E6=89=93=E5=BC=80=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E6=96=87=E4=BB=B6=E5=A4=B9=E9=80=89=E6=8B=A9=E5=99=A8?= =?UTF-8?q?,=E9=83=A8=E5=88=86=E7=B3=BB=E7=BB=9F=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E9=80=89=E6=8B=A9=E5=99=A8=E8=A2=AB=E9=98=89=E5=89=B2?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/document/HandleFileActivity.kt | 12 +++++++++++- app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt b/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt index 52715eb5a..10916635a 100644 --- a/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt +++ b/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt @@ -79,7 +79,17 @@ class HandleFileActivity : alert(title) { items(selectList) { _, item, _ -> when (item.value) { - HandleFileContract.DIR -> selectDocTree.launch(null) + HandleFileContract.DIR -> kotlin.runCatching { + selectDocTree.launch(null) + }.onFailure { + toastOnUi(R.string.open_sys_dir_picker_error) + checkPermissions { + FilePickerDialog.show( + supportFragmentManager, + mode = HandleFileContract.DIR + ) + } + } HandleFileContract.FILE -> selectDoc.launch(typesOfExtensions(allowExtensions)) 10 -> checkPermissions { FilePickerDialog.show( diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 8c21d2461..dd6a2d5e8 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -904,5 +904,6 @@ 当前字体大小:%.1f 语速减 语速加 + 打开系统文件夹选择器出错,自动打开应用文件夹选择器 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 9a780a16d..4ac6c352f 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -908,5 +908,6 @@ 当前字体大小:%.1f 语速减 语速加 + 打开系统文件夹选择器出错,自动打开应用文件夹选择器 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6318b9952..ecc78d85d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -908,5 +908,6 @@ 当前字体大小:%.1f 语速减 语速加 + 打开系统文件夹选择器出错,自动打开应用文件夹选择器 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index fc8c09771..3ce737859 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -905,5 +905,6 @@ 當前字亂大小:%.1f 語速减 語速加 + 打开系统文件夹选择器出错,自动打开应用文件夹选择器 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b11a9b323..ed32c1f1e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -907,5 +907,6 @@ 當前字體大小:%.1f 語速减 語速加 + 打开系统文件夹选择器出错,自动打开应用文件夹选择器 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 1e966bab3..776beec37 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -907,5 +907,6 @@ 当前字体大小:%.1f 语速减 语速加 + 打开系统文件夹选择器出错,自动打开应用文件夹选择器 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 967010a8e..d32a0631b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -908,5 +908,6 @@ font scale:%.1f 语速减 语速加 + 打开系统文件夹选择器出错,自动打开应用文件夹选择器 From 7c4e2cfba62a875d38dd92180d64541b082e4d23 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 13 Nov 2021 19:26:56 +0800 Subject: [PATCH 048/102] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E9=80=89=E6=8B=A9=E5=99=A8=E5=87=BA?= =?UTF-8?q?=E9=94=99=E6=97=B6=E8=87=AA=E5=8A=A8=E6=89=93=E5=BC=80=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E6=96=87=E4=BB=B6=E5=A4=B9=E9=80=89=E6=8B=A9=E5=99=A8?= =?UTF-8?q?,=E9=83=A8=E5=88=86=E7=B3=BB=E7=BB=9F=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E9=80=89=E6=8B=A9=E5=99=A8=E8=A2=AB=E9=98=89=E5=89=B2?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index c9ae78b09..e31183bc7 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,9 +11,10 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! -**2021/11/03** +**2021/11/13** * 修复没有目录时进入阅读界面不自动更新目录的bug +* 使用系统文件夹选择器出错时自动打开应用文件夹选择器,部分系统文件夹选择器被阉割了 **2021/11/02** From e2d187f38a71b499b5657e74db58730e384310c5 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 13 Nov 2021 19:36:42 +0800 Subject: [PATCH 049/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wsa.bat | 1 - 1 file changed, 1 deletion(-) delete mode 100644 wsa.bat diff --git a/wsa.bat b/wsa.bat deleted file mode 100644 index c9bb23c6b..000000000 --- a/wsa.bat +++ /dev/null @@ -1 +0,0 @@ -adb connect 127.0.0.1:58526 \ No newline at end of file From 493524b4029d20325a6e62f67c1fe673c125f761 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 14 Nov 2021 17:43:17 +0800 Subject: [PATCH 050/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/model/localBook/EpubFile.kt | 27 +- .../ag2s/epublib/domain/TableOfContents.java | 424 +++++++++--------- 2 files changed, 225 insertions(+), 226 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index 8e526b60f..a903ed654 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt @@ -119,23 +119,18 @@ class EpubFile(var book: Book) { private fun getContent(chapter: BookChapter): String? { /*获取当前章节文本*/ - return getChildChapter(chapter, chapter.url) - } - - private fun getChildChapter(chapter: BookChapter, href: String): String? { epubBook?.let { - val body = Jsoup.parse(String(it.resources.getByHref(href).data, mCharset)).body() - - if (chapter.url == href) { - val startFragmentId = chapter.startFragmentId - val endFragmentId = chapter.endFragmentId - /*一些书籍依靠href索引的resource会包含多个章节,需要依靠fragmentId来截取到当前章节的内容*/ - /*注:这里较大增加了内容加载的时间,所以首次获取内容后可存储到本地cache,减少重复加载*/ - if (!startFragmentId.isNullOrBlank()) - body.getElementById(startFragmentId)?.previousElementSiblings()?.remove() - if (!endFragmentId.isNullOrBlank() && endFragmentId != startFragmentId) - body.getElementById(endFragmentId)?.nextElementSiblings()?.remove() - } + val body = + Jsoup.parse(String(it.resources.getByHref(chapter.url).data, mCharset)).body() + + val startFragmentId = chapter.startFragmentId + val endFragmentId = chapter.endFragmentId + /*一些书籍依靠href索引的resource会包含多个章节,需要依靠fragmentId来截取到当前章节的内容*/ + /*注:这里较大增加了内容加载的时间,所以首次获取内容后可存储到本地cache,减少重复加载*/ + if (!startFragmentId.isNullOrBlank()) + body.getElementById(startFragmentId)?.previousElementSiblings()?.remove() + if (!endFragmentId.isNullOrBlank() && endFragmentId != startFragmentId) + body.getElementById(endFragmentId)?.nextElementSiblings()?.remove() /*选择去除正文中的H标签,部分书籍标题与阅读标题重复待优化*/ var tag = Book.hTag diff --git a/epublib/src/main/java/me/ag2s/epublib/domain/TableOfContents.java b/epublib/src/main/java/me/ag2s/epublib/domain/TableOfContents.java index 6c268358d..7692d258d 100644 --- a/epublib/src/main/java/me/ag2s/epublib/domain/TableOfContents.java +++ b/epublib/src/main/java/me/ag2s/epublib/domain/TableOfContents.java @@ -10,251 +10,255 @@ import java.util.Set; /** * The table of contents of the book. * The TableOfContents is a tree structure at the root it is a list of TOCReferences, each if which may have as children another list of TOCReferences. - * + *

* The table of contents is used by epub as a quick index to chapters and sections within chapters. * It may contain duplicate entries, may decide to point not to certain chapters, etc. - * + *

* See the spine for the complete list of sections in the order in which they should be read. * - * @see Spine - * * @author paul + * @see Spine */ public class TableOfContents implements Serializable { - private static final long serialVersionUID = -3147391239966275152L; + private static final long serialVersionUID = -3147391239966275152L; - public static final String DEFAULT_PATH_SEPARATOR = "/"; + public static final String DEFAULT_PATH_SEPARATOR = "/"; - private List tocReferences; + private List tocReferences; - public TableOfContents() { - this(new ArrayList<>()); - } - - public TableOfContents(List tocReferences) { - this.tocReferences = tocReferences; - } - - public List getTocReferences() { - return tocReferences; - } - - public void setTocReferences(List tocReferences) { - this.tocReferences = tocReferences; - } + public TableOfContents() { + this(new ArrayList<>()); + } - /** - * Calls addTOCReferenceAtLocation after splitting the path using the DEFAULT_PATH_SEPARATOR. - * @return the new TOCReference - */ - @SuppressWarnings("unused") - public TOCReference addSection(Resource resource, String path) { - return addSection(resource, path, DEFAULT_PATH_SEPARATOR); - } + public TableOfContents(List tocReferences) { + this.tocReferences = tocReferences; + } - /** - * Calls addTOCReferenceAtLocation after splitting the path using the given pathSeparator. - * - * @param resource resource - * @param path path - * @param pathSeparator pathSeparator - * @return the new TOCReference - */ - public TOCReference addSection(Resource resource, String path, - String pathSeparator) { - String[] pathElements = path.split(pathSeparator); - return addSection(resource, pathElements); - } + public List getTocReferences() { + return tocReferences; + } - /** - * Finds the first TOCReference in the given list that has the same title as the given Title. - * - * @param title title - * @param tocReferences tocReferences - * @return null if not found. - */ - private static TOCReference findTocReferenceByTitle(String title, - List tocReferences) { - for (TOCReference tocReference : tocReferences) { - if (title.equals(tocReference.getTitle())) { - return tocReference; - } + public void setTocReferences(List tocReferences) { + this.tocReferences = tocReferences; } - return null; - } - /** - * Adds the given Resources to the TableOfContents at the location specified by the pathElements. - * - * Example: - * Calling this method with a Resource and new String[] {"chapter1", "paragraph1"} will result in the following: - *

    - *
  • a TOCReference with the title "chapter1" at the root level.
    - * If this TOCReference did not yet exist it will have been created and does not point to any resource
  • - *
  • A TOCReference that has the title "paragraph1". This TOCReference will be the child of TOCReference "chapter1" and - * will point to the given Resource
  • - *
- * - * @param resource resource - * @param pathElements pathElements - * @return the new TOCReference - */ - public TOCReference addSection(Resource resource, String[] pathElements) { - if (pathElements == null || pathElements.length == 0) { - return null; + /** + * Calls addTOCReferenceAtLocation after splitting the path using the DEFAULT_PATH_SEPARATOR. + * + * @return the new TOCReference + */ + @SuppressWarnings("unused") + public TOCReference addSection(Resource resource, String path) { + return addSection(resource, path, DEFAULT_PATH_SEPARATOR); } - TOCReference result = null; - List currentTocReferences = this.tocReferences; - for (String currentTitle : pathElements) { - result = findTocReferenceByTitle(currentTitle, currentTocReferences); - if (result == null) { - result = new TOCReference(currentTitle, null); - currentTocReferences.add(result); - } - currentTocReferences = result.getChildren(); + + /** + * Calls addTOCReferenceAtLocation after splitting the path using the given pathSeparator. + * + * @param resource resource + * @param path path + * @param pathSeparator pathSeparator + * @return the new TOCReference + */ + public TOCReference addSection(Resource resource, String path, + String pathSeparator) { + String[] pathElements = path.split(pathSeparator); + return addSection(resource, pathElements); } - result.setResource(resource); - return result; - } - /** - * Adds the given Resources to the TableOfContents at the location specified by the pathElements. - * - * Example: - * Calling this method with a Resource and new int[] {0, 0} will result in the following: - *
    - *
  • a TOCReference at the root level.
    - * If this TOCReference did not yet exist it will have been created with a title of "" and does not point to any resource
  • - *
  • A TOCReference that points to the given resource and is a child of the previously created TOCReference.
    - * If this TOCReference didn't exist yet it will be created and have a title of ""
  • - *
- * - * @param resource resource - * @param pathElements pathElements - * @return the new TOCReference - */ - @SuppressWarnings("unused") - public TOCReference addSection(Resource resource, int[] pathElements, - String sectionTitlePrefix, String sectionNumberSeparator) { - if (pathElements == null || pathElements.length == 0) { - return null; + /** + * Finds the first TOCReference in the given list that has the same title as the given Title. + * + * @param title title + * @param tocReferences tocReferences + * @return null if not found. + */ + private static TOCReference findTocReferenceByTitle(String title, + List tocReferences) { + for (TOCReference tocReference : tocReferences) { + if (title.equals(tocReference.getTitle())) { + return tocReference; + } + } + return null; } - TOCReference result = null; - List currentTocReferences = this.tocReferences; - for (int i = 0; i < pathElements.length; i++) { - int currentIndex = pathElements[i]; - if (currentIndex > 0 && currentIndex < (currentTocReferences.size() - - 1)) { - result = currentTocReferences.get(currentIndex); - } else { - result = null; - } - if (result == null) { - paddTOCReferences(currentTocReferences, pathElements, i, - sectionTitlePrefix, sectionNumberSeparator); - result = currentTocReferences.get(currentIndex); - } - currentTocReferences = result.getChildren(); + + /** + * Adds the given Resources to the TableOfContents at the location specified by the pathElements. + *

+ * Example: + * Calling this method with a Resource and new String[] {"chapter1", "paragraph1"} will result in the following: + *

    + *
  • a TOCReference with the title "chapter1" at the root level.
    + * If this TOCReference did not yet exist it will have been created and does not point to any resource
  • + *
  • A TOCReference that has the title "paragraph1". This TOCReference will be the child of TOCReference "chapter1" and + * will point to the given Resource
  • + *
+ * + * @param resource resource + * @param pathElements pathElements + * @return the new TOCReference + */ + public TOCReference addSection(Resource resource, String[] pathElements) { + if (pathElements == null || pathElements.length == 0) { + return null; + } + TOCReference result = null; + List currentTocReferences = this.tocReferences; + for (String currentTitle : pathElements) { + result = findTocReferenceByTitle(currentTitle, currentTocReferences); + if (result == null) { + result = new TOCReference(currentTitle, null); + currentTocReferences.add(result); + } + currentTocReferences = result.getChildren(); + } + result.setResource(resource); + return result; } - result.setResource(resource); - return result; - } - private void paddTOCReferences(List currentTocReferences, - int[] pathElements, int pathPos, String sectionPrefix, - String sectionNumberSeparator) { - for (int i = currentTocReferences.size(); i <= pathElements[pathPos]; i++) { - String sectionTitle = createSectionTitle(pathElements, pathPos, i, - sectionPrefix, - sectionNumberSeparator); - currentTocReferences.add(new TOCReference(sectionTitle, null)); + /** + * Adds the given Resources to the TableOfContents at the location specified by the pathElements. + *

+ * Example: + * Calling this method with a Resource and new int[] {0, 0} will result in the following: + *

    + *
  • a TOCReference at the root level.
    + * If this TOCReference did not yet exist it will have been created with a title of "" and does not point to any resource
  • + *
  • A TOCReference that points to the given resource and is a child of the previously created TOCReference.
    + * If this TOCReference didn't exist yet it will be created and have a title of ""
  • + *
+ * + * @param resource resource + * @param pathElements pathElements + * @return the new TOCReference + */ + @SuppressWarnings("unused") + public TOCReference addSection(Resource resource, int[] pathElements, + String sectionTitlePrefix, String sectionNumberSeparator) { + if (pathElements == null || pathElements.length == 0) { + return null; + } + TOCReference result = null; + List currentTocReferences = this.tocReferences; + for (int i = 0; i < pathElements.length; i++) { + int currentIndex = pathElements[i]; + if (currentIndex > 0 && currentIndex < (currentTocReferences.size() + - 1)) { + result = currentTocReferences.get(currentIndex); + } else { + result = null; + } + if (result == null) { + paddTOCReferences(currentTocReferences, pathElements, i, + sectionTitlePrefix, sectionNumberSeparator); + result = currentTocReferences.get(currentIndex); + } + currentTocReferences = result.getChildren(); + } + result.setResource(resource); + return result; } - } - private String createSectionTitle(int[] pathElements, int pathPos, - int lastPos, - String sectionPrefix, String sectionNumberSeparator) { - StringBuilder title = new StringBuilder(sectionPrefix); - for (int i = 0; i < pathPos; i++) { - if (i > 0) { - title.append(sectionNumberSeparator); - } - title.append(pathElements[i] + 1); + private void paddTOCReferences(List currentTocReferences, + int[] pathElements, int pathPos, String sectionPrefix, + String sectionNumberSeparator) { + for (int i = currentTocReferences.size(); i <= pathElements[pathPos]; i++) { + String sectionTitle = createSectionTitle(pathElements, pathPos, i, + sectionPrefix, + sectionNumberSeparator); + currentTocReferences.add(new TOCReference(sectionTitle, null)); + } } - if (pathPos > 0) { - title.append(sectionNumberSeparator); + + private String createSectionTitle(int[] pathElements, int pathPos, + int lastPos, + String sectionPrefix, String sectionNumberSeparator) { + StringBuilder title = new StringBuilder(sectionPrefix); + for (int i = 0; i < pathPos; i++) { + if (i > 0) { + title.append(sectionNumberSeparator); + } + title.append(pathElements[i] + 1); + } + if (pathPos > 0) { + title.append(sectionNumberSeparator); + } + title.append(lastPos + 1); + return title.toString(); } - title.append(lastPos + 1); - return title.toString(); - } - public TOCReference addTOCReference(TOCReference tocReference) { - if (tocReferences == null) { - tocReferences = new ArrayList<>(); + public TOCReference addTOCReference(TOCReference tocReference) { + if (tocReferences == null) { + tocReferences = new ArrayList<>(); + } + tocReferences.add(tocReference); + return tocReference; } - tocReferences.add(tocReference); - return tocReference; - } - /** - * All unique references (unique by href) in the order in which they are referenced to in the table of contents. - * - * @return All unique references (unique by href) in the order in which they are referenced to in the table of contents. - */ - public List getAllUniqueResources() { - Set uniqueHrefs = new HashSet<>(); - List result = new ArrayList<>(); - getAllUniqueResources(uniqueHrefs, result, tocReferences); - return result; - } + /** + * All unique references (unique by href) in the order in which they are referenced to in the table of contents. + * + * @return All unique references (unique by href) in the order in which they are referenced to in the table of contents. + */ + public List getAllUniqueResources() { + Set uniqueHrefs = new HashSet<>(); + List result = new ArrayList<>(); + getAllUniqueResources(uniqueHrefs, result, tocReferences); + return result; + } - private static void getAllUniqueResources(Set uniqueHrefs, - List result, List tocReferences) { - for (TOCReference tocReference : tocReferences) { - Resource resource = tocReference.getResource(); - if (resource != null && !uniqueHrefs.contains(resource.getHref())) { - uniqueHrefs.add(resource.getHref()); - result.add(resource); - } - getAllUniqueResources(uniqueHrefs, result, tocReference.getChildren()); + private static void getAllUniqueResources( + Set uniqueHrefs, + List result, + List tocReferences + ) { + for (TOCReference tocReference : tocReferences) { + Resource resource = tocReference.getResource(); + if (resource != null && !uniqueHrefs.contains(resource.getHref())) { + uniqueHrefs.add(resource.getHref()); + result.add(resource); + } + getAllUniqueResources(uniqueHrefs, result, tocReference.getChildren()); + } } - } - /** - * The total number of references in this table of contents. - * - * @return The total number of references in this table of contents. - */ - public int size() { - return getTotalSize(tocReferences); - } + /** + * The total number of references in this table of contents. + * + * @return The total number of references in this table of contents. + */ + public int size() { + return getTotalSize(tocReferences); + } - private static int getTotalSize(Collection tocReferences) { - int result = tocReferences.size(); - for (TOCReference tocReference : tocReferences) { - result += getTotalSize(tocReference.getChildren()); + private static int getTotalSize(Collection tocReferences) { + int result = tocReferences.size(); + for (TOCReference tocReference : tocReferences) { + result += getTotalSize(tocReference.getChildren()); + } + return result; } - return result; - } - /** - * The maximum depth of the reference tree - * @return The maximum depth of the reference tree - */ - public int calculateDepth() { - return calculateDepth(tocReferences, 0); - } + /** + * The maximum depth of the reference tree + * + * @return The maximum depth of the reference tree + */ + public int calculateDepth() { + return calculateDepth(tocReferences, 0); + } - private int calculateDepth(List tocReferences, - int currentDepth) { - int maxChildDepth = 0; - for (TOCReference tocReference : tocReferences) { - int childDepth = calculateDepth(tocReference.getChildren(), 1); - if (childDepth > maxChildDepth) { - maxChildDepth = childDepth; - } + private int calculateDepth(List tocReferences, + int currentDepth) { + int maxChildDepth = 0; + for (TOCReference tocReference : tocReferences) { + int childDepth = calculateDepth(tocReference.getChildren(), 1); + if (childDepth > maxChildDepth) { + maxChildDepth = childDepth; + } + } + return currentDepth + maxChildDepth; } - return currentDepth + maxChildDepth; - } } From bcd815b05a3bd5119034c8eeeda28fc7b46a24b9 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 14 Nov 2021 18:17:30 +0800 Subject: [PATCH 051/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index e31183bc7..bb832cd7f 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -21,7 +21,6 @@ * 修复朗读错误时提示不消失的bug * 修复滚动阅读选择文字错位bug by DuShuYuan * 朗读语速调节添加微调按钮 -* 其它bug修复,最近在搞苹果系统,更新比较少 **2021/10/24** From fe06d2ad7eb921c46bfde5cbd969b26821190649 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 15 Nov 2021 20:47:24 +0800 Subject: [PATCH 052/102] =?UTF-8?q?=E5=8F=8C=E9=A1=B5=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E4=B8=BA=E5=B9=B3=E6=9D=BF=E6=97=B6=E4=B8=8D=E5=9C=A8=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=BA=95=E5=92=8C=E9=AB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/page/provider/ChapterProvider.kt | 2 +- app/src/main/java/io/legado/app/utils/ContextExtensions.kt | 6 ++++++ app/src/main/res/values-es-rES/strings.xml | 3 ++- app/src/main/res/values-ja-rJP/strings.xml | 3 ++- app/src/main/res/values-pt-rBR/strings.xml | 3 ++- app/src/main/res/values-zh-rHK/strings.xml | 3 ++- app/src/main/res/values-zh-rTW/strings.xml | 3 ++- app/src/main/res/values-zh/strings.xml | 3 ++- app/src/main/res/values/strings.xml | 3 ++- app/src/main/res/xml/pref_config_read.xml | 2 +- 10 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt index 2e4f4713b..556f26df1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt @@ -591,7 +591,7 @@ object ChapterProvider { * 更新绘制尺寸 */ fun upLayout() { - doublePage = viewWidth > viewHeight + doublePage = (viewWidth > viewHeight || appCtx.isPad) && ReadBook.pageAnim() != 3 && AppConfig.doublePageHorizontal if (viewWidth > 0 && viewHeight > 0) { diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index 7d90fff72..d181da779 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -10,6 +10,7 @@ import android.app.Service import android.content.* import android.content.pm.PackageManager import android.content.res.ColorStateList +import android.content.res.Configuration import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.net.Uri @@ -291,6 +292,11 @@ fun Context.openFileUri(uri: Uri, type: String? = null) { } } +val Context.isPad: Boolean + get() { + return resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_LARGE + } + val Context.channel: String get() { try { diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index dd6a2d5e8..0173019c5 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -890,7 +890,7 @@ 禁用源 删除源 购买 - 横屏双页 + 平板/横屏双页 浏览器打开 拷贝url 打开方式 @@ -905,5 +905,6 @@ 语速减 语速加 打开系统文件夹选择器出错,自动打开应用文件夹选择器 + 展开文本选择菜单 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 4ac6c352f..cdc494ae4 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -894,7 +894,7 @@ 禁用源 删除源 购买 - 横屏双页 + 平板/横屏双页 浏览器打开 拷贝url 打开方式 @@ -909,5 +909,6 @@ 语速减 语速加 打开系统文件夹选择器出错,自动打开应用文件夹选择器 + 展开文本选择菜单 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ecc78d85d..e8c7e94d1 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -894,7 +894,7 @@ 禁用源 删除源 购买 - 横屏双页 + 平板/横屏双页 浏览器打开 拷贝url 打开方式 @@ -909,5 +909,6 @@ 语速减 语速加 打开系统文件夹选择器出错,自动打开应用文件夹选择器 + 展开文本选择菜单 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 3ce737859..d8aeaec16 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -891,7 +891,7 @@ 禁用源 刪除源 購買 - 橫屏雙頁 + 平板/橫屏雙頁 瀏覽器打開 複製url 打開方式 @@ -906,5 +906,6 @@ 語速减 語速加 打开系统文件夹选择器出错,自动打开应用文件夹选择器 + 展开文本选择菜单 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ed32c1f1e..bed8ce857 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -893,7 +893,7 @@ 禁用源 刪除源 購買 - 橫屏雙頁 + 平板/橫屏雙頁 瀏覽器打開 複製url 打開方式 @@ -908,5 +908,6 @@ 語速减 語速加 打开系统文件夹选择器出错,自动打开应用文件夹选择器 + 展开文本选择菜单 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 776beec37..8f2b322a3 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -893,7 +893,7 @@ 禁用源 删除源 购买 - 横屏双页 + 平板/横屏双页 浏览器打开 拷贝url 打开方式 @@ -908,5 +908,6 @@ 语速减 语速加 打开系统文件夹选择器出错,自动打开应用文件夹选择器 + 展开文本选择菜单 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d32a0631b..608d691a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -894,7 +894,7 @@ disable source delete source pay - 横屏双页 + 平板/横屏双页 open in browser copy url open function @@ -909,5 +909,6 @@ 语速减 语速加 打开系统文件夹选择器出错,自动打开应用文件夹选择器 + 展开文本选择菜单 diff --git a/app/src/main/res/xml/pref_config_read.xml b/app/src/main/res/xml/pref_config_read.xml index 2ff1567be..7ad5985df 100644 --- a/app/src/main/res/xml/pref_config_read.xml +++ b/app/src/main/res/xml/pref_config_read.xml @@ -126,7 +126,7 @@ From 8de8af41c4f9c6ec7afdc29218f3116962920daf Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 15 Nov 2021 20:49:25 +0800 Subject: [PATCH 053/102] =?UTF-8?q?=E5=8F=8C=E9=A1=B5=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E4=B8=BA=E5=B9=B3=E6=9D=BF=E6=97=B6=E4=B8=8D=E5=9C=A8=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=BA=95=E5=92=8C=E9=AB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index bb832cd7f..19b8d6199 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,6 +11,10 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! +**2021/11/15** + +* 修复平板双叶 + **2021/11/13** * 修复没有目录时进入阅读界面不自动更新目录的bug From 411b99915c2fb900e02c7c45c874b966d88bc97b Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 15 Nov 2021 22:39:36 +0800 Subject: [PATCH 054/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/local/rule/TxtTocRuleActivity.kt | 19 +++++++ .../ui/book/local/rule/TxtTocRuleAdapter.kt | 31 +++++++++++ .../ui/book/local/rule/TxtTocRuleViewModel.kt | 6 +++ .../main/res/layout/activity_txt_toc_rule.xml | 35 +++++++++++++ app/src/main/res/layout/item_txt_toc_rule.xml | 51 +++++++++++++++++++ 5 files changed, 142 insertions(+) create mode 100644 app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt create mode 100644 app/src/main/res/layout/activity_txt_toc_rule.xml create mode 100644 app/src/main/res/layout/item_txt_toc_rule.xml diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt new file mode 100644 index 000000000..8f450e770 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt @@ -0,0 +1,19 @@ +package io.legado.app.ui.book.local.rule + +import android.os.Bundle +import androidx.activity.viewModels +import io.legado.app.base.VMBaseActivity +import io.legado.app.databinding.ActivityTxtTocRuleBinding +import io.legado.app.utils.viewbindingdelegate.viewBinding + +class TxtTocRuleActivity : VMBaseActivity() { + + override val viewModel: TxtTocRuleViewModel by viewModels() + override val binding: ActivityTxtTocRuleBinding by viewBinding(ActivityTxtTocRuleBinding::inflate) + + override fun onActivityCreated(savedInstanceState: Bundle?) { + TODO("Not yet implemented") + } + + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt new file mode 100644 index 000000000..aad8da3ac --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt @@ -0,0 +1,31 @@ +package io.legado.app.ui.book.local.rule + +import android.content.Context +import android.view.ViewGroup +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.entities.TxtTocRule +import io.legado.app.databinding.ItemTxtTocRuleBinding + +class TxtTocRuleAdapter(context: Context) : + RecyclerAdapter(context) { + + override fun getViewBinding(parent: ViewGroup): ItemTxtTocRuleBinding { + return ItemTxtTocRuleBinding.inflate(inflater, parent, false) + } + + override fun convert( + holder: ItemViewHolder, + binding: ItemTxtTocRuleBinding, + item: TxtTocRule, + payloads: MutableList + ) { + binding.cbSource.text = item.name + binding.swtEnabled.isChecked = item.enable + } + + override fun registerListener(holder: ItemViewHolder, binding: ItemTxtTocRuleBinding) { + TODO("Not yet implemented") + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt new file mode 100644 index 000000000..204f1c59c --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt @@ -0,0 +1,6 @@ +package io.legado.app.ui.book.local.rule + +import android.app.Application +import io.legado.app.base.BaseViewModel + +class TxtTocRuleViewModel(app: Application) : BaseViewModel(app) \ No newline at end of file diff --git a/app/src/main/res/layout/activity_txt_toc_rule.xml b/app/src/main/res/layout/activity_txt_toc_rule.xml new file mode 100644 index 000000000..21f662944 --- /dev/null +++ b/app/src/main/res/layout/activity_txt_toc_rule.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_txt_toc_rule.xml b/app/src/main/res/layout/item_txt_toc_rule.xml new file mode 100644 index 000000000..9db02db4e --- /dev/null +++ b/app/src/main/res/layout/item_txt_toc_rule.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + \ No newline at end of file From f125aa8bc3e90ecba40ddc34b9cb3d65d6207891 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 15 Nov 2021 23:15:02 +0800 Subject: [PATCH 055/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/local/rule/TxtTocRuleActivity.kt | 6 +++++ .../ui/book/local/rule/TxtTocRuleAdapter.kt | 24 ++++++++++++++++- .../book/source/manage/BookSourceAdapter.kt | 26 ++++++++----------- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt index 8f450e770..c34fb8076 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt @@ -10,10 +10,16 @@ class TxtTocRuleActivity : VMBaseActivity(context) { + private val selected = linkedSetOf() + override fun getViewBinding(parent: ViewGroup): ItemTxtTocRuleBinding { return ItemTxtTocRuleBinding.inflate(inflater, parent, false) } @@ -25,7 +27,27 @@ class TxtTocRuleAdapter(context: Context) : } override fun registerListener(holder: ItemViewHolder, binding: ItemTxtTocRuleBinding) { - TODO("Not yet implemented") + binding.cbSource.setOnCheckedChangeListener { buttonView, isChecked -> + getItem(holder.layoutPosition)?.let { + if (buttonView.isPressed) { + if (isChecked) { + selected.add(it) + } else { + selected.remove(it) + } + } + } + } + binding.swtEnabled.setOnCheckedChangeListener { buttonView, isChecked -> + getItem(holder.layoutPosition)?.let { + if (buttonView.isPressed) { + it.enable = isChecked + } + } + } + binding.ivEdit.setOnClickListener { + + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt index bedde1b8f..f84f01229 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt @@ -110,26 +110,22 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : override fun registerListener(holder: ItemViewHolder, binding: ItemBookSourceBinding) { binding.apply { swtEnabled.setOnCheckedChangeListener { view, checked -> - if (view.isPressed) { - getItem(holder.layoutPosition)?.let { - if (view.isPressed) { - it.enabled = checked - callBack.update(it) - } + getItem(holder.layoutPosition)?.let { + if (view.isPressed) { + it.enabled = checked + callBack.update(it) } } } cbBookSource.setOnCheckedChangeListener { view, checked -> - if (view.isPressed) { - getItem(holder.layoutPosition)?.let { - if (view.isPressed) { - if (checked) { - selected.add(it) - } else { - selected.remove(it) - } - callBack.upCountView() + getItem(holder.layoutPosition)?.let { + if (view.isPressed) { + if (checked) { + selected.add(it) + } else { + selected.remove(it) } + callBack.upCountView() } } } From e54166f70762091825d8e7f3b8bccf4b1b1c9ba6 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 16 Nov 2021 20:33:31 +0800 Subject: [PATCH 056/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/local/rule/TxtTocRuleActivity.kt | 39 +++++++++++++++++-- .../ui/book/local/rule/TxtTocRuleAdapter.kt | 13 ++++++- .../ui/book/local/rule/TxtTocRuleViewModel.kt | 18 ++++++++- build.gradle | 2 +- 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt index c34fb8076..151753cb3 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt @@ -3,22 +3,53 @@ package io.legado.app.ui.book.local.rule import android.os.Bundle import androidx.activity.viewModels import io.legado.app.base.VMBaseActivity +import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.ActivityTxtTocRuleBinding import io.legado.app.utils.viewbindingdelegate.viewBinding -class TxtTocRuleActivity : VMBaseActivity() { +class TxtTocRuleActivity : VMBaseActivity(), + TxtTocRuleAdapter.Callback { override val viewModel: TxtTocRuleViewModel by viewModels() override val binding: ActivityTxtTocRuleBinding by viewBinding(ActivityTxtTocRuleBinding::inflate) private val adapter: TxtTocRuleAdapter by lazy { - TxtTocRuleAdapter(this) + TxtTocRuleAdapter(this, this) } override fun onActivityCreated(savedInstanceState: Bundle?) { - TODO("Not yet implemented") + initView() } - private fun initView() { + private fun initView() = binding.run { + recyclerView.adapter = adapter + + } + + override fun del(source: TxtTocRule) { + viewModel.del(source) + } + + override fun edit(source: TxtTocRule) { + + } + + override fun update(vararg source: TxtTocRule) { + + } + + override fun toTop(source: TxtTocRule) { + + } + + override fun toBottom(source: TxtTocRule) { + + } + + override fun upOrder() { + + } + + override fun upCountView() { } diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt index 412857dc8..5b18f3566 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt @@ -7,7 +7,7 @@ import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.ItemTxtTocRuleBinding -class TxtTocRuleAdapter(context: Context) : +class TxtTocRuleAdapter(context: Context, private val callback: Callback) : RecyclerAdapter(context) { private val selected = linkedSetOf() @@ -35,6 +35,7 @@ class TxtTocRuleAdapter(context: Context) : } else { selected.remove(it) } + callback.upCountView() } } } @@ -50,4 +51,14 @@ class TxtTocRuleAdapter(context: Context) : } } + interface Callback { + fun del(source: TxtTocRule) + fun edit(source: TxtTocRule) + fun update(vararg source: TxtTocRule) + fun toTop(source: TxtTocRule) + fun toBottom(source: TxtTocRule) + fun upOrder() + fun upCountView() + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt index 204f1c59c..b3b6f8dad 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt @@ -2,5 +2,21 @@ package io.legado.app.ui.book.local.rule import android.app.Application import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb +import io.legado.app.data.entities.TxtTocRule -class TxtTocRuleViewModel(app: Application) : BaseViewModel(app) \ No newline at end of file +class TxtTocRuleViewModel(app: Application) : BaseViewModel(app) { + + fun del(txtTocRule: TxtTocRule) { + execute { + appDb.txtTocRuleDao.delete(txtTocRule) + } + } + + fun update(txtTocRule: TxtTocRule) { + execute { + appDb.txtTocRuleDao.update(txtTocRule) + } + } + +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 45afa777f..1f3ac687d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.5.31' + ext.kotlin_version = '1.6.0' repositories { google() mavenCentral() From f617f4b6bfee500df29d8e7b775df23a5d16f3f2 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 16 Nov 2021 21:10:58 +0800 Subject: [PATCH 057/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/local/rule/TxtTocRuleActivity.kt | 86 ++++++++++++++++++- .../ui/book/local/rule/TxtTocRuleAdapter.kt | 11 +++ .../ui/book/local/rule/TxtTocRuleViewModel.kt | 38 +++++++- 3 files changed, 131 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt index 151753cb3..0b09d970c 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt @@ -1,10 +1,21 @@ package io.legado.app.ui.book.local.rule +import android.annotation.SuppressLint import android.os.Bundle +import android.view.Menu +import android.view.MenuItem import androidx.activity.viewModels +import com.google.android.material.snackbar.Snackbar +import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.ActivityTxtTocRuleBinding +import io.legado.app.databinding.DialogEditTextBinding +import io.legado.app.databinding.DialogTocRegexEditBinding +import io.legado.app.lib.dialogs.alert +import io.legado.app.utils.ACache +import io.legado.app.utils.snackbar +import io.legado.app.utils.splitNotBlank import io.legado.app.utils.viewbindingdelegate.viewBinding class TxtTocRuleActivity : VMBaseActivity(), @@ -15,6 +26,7 @@ class TxtTocRuleActivity : VMBaseActivity edit(TxtTocRule()) + R.id.menu_default -> viewModel.importDefault() + R.id.menu_import -> showImportDialog() + } + return super.onCompatOptionsItemSelected(item) + } + override fun del(source: TxtTocRule) { viewModel.del(source) } override fun edit(source: TxtTocRule) { - + alert(titleResource = R.string.txt_toc_regex) { + val alertBinding = DialogTocRegexEditBinding.inflate(layoutInflater) + alertBinding.apply { + tvRuleName.setText(source.name) + tvRuleRegex.setText(source.rule) + } + customView { alertBinding.root } + okButton { + alertBinding.apply { + source.name = tvRuleName.text.toString() + source.rule = tvRuleRegex.text.toString() + viewModel.save(source) + } + } + cancelButton() + } } override fun update(vararg source: TxtTocRule) { - + viewModel.update(*source) } override fun toTop(source: TxtTocRule) { @@ -50,7 +91,48 @@ class TxtTocRuleActivity : VMBaseActivity = aCache + .getAsString(importTocRuleKey) + ?.splitNotBlank(",") + ?.toMutableList() + ?: mutableListOf() + if (!cacheUrls.contains(defaultUrl)) { + cacheUrls.add(0, defaultUrl) + } + alert(titleResource = R.string.import_on_line) { + val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { + editView.hint = "url" + editView.setFilterValues(cacheUrls) + editView.delCallBack = { + cacheUrls.remove(it) + aCache.put(importTocRuleKey, cacheUrls.joinToString(",")) + } + } + customView { alertBinding.root } + okButton { + val text = alertBinding.editView.text?.toString() + text?.let { + if (!cacheUrls.contains(it)) { + cacheUrls.add(0, it) + aCache.put(importTocRuleKey, cacheUrls.joinToString(",")) + } + Snackbar.make(binding.root, R.string.importing, Snackbar.LENGTH_INDEFINITE) + .show() + viewModel.importOnLine(it) { msg -> + binding.root.snackbar(msg) + } + } + } + cancelButton() + } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt index 5b18f3566..c222843fc 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt @@ -12,6 +12,17 @@ class TxtTocRuleAdapter(context: Context, private val callback: Callback) : private val selected = linkedSetOf() + val selection: List + get() { + val selection = arrayListOf() + getItems().map { + if (selected.contains(it)) { + selection.add(it) + } + } + return selection.sortedBy { it.serialNumber } + } + override fun getViewBinding(parent: ViewGroup): ItemTxtTocRuleBinding { return ItemTxtTocRuleBinding.inflate(inflater, parent, false) } diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt index b3b6f8dad..d9760a2cd 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleViewModel.kt @@ -4,18 +4,52 @@ import android.app.Application import io.legado.app.base.BaseViewModel import io.legado.app.data.appDb import io.legado.app.data.entities.TxtTocRule +import io.legado.app.help.DefaultData +import io.legado.app.help.http.newCallResponseBody +import io.legado.app.help.http.okHttpClient +import io.legado.app.help.http.text +import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonArray class TxtTocRuleViewModel(app: Application) : BaseViewModel(app) { + fun save(txtTocRule: TxtTocRule) { + execute { + appDb.txtTocRuleDao.insert(txtTocRule) + } + } + fun del(txtTocRule: TxtTocRule) { execute { appDb.txtTocRuleDao.delete(txtTocRule) } } - fun update(txtTocRule: TxtTocRule) { + fun update(vararg txtTocRule: TxtTocRule) { + execute { + appDb.txtTocRuleDao.update(*txtTocRule) + } + } + + fun importDefault() { + execute { + DefaultData.importDefaultTocRules() + } + } + + fun importOnLine(url: String, finally: (msg: String) -> Unit) { execute { - appDb.txtTocRuleDao.update(txtTocRule) + okHttpClient.newCallResponseBody { + url(url) + }.text("utf-8").let { json -> + GSON.fromJsonArray(json)?.let { + appDb.txtTocRuleDao.insert(*it.toTypedArray()) + } + } + }.onSuccess { + finally("导入成功") + }.onError { + finally("导入失败") } } From bc7b23b036f4d800e6f69e217b577432a1e797c2 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 16 Nov 2021 21:21:02 +0800 Subject: [PATCH 058/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/local/rule/TxtTocRuleActivity.kt | 31 ++++++- .../ui/book/local/rule/TxtTocRuleAdapter.kt | 85 ++++++++++++++++++- .../book/source/manage/BookSourceAdapter.kt | 4 +- .../main/res/layout/activity_txt_toc_rule.xml | 2 +- 4 files changed, 114 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt index 0b09d970c..66b49eba6 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt @@ -5,21 +5,30 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.activity.viewModels +import androidx.recyclerview.widget.ItemTouchHelper import com.google.android.material.snackbar.Snackbar import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.data.appDb import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.ActivityTxtTocRuleBinding import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogTocRegexEditBinding import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.theme.primaryColor +import io.legado.app.ui.widget.recycler.DragSelectTouchHelper +import io.legado.app.ui.widget.recycler.ItemTouchCallback +import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.ACache +import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.snackbar import io.legado.app.utils.splitNotBlank import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch class TxtTocRuleActivity : VMBaseActivity(), - TxtTocRuleAdapter.Callback { + TxtTocRuleAdapter.CallBack { override val viewModel: TxtTocRuleViewModel by viewModels() override val binding: ActivityTxtTocRuleBinding by viewBinding(ActivityTxtTocRuleBinding::inflate) @@ -30,11 +39,31 @@ class TxtTocRuleActivity : VMBaseActivity + adapter.setItems(tocRules) + upCountView() + } + } } override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt index c222843fc..1b8a3f489 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt @@ -2,13 +2,18 @@ package io.legado.app.ui.book.local.rule import android.content.Context import android.view.ViewGroup +import androidx.core.os.bundleOf +import androidx.recyclerview.widget.RecyclerView import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.ItemTxtTocRuleBinding +import io.legado.app.ui.widget.recycler.DragSelectTouchHelper +import io.legado.app.ui.widget.recycler.ItemTouchCallback -class TxtTocRuleAdapter(context: Context, private val callback: Callback) : - RecyclerAdapter(context) { +class TxtTocRuleAdapter(context: Context, private val callBack: CallBack) : + RecyclerAdapter(context), + ItemTouchCallback.Callback { private val selected = linkedSetOf() @@ -46,7 +51,7 @@ class TxtTocRuleAdapter(context: Context, private val callback: Callback) : } else { selected.remove(it) } - callback.upCountView() + callBack.upCountView() } } } @@ -62,7 +67,79 @@ class TxtTocRuleAdapter(context: Context, private val callback: Callback) : } } - interface Callback { + fun selectAll() { + getItems().forEach { + selected.add(it) + } + notifyItemRangeChanged(0, itemCount, bundleOf(Pair("selected", null))) + callBack.upCountView() + } + + fun revertSelection() { + getItems().forEach { + if (selected.contains(it)) { + selected.remove(it) + } else { + selected.add(it) + } + } + notifyItemRangeChanged(0, itemCount, bundleOf(Pair("selected", null))) + callBack.upCountView() + } + + override fun swap(srcPosition: Int, targetPosition: Int): Boolean { + val srcItem = getItem(srcPosition) + val targetItem = getItem(targetPosition) + if (srcItem != null && targetItem != null) { + if (srcItem.serialNumber == targetItem.serialNumber) { + callBack.upOrder() + } else { + val srcOrder = srcItem.serialNumber + srcItem.serialNumber = targetItem.serialNumber + targetItem.serialNumber = srcOrder + movedItems.add(srcItem) + movedItems.add(targetItem) + } + } + swapItem(srcPosition, targetPosition) + return true + } + + private val movedItems = hashSetOf() + + override fun onClearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + if (movedItems.isNotEmpty()) { + callBack.update(*movedItems.toTypedArray()) + movedItems.clear() + } + } + + val dragSelectCallback: DragSelectTouchHelper.Callback = + object : DragSelectTouchHelper.AdvanceCallback(Mode.ToggleAndReverse) { + override fun currentSelectedId(): MutableSet { + return selected + } + + override fun getItemId(position: Int): TxtTocRule { + return getItem(position)!! + } + + override fun updateSelectState(position: Int, isSelected: Boolean): Boolean { + getItem(position)?.let { + if (isSelected) { + selected.add(it) + } else { + selected.remove(it) + } + notifyItemChanged(position, bundleOf(Pair("selected", null))) + callBack.upCountView() + return true + } + return false + } + } + + interface CallBack { fun del(source: TxtTocRule) fun edit(source: TxtTocRule) fun update(vararg source: TxtTocRule) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt index f84f01229..1c663c27b 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt @@ -19,7 +19,7 @@ import io.legado.app.lib.theme.backgroundColor import io.legado.app.model.Debug import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.widget.recycler.DragSelectTouchHelper -import io.legado.app.ui.widget.recycler.ItemTouchCallback.Callback +import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.utils.ColorUtils import io.legado.app.utils.invisible import io.legado.app.utils.startActivity @@ -28,7 +28,7 @@ import io.legado.app.utils.visible class BookSourceAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context), - Callback { + ItemTouchCallback.Callback { private val selected = linkedSetOf() diff --git a/app/src/main/res/layout/activity_txt_toc_rule.xml b/app/src/main/res/layout/activity_txt_toc_rule.xml index 21f662944..7ac6263aa 100644 --- a/app/src/main/res/layout/activity_txt_toc_rule.xml +++ b/app/src/main/res/layout/activity_txt_toc_rule.xml @@ -12,7 +12,7 @@ app:contentInsetStartWithNavigation="0dp" app:contentLayout="@layout/view_search" app:displayHomeAsUp="true" - app:title="@string/book_source" /> + app:title="@string/txt_toc_regex" /> Date: Tue, 16 Nov 2021 22:21:45 +0800 Subject: [PATCH 059/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1f3ac687d..ce793a625 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.0' + ext.kotlin_version = '1.5.30' repositories { google() mavenCentral() From d34d5ba2421946798d5a212acd92f855d5ea7ae4 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 16 Nov 2021 22:41:00 +0800 Subject: [PATCH 060/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ce793a625..45afa777f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.5.30' + ext.kotlin_version = '1.5.31' repositories { google() mavenCentral() From 0766477f4bb9a410ed6a78eb4bc967c5127f5214 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 18 Nov 2021 11:52:43 +0800 Subject: [PATCH 061/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/bookshelf/style1/BookshelfFragment1.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt index 1ad9ebc67..d5fd3eded 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt @@ -46,11 +46,11 @@ class BookshelfFragment1 : BaseBookshelfFragment(R.layout.fragment_bookshelf), private val bookGroups = mutableListOf() private val fragmentMap = hashMapOf() private var groupsFlowJob: Job? = null - override val groupId: Long get() = selectedGroup.groupId + override val groupId: Long get() = selectedGroup?.groupId ?: 0 override val books: List get() { - val fragment = fragmentMap[selectedGroup.groupId] + val fragment = fragmentMap[groupId] return fragment?.getBooks() ?: emptyList() } @@ -60,8 +60,8 @@ class BookshelfFragment1 : BaseBookshelfFragment(R.layout.fragment_bookshelf), initBookGroupData() } - private val selectedGroup: BookGroup - get() = bookGroups[tabLayout.selectedTabPosition] + private val selectedGroup: BookGroup? + get() = bookGroups.getOrNull(tabLayout.selectedTabPosition) private fun initView() { binding.viewPagerBookshelf.setEdgeEffectColor(primaryColor) @@ -113,8 +113,10 @@ class BookshelfFragment1 : BaseBookshelfFragment(R.layout.fragment_bookshelf), } override fun onTabReselected(tab: TabLayout.Tab) { - fragmentMap[selectedGroup.groupId]?.let { - toastOnUi("${selectedGroup.groupName}(${it.getBooksCount()})") + selectedGroup?.let { group -> + fragmentMap[group.groupId]?.let { + toastOnUi("${group.groupName}(${it.getBooksCount()})") + } } } @@ -125,7 +127,7 @@ class BookshelfFragment1 : BaseBookshelfFragment(R.layout.fragment_bookshelf), } override fun gotoTop() { - fragmentMap[selectedGroup.groupId]?.gotoTop() + fragmentMap[groupId]?.gotoTop() } private inner class TabFragmentPageAdapter(fm: FragmentManager) : From 3e7069af3a16c5448660ddb7a0b68eb20d76784c Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 18 Nov 2021 18:48:24 +0800 Subject: [PATCH 062/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/storage/Backup.kt | 4 +++- .../app/ui/config/BackupConfigFragment.kt | 17 +++++++++++------ app/src/main/res/values-es-rES/strings.xml | 4 ++-- app/src/main/res/values-ja-rJP/strings.xml | 4 ++-- app/src/main/res/values-pt-rBR/strings.xml | 4 ++-- app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 4 ++-- app/src/main/res/values-zh/strings.xml | 4 ++-- app/src/main/res/values/strings.xml | 4 ++-- 9 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 631684dab..85e7b23b6 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -4,6 +4,7 @@ import android.content.Context import android.net.Uri import androidx.documentfile.provider.DocumentFile import io.legado.app.R +import io.legado.app.constant.AppLog import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.help.DefaultData @@ -51,7 +52,8 @@ object Backup { Coroutine.async { backup(context, context.getPrefString(PreferKey.backupPath) ?: "", true) }.onError { - appCtx.toastOnUi(R.string.autobackup_fail) + AppLog.put("备份出错\n${it.localizedMessage}", it) + appCtx.toastOnUi(appCtx.getString(R.string.autobackup_fail, it.localizedMessage)) } } } diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index 77e842228..7180fb0df 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -15,6 +15,7 @@ import androidx.preference.ListPreference import androidx.preference.Preference import io.legado.app.R import io.legado.app.base.BasePreferenceFragment +import io.legado.app.constant.AppLog import io.legado.app.constant.PreferKey import io.legado.app.help.AppConfig import io.legado.app.help.LocalConfig @@ -47,8 +48,8 @@ class BackupConfigFragment : BasePreferenceFragment(), } } } - private val backupDir = registerForActivityResult(HandleFileContract()) { - it.uri?.let { uri -> + private val backupDir = registerForActivityResult(HandleFileContract()) { result -> + result.uri?.let { uri -> if (uri.isContentScheme()) { AppConfig.backupPath = uri.toString() Coroutine.async { @@ -56,7 +57,8 @@ class BackupConfigFragment : BasePreferenceFragment(), }.onSuccess { appCtx.toastOnUi(R.string.backup_success) }.onError { - appCtx.toastOnUi(R.string.backup_fail) + AppLog.put("备份出错\n${it.localizedMessage}", it) + appCtx.toastOnUi(getString(R.string.backup_fail, it.localizedMessage)) } } else { uri.path?.let { path -> @@ -66,7 +68,8 @@ class BackupConfigFragment : BasePreferenceFragment(), }.onSuccess { appCtx.toastOnUi(R.string.backup_success) }.onError { - appCtx.toastOnUi(R.string.backup_fail) + AppLog.put("备份出错\n${it.localizedMessage}", it) + appCtx.toastOnUi(getString(R.string.backup_fail, it.localizedMessage)) } } } @@ -242,7 +245,8 @@ class BackupConfigFragment : BasePreferenceFragment(), }.onSuccess { appCtx.toastOnUi(R.string.backup_success) }.onError { - appCtx.toastOnUi(R.string.backup_fail) + AppLog.put("备份出错\n${it.localizedMessage}", it) + appCtx.toastOnUi(getString(R.string.backup_fail, it.localizedMessage)) } } else { backupDir.launch(null) @@ -264,7 +268,8 @@ class BackupConfigFragment : BasePreferenceFragment(), }.onSuccess { appCtx.toastOnUi(R.string.backup_success) }.onError { - appCtx.toastOnUi(R.string.backup_fail) + AppLog.put("备份出错\n${it.localizedMessage}", it) + appCtx.toastOnUi(getString(R.string.backup_fail, it.localizedMessage)) } } .request() diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 0173019c5..892a59490 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -114,7 +114,7 @@ Confirmar restauración La restauración de los datos de la estantería reemplazará a los datos de la actual. Respaldo completado - Error de respaldo + Error de respaldo\n%s Restaurando Restauración completada Restauración fallida @@ -857,7 +857,7 @@ La fuente del libro de cheques muestra un mensaje de depuración Muestra los pasos y el tiempo de la solicitud de red durante la verificación de la fuente del libro No export chapter names - Autobackup failed + Autobackup failed\n%s Background image blurring Blurring radius Disabled when 0, enable range from 1 to 25\nThe greater the radius, the stronger the effect of blurring diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index cdc494ae4..b308ada13 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -118,7 +118,7 @@ Restore confirmation Restoring the bookshelf data will overwrite the current Bookshelf. Backup succeed - Backup failed + Backup failed\n%s Restoring Restore succeed Backup failed @@ -861,7 +861,7 @@ 及时翻页,翻页时会停顿一下 Check book source shows debug message Show network status and timestamp during source checking - Autobackup failed + Autobackup failed\n%s Background image blurring Blurring radius Disabled when 0, enable range from 1 to 25\nThe greater the radius, the stronger the effect of blurring diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e8c7e94d1..5326f806e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -118,7 +118,7 @@ Confirmação da Restauração A restauração dos dados da estante irá substituir a estante atual. Backup bem sucedido - O Backup falhou + O Backup falhou\n%s Restaurando Restauração bem sucedida A restauração falhou @@ -861,7 +861,7 @@ Marcando a fonte do livro mostra uma mensagem de depuração Mostrar o status da rede com a data e hora durante a verificação da fonte Não há nomes de capítulos de exportação - Auto-Backup falhou + Auto-Backup falhou\n%s Desfocagem da imagem de fundo Raio da desfocagem Desativado quando 0, Ativado entre 1 e 25\n Quanto maior o raio, mais forte o efeito de desfocagem diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index d8aeaec16..b36e44594 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -115,7 +115,7 @@ 確認還原嗎? 還原成功會覆蓋原有書架。 備份成功 - 備份失敗 + 備份失敗\n%s 正在還原 還原成功 還原失敗 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bed8ce857..46dcab31e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -117,7 +117,7 @@ 確認復原嗎? 復原書架會覆蓋現有書架。 備份成功 - 備份失敗 + 備份失敗\n%s 正在復原 復原成功 復原失敗 @@ -856,7 +856,7 @@ url為空 字典 未知錯誤 - 自動備份失敗 + 自動備份失敗\n%s 結束 關閉取代分組/開啟添加分組 媒體按鈕•上一首|下一首 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 8f2b322a3..3628cd445 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -117,7 +117,7 @@ 确认恢复吗? 恢复书架会覆盖现有书架。 备份成功 - 备份失败 + 备份失败\n%s 正在恢复 恢复成功 恢复失败 @@ -856,7 +856,7 @@ url为空 字典 未知错误 - 自动备份失败 + 自动备份失败\n%s 结束 关闭替换分组/开启添加分组 媒体按钮•上一首|下一首 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 608d691a2..eb6208c7c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -118,7 +118,7 @@ Restore confirmation Restoring the bookshelf data will overwrite the current Bookshelf. Backup succeed - Backup failed + Backup failed\n%s Restoring Restore succeed Backup failed @@ -858,7 +858,7 @@ dict unknown error No export chapter names - Autobackup failed + Autobackup failed\n%s end 关闭替换分组/开启添加分组 媒体按钮•上一首|下一首 From 9f3329e02bbcb3b9cc4d7b1277dfea75104252c7 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 18 Nov 2021 20:50:30 +0800 Subject: [PATCH 063/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a1548a6f..aab1887a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,7 @@ android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" + android:largeHeap="true" android:supportsRtl="true" android:theme="@style/AppTheme.Light" tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute"> From 176a6114fdaa87a98474465072514e9389f4b601 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 19 Nov 2021 09:22:04 +0800 Subject: [PATCH 064/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 12e50ecf0..b0e23e611 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -147,7 +147,7 @@ dependencies { implementation('androidx.viewpager2:viewpager2:1.0.0') implementation('com.google.android.material:material:1.4.0') implementation('com.google.android.flexbox:flexbox:3.0.0') - implementation('com.google.code.gson:gson:2.8.8') + implementation('com.google.code.gson:gson:2.8.9') implementation('androidx.webkit:webkit:1.4.0') implementation('com.jakewharton.timber:timber:5.0.1') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aab1887a7..1a1548a6f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,7 +27,6 @@ android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" - android:largeHeap="true" android:supportsRtl="true" android:theme="@style/AppTheme.Light" tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute"> From 6180a654aed3dca3804074e0cffc63ebe9be3392 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 19 Nov 2021 21:26:28 +0800 Subject: [PATCH 065/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/source/manage/BookSourceViewModel.kt | 6 +++++- .../io/legado/app/utils/GsonExtensions.kt | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index d24047480..11d678a8f 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -10,6 +10,7 @@ import io.legado.app.constant.AppPattern import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.utils.* +import java.io.FileOutputStream class BookSourceViewModel(application: Application) : BaseViewModel(application) { @@ -135,13 +136,16 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) } } + @Suppress("BlockingMethodInNonBlockingContext") fun shareSelection(sources: List, success: ((intent: Intent) -> Unit)) { execute { val tmpSharePath = "${context.filesDir}/shareBookSource.json" FileUtils.delete(tmpSharePath) val intent = Intent(Intent.ACTION_SEND) val file = FileUtils.createFileWithReplace(tmpSharePath) - file.writeText(GSON.toJson(sources)) + FileOutputStream(file).use { + GSON.writeToOutputStream(it, sources) + } val fileUri = FileProvider.getUriForFile(context, AppConst.authority, file) intent.type = "text/*" intent.putExtra(Intent.EXTRA_STREAM, fileUri) diff --git a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt index 08d82b2ff..138ed2821 100644 --- a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt @@ -3,7 +3,10 @@ package io.legado.app.utils import com.google.gson.* import com.google.gson.internal.LinkedTreeMap import com.google.gson.reflect.TypeToken +import com.google.gson.stream.JsonWriter import timber.log.Timber +import java.io.OutputStream +import java.io.OutputStreamWriter import java.lang.reflect.ParameterizedType import java.lang.reflect.Type import kotlin.math.ceil @@ -39,6 +42,23 @@ inline fun Gson.fromJsonArray(json: String?): List? { }.getOrNull() } +fun Gson.writeToOutputStream(out: OutputStream, any: Any) { + val writer = JsonWriter(OutputStreamWriter(out, "UTF-8")) + writer.setIndent(" ") + if (any is List<*>) { + writer.beginArray() + any.forEach { + it?.let { + GSON.toJson(it, it::class.java, writer) + } + } + writer.endArray() + } else { + GSON.toJson(any, any::class.java, writer) + } + writer.close() +} + class ParameterizedTypeImpl(private val clazz: Class<*>) : ParameterizedType { override fun getRawType(): Type = List::class.java From d80c5f34f727a85cd34fb2c88c677fb6b6c5ae40 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 19 Nov 2021 22:20:48 +0800 Subject: [PATCH 066/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/storage/Backup.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 85e7b23b6..8e28e0865 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext import splitties.init.appCtx import java.io.File +import java.io.FileOutputStream import java.util.concurrent.TimeUnit @@ -114,8 +115,10 @@ object Backup { private fun writeListToJson(list: List, fileName: String, path: String) { if (list.isNotEmpty()) { - val json = GSON.toJson(list) - FileUtils.createFileIfNotExist(path + File.separator + fileName).writeText(json) + val file = FileUtils.createFileIfNotExist(path + File.separator + fileName) + FileOutputStream(file).use { + GSON.writeToOutputStream(it, list) + } } } From 85d83a2acf528a44fd3f9497883fed3235eb10fa Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 19 Nov 2021 22:23:41 +0800 Subject: [PATCH 067/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 19b8d6199..1438e4c09 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,9 +11,10 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! -**2021/11/15** +**2021/11/19** -* 修复平板双叶 +* 修复部分平板双页问题 +* 修复书源太多不能导出和备份的问题 **2021/11/13** From ee25e3e777d29b40c0ce4e2557539e1c109c6c6c Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 19 Nov 2021 23:16:11 +0800 Subject: [PATCH 068/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/DirectLinkUpload.kt | 2 +- .../io/legado/app/help/http/OkHttpUtils.kt | 20 +++++++++-- .../app/model/analyzeRule/AnalyzeUrl.kt | 2 +- .../book/source/manage/BookSourceActivity.kt | 33 ++++++++++++++----- .../book/source/manage/BookSourceViewModel.kt | 20 ++++------- .../app/ui/document/HandleFileActivity.kt | 4 +-- .../app/ui/document/HandleFileViewModel.kt | 15 ++++++--- 7 files changed, 63 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/DirectLinkUpload.kt b/app/src/main/java/io/legado/app/help/DirectLinkUpload.kt index f2427a301..fcceecfd6 100644 --- a/app/src/main/java/io/legado/app/help/DirectLinkUpload.kt +++ b/app/src/main/java/io/legado/app/help/DirectLinkUpload.kt @@ -15,7 +15,7 @@ object DirectLinkUpload { private const val downloadUrlRuleKey = "directLinkDownloadUrlRule" private const val summaryKey = "directSummary" - suspend fun upLoad(fileName: String, file: ByteArray, contentType: String): String { + suspend fun upLoad(fileName: String, file: Any, contentType: String): String { val url = getUploadUrl() if (url.isNullOrBlank()) { throw NoStackTraceException("上传url未配置") diff --git a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt index e3774b3f1..c92d93945 100644 --- a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt +++ b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt @@ -3,6 +3,7 @@ package io.legado.app.help.http import io.legado.app.constant.AppConst import io.legado.app.help.AppConfig import io.legado.app.utils.EncodingDetect +import io.legado.app.utils.GSON import io.legado.app.utils.UTF8BOMFighter import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.suspendCancellableCoroutine @@ -10,7 +11,9 @@ import kotlinx.coroutines.withContext import okhttp3.* import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody +import java.io.File import java.io.IOException import java.nio.charset.Charset import kotlin.coroutines.resume @@ -152,9 +155,22 @@ fun Request.Builder.postMultipart(type: String?, form: Map) { when (val value = it.value) { is Map<*, *> -> { val fileName = value["fileName"] as String - val file = value["file"] as ByteArray + val file = value["file"] val mediaType = (value["contentType"] as? String)?.toMediaType() - val requestBody = file.toRequestBody(mediaType) + val requestBody = when (file) { + is File -> { + file.asRequestBody(mediaType) + } + is ByteArray -> { + file.toRequestBody(mediaType) + } + is String -> { + file.toRequestBody(mediaType) + } + else -> { + GSON.toJson(file).toRequestBody(mediaType) + } + } multipartBody.addFormDataPart(it.key, fileName, requestBody) } else -> multipartBody.addFormDataPart(it.key, it.value.toString()) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index cd0d02fcd..81b11e51b 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -481,7 +481,7 @@ class AnalyzeUrl( /** * 上传文件 */ - suspend fun upload(fileName: String, file: ByteArray, contentType: String): StrResponse { + suspend fun upload(fileName: String, file: Any, contentType: String): StrResponse { return getProxyClient(proxy).newCallStrResponse(retry) { url(urlNoQuery) val bodyMap = GSON.fromJsonObject>(body)!! diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 1383de194..aa21d2cbf 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -9,11 +9,13 @@ import android.view.SubMenu import androidx.activity.viewModels import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.SearchView +import androidx.core.content.FileProvider import androidx.core.os.bundleOf import androidx.recyclerview.widget.ItemTouchHelper import com.google.android.material.snackbar.Snackbar import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppConst import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus import io.legado.app.data.appDb @@ -121,8 +123,19 @@ class BookSourceActivity : VMBaseActivity startActivity() R.id.menu_import_qr -> qrResult.launch(null) - R.id.menu_share_source -> viewModel.shareSelection(adapter.selection) { - startActivity(Intent.createChooser(it, getString(R.string.share_selected_source))) + R.id.menu_share_source -> viewModel.saveToFile(adapter.selection) { + val fileUri = FileProvider.getUriForFile(this, AppConst.authority, it) + val intent = Intent(Intent.ACTION_SEND) + intent.type = "text/*" + intent.putExtra(Intent.EXTRA_STREAM, fileUri) + intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity( + Intent.createChooser( + intent, + getString(R.string.share_selected_source) + ) + ) } R.id.menu_group_manage -> showDialogFragment() R.id.menu_import_local -> importDoc.launch { @@ -333,13 +346,15 @@ class BookSourceActivity : VMBaseActivity viewModel.bottomSource(*adapter.selection.toTypedArray()) R.id.menu_add_group -> selectionAddToGroups() R.id.menu_remove_group -> selectionRemoveFromGroups() - R.id.menu_export_selection -> exportDir.launch { - mode = HandleFileContract.EXPORT - fileData = Triple( - "bookSource.json", - GSON.toJson(adapter.selection).toByteArray(), - "application/json" - ) + R.id.menu_export_selection -> viewModel.saveToFile(adapter.selection) { file -> + exportDir.launch { + mode = HandleFileContract.EXPORT + fileData = Triple( + "bookSource.json", + file.readBytes(), + "application/json" + ) + } } } return true diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index 11d678a8f..dee06807a 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -1,15 +1,13 @@ package io.legado.app.ui.book.source.manage import android.app.Application -import android.content.Intent import android.text.TextUtils -import androidx.core.content.FileProvider import io.legado.app.base.BaseViewModel -import io.legado.app.constant.AppConst import io.legado.app.constant.AppPattern import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.utils.* +import java.io.File import java.io.FileOutputStream class BookSourceViewModel(application: Application) : BaseViewModel(application) { @@ -137,21 +135,15 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) } @Suppress("BlockingMethodInNonBlockingContext") - fun shareSelection(sources: List, success: ((intent: Intent) -> Unit)) { + fun saveToFile(sources: List, success: (file: File) -> Unit) { execute { - val tmpSharePath = "${context.filesDir}/shareBookSource.json" - FileUtils.delete(tmpSharePath) - val intent = Intent(Intent.ACTION_SEND) - val file = FileUtils.createFileWithReplace(tmpSharePath) + val path = "${context.filesDir}/shareBookSource.json" + FileUtils.delete(path) + val file = FileUtils.createFileWithReplace(path) FileOutputStream(file).use { GSON.writeToOutputStream(it, sources) } - val fileUri = FileProvider.getUriForFile(context, AppConst.authority, file) - intent.type = "text/*" - intent.putExtra(Intent.EXTRA_STREAM, fileUri) - intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - intent + file }.onSuccess { success.invoke(it) }.onError { diff --git a/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt b/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt index 10916635a..dad9157b2 100644 --- a/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt +++ b/app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt @@ -128,10 +128,10 @@ class HandleFileActivity : } } - private fun getFileData(): Triple? { + private fun getFileData(): Triple? { val fileName = intent.getStringExtra("fileName") val file = intent.getStringExtra("fileKey")?.let { - IntentData.get(it) + IntentData.get(it) } val contentType = intent.getStringExtra("contentType") if (fileName != null && file != null && contentType != null) { diff --git a/app/src/main/java/io/legado/app/ui/document/HandleFileViewModel.kt b/app/src/main/java/io/legado/app/ui/document/HandleFileViewModel.kt index 14cf13334..b82bedd2a 100644 --- a/app/src/main/java/io/legado/app/ui/document/HandleFileViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/document/HandleFileViewModel.kt @@ -8,6 +8,7 @@ import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppLog import io.legado.app.help.DirectLinkUpload import io.legado.app.utils.FileUtils +import io.legado.app.utils.GSON import io.legado.app.utils.isContentScheme import io.legado.app.utils.writeBytes @@ -20,7 +21,7 @@ class HandleFileViewModel(application: Application) : BaseViewModel(application) fun upload( fileName: String, - file: ByteArray, + file: Any, contentType: String, success: (url: String) -> Unit ) { @@ -35,18 +36,24 @@ class HandleFileViewModel(application: Application) : BaseViewModel(application) } } - fun saveToLocal(uri: Uri, fileName: String, data: ByteArray, success: (uri: Uri) -> Unit) { + fun saveToLocal(uri: Uri, fileName: String, data: Any, success: (uri: Uri) -> Unit) { execute { + val bytes = when (data) { + is File -> data.readBytes() + is ByteArray -> data + is String -> data.toByteArray() + else -> GSON.toJson(data).toByteArray() + } return@execute if (uri.isContentScheme()) { val doc = DocumentFile.fromTreeUri(context, uri)!! doc.findFile(fileName)?.delete() val newDoc = doc.createFile("", fileName) - newDoc!!.writeBytes(context, data) + newDoc!!.writeBytes(context, bytes) newDoc.uri } else { val file = File(uri.path!!) val newFile = FileUtils.createFileIfNotExist(file, fileName) - newFile.writeBytes(data) + newFile.writeBytes(bytes) Uri.fromFile(newFile) } }.onError { From c29dfbb9ed4530d0d8d7633493863ff62cb1c387 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 19 Nov 2021 23:21:35 +0800 Subject: [PATCH 069/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/source/manage/BookSourceActivity.kt | 6 +----- .../java/io/legado/app/ui/document/HandleFileContract.kt | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index aa21d2cbf..333d1908b 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -349,11 +349,7 @@ class BookSourceActivity : VMBaseActivity viewModel.saveToFile(adapter.selection) { file -> exportDir.launch { mode = HandleFileContract.EXPORT - fileData = Triple( - "bookSource.json", - file.readBytes(), - "application/json" - ) + fileData = Triple("bookSource.json", file, "application/json") } } } diff --git a/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt b/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt index b33d2ef70..af2dda346 100644 --- a/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt +++ b/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt @@ -55,7 +55,7 @@ class HandleFileContract : var title: String? = null, var allowExtensions: Array = arrayOf(), var otherActions: ArrayList>? = null, - var fileData: Triple? = null, + var fileData: Triple? = null, var requestCode: Int = 0 ) From ba69ae317bce04dbc7f612d9e997c48ff57064ea Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 19 Nov 2021 23:35:56 +0800 Subject: [PATCH 070/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/source/manage/BookSourceActivity.kt | 16 +-------------- .../ui/rss/source/manage/RssSourceActivity.kt | 5 ++--- .../rss/source/manage/RssSourceViewModel.kt | 20 ++++++------------- .../io/legado/app/utils/ContextExtensions.kt | 15 ++++++++++++++ 4 files changed, 24 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 333d1908b..6533035bb 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -1,7 +1,6 @@ package io.legado.app.ui.book.source.manage import android.annotation.SuppressLint -import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -9,13 +8,11 @@ import android.view.SubMenu import androidx.activity.viewModels import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.SearchView -import androidx.core.content.FileProvider import androidx.core.os.bundleOf import androidx.recyclerview.widget.ItemTouchHelper import com.google.android.material.snackbar.Snackbar import io.legado.app.R import io.legado.app.base.VMBaseActivity -import io.legado.app.constant.AppConst import io.legado.app.constant.AppPattern import io.legado.app.constant.EventBus import io.legado.app.data.appDb @@ -124,18 +121,7 @@ class BookSourceActivity : VMBaseActivity startActivity() R.id.menu_import_qr -> qrResult.launch(null) R.id.menu_share_source -> viewModel.saveToFile(adapter.selection) { - val fileUri = FileProvider.getUriForFile(this, AppConst.authority, it) - val intent = Intent(Intent.ACTION_SEND) - intent.type = "text/*" - intent.putExtra(Intent.EXTRA_STREAM, fileUri) - intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity( - Intent.createChooser( - intent, - getString(R.string.share_selected_source) - ) - ) + share(it) } R.id.menu_group_manage -> showDialogFragment() R.id.menu_import_local -> importDoc.launch { diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 6a7d970ae..82339958f 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -1,7 +1,6 @@ package io.legado.app.ui.rss.source.manage import android.annotation.SuppressLint -import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -117,8 +116,8 @@ class RssSourceActivity : VMBaseActivity showImportDialog() R.id.menu_import_qr -> qrCodeResult.launch(null) R.id.menu_group_manage -> showDialogFragment() - R.id.menu_share_source -> viewModel.shareSelection(adapter.selection) { - startActivity(Intent.createChooser(it, getString(R.string.share_selected_source))) + R.id.menu_share_source -> viewModel.saveToFile(adapter.selection) { + share(it) } R.id.menu_import_default -> viewModel.importDefault() R.id.menu_help -> showHelp() diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt index b0a80eec2..e80380762 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt @@ -1,15 +1,13 @@ package io.legado.app.ui.rss.source.manage import android.app.Application -import android.content.Intent import android.text.TextUtils -import androidx.core.content.FileProvider import io.legado.app.base.BaseViewModel -import io.legado.app.constant.AppConst import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource import io.legado.app.help.DefaultData import io.legado.app.utils.* +import java.io.File class RssSourceViewModel(application: Application) : BaseViewModel(application) { @@ -77,19 +75,13 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) } } - fun shareSelection(sources: List, success: ((intent: Intent) -> Unit)) { + fun saveToFile(sources: List, success: (file: File) -> Unit) { execute { - val tmpSharePath = "${context.filesDir}/shareRssSource.json" - FileUtils.delete(tmpSharePath) - val intent = Intent(Intent.ACTION_SEND) - val file = FileUtils.createFileWithReplace(tmpSharePath) + val path = "${context.filesDir}/shareRssSource.json" + FileUtils.delete(path) + val file = FileUtils.createFileWithReplace(path) file.writeText(GSON.toJson(sources)) - val fileUri = FileProvider.getUriForFile(context, AppConst.authority, file) - intent.type = "text/*" - intent.putExtra(Intent.EXTRA_STREAM, fileUri) - intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - intent + file }.onSuccess { success.invoke(it) }.onError { diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index d181da779..6562c98e9 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -177,6 +177,21 @@ fun Context.share(text: String, title: String = getString(R.string.share)) { } } +fun Context.share(file: File, type: String = "text/*") { + val fileUri = FileProvider.getUriForFile(this, AppConst.authority, file) + val intent = Intent(Intent.ACTION_SEND) + intent.type = type + intent.putExtra(Intent.EXTRA_STREAM, fileUri) + intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity( + Intent.createChooser( + intent, + getString(R.string.share_selected_source) + ) + ) +} + @SuppressLint("SetWorldReadable") fun Context.shareWithQr( text: String, From 17e1ece0f6bfc555ec39fa8d97fbd353767aa458 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 10:42:27 +0800 Subject: [PATCH 071/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/source/manage/BookSourceActivity.kt | 8 +++++--- .../ui/rss/source/manage/RssSourceActivity.kt | 20 +++++++++---------- app/src/main/res/menu/book_source.xml | 10 ++-------- app/src/main/res/menu/book_source_sel.xml | 5 +++++ app/src/main/res/menu/rss_source.xml | 12 ----------- app/src/main/res/menu/rss_source_sel.xml | 7 +++++++ 6 files changed, 28 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 6533035bb..55b8ed893 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -27,6 +27,7 @@ import io.legado.app.lib.theme.primaryTextColor import io.legado.app.model.CheckSource import io.legado.app.model.Debug import io.legado.app.ui.association.ImportBookSourceDialog +import io.legado.app.ui.book.local.rule.TxtTocRuleActivity import io.legado.app.ui.book.source.debug.BookSourceDebugActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.document.HandleFileContract @@ -120,15 +121,13 @@ class BookSourceActivity : VMBaseActivity startActivity() R.id.menu_import_qr -> qrResult.launch(null) - R.id.menu_share_source -> viewModel.saveToFile(adapter.selection) { - share(it) - } R.id.menu_group_manage -> showDialogFragment() R.id.menu_import_local -> importDoc.launch { mode = HandleFileContract.FILE allowExtensions = arrayOf("txt", "json") } R.id.menu_import_onLine -> showImportDialog() + R.id.menu_text_toc_rule -> startActivity() R.id.menu_sort_manual -> { item.isChecked = true sortCheck(Sort.Default) @@ -338,6 +337,9 @@ class BookSourceActivity : VMBaseActivity viewModel.saveToFile(adapter.selection) { + share(it) + } } return true } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 82339958f..13a5a6653 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -116,9 +116,6 @@ class RssSourceActivity : VMBaseActivity showImportDialog() R.id.menu_import_qr -> qrCodeResult.launch(null) R.id.menu_group_manage -> showDialogFragment() - R.id.menu_share_source -> viewModel.saveToFile(adapter.selection) { - share(it) - } R.id.menu_import_default -> viewModel.importDefault() R.id.menu_help -> showHelp() else -> if (item.groupId == R.id.source_group) { @@ -134,16 +131,17 @@ class RssSourceActivity : VMBaseActivity viewModel.enableSelection(adapter.selection) R.id.menu_disable_selection -> viewModel.disableSelection(adapter.selection) R.id.menu_del_selection -> viewModel.delSelection(adapter.selection) - R.id.menu_export_selection -> exportResult.launch { - mode = HandleFileContract.EXPORT - fileData = Triple( - "exportRssSource.json", - GSON.toJson(adapter.selection).toByteArray(), - "application/json" - ) - } R.id.menu_top_sel -> viewModel.topSource(*adapter.selection.toTypedArray()) R.id.menu_bottom_sel -> viewModel.bottomSource(*adapter.selection.toTypedArray()) + R.id.menu_export_selection -> viewModel.saveToFile(adapter.selection) { file -> + exportResult.launch { + mode = HandleFileContract.EXPORT + fileData = Triple("exportRssSource.json", file, "application/json") + } + } + R.id.menu_share_source -> viewModel.saveToFile(adapter.selection) { + share(it) + } } return true } diff --git a/app/src/main/res/menu/book_source.xml b/app/src/main/res/menu/book_source.xml index 67d58d2d4..b68148cbb 100644 --- a/app/src/main/res/menu/book_source.xml +++ b/app/src/main/res/menu/book_source.xml @@ -89,37 +89,31 @@ diff --git a/app/src/main/res/menu/book_source_sel.xml b/app/src/main/res/menu/book_source_sel.xml index 7d947d35e..f73160d90 100644 --- a/app/src/main/res/menu/book_source_sel.xml +++ b/app/src/main/res/menu/book_source_sel.xml @@ -47,6 +47,11 @@ android:title="@string/export_selection" app:showAsAction="never" /> + + - - diff --git a/app/src/main/res/menu/rss_source_sel.xml b/app/src/main/res/menu/rss_source_sel.xml index 24ea4d598..252927165 100644 --- a/app/src/main/res/menu/rss_source_sel.xml +++ b/app/src/main/res/menu/rss_source_sel.xml @@ -27,4 +27,11 @@ android:title="@string/export_selection" app:showAsAction="never" /> + + + + From 44a5ab4b445c897e6d528f829ba380cdfc73ba9b Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 10:51:12 +0800 Subject: [PATCH 072/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a1548a6f..dc0ea0bc2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -236,6 +236,11 @@ android:name=".ui.rss.source.manage.RssSourceActivity" android:launchMode="singleTop" android:screenOrientation="behind" /> + + Date: Sat, 20 Nov 2021 10:58:22 +0800 Subject: [PATCH 073/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/local/rule/TxtTocRuleAdapter.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt index 1b8a3f489..eb555453f 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt @@ -1,9 +1,12 @@ package io.legado.app.ui.book.local.rule import android.content.Context +import android.view.View import android.view.ViewGroup +import android.widget.PopupMenu import androidx.core.os.bundleOf import androidx.recyclerview.widget.RecyclerView +import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.TxtTocRule @@ -63,8 +66,28 @@ class TxtTocRuleAdapter(context: Context, private val callBack: CallBack) : } } binding.ivEdit.setOnClickListener { + getItem(holder.layoutPosition)?.let { + callBack.edit(it) + } + } + binding.ivMenuMore.setOnClickListener { + showMenu(it, holder.layoutPosition) + } + } + private fun showMenu(view: View, position: Int) { + val source = getItem(position) ?: return + val popupMenu = PopupMenu(context, view) + popupMenu.inflate(R.menu.rss_source_item) + popupMenu.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.menu_top -> callBack.toTop(source) + R.id.menu_bottom -> callBack.toBottom(source) + R.id.menu_del -> callBack.del(source) + } + true } + popupMenu.show() } fun selectAll() { From 207bb56f56f172e5899fc83f4ecb91aef95513d6 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 10:59:36 +0800 Subject: [PATCH 074/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/local/rule/TxtTocRuleAdapter.kt | 2 +- app/src/main/res/menu/txt_toc_rule_item.xml | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/menu/txt_toc_rule_item.xml diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt index eb555453f..dad24cc2a 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleAdapter.kt @@ -78,7 +78,7 @@ class TxtTocRuleAdapter(context: Context, private val callBack: CallBack) : private fun showMenu(view: View, position: Int) { val source = getItem(position) ?: return val popupMenu = PopupMenu(context, view) - popupMenu.inflate(R.menu.rss_source_item) + popupMenu.inflate(R.menu.txt_toc_rule_item) popupMenu.setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { R.id.menu_top -> callBack.toTop(source) diff --git a/app/src/main/res/menu/txt_toc_rule_item.xml b/app/src/main/res/menu/txt_toc_rule_item.xml new file mode 100644 index 000000000..77c3a18cd --- /dev/null +++ b/app/src/main/res/menu/txt_toc_rule_item.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file From 7134d751db26d21454eefb2b86042f6d7528322d Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 12:34:19 +0800 Subject: [PATCH 075/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/data/dao/TxtTocRuleDao.kt | 5 +++- .../ui/book/local/rule/TxtTocRuleActivity.kt | 6 ++-- .../ui/book/local/rule/TxtTocRuleViewModel.kt | 30 +++++++++++++++++++ .../ui/book/read/config/TocRegexViewModel.kt | 2 +- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt b/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt index 98925bc78..0449e0d3e 100644 --- a/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/TxtTocRuleDao.kt @@ -16,8 +16,11 @@ interface TxtTocRuleDao { @get:Query("select * from txtTocRules where enable = 1 order by serialNumber") val enabled: List + @get:Query("select ifNull(min(serialNumber), 0) from txtTocRules") + val minOrder: Int + @get:Query("select ifNull(max(serialNumber), 0) from txtTocRules") - val lastOrderNum: Int + val maxOrder: Int @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg rule: TxtTocRule) diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt index 66b49eba6..1bd891429 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt @@ -108,15 +108,15 @@ class TxtTocRuleActivity : VMBaseActivity + source.serialNumber = minOrder - index + } + appDb.txtTocRuleDao.update(*rules) + } + } + + fun toBottom(vararg sources: TxtTocRule) { + execute { + val maxOrder = appDb.txtTocRuleDao.maxOrder + 1 + sources.forEachIndexed { index, source -> + source.serialNumber = maxOrder + index + } + appDb.txtTocRuleDao.update(*sources) + } + } + + fun upOrder() { + execute { + val sources = appDb.txtTocRuleDao.all + for ((index: Int, source: TxtTocRule) in sources.withIndex()) { + source.serialNumber = index + 1 + } + appDb.txtTocRuleDao.update(*sources.toTypedArray()) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt index 2b5236e50..011f4debe 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/TocRegexViewModel.kt @@ -16,7 +16,7 @@ class TocRegexViewModel(application: Application) : BaseViewModel(application) { fun saveRule(rule: TxtTocRule) { execute { if (rule.serialNumber < 0) { - rule.serialNumber = appDb.txtTocRuleDao.lastOrderNum + 1 + rule.serialNumber = appDb.txtTocRuleDao.maxOrder + 1 } appDb.txtTocRuleDao.insert(rule) } From 2c6f3a9950e916ee60534da01cd3ec51799f8057 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 12:56:04 +0800 Subject: [PATCH 076/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/local/rule/TxtTocRuleActivity.kt | 22 ++++++++++++++++++- .../ui/book/local/rule/TxtTocRuleAdapter.kt | 20 +++++++++++++++-- .../ui/rss/source/manage/RssSourceActivity.kt | 16 +++++++------- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt index 1bd891429..2e52efcbd 100644 --- a/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/local/rule/TxtTocRuleActivity.kt @@ -16,6 +16,7 @@ import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogTocRegexEditBinding import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.primaryColor +import io.legado.app.ui.widget.SelectActionBar import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider @@ -28,7 +29,8 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch class TxtTocRuleActivity : VMBaseActivity(), - TxtTocRuleAdapter.CallBack { + TxtTocRuleAdapter.CallBack, + SelectActionBar.CallBack { override val viewModel: TxtTocRuleViewModel by viewModels() override val binding: ActivityTxtTocRuleBinding by viewBinding(ActivityTxtTocRuleBinding::inflate) @@ -39,6 +41,7 @@ class TxtTocRuleActivity : VMBaseActivity @@ -103,6 +111,18 @@ class TxtTocRuleActivity : VMBaseActivity(context), @@ -41,8 +44,21 @@ class TxtTocRuleAdapter(context: Context, private val callBack: CallBack) : item: TxtTocRule, payloads: MutableList ) { - binding.cbSource.text = item.name - binding.swtEnabled.isChecked = item.enable + binding.run { + val bundle = payloads.getOrNull(0) as? Bundle + if (bundle == null) { + root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) + cbSource.text = item.name + swtEnabled.isChecked = item.enable + cbSource.isChecked = selected.contains(item) + } else { + bundle.keySet().map { + when (it) { + "selected" -> cbSource.isChecked = selected.contains(item) + } + } + } + } } override fun registerListener(holder: ItemViewHolder, binding: ItemTxtTocRuleBinding) { diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 13a5a6653..5242e7e64 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -92,7 +92,7 @@ class RssSourceActivity : VMBaseActivity Date: Sat, 20 Nov 2021 13:09:41 +0800 Subject: [PATCH 077/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/arrange/ArrangeBookActivity.kt | 2 +- .../io/legado/app/ui/book/local/ImportBookActivity.kt | 2 +- .../app/ui/book/local/rule/TxtTocRuleActivity.kt | 11 +++++++++++ .../app/ui/book/local/rule/TxtTocRuleViewModel.kt | 4 ++-- .../app/ui/book/source/manage/BookSourceActivity.kt | 2 +- .../io/legado/app/ui/replace/ReplaceRuleActivity.kt | 2 +- .../app/ui/rss/source/manage/RssSourceActivity.kt | 5 ++--- .../app/ui/rss/source/manage/RssSourceViewModel.kt | 10 ++-------- .../java/io/legado/app/ui/widget/SelectActionBar.kt | 4 ++-- 9 files changed, 23 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt index 8b05ec3b2..77f9f313a 100644 --- a/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/arrange/ArrangeBookActivity.kt @@ -84,7 +84,7 @@ class ArrangeBookActivity : VMBaseActivity viewModel.enableSelection(adapter.selection) R.id.menu_disable_selection -> viewModel.disableSelection(adapter.selection) - R.id.menu_del_selection -> viewModel.delSelection(adapter.selection) R.id.menu_top_sel -> viewModel.topSource(*adapter.selection.toTypedArray()) R.id.menu_bottom_sel -> viewModel.bottomSource(*adapter.selection.toTypedArray()) R.id.menu_export_selection -> viewModel.saveToFile(adapter.selection) { file -> @@ -211,13 +210,13 @@ class RssSourceActivity : VMBaseActivity) { - execute { - appDb.rssSourceDao.delete(*sources.toTypedArray()) - } - } - fun saveToFile(sources: List, success: (file: File) -> Unit) { execute { val path = "${context.filesDir}/shareRssSource.json" diff --git a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt index 57b926137..c381b391f 100644 --- a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt @@ -42,7 +42,7 @@ class SelectActionBar @JvmOverloads constructor( } } binding.btnRevertSelection.setOnClickListener { callBack?.revertSelection() } - binding.btnSelectActionMain.setOnClickListener { callBack?.onClickMainAction() } + binding.btnSelectActionMain.setOnClickListener { callBack?.onClickSelectBarMainAction() } binding.ivMenuMore.setOnClickListener { selMenu?.show() } } @@ -108,6 +108,6 @@ class SelectActionBar @JvmOverloads constructor( fun revertSelection() - fun onClickMainAction() {} + fun onClickSelectBarMainAction() {} } } \ No newline at end of file From 98272ab1604e0aca14f74d88c041a4397948f20c Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 20:05:56 +0800 Subject: [PATCH 078/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/source/manage/BookSourceActivity.kt | 2 +- .../app/ui/book/source/manage/BookSourceViewModel.kt | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 7a557774f..4e0302ede 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -308,7 +308,7 @@ class BookSourceActivity : VMBaseActivity) { - execute { - appDb.bookSourceDao.delete(*sources.toTypedArray()) - } - } - @Suppress("BlockingMethodInNonBlockingContext") fun saveToFile(sources: List, success: (file: File) -> Unit) { execute { From 269671abe44a21a094cbd34b8f3a96fe4269e060 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 20:43:19 +0800 Subject: [PATCH 079/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 1438e4c09..8756968ff 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,10 +11,11 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! -**2021/11/19** +**2021/11/20** * 修复部分平板双页问题 * 修复书源太多不能导出和备份的问题 +* 给txt目录规则添加了一个入口,在书源管理的菜单里面 **2021/11/13** From 829695e398d1458fab575819154be4af18738289 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 20:52:06 +0800 Subject: [PATCH 080/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/menu/book_source.xml | 6 ++++++ app/src/main/res/menu/rss_source.xml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/res/menu/book_source.xml b/app/src/main/res/menu/book_source.xml index b68148cbb..dd43aec84 100644 --- a/app/src/main/res/menu/book_source.xml +++ b/app/src/main/res/menu/book_source.xml @@ -89,31 +89,37 @@ diff --git a/app/src/main/res/menu/rss_source.xml b/app/src/main/res/menu/rss_source.xml index 45d06c99c..e5836f7d6 100644 --- a/app/src/main/res/menu/rss_source.xml +++ b/app/src/main/res/menu/rss_source.xml @@ -26,31 +26,37 @@ From 7775ff9d562f384bd0dc97de18a57d38e5c5a491 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 23:27:22 +0800 Subject: [PATCH 081/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/entities/Book.kt | 3 +++ .../main/java/io/legado/app/data/entities/BookChapter.kt | 3 +++ .../main/java/io/legado/app/data/entities/BookGroup.kt | 4 ++++ .../main/java/io/legado/app/data/entities/BookSource.kt | 7 +++++-- .../main/java/io/legado/app/data/entities/Bookmark.kt | 7 ++++++- app/src/main/java/io/legado/app/data/entities/Cache.kt | 8 +++++++- app/src/main/java/io/legado/app/data/entities/Cookie.kt | 8 +++++++- app/src/main/java/io/legado/app/data/entities/HttpTTS.kt | 4 ++++ .../main/java/io/legado/app/data/entities/ReadRecord.kt | 8 +++++++- .../java/io/legado/app/data/entities/ReadRecordShow.kt | 9 ++++++++- .../main/java/io/legado/app/data/entities/ReplaceRule.kt | 7 +++---- .../main/java/io/legado/app/data/entities/RssArticle.kt | 3 +++ .../java/io/legado/app/data/entities/RssReadRecord.kt | 8 +++++++- .../main/java/io/legado/app/data/entities/RssSource.kt | 4 ++++ app/src/main/java/io/legado/app/data/entities/RssStar.kt | 3 +++ app/src/main/java/io/legado/app/data/entities/RuleSub.kt | 8 +++++++- .../main/java/io/legado/app/data/entities/SearchBook.kt | 3 +++ .../java/io/legado/app/data/entities/SearchKeyword.kt | 8 +++++++- .../main/java/io/legado/app/data/entities/TxtTocRule.kt | 8 +++++++- build.gradle | 2 +- 20 files changed, 99 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index 5b61a6cc7..79fc9dbe2 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -56,6 +56,9 @@ data class Book( var readConfig: ReadConfig? = null ) : Parcelable, BaseBook { + @Ignore + constructor() : this(bookUrl = "") + fun isLocalBook(): Boolean { return origin == BookType.local } diff --git a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt index 39b8ea6b0..48f4fc3bf 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookChapter.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookChapter.kt @@ -47,6 +47,9 @@ data class BookChapter( var variable: String? = null //变量 ) : Parcelable, RuleDataInterface { + @Ignore + constructor() : this(url = "", bookUrl = "") + @delegate:Transient @delegate:Ignore @IgnoredOnParcel diff --git a/app/src/main/java/io/legado/app/data/entities/BookGroup.kt b/app/src/main/java/io/legado/app/data/entities/BookGroup.kt index f19f5f05c..78cc44cce 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookGroup.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookGroup.kt @@ -3,6 +3,7 @@ package io.legado.app.data.entities import android.content.Context import android.os.Parcelable import androidx.room.Entity +import androidx.room.Ignore import androidx.room.PrimaryKey import io.legado.app.R import io.legado.app.constant.AppConst @@ -19,6 +20,9 @@ data class BookGroup( var show: Boolean = true ) : Parcelable { + @Ignore + constructor() : this(groupName = "") + fun getManageName(context: Context): String { return when (groupId) { AppConst.bookGroupAllId -> "$groupName(${context.getString(R.string.all)})" diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index 01fdf3fe5..bcc222ba5 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -19,10 +19,10 @@ import timber.log.Timber indices = [(Index(value = ["bookSourceUrl"], unique = false))] ) data class BookSource( - var bookSourceName: String = "", // 名称 - var bookSourceGroup: String? = null, // 分组 @PrimaryKey var bookSourceUrl: String = "", // 地址,包括 http/https + var bookSourceName: String = "", // 名称 + var bookSourceGroup: String? = null, // 分组 var bookSourceType: Int = BookType.default, // 类型,0 文本,1 音频, 3 图片 var bookUrlPattern: String? = null, // 详情页url正则 var customOrder: Int = 0, // 手动排序编号 @@ -46,6 +46,9 @@ data class BookSource( var ruleContent: ContentRule? = null // 正文页规则 ) : Parcelable, BaseSource { + @Ignore + constructor() : this(bookSourceUrl = "") + override fun getTag(): String { return bookSourceName } diff --git a/app/src/main/java/io/legado/app/data/entities/Bookmark.kt b/app/src/main/java/io/legado/app/data/entities/Bookmark.kt index 9ee4a8ea0..46db12e35 100644 --- a/app/src/main/java/io/legado/app/data/entities/Bookmark.kt +++ b/app/src/main/java/io/legado/app/data/entities/Bookmark.kt @@ -2,6 +2,7 @@ package io.legado.app.data.entities import android.os.Parcelable import androidx.room.Entity +import androidx.room.Ignore import androidx.room.Index import androidx.room.PrimaryKey import kotlinx.parcelize.Parcelize @@ -21,5 +22,9 @@ data class Bookmark( var chapterName: String = "", var bookText: String = "", var content: String = "" +) : Parcelable { -) : Parcelable \ No newline at end of file + @Ignore + constructor() : this(bookName = "") + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/Cache.kt b/app/src/main/java/io/legado/app/data/entities/Cache.kt index f9687dea7..39c0bd808 100644 --- a/app/src/main/java/io/legado/app/data/entities/Cache.kt +++ b/app/src/main/java/io/legado/app/data/entities/Cache.kt @@ -1,6 +1,7 @@ package io.legado.app.data.entities import androidx.room.Entity +import androidx.room.Ignore import androidx.room.Index import androidx.room.PrimaryKey @@ -10,4 +11,9 @@ data class Cache( val key: String = "", var value: String? = null, var deadline: Long = 0L -) \ No newline at end of file +) { + + @Ignore + constructor() : this(key = "") + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/Cookie.kt b/app/src/main/java/io/legado/app/data/entities/Cookie.kt index 8e12febf4..193fb643c 100644 --- a/app/src/main/java/io/legado/app/data/entities/Cookie.kt +++ b/app/src/main/java/io/legado/app/data/entities/Cookie.kt @@ -1,6 +1,7 @@ package io.legado.app.data.entities import androidx.room.Entity +import androidx.room.Ignore import androidx.room.Index import androidx.room.PrimaryKey @@ -9,4 +10,9 @@ data class Cookie( @PrimaryKey var url: String = "", var cookie: String = "" -) \ No newline at end of file +) { + + @Ignore + constructor() : this(url = "") + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt b/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt index 3b1db4512..cbc6a05da 100644 --- a/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt +++ b/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt @@ -1,6 +1,7 @@ package io.legado.app.data.entities import androidx.room.Entity +import androidx.room.Ignore import androidx.room.PrimaryKey import com.jayway.jsonpath.DocumentContext import io.legado.app.utils.GSON @@ -25,6 +26,9 @@ data class HttpTTS( var loginCheckJs: String? = null, ) : BaseSource { + @Ignore + constructor() : this(name = "") + override fun getTag(): String { return name } diff --git a/app/src/main/java/io/legado/app/data/entities/ReadRecord.kt b/app/src/main/java/io/legado/app/data/entities/ReadRecord.kt index 2b2b5caf4..b12246c62 100644 --- a/app/src/main/java/io/legado/app/data/entities/ReadRecord.kt +++ b/app/src/main/java/io/legado/app/data/entities/ReadRecord.kt @@ -1,10 +1,16 @@ package io.legado.app.data.entities import androidx.room.Entity +import androidx.room.Ignore @Entity(tableName = "readRecord", primaryKeys = ["deviceId", "bookName"]) data class ReadRecord( var deviceId: String = "", var bookName: String = "", var readTime: Long = 0L -) \ No newline at end of file +) { + + @Ignore + constructor() : this(deviceId = "") + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/ReadRecordShow.kt b/app/src/main/java/io/legado/app/data/entities/ReadRecordShow.kt index 79795b0d9..0ede36a84 100644 --- a/app/src/main/java/io/legado/app/data/entities/ReadRecordShow.kt +++ b/app/src/main/java/io/legado/app/data/entities/ReadRecordShow.kt @@ -1,6 +1,13 @@ package io.legado.app.data.entities +import androidx.room.Ignore + data class ReadRecordShow( var bookName: String = "", var readTime: Long = 0L -) \ No newline at end of file +) { + + @Ignore + constructor() : this("") + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt b/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt index 29f0072fd..be085a9fc 100644 --- a/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/ReplaceRule.kt @@ -2,10 +2,7 @@ package io.legado.app.data.entities import android.os.Parcelable import android.text.TextUtils -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room.* import kotlinx.parcelize.Parcelize import java.util.regex.Pattern import java.util.regex.PatternSyntaxException @@ -29,6 +26,8 @@ data class ReplaceRule( var order: Int = 0 ) : Parcelable { + @Ignore + constructor() : this(id = System.currentTimeMillis()) override fun equals(other: Any?): Boolean { if (other is ReplaceRule) { diff --git a/app/src/main/java/io/legado/app/data/entities/RssArticle.kt b/app/src/main/java/io/legado/app/data/entities/RssArticle.kt index 911fb16b8..8928ddc28 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssArticle.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssArticle.kt @@ -26,6 +26,9 @@ data class RssArticle( var variable: String? = null ) : RuleDataInterface { + @Ignore + constructor() : this("") + override fun hashCode() = link.hashCode() override fun equals(other: Any?): Boolean { diff --git a/app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt b/app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt index edbb4c15d..2a54427dd 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssReadRecord.kt @@ -1,7 +1,13 @@ package io.legado.app.data.entities import androidx.room.Entity +import androidx.room.Ignore import androidx.room.PrimaryKey @Entity(tableName = "rssReadRecords") -data class RssReadRecord(@PrimaryKey val record: String, val read: Boolean = true) \ No newline at end of file +data class RssReadRecord(@PrimaryKey val record: String, val read: Boolean = true) { + + @Ignore + constructor() : this("") + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/RssSource.kt b/app/src/main/java/io/legado/app/data/entities/RssSource.kt index 78830285a..7f9c97051 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssSource.kt @@ -2,6 +2,7 @@ package io.legado.app.data.entities import android.os.Parcelable import androidx.room.Entity +import androidx.room.Ignore import androidx.room.Index import androidx.room.PrimaryKey import com.jayway.jsonpath.DocumentContext @@ -43,6 +44,9 @@ data class RssSource( var customOrder: Int = 0 ) : Parcelable, BaseSource { + @Ignore + constructor() : this("") + override fun getTag(): String { return sourceName } diff --git a/app/src/main/java/io/legado/app/data/entities/RssStar.kt b/app/src/main/java/io/legado/app/data/entities/RssStar.kt index df4bd546f..fc696cf94 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssStar.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssStar.kt @@ -25,6 +25,9 @@ data class RssStar( var variable: String? = null ) : RuleDataInterface { + @Ignore + constructor() : this("") + @delegate:Transient @delegate:Ignore @IgnoredOnParcel diff --git a/app/src/main/java/io/legado/app/data/entities/RuleSub.kt b/app/src/main/java/io/legado/app/data/entities/RuleSub.kt index 2b43787fe..bc9c250d0 100644 --- a/app/src/main/java/io/legado/app/data/entities/RuleSub.kt +++ b/app/src/main/java/io/legado/app/data/entities/RuleSub.kt @@ -1,6 +1,7 @@ package io.legado.app.data.entities import androidx.room.Entity +import androidx.room.Ignore import androidx.room.PrimaryKey @Entity(tableName = "ruleSubs") @@ -13,4 +14,9 @@ data class RuleSub( var customOrder: Int = 0, var autoUpdate: Boolean = false, var update: Long = System.currentTimeMillis() -) +) { + + @Ignore + constructor() : this(name = "") + +} diff --git a/app/src/main/java/io/legado/app/data/entities/SearchBook.kt b/app/src/main/java/io/legado/app/data/entities/SearchBook.kt index 96c525b3a..6169aa6d0 100644 --- a/app/src/main/java/io/legado/app/data/entities/SearchBook.kt +++ b/app/src/main/java/io/legado/app/data/entities/SearchBook.kt @@ -40,6 +40,9 @@ data class SearchBook( var originOrder: Int = 0 ) : Parcelable, BaseBook, Comparable { + @Ignore + constructor() : this(bookUrl = "") + @Ignore @IgnoredOnParcel override var infoHtml: String? = null diff --git a/app/src/main/java/io/legado/app/data/entities/SearchKeyword.kt b/app/src/main/java/io/legado/app/data/entities/SearchKeyword.kt index 955e5fe3d..ade4a5551 100644 --- a/app/src/main/java/io/legado/app/data/entities/SearchKeyword.kt +++ b/app/src/main/java/io/legado/app/data/entities/SearchKeyword.kt @@ -2,6 +2,7 @@ package io.legado.app.data.entities import android.os.Parcelable import androidx.room.Entity +import androidx.room.Ignore import androidx.room.Index import androidx.room.PrimaryKey import kotlinx.parcelize.Parcelize @@ -14,4 +15,9 @@ data class SearchKeyword( var word: String = "", // 搜索关键词 var usage: Int = 1, // 使用次数 var lastUseTime: Long = System.currentTimeMillis() // 最后一次使用时间 -) : Parcelable +) : Parcelable { + + @Ignore + constructor() : this(word = "") + +} diff --git a/app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt b/app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt index 52669dab7..54429bbf3 100644 --- a/app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt +++ b/app/src/main/java/io/legado/app/data/entities/TxtTocRule.kt @@ -1,6 +1,7 @@ package io.legado.app.data.entities import androidx.room.Entity +import androidx.room.Ignore import androidx.room.PrimaryKey @@ -12,4 +13,9 @@ data class TxtTocRule( var rule: String = "", var serialNumber: Int = -1, var enable: Boolean = true -) \ No newline at end of file +) { + + @Ignore + constructor() : this(name = "") + +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 45afa777f..1f3ac687d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.5.31' + ext.kotlin_version = '1.6.0' repositories { google() mavenCentral() From d596c18a0f383895702bc5c49e5616cdebd58085 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 20 Nov 2021 23:51:19 +0800 Subject: [PATCH 082/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b0e23e611..0eca8db42 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ def version = "3." + releaseTime() def gitCommits = Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim()) android { - compileSdkVersion 30 - buildToolsVersion '30.0.3' + compileSdkVersion 31 + buildToolsVersion '31.0.0' kotlinOptions { jvmTarget = "11" } @@ -34,7 +34,7 @@ android { defaultConfig { applicationId "io.legado.app" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 31 versionCode gitCommits versionName version testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From 45408b7cc2ecb1e6c8a54824a5d4373ad387c28e Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 21 Nov 2021 12:17:54 +0800 Subject: [PATCH 083/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/http/BackstageWebView.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt b/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt index 9fedea7fa..914b9400f 100644 --- a/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt +++ b/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt @@ -3,6 +3,7 @@ package io.legado.app.help.http import android.annotation.SuppressLint import android.os.Handler import android.os.Looper +import android.util.AndroidRuntimeException import android.webkit.CookieManager import android.webkit.WebSettings import android.webkit.WebView @@ -51,7 +52,11 @@ class BackstageWebView( } } runOnUI { - load() + try { + load() + } catch (error: Throwable) { + block.cancel(error) + } } } @@ -59,6 +64,7 @@ class BackstageWebView( return encode ?: "utf-8" } + @Throws(AndroidRuntimeException::class) private fun load() { val webView = createWebView() mWebView = webView From 4f465fcb692c303a196ea19fad51e2b44ffc6ea9 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 21 Nov 2021 12:32:30 +0800 Subject: [PATCH 084/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/bookshelf/BookshelfViewModel.kt | 38 ++++++++++++++----- .../io/legado/app/utils/GsonExtensions.kt | 4 +- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt index 4366edfaf..471a0d976 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfViewModel.kt @@ -1,6 +1,7 @@ package io.legado.app.ui.main.bookshelf import android.app.Application +import com.google.gson.stream.JsonWriter import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.data.appDb @@ -14,6 +15,9 @@ import io.legado.app.model.webBook.WebBook import io.legado.app.utils.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.isActive +import java.io.File +import java.io.FileOutputStream +import java.io.OutputStreamWriter class BookshelfViewModel(application: Application) : BaseViewModel(application) { @@ -66,19 +70,33 @@ class BookshelfViewModel(application: Application) : BaseViewModel(application) } } - fun exportBookshelf(books: List?, success: (json: String) -> Unit) { + fun exportBookshelf(books: List?, success: (file: File) -> Unit) { execute { - val exportList = arrayListOf>() - books?.forEach { - val bookMap = hashMapOf() - bookMap["name"] = it.name - bookMap["author"] = it.author - bookMap["intro"] = it.getDisplayIntro() - exportList.add(bookMap) - } - GSON.toJson(exportList) + books?.let { + val path = "${context.filesDir}/books.json" + FileUtils.delete(path) + val file = FileUtils.createFileWithReplace(path) + @Suppress("BlockingMethodInNonBlockingContext") + FileOutputStream(file).use { out -> + val writer = JsonWriter(OutputStreamWriter(out, "UTF-8")) + writer.setIndent(" ") + writer.beginArray() + books.forEach { + val bookMap = hashMapOf() + bookMap["name"] = it.name + bookMap["author"] = it.author + bookMap["intro"] = it.getDisplayIntro() + GSON.toJson(bookMap, bookMap::class.java, writer) + } + writer.endArray() + writer.close() + } + file + } ?: throw NoStackTraceException("书籍不能为空") }.onSuccess { success(it) + }.onError { + context.toastOnUi("导出书籍出错\n${it.localizedMessage}") } } diff --git a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt index 138ed2821..c5535c407 100644 --- a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt @@ -49,12 +49,12 @@ fun Gson.writeToOutputStream(out: OutputStream, any: Any) { writer.beginArray() any.forEach { it?.let { - GSON.toJson(it, it::class.java, writer) + toJson(it, it::class.java, writer) } } writer.endArray() } else { - GSON.toJson(any, any::class.java, writer) + toJson(any, any::class.java, writer) } writer.close() } From 82d4c0de030e70c89c3a4939548e6b6b0e5612bf Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 21 Nov 2021 21:22:46 +0800 Subject: [PATCH 085/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 8 ++++---- app/src/main/java/io/legado/app/base/BaseActivity.kt | 6 +++--- .../java/io/legado/app/ui/book/toc/TocActivityResult.kt | 2 +- .../java/io/legado/app/ui/document/HandleFileContract.kt | 6 ++---- .../legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt | 8 ++------ app/src/main/java/io/legado/app/ui/qrcode/QrCodeResult.kt | 2 +- .../java/io/legado/app/utils/ActivityResultContracts.kt | 2 +- 7 files changed, 14 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0eca8db42..a4a60eba1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -137,12 +137,12 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version") //androidX + implementation('androidx.core:core-ktx:1.7.0') implementation('androidx.appcompat:appcompat:1.3.1') - implementation('androidx.core:core-ktx:1.6.0') - implementation("androidx.activity:activity-ktx:1.3.1") - implementation("androidx.fragment:fragment-ktx:1.3.6") + implementation('androidx.activity:activity-ktx:1.4.0') + implementation('androidx.fragment:fragment-ktx:1.3.6') implementation('androidx.preference:preference-ktx:1.1.1') - implementation('androidx.constraintlayout:constraintlayout:2.1.0') + implementation('androidx.constraintlayout:constraintlayout:2.1.1') implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0') implementation('androidx.viewpager2:viewpager2:1.0.0') implementation('com.google.android.material:material:1.4.0') diff --git a/app/src/main/java/io/legado/app/base/BaseActivity.kt b/app/src/main/java/io/legado/app/base/BaseActivity.kt index 469cc6e40..0c1c153d8 100644 --- a/app/src/main/java/io/legado/app/base/BaseActivity.kt +++ b/app/src/main/java/io/legado/app/base/BaseActivity.kt @@ -98,12 +98,12 @@ abstract class BaseActivity( abstract fun onActivityCreated(savedInstanceState: Bundle?) - final override fun onCreateOptionsMenu(menu: Menu?): Boolean { - return menu?.let { + final override fun onCreateOptionsMenu(menu: Menu): Boolean { + return menu.let { val bool = onCompatCreateOptionsMenu(it) it.applyTint(this, toolBarTheme) bool - } ?: super.onCreateOptionsMenu(menu) + } } override fun onMenuOpened(featureId: Int, menu: Menu): Boolean { diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocActivityResult.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocActivityResult.kt index e727de0b2..4cdd2ad4c 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocActivityResult.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocActivityResult.kt @@ -7,7 +7,7 @@ import androidx.activity.result.contract.ActivityResultContract class TocActivityResult : ActivityResultContract?>() { - override fun createIntent(context: Context, input: String?): Intent { + override fun createIntent(context: Context, input: String): Intent { return Intent(context, TocActivity::class.java) .putExtra("bookUrl", input) } diff --git a/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt b/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt index af2dda346..f60c6e312 100644 --- a/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt +++ b/app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt @@ -15,12 +15,10 @@ class HandleFileContract : private var requestCode: Int = 0 - override fun createIntent(context: Context, input: (HandleFileParam.() -> Unit)?): Intent { + override fun createIntent(context: Context, input: (HandleFileParam.() -> Unit)): Intent { val intent = Intent(context, HandleFileActivity::class.java) val handleFileParam = HandleFileParam() - input?.let { - handleFileParam.apply(input) - } + handleFileParam.apply(input) handleFileParam.let { requestCode = it.requestCode intent.putExtra("mode", it.mode) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt index 1b14f43d6..a5715cfa9 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt @@ -82,14 +82,10 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment startActivity { putExtra("groupId", groupId) } - R.id.menu_export_bookshelf -> viewModel.exportBookshelf(books) { + R.id.menu_export_bookshelf -> viewModel.exportBookshelf(books) { file -> exportResult.launch { mode = HandleFileContract.EXPORT - fileData = Triple( - "bookshelf.json", - it.toByteArray(), - "application/json" - ) + fileData = Triple("bookshelf.json", file, "application/json") } } R.id.menu_import_bookshelf -> importBookshelfAlert(groupId) diff --git a/app/src/main/java/io/legado/app/ui/qrcode/QrCodeResult.kt b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeResult.kt index b39f09791..e98d0c249 100644 --- a/app/src/main/java/io/legado/app/ui/qrcode/QrCodeResult.kt +++ b/app/src/main/java/io/legado/app/ui/qrcode/QrCodeResult.kt @@ -7,7 +7,7 @@ import androidx.activity.result.contract.ActivityResultContract class QrCodeResult : ActivityResultContract() { - override fun createIntent(context: Context, input: Unit?): Intent { + override fun createIntent(context: Context, input: Unit): Intent { return Intent(context, QrCodeActivity::class.java) } diff --git a/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt b/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt index 3c3a89b75..9291dca05 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityResultContracts.kt @@ -11,7 +11,7 @@ class SelectImageContract : ActivityResultContract Date: Mon, 22 Nov 2021 08:36:07 +0800 Subject: [PATCH 086/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a4a60eba1..17e421829 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -130,7 +130,7 @@ dependencies { //kotlin implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version") //Kotlin反射 - implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" + implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version") //协程 def coroutines_version = '1.5.1' implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version") @@ -155,8 +155,8 @@ dependencies { //media implementation("androidx.media:media:1.4.1") def exoplayer_version = '2.15.0' - implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version" - implementation "com.google.android.exoplayer:extension-okhttp:$exoplayer_version" + implementation("com.google.android.exoplayer:exoplayer-core:$exoplayer_version") + implementation("com.google.android.exoplayer:extension-okhttp:$exoplayer_version") //Splitties def splitties_version = '3.0.0' From 7c29f878c64d1258f9b84725388bc627c313071b Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 22 Nov 2021 08:39:02 +0800 Subject: [PATCH 087/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/data/entities/Bookmark.kt | 2 +- app/src/main/java/io/legado/app/data/entities/HttpTTS.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/Bookmark.kt b/app/src/main/java/io/legado/app/data/entities/Bookmark.kt index 46db12e35..e844fb4b8 100644 --- a/app/src/main/java/io/legado/app/data/entities/Bookmark.kt +++ b/app/src/main/java/io/legado/app/data/entities/Bookmark.kt @@ -25,6 +25,6 @@ data class Bookmark( ) : Parcelable { @Ignore - constructor() : this(bookName = "") + constructor() : this(time = System.currentTimeMillis()) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt b/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt index cbc6a05da..0fff5786e 100644 --- a/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt +++ b/app/src/main/java/io/legado/app/data/entities/HttpTTS.kt @@ -27,7 +27,7 @@ data class HttpTTS( ) : BaseSource { @Ignore - constructor() : this(name = "") + constructor() : this(id = System.currentTimeMillis()) override fun getTag(): String { return name From 84eed6e142415605066dabb27bcd89645eff5706 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 22 Nov 2021 09:00:09 +0800 Subject: [PATCH 088/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/config/HttpTtsEditViewModel.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/HttpTtsEditViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/config/HttpTtsEditViewModel.kt index 2978e8f3f..04b584012 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/HttpTtsEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/HttpTtsEditViewModel.kt @@ -16,11 +16,11 @@ class HttpTtsEditViewModel(app: Application) : BaseViewModel(app) { fun initData(arguments: Bundle?, success: (httpTTS: HttpTTS) -> Unit) { execute { if (id == null) { - id = arguments?.getLong("id") - val httpTTS = id?.let { - return@let appDb.httpTTSDao.get(it) + val argumentId = arguments?.getLong("id") + if (argumentId != null && argumentId != 0L) { + id = argumentId + return@execute appDb.httpTTSDao.get(argumentId) } - return@execute httpTTS } return@execute null }.onSuccess { From 89d527e21699cb14bc9e1cdb67303aa855725366 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 22 Nov 2021 09:03:39 +0800 Subject: [PATCH 089/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 8756968ff..514e56091 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,6 +11,10 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! +**2021/11/22** + +* 修复在线朗读引擎新建会替换之前已有的bug + **2021/11/20** * 修复部分平板双页问题 From 8f3fc92318077c5f0329ff7b49bc39d0d7c505a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=AD=90=E5=B0=A2=E4=B9=82?= Date: Mon, 22 Nov 2021 17:10:05 +0800 Subject: [PATCH 090/102] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e05e6f1c7..4b0e204cf 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ +[![icon_android](https://github.com/gedoor/gedoor.github.io/blob/master/images/icon_android.png)](https://play.google.com/store/apps/details?id=io.legado.play.release)
# -[![Downloads](https://img.shields.io/github/downloads/gedoor/legado/total.svg)](https://github.com/gedoor/legado/releases/latest) [![Telegram](https://img.shields.io/badge/Telegram-channel-blue)](https://t.me/legado_channels) -
legado @@ -44,21 +43,21 @@ Legado is a free and open source novel reader for Android. 9.软件开源,持续优化,无广告。 - # # Download-下载 [![](https://img.shields.io/badge/-Download-F5F5F5.svg)](#Download-下载-) -#### Android-安卓 +#### Android-安卓 * [Releases](https://github.com/gedoor/legado/releases/latest) * [Google play - $1.99](https://play.google.com/store/apps/details?id=io.legado.play.release) * [Coolapk](https://www.coolapk.com/apk/io.legado.app.release) * [Jsdelivr](https://cdn.jsdelivr.net/gh/gedoor/legado@release/) * [\#Beta](https://kunfei.lanzoui.com/b0f810h4b) + #### IOS-苹果 -* 准备中 +* 准备中(No release) - [Github](https://github.com/gedoor/YueDuFlutter) # From ad5bcf414535f657bb9d5c5cf2113ae96cc10e11 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 25 Nov 2021 17:30:30 +0800 Subject: [PATCH 091/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 514e56091..482856faf 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,9 +11,10 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! -**2021/11/22** +**2021/11/25** * 修复在线朗读引擎新建会替换之前已有的bug +* 更新到SDK31,android 12 **2021/11/20** From 2e19bf69780d13397385f88471d3684eef389669 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 25 Nov 2021 17:41:57 +0800 Subject: [PATCH 092/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/toc/ChapterListAdapter.kt | 17 +++++++++++++++++ .../app/ui/book/toc/ChapterListFragment.kt | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt index aec125643..749968111 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt @@ -2,6 +2,7 @@ package io.legado.app.ui.book.toc import android.content.Context import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter @@ -16,6 +17,22 @@ class ChapterListAdapter(context: Context, val callback: Callback) : RecyclerAdapter(context) { val cacheFileNames = hashSetOf() + val diffCallBack = object : DiffUtil.ItemCallback() { + + override fun areItemsTheSame(oldItem: BookChapter, newItem: BookChapter): Boolean { + return oldItem.index == newItem.index + } + + override fun areContentsTheSame(oldItem: BookChapter, newItem: BookChapter): Boolean { + return oldItem.bookUrl == newItem.bookUrl + && oldItem.url == newItem.url + && oldItem.isVip == newItem.isVip + && oldItem.isPay == newItem.isPay + && oldItem.title == newItem.title + && oldItem.tag == newItem.tag + } + + } override fun getViewBinding(parent: ViewGroup): ItemChapterListBinding { return ItemChapterListBinding.inflate(inflater, parent, false) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 34d386dc1..382072526 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -112,7 +112,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt searchKey.isNullOrBlank() -> appDb.bookChapterDao.flowByBook(viewModel.bookUrl) else -> appDb.bookChapterDao.flowSearch(viewModel.bookUrl, searchKey) }.collect { - adapter.setItems(it) + adapter.setItems(it, adapter.diffCallBack) if (searchKey.isNullOrBlank() && !scrollToDurChapter) { mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) scrollToDurChapter = true From fa98d8c5bb57419e0a29c3af11417f54884c6afd Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 25 Nov 2021 17:48:19 +0800 Subject: [PATCH 093/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../book/changesource/ChangeSourceAdapter.kt | 22 +++++++++---------- .../main/bookshelf/style2/BaseBooksAdapter.kt | 19 ++++++++-------- .../app/ui/main/explore/ExploreFragment.kt | 3 ++- .../ui/rss/source/manage/RssSourceAdapter.kt | 19 ++++++++-------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt index ffc51ce84..0da75c27f 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeSourceAdapter.kt @@ -20,22 +20,20 @@ class ChangeSourceAdapter( context: Context, val viewModel: ChangeSourceViewModel, val callBack: CallBack -) : - DiffRecyclerAdapter(context) { +) : DiffRecyclerAdapter(context) { - override val diffItemCallback: DiffUtil.ItemCallback - get() = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean { - return oldItem.bookUrl == newItem.bookUrl - } - - override fun areContentsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean { - return oldItem.originName == newItem.originName - && oldItem.getDisplayLastChapterTitle() == newItem.getDisplayLastChapterTitle() - } + override val diffItemCallback = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean { + return oldItem.bookUrl == newItem.bookUrl + } + override fun areContentsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean { + return oldItem.originName == newItem.originName + && oldItem.getDisplayLastChapterTitle() == newItem.getDisplayLastChapterTitle() } + } + override fun getViewBinding(parent: ViewGroup): ItemChangeSourceBinding { return ItemChangeSourceBinding.inflate(inflater, parent, false) } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BaseBooksAdapter.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BaseBooksAdapter.kt index e5a0428c5..6f3a1f9a9 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BaseBooksAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BaseBooksAdapter.kt @@ -11,18 +11,17 @@ abstract class BaseBooksAdapter( val callBack: CallBack ) : RecyclerView.Adapter() { - val diffItemCallback: DiffUtil.ItemCallback - get() = object : DiffUtil.ItemCallback() { + val diffItemCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean { - return oldItem.name == newItem.name - && oldItem.author == newItem.author - } + override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean { + return oldItem.name == newItem.name + && oldItem.author == newItem.author + } - override fun areContentsTheSame(oldItem: Book, newItem: Book): Boolean { - return when { - oldItem.durChapterTime != newItem.durChapterTime -> false - oldItem.name != newItem.name -> false + override fun areContentsTheSame(oldItem: Book, newItem: Book): Boolean { + return when { + oldItem.durChapterTime != newItem.durChapterTime -> false + oldItem.name != newItem.name -> false oldItem.author != newItem.author -> false oldItem.durChapterTitle != newItem.durChapterTitle -> false oldItem.latestChapterTitle != newItem.latestChapterTitle -> false diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt index 80ccfef1d..7c321c9ca 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt @@ -40,6 +40,7 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo private val searchView: SearchView by lazy { binding.titleBar.findViewById(R.id.search_view) } + private val diffItemCallBack = ExploreDiffItemCallBack() private val groups = linkedSetOf() private var exploreFlowJob: Job? = null private var groupsMenu: SubMenu? = null @@ -127,7 +128,7 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo } exploreFlow.collect { binding.tvEmptyMsg.isGone = it.isNotEmpty() || searchView.query.isNotEmpty() - adapter.setItems(it, ExploreDiffItemCallBack()) + adapter.setItems(it, diffItemCallBack) } } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt index 42f7a4c67..34147a14c 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt @@ -36,18 +36,17 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : return selection.sortedBy { it.customOrder } } - val diffItemCallback: DiffUtil.ItemCallback - get() = object : DiffUtil.ItemCallback() { + val diffItemCallback = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: RssSource, newItem: RssSource): Boolean { - return oldItem.sourceUrl == newItem.sourceUrl - } + override fun areItemsTheSame(oldItem: RssSource, newItem: RssSource): Boolean { + return oldItem.sourceUrl == newItem.sourceUrl + } - override fun areContentsTheSame(oldItem: RssSource, newItem: RssSource): Boolean { - return oldItem.sourceName == newItem.sourceName - && oldItem.sourceGroup == newItem.sourceGroup - && oldItem.enabled == newItem.enabled - } + override fun areContentsTheSame(oldItem: RssSource, newItem: RssSource): Boolean { + return oldItem.sourceName == newItem.sourceName + && oldItem.sourceGroup == newItem.sourceGroup + && oldItem.enabled == newItem.enabled + } override fun getChangePayload(oldItem: RssSource, newItem: RssSource): Any? { val payload = Bundle() From bd9afe7c4ac1ed1b2d5c05e4141997092d024d23 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 25 Nov 2021 17:54:09 +0800 Subject: [PATCH 094/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/changecover/DiffCallBack.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt b/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt index ffdac0f79..1d1668acb 100644 --- a/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt +++ b/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt @@ -5,7 +5,8 @@ import androidx.recyclerview.widget.DiffUtil import io.legado.app.data.entities.SearchBook class DiffCallBack(private val oldItems: List, private val newItems: List) : - DiffUtil.Callback() { + +DiffUtil.Callback() { override fun getOldListSize(): Int { return oldItems.size From 13d20341c58a0cfcebf3320317b6bece6245457f Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 25 Nov 2021 17:54:42 +0800 Subject: [PATCH 095/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/changecover/DiffCallBack.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt b/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt index 1d1668acb..65d6fdd36 100644 --- a/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt +++ b/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt @@ -4,9 +4,10 @@ import android.os.Bundle import androidx.recyclerview.widget.DiffUtil import io.legado.app.data.entities.SearchBook -class DiffCallBack(private val oldItems: List, private val newItems: List) : - -DiffUtil.Callback() { +class DiffCallBack( + private val oldItems: List, + private val newItems: List +) : DiffUtil.Callback() { override fun getOldListSize(): Int { return oldItems.size From fb3cafddf33452b172d6c15eb75d84ffc5e8d661 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 25 Nov 2021 17:55:02 +0800 Subject: [PATCH 096/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/changecover/DiffCallBack.kt | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt diff --git a/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt b/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt deleted file mode 100644 index 65d6fdd36..000000000 --- a/app/src/main/java/io/legado/app/ui/book/changecover/DiffCallBack.kt +++ /dev/null @@ -1,54 +0,0 @@ -package io.legado.app.ui.book.changecover - -import android.os.Bundle -import androidx.recyclerview.widget.DiffUtil -import io.legado.app.data.entities.SearchBook - -class DiffCallBack( - private val oldItems: List, - private val newItems: List -) : DiffUtil.Callback() { - - override fun getOldListSize(): Int { - return oldItems.size - } - - override fun getNewListSize(): Int { - return newItems.size - } - - override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val oldItem = oldItems[oldItemPosition] - val newItem = newItems[newItemPosition] - return oldItem.bookUrl == newItem.bookUrl - } - - override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val oldItem = oldItems[oldItemPosition] - val newItem = newItems[newItemPosition] - if (oldItem.originName != newItem.originName) { - return false - } - if (oldItem.coverUrl != newItem.coverUrl) { - return false - } - return true - } - - override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { - val oldItem = oldItems[oldItemPosition] - val newItem = newItems[newItemPosition] - val payload = Bundle() - if (oldItem.originName != newItem.originName) { - payload.putString("name", newItem.originName) - } - if (oldItem.coverUrl != newItem.coverUrl) { - payload.putString("coverUrl", newItem.coverUrl) - } - if (payload.isEmpty) { - return null - } - return payload - } - -} \ No newline at end of file From 7fdc87177674c0737315e245e08dd1d9a04e7d8a Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 26 Nov 2021 22:40:07 +0800 Subject: [PATCH 097/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt | 3 +++ app/src/main/res/menu/book_toc.xml | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt index 31cddf6e0..46310a27e 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt @@ -17,8 +17,10 @@ import io.legado.app.base.VMBaseActivity import io.legado.app.databinding.ActivityChapterListBinding import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.primaryTextColor +import io.legado.app.ui.about.AppLogDialog import io.legado.app.utils.applyTint import io.legado.app.utils.gone +import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible @@ -80,6 +82,7 @@ class TocActivity : VMBaseActivity() { putExtra("chapterPos", it.durChapterPos) }) } + R.id.menu_log -> showDialogFragment() } return super.onCompatOptionsItemSelected(item) } diff --git a/app/src/main/res/menu/book_toc.xml b/app/src/main/res/menu/book_toc.xml index 59efd4075..d5c6dadf0 100644 --- a/app/src/main/res/menu/book_toc.xml +++ b/app/src/main/res/menu/book_toc.xml @@ -15,4 +15,9 @@ android:title="@string/reverse_toc" app:showAsAction="never" /> + + \ No newline at end of file From 6b35a1251a2cbec8877239036556e4cf5e7ae2d8 Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 26 Nov 2021 22:55:07 +0800 Subject: [PATCH 098/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/toc/ChapterListFragment.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 382072526..93b82d1c6 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -38,7 +38,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt private var durChapterIndex = 0 private lateinit var mLayoutManager: UpLinearLayoutManager private var tocFlowJob: Job? = null - private var scrollToDurChapter = false + private var isFirstSetData = true override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = binding.run { viewModel.chapterCallBack = this@ChapterListFragment @@ -63,7 +63,9 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt } private fun initView() = binding.run { - ivChapterTop.setOnClickListener { mLayoutManager.scrollToPositionWithOffset(0, 0) } + ivChapterTop.setOnClickListener { + mLayoutManager.scrollToPositionWithOffset(0, 0) + } ivChapterBottom.setOnClickListener { if (adapter.itemCount > 0) { mLayoutManager.scrollToPositionWithOffset(adapter.itemCount - 1, 0) @@ -113,9 +115,9 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt else -> appDb.bookChapterDao.flowSearch(viewModel.bookUrl, searchKey) }.collect { adapter.setItems(it, adapter.diffCallBack) - if (searchKey.isNullOrBlank() && !scrollToDurChapter) { + if (isFirstSetData) { mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) - scrollToDurChapter = true + isFirstSetData = false } } } From 785412ab2b2a3e5408a744281bb8ce187da5d333 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 27 Nov 2021 15:47:38 +0800 Subject: [PATCH 099/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/toc/ChapterListFragment.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 93b82d1c6..8e37c5b88 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -38,7 +38,6 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt private var durChapterIndex = 0 private lateinit var mLayoutManager: UpLinearLayoutManager private var tocFlowJob: Job? = null - private var isFirstSetData = true override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = binding.run { viewModel.chapterCallBack = this@ChapterListFragment @@ -114,10 +113,11 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt searchKey.isNullOrBlank() -> appDb.bookChapterDao.flowByBook(viewModel.bookUrl) else -> appDb.bookChapterDao.flowSearch(viewModel.bookUrl, searchKey) }.collect { - adapter.setItems(it, adapter.diffCallBack) - if (isFirstSetData) { - mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) - isFirstSetData = false + if (!(searchKey.isNullOrBlank() && it.isEmpty())) { + adapter.setItems(it, adapter.diffCallBack) + if (searchKey.isNullOrBlank()) { + mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) + } } } } From 15d6c1381f92f41a9f4746a17ae6a88937c3135a Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 27 Nov 2021 16:19:25 +0800 Subject: [PATCH 100/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/toc/ChapterListFragment.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 8e37c5b88..1035fd957 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -27,7 +27,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import kotlin.math.min class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapter_list), ChapterListAdapter.Callback, @@ -115,7 +114,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt }.collect { if (!(searchKey.isNullOrBlank() && it.isEmpty())) { adapter.setItems(it, adapter.diffCallBack) - if (searchKey.isNullOrBlank()) { + if (searchKey.isNullOrBlank() && mLayoutManager.findFirstVisibleItemPosition() < 0) { mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) } } @@ -127,7 +126,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt get() = viewModel.bookData.value?.isLocalBook() == true override fun durChapterIndex(): Int { - return min(durChapterIndex, adapter.itemCount) + return durChapterIndex } override fun openChapter(bookChapter: BookChapter) { From 7c8756bfb864347dd35bd83005c2afa537277d78 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 27 Nov 2021 16:23:11 +0800 Subject: [PATCH 101/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 1035fd957..af1bd83bd 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -33,9 +33,9 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt TocViewModel.ChapterListCallBack { override val viewModel by activityViewModels() private val binding by viewBinding(FragmentChapterListBinding::bind) + private val mLayoutManager by lazy { UpLinearLayoutManager(requireContext()) } private val adapter by lazy { ChapterListAdapter(requireContext(), this) } private var durChapterIndex = 0 - private lateinit var mLayoutManager: UpLinearLayoutManager private var tocFlowJob: Job? = null override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = binding.run { @@ -54,7 +54,6 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt } private fun initRecyclerView() { - mLayoutManager = UpLinearLayoutManager(requireContext()) binding.recyclerView.layoutManager = mLayoutManager binding.recyclerView.addItemDecoration(VerticalDivider(requireContext())) binding.recyclerView.adapter = adapter From 1973bf368ec1e0bd7135645cdc9546d2af481d4d Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 27 Nov 2021 16:46:16 +0800 Subject: [PATCH 102/102] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 482856faf..2bac567b3 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -11,10 +11,11 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! -**2021/11/25** +**2021/11/27** -* 修复在线朗读引擎新建会替换之前已有的bug * 更新到SDK31,android 12 +* 修复在线朗读引擎新建会替换之前已有的bug +* 修复目录界面自动跳转到顶部bug **2021/11/20**