Merge remote-tracking branch 'origin/master'

pull/2296/head
kunfei 2 years ago
commit 03e1d5126c
  1. 2
      app/build.gradle
  2. 4
      app/src/main/assets/updateLog.md
  3. 4
      app/src/main/java/io/legado/app/help/AppWebDav.kt
  4. 5
      app/src/main/java/io/legado/app/help/BookHelp.kt
  5. 2
      app/src/main/java/io/legado/app/help/glide/ImageLoader.kt
  6. 2
      app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt
  7. 2
      app/src/main/java/io/legado/app/ui/association/BaseAssociationViewModel.kt
  8. 2
      app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt
  9. 18
      app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt
  10. 3
      app/src/main/java/io/legado/app/ui/association/VerificationCodeActivity.kt
  11. 2
      app/src/main/java/io/legado/app/ui/book/local/ImportBookActivity.kt
  12. 1
      app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt
  13. 3
      app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt
  14. 4
      app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt
  15. 1
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt
  16. 8
      app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt
  17. 11
      app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt
  18. 8
      app/src/main/java/io/legado/app/ui/main/explore/ExploreViewModel.kt
  19. 2
      app/src/main/java/io/legado/app/utils/EncoderUtils.kt
  20. 2
      app/src/main/java/io/legado/app/utils/StringExtensions.kt
  21. 111
      app/src/main/res/layout/activity_book_source_edit.xml
  22. 3
      app/src/main/res/layout/dialog_bookmark.xml
  23. 3
      app/src/main/res/layout/dialog_http_tts_edit.xml
  24. 3
      app/src/main/res/layout/dialog_login.xml
  25. 3
      app/src/main/res/layout/dialog_url_option_edit.xml
  26. 2
      app/src/main/res/layout/item_change_source.xml
  27. 6
      app/src/main/res/values-es-rES/strings.xml
  28. 6
      app/src/main/res/values-ja-rJP/strings.xml
  29. 6
      app/src/main/res/values-pt-rBR/strings.xml
  30. 6
      app/src/main/res/values-zh-rHK/strings.xml
  31. 6
      app/src/main/res/values-zh-rTW/strings.xml
  32. 6
      app/src/main/res/values-zh/strings.xml
  33. 6
      app/src/main/res/values/strings.xml
  34. 2
      build.gradle

@ -131,7 +131,7 @@ resourcePlaceholders {
dependencies { dependencies {
//noinspection GradleDependency //noinspection GradleDependency
coreLibraryDesugaring('com.android.tools:desugar_jdk_libs:1.1.6') coreLibraryDesugaring('com.android.tools:desugar_jdk_libs:1.2.2')
testImplementation('junit:junit:4.13.2') testImplementation('junit:junit:4.13.2')
androidTestImplementation('androidx.test:runner:1.4.0') androidTestImplementation('androidx.test:runner:1.4.0')
androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0') androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0')

@ -11,6 +11,10 @@
* 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
**2022/09/16**
* 一些优化
**2022/09/15** **2022/09/15**
* 更新cronet: 105.0.5195.136 * 更新cronet: 105.0.5195.136

@ -19,9 +19,11 @@ import io.legado.app.lib.webdav.WebDavException
import io.legado.app.lib.webdav.WebDavFile import io.legado.app.lib.webdav.WebDavFile
import io.legado.app.ui.widget.dialog.WaitDialog import io.legado.app.ui.widget.dialog.WaitDialog
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import splitties.init.appCtx import splitties.init.appCtx
import java.io.File import java.io.File
import java.text.SimpleDateFormat import java.text.SimpleDateFormat

@ -139,8 +139,11 @@ object BookHelp {
var bytes = analyzeUrl.getByteArrayAwait() var bytes = analyzeUrl.getByteArrayAwait()
//某些图片被加密,需要进一步解密 //某些图片被加密,需要进一步解密
bookSource?.getContentRule()?.imageDecode?.let { bookSource?.getContentRule()?.imageDecode?.let {
if (it.isBlank()) {
return@let
}
kotlin.runCatching { kotlin.runCatching {
bookSource?.evalJS(it) { bookSource.evalJS(it) {
put("book", book) put("book", book)
put("result", bytes) put("result", bytes)
put("src", src) put("src", src)

@ -7,8 +7,8 @@ import android.net.Uri
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import com.bumptech.glide.RequestBuilder import com.bumptech.glide.RequestBuilder
import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.isDataUrl
import io.legado.app.utils.isContentScheme import io.legado.app.utils.isContentScheme
import io.legado.app.utils.isDataUrl
import java.io.File import java.io.File
@Suppress("unused") @Suppress("unused")

@ -1,6 +1,5 @@
package io.legado.app.ui.about package io.legado.app.ui.about
import java.text.SimpleDateFormat
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
@ -26,6 +25,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.text.SimpleDateFormat
class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() { class ReadRecordActivity : BaseActivity<ActivityReadRecordBinding>() {

@ -21,7 +21,7 @@ abstract class BaseAssociationViewModel(application: Application) : BaseViewMode
} }
} }
fun importJson(json: String) { private fun importJson(json: String) {
//暂时根据文件内容判断属于什么 //暂时根据文件内容判断属于什么
when { when {
json.contains("sourceUrl") -> json.contains("sourceUrl") ->

@ -7,13 +7,11 @@ import androidx.lifecycle.MutableLiveData
import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog
import io.legado.app.constant.AppPattern.bookFileRegex import io.legado.app.constant.AppPattern.bookFileRegex
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.IntentData
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.inputStream import io.legado.app.utils.inputStream
import io.legado.app.utils.isJson import io.legado.app.utils.isJson
import io.legado.app.utils.printOnDebug import io.legado.app.utils.printOnDebug
import java.io.File import java.io.File
import java.io.InputStream
class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) { class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) {
val importBookLiveData = MutableLiveData<Uri>() val importBookLiveData = MutableLiveData<Uri>()

@ -1,12 +1,16 @@
package io.legado.app.ui.association package io.legado.app.ui.association
import android.app.Application import android.app.Application
import androidx.core.net.toUri
import io.legado.app.R import io.legado.app.R
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.http.newCallResponseBody import io.legado.app.help.http.newCallResponseBody
import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.okHttpClient
import io.legado.app.help.http.text import io.legado.app.help.http.text
import io.legado.app.utils.FileUtils
import io.legado.app.utils.externalCache
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import splitties.init.appCtx
class OnLineImportViewModel(app: Application) : BaseAssociationViewModel(app) { class OnLineImportViewModel(app: Application) : BaseAssociationViewModel(app) {
@ -72,8 +76,18 @@ class OnLineImportViewModel(app: Application) : BaseAssociationViewModel(app) {
importReadConfig(rs.bytes(), finally) importReadConfig(rs.bytes(), finally)
} }
else -> { else -> {
val json = rs.text("utf-8") val inputStream = rs.byteStream()
importJson(json) val file = FileUtils.createFileIfNotExist(
appCtx.externalCache,
"download",
"scheme_import_cache.json"
)
file.outputStream().use { out ->
inputStream.use {
it.copyTo(out)
}
}
importJson(file.toUri())
} }
} }
} }

@ -17,8 +17,9 @@ class VerificationCodeActivity :
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
intent.getStringExtra("imageUrl")?.let { intent.getStringExtra("imageUrl")?.let {
val sourceOrigin = intent.getStringExtra("sourceOrigin") val sourceOrigin = intent.getStringExtra("sourceOrigin")
val sourceName = intent.getStringExtra("sourceName")
showDialogFragment( showDialogFragment(
VerificationCodeDialog(it, sourceOrigin) VerificationCodeDialog(it, sourceOrigin, sourceName)
) )
} ?: finish() } ?: finish()
} }

@ -200,7 +200,7 @@ class ImportBookActivity : VMBaseActivity<ActivityImportBookBinding, ImportBookV
private fun upSort(sort: Int) { private fun upSort(sort: Int) {
viewModel.sort = sort viewModel.sort = sort
putPrefInt(PreferKey.localBookImportSort, sort) putPrefInt(PreferKey.localBookImportSort, sort)
if (scanDocJob?.isCancelled == true || scanDocJob?.isCompleted == true) { if (scanDocJob?.isActive != true) {
viewModel.dataCallback?.setItems(adapter.getItems()) viewModel.dataCallback?.setItems(adapter.getItems())
} }
} }

@ -15,7 +15,6 @@ import io.legado.app.lib.theme.backgroundColor
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.ItemTouchCallback
import java.util.* import java.util.*
import kotlin.collections.HashSet
class BookAdapter(context: Context, val callBack: CallBack) : class BookAdapter(context: Context, val callBack: CallBack) :
RecyclerAdapter<Book, ItemArrangeBookBinding>(context), RecyclerAdapter<Book, ItemArrangeBookBinding>(context),

@ -15,7 +15,8 @@ import android.view.animation.Animation
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.SeekBar import android.widget.SeekBar
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.core.view.* import androidx.core.view.isGone
import androidx.core.view.isVisible
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.databinding.ViewReadMenuBinding import io.legado.app.databinding.ViewReadMenuBinding

@ -15,7 +15,9 @@ import io.legado.app.help.config.AppConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.model.localBook.EpubFile import io.legado.app.model.localBook.EpubFile
import io.legado.app.utils.* import io.legado.app.utils.BitmapUtils
import io.legado.app.utils.FileUtils
import io.legado.app.utils.toastOnUi
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext

@ -21,7 +21,6 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.ActivityBookSourceBinding import io.legado.app.databinding.ActivityBookSourceBinding
import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.help.DirectLinkUpload import io.legado.app.help.DirectLinkUpload
import io.legado.app.help.IntentData
import io.legado.app.help.config.LocalConfig import io.legado.app.help.config.LocalConfig
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor

@ -10,12 +10,10 @@ import com.google.android.flexbox.FlexboxLayout
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.rule.ExploreKind import io.legado.app.data.entities.rule.ExploreKind
import io.legado.app.databinding.ItemFilletTextBinding import io.legado.app.databinding.ItemFilletTextBinding
import io.legado.app.databinding.ItemFindBookBinding import io.legado.app.databinding.ItemFindBookBinding
import io.legado.app.help.config.SourceConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.accentColor
import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.login.SourceLoginActivity
@ -173,10 +171,7 @@ class ExploreAdapter(context: Context, val callBack: CallBack) :
}.onSuccess { }.onSuccess {
callBack.refreshData() callBack.refreshData()
} }
R.id.menu_del -> Coroutine.async(callBack.scope) { R.id.menu_del -> callBack.deleteSource(source)
appDb.bookSourceDao.delete(source)
SourceConfig.removeSource(source.bookSourceUrl)
}
} }
true true
} }
@ -191,5 +186,6 @@ class ExploreAdapter(context: Context, val callBack: CallBack) :
fun openExplore(sourceUrl: String, title: String, exploreUrl: String?) fun openExplore(sourceUrl: String, title: String, exploreUrl: String?)
fun editSource(sourceUrl: String) fun editSource(sourceUrl: String)
fun toTop(source: BookSource) fun toTop(source: BookSource)
fun deleteSource(source: BookSource)
} }
} }

@ -18,6 +18,7 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.FragmentExploreBinding import io.legado.app.databinding.FragmentExploreBinding
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.lib.theme.primaryTextColor import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.ui.book.explore.ExploreShowActivity import io.legado.app.ui.book.explore.ExploreShowActivity
@ -183,6 +184,16 @@ class ExploreFragment : VMBaseFragment<ExploreViewModel>(R.layout.fragment_explo
viewModel.topSource(source) viewModel.topSource(source)
} }
override fun deleteSource(source: BookSource) {
alert(R.string.draw) {
setMessage(getString(R.string.sure_del) + "\n" + source.bookSourceName)
noButton()
yesButton {
viewModel.deleteSource(source)
}
}
}
fun compressExplore() { fun compressExplore() {
if (!adapter.compressExplore()) { if (!adapter.compressExplore()) {
if (AppConfig.isEInkMode) { if (AppConfig.isEInkMode) {

@ -4,6 +4,7 @@ import android.app.Application
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.help.config.SourceConfig
class ExploreViewModel(application: Application) : BaseViewModel(application) { class ExploreViewModel(application: Application) : BaseViewModel(application) {
@ -15,4 +16,11 @@ class ExploreViewModel(application: Application) : BaseViewModel(application) {
} }
} }
fun deleteSource(source: BookSource) {
execute {
appDb.bookSourceDao.delete(source)
SourceConfig.removeSource(source.bookSourceUrl)
}
}
} }

@ -1,10 +1,10 @@
package io.legado.app.utils package io.legado.app.utils
import android.util.Base64 import android.util.Base64
import cn.hutool.crypto.symmetric.SymmetricCrypto
import java.security.spec.AlgorithmParameterSpec import java.security.spec.AlgorithmParameterSpec
import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec import javax.crypto.spec.SecretKeySpec
import cn.hutool.crypto.symmetric.SymmetricCrypto
/** /**
* transformations https://developer.android.google.cn/reference/kotlin/javax/crypto/Cipher?hl=en * transformations https://developer.android.google.cn/reference/kotlin/javax/crypto/Cipher?hl=en

@ -2,11 +2,11 @@
package io.legado.app.utils package io.legado.app.utils
import io.legado.app.constant.AppPattern.dataUriRegex
import android.icu.text.Collator import android.icu.text.Collator
import android.icu.util.ULocale import android.icu.util.ULocale
import android.net.Uri import android.net.Uri
import android.text.Editable import android.text.Editable
import io.legado.app.constant.AppPattern.dataUriRegex
import java.io.File import java.io.File
import java.util.* import java.util.*

@ -13,64 +13,64 @@
app:fitStatusBar="false" app:fitStatusBar="false"
app:title="@string/edit_book_source" /> app:title="@string/edit_book_source" />
<LinearLayout <HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_vertical">
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/is_enable" />
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable_explore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/discovery" />
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable_cookie"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/auto_save_cookie" />
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable_review"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/review" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:scrollbars="none">
<TextView <LinearLayout
android:height="30dp"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/book_type"
android:layout_marginLeft="8dp"
android:layout_marginRight="3dp"
tools:ignore="RtlHardcoded" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/sp_type"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:entries="@array/book_type" android:layout_gravity="center_vertical"
app:theme="@style/Spinner" /> android:paddingHorizontal="8dp"
android:gravity="center_vertical"
</LinearLayout> android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/book_type"
tools:ignore="RtlHardcoded" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/sp_type"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:entries="@array/book_type"
app:theme="@style/Spinner" />
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/is_enable" />
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable_explore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/discovery" />
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable_cookie"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/auto_save_cookie" />
<io.legado.app.lib.theme.view.ThemeCheckBox
android:id="@+id/cb_is_enable_review"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/review" />
</LinearLayout>
</HorizontalScrollView>
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout" android:id="@+id/tab_layout"
@ -119,6 +119,7 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
tools:listitem="@layout/item_source_edit" />
</LinearLayout> </LinearLayout>

@ -35,7 +35,8 @@
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"> android:layout_weight="1"
android:overScrollMode="ifContentScrolls">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

@ -26,7 +26,8 @@
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:overScrollMode="ifContentScrolls">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

@ -30,7 +30,8 @@
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:overScrollMode="ifContentScrolls">
<com.google.android.flexbox.FlexboxLayout <com.google.android.flexbox.FlexboxLayout
android:id="@+id/flexbox" android:id="@+id/flexbox"

@ -46,7 +46,8 @@
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:overScrollMode="ifContentScrolls">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

@ -14,6 +14,7 @@
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:padding="5dp" android:padding="5dp"
android:src="@drawable/ic_praise" android:src="@drawable/ic_praise"
android:contentDescription="@string/like_source"
app:layout_constraintBottom_toTopOf="@+id/iv_bad" app:layout_constraintBottom_toTopOf="@+id/iv_bad"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
@ -27,6 +28,7 @@
android:padding="5dp" android:padding="5dp"
android:rotationX="180" android:rotationX="180"
android:src="@drawable/ic_praise" android:src="@drawable/ic_praise"
android:contentDescription="@string/not_like_source"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_good" app:layout_constraintTop_toBottomOf="@+id/iv_good"

@ -1016,8 +1016,8 @@
<string name="rule_review_content">段评内容(contentRule)</string> <string name="rule_review_content">段评内容(contentRule)</string>
<string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string> <string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string>
<string name="rule_post_time">段评发布时间(postTimeRule)</string> <string name="rule_post_time">段评发布时间(postTimeRule)</string>
<string name="review_vote_down">点踩URL(voteUpUrl)</string> <string name="review_vote_down">点踩URL(voteDownUrl)</string>
<string name="review_vote_up">点赞URL(voteDownUrl)</string> <string name="review_vote_up">点赞URL(voteUpUrl)</string>
<string name="post_review_url">发送回复URL(postReviewUrl)</string> <string name="post_review_url">发送回复URL(postReviewUrl)</string>
<string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string> <string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string>
<string name="delete_review_url">删除段评URL(deleteUrl)</string> <string name="delete_review_url">删除段评URL(deleteUrl)</string>
@ -1026,4 +1026,6 @@
<string name="show_read_title_addition">show read title addition area</string> <string name="show_read_title_addition">show read title addition area</string>
<string name="read_bar_style_follow_page">read bar style follow page</string> <string name="read_bar_style_follow_page">read bar style follow page</string>
<string name="rule_image_decode">Decode Image(imageDecode)</string> <string name="rule_image_decode">Decode Image(imageDecode)</string>
<string name="like_source"></string>
<string name="not_like_source"></string>
</resources> </resources>

@ -1019,8 +1019,8 @@
<string name="rule_review_content">段评内容(contentRule)</string> <string name="rule_review_content">段评内容(contentRule)</string>
<string name="rule_post_time">段评发布时间(postTimeRule)</string> <string name="rule_post_time">段评发布时间(postTimeRule)</string>
<string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string> <string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string>
<string name="review_vote_down">点踩URL(voteUpUrl)</string> <string name="review_vote_down">点踩URL(voteDownUrl)</string>
<string name="review_vote_up">点赞URL(voteDownUrl)</string> <string name="review_vote_up">点赞URL(voteUpUrl)</string>
<string name="post_review_url">发送回复URL(postReviewUrl)</string> <string name="post_review_url">发送回复URL(postReviewUrl)</string>
<string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string> <string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string>
<string name="delete_review_url">删除段评URL(deleteUrl)</string> <string name="delete_review_url">删除段评URL(deleteUrl)</string>
@ -1029,4 +1029,6 @@
<string name="show_read_title_addition">show read title addition area</string> <string name="show_read_title_addition">show read title addition area</string>
<string name="read_bar_style_follow_page">read bar style follow page</string> <string name="read_bar_style_follow_page">read bar style follow page</string>
<string name="rule_image_decode">Decode Image(imageDecode)</string> <string name="rule_image_decode">Decode Image(imageDecode)</string>
<string name="like_source"></string>
<string name="not_like_source"></string>
</resources> </resources>

@ -1019,8 +1019,8 @@
<string name="rule_review_content">段评内容(contentRule)</string> <string name="rule_review_content">段评内容(contentRule)</string>
<string name="rule_post_time">段评发布时间(postTimeRule)</string> <string name="rule_post_time">段评发布时间(postTimeRule)</string>
<string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string> <string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string>
<string name="review_vote_down">点踩URL(voteUpUrl)</string> <string name="review_vote_down">点踩URL(voteDownUrl)</string>
<string name="review_vote_up">点赞URL(voteDownUrl)</string> <string name="review_vote_up">点赞URL(voteUpUrl)</string>
<string name="post_review_url">发送回复URL(postReviewUrl)</string> <string name="post_review_url">发送回复URL(postReviewUrl)</string>
<string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string> <string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string>
<string name="delete_review_url">删除段评URL(deleteUrl)</string> <string name="delete_review_url">删除段评URL(deleteUrl)</string>
@ -1029,4 +1029,6 @@
<string name="show_read_title_addition">show read title addition area</string> <string name="show_read_title_addition">show read title addition area</string>
<string name="read_bar_style_follow_page">read bar style follow page</string> <string name="read_bar_style_follow_page">read bar style follow page</string>
<string name="rule_image_decode">Decode Image(imageDecode)</string> <string name="rule_image_decode">Decode Image(imageDecode)</string>
<string name="like_source"></string>
<string name="not_like_source"></string>
</resources> </resources>

@ -1016,8 +1016,8 @@
<string name="rule_review_content">段评内容(contentRule)</string> <string name="rule_review_content">段评内容(contentRule)</string>
<string name="rule_post_time">段评发布时间(postTimeRule)</string> <string name="rule_post_time">段评发布时间(postTimeRule)</string>
<string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string> <string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string>
<string name="review_vote_down">点踩URL(voteUpUrl)</string> <string name="review_vote_down">点踩URL(voteDownUrl)</string>
<string name="review_vote_up">点赞URL(voteDownUrl)</string> <string name="review_vote_up">点赞URL(voteUpUrl)</string>
<string name="post_review_url">发送回复URL(postReviewUrl)</string> <string name="post_review_url">发送回复URL(postReviewUrl)</string>
<string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string> <string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string>
<string name="delete_review_url">删除段评URL(deleteUrl)</string> <string name="delete_review_url">删除段评URL(deleteUrl)</string>
@ -1026,4 +1026,6 @@
<string name="show_read_title_addition">展示顶部工具栏附加区域</string> <string name="show_read_title_addition">展示顶部工具栏附加区域</string>
<string name="read_bar_style_follow_page">工具栏样式跟随页面</string> <string name="read_bar_style_follow_page">工具栏样式跟随页面</string>
<string name="rule_image_decode">图片解密(imageDecode)</string> <string name="rule_image_decode">图片解密(imageDecode)</string>
<string name="like_source"></string>
<string name="not_like_source"></string>
</resources> </resources>

@ -1018,8 +1018,8 @@
<string name="rule_review_content">段评内容(contentRule)</string> <string name="rule_review_content">段评内容(contentRule)</string>
<string name="rule_post_time">段评发布时间(postTimeRule)</string> <string name="rule_post_time">段评发布时间(postTimeRule)</string>
<string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string> <string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string>
<string name="review_vote_down">点踩URL(voteUpUrl)</string> <string name="review_vote_down">点踩URL(voteDownUrl)</string>
<string name="review_vote_up">点赞URL(voteDownUrl)</string> <string name="review_vote_up">点赞URL(voteUpUrl)</string>
<string name="post_review_url">发送回复URL(postReviewUrl)</string> <string name="post_review_url">发送回复URL(postReviewUrl)</string>
<string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string> <string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string>
<string name="delete_review_url">删除段评URL(deleteUrl)</string> <string name="delete_review_url">删除段评URL(deleteUrl)</string>
@ -1028,4 +1028,6 @@
<string name="show_read_title_addition">展示顶部工具栏附加区域</string> <string name="show_read_title_addition">展示顶部工具栏附加区域</string>
<string name="read_bar_style_follow_page">工具栏样式跟随页面</string> <string name="read_bar_style_follow_page">工具栏样式跟随页面</string>
<string name="rule_image_decode">图片解密(imageDecode)</string> <string name="rule_image_decode">图片解密(imageDecode)</string>
<string name="like_source"></string>
<string name="not_like_source"></string>
</resources> </resources>

@ -1018,8 +1018,8 @@
<string name="rule_review_content">段评内容(contentRule)</string> <string name="rule_review_content">段评内容(contentRule)</string>
<string name="rule_post_time">段评发布时间(postTimeRule)</string> <string name="rule_post_time">段评发布时间(postTimeRule)</string>
<string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string> <string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string>
<string name="review_vote_down">点踩URL(voteUpUrl)</string> <string name="review_vote_down">点踩URL(voteDownUrl)</string>
<string name="review_vote_up">点赞URL(voteDownUrl)</string> <string name="review_vote_up">点赞URL(voteUpUrl)</string>
<string name="post_review_url">发送回复URL(postReviewUrl)</string> <string name="post_review_url">发送回复URL(postReviewUrl)</string>
<string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string> <string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string>
<string name="delete_review_url">删除段评URL(deleteUrl)</string> <string name="delete_review_url">删除段评URL(deleteUrl)</string>
@ -1028,4 +1028,6 @@
<string name="show_read_title_addition">展示顶部工具栏附加区域</string> <string name="show_read_title_addition">展示顶部工具栏附加区域</string>
<string name="read_bar_style_follow_page">工具栏样式跟随页面</string> <string name="read_bar_style_follow_page">工具栏样式跟随页面</string>
<string name="rule_image_decode">图片解密(imageDecode)</string> <string name="rule_image_decode">图片解密(imageDecode)</string>
<string name="like_source"></string>
<string name="not_like_source"></string>
</resources> </resources>

@ -1019,8 +1019,8 @@
<string name="rule_review_content">段评内容(contentRule)</string> <string name="rule_review_content">段评内容(contentRule)</string>
<string name="rule_post_time">段评发布时间(postTimeRule)</string> <string name="rule_post_time">段评发布时间(postTimeRule)</string>
<string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string> <string name="rule_review_quote">段评回复URL(reviewQuoteUrl)</string>
<string name="review_vote_down">点踩URL(voteUpUrl)</string> <string name="review_vote_down">点踩URL(voteDownUrl)</string>
<string name="review_vote_up">点赞URL(voteDownUrl)</string> <string name="review_vote_up">点赞URL(voteUpUrl)</string>
<string name="post_review_url">发送回复URL(postReviewUrl)</string> <string name="post_review_url">发送回复URL(postReviewUrl)</string>
<string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string> <string name="post_quote_url">发送回复段评URL(postQuoteUrl)</string>
<string name="delete_review_url">删除段评URL(deleteUrl)</string> <string name="delete_review_url">删除段评URL(deleteUrl)</string>
@ -1029,4 +1029,6 @@
<string name="show_read_title_addition">show read title addition area</string> <string name="show_read_title_addition">show read title addition area</string>
<string name="read_bar_style_follow_page">read bar style follow page</string> <string name="read_bar_style_follow_page">read bar style follow page</string>
<string name="rule_image_decode">Decode Image(imageDecode)</string> <string name="rule_image_decode">Decode Image(imageDecode)</string>
<string name="like_source"></string>
<string name="not_like_source"></string>
</resources> </resources>

@ -5,7 +5,7 @@ buildscript {
kotlin_version = '1.7.10' kotlin_version = '1.7.10'
compose_version = '1.2.1' compose_version = '1.2.1'
compose_compiler_version = '1.3.0' compose_compiler_version = '1.3.0'
agp_version= '7.2.2' agp_version = '7.3.0'
exoplayer_version = '2.18.1' exoplayer_version = '2.18.1'
splitties_version = '3.0.0' splitties_version = '3.0.0'
room_version = '2.4.3' room_version = '2.4.3'

Loading…
Cancel
Save