Merge remote-tracking branch 'upstream/master'

pull/2250/head
Seidko 2 years ago
commit 24838b0676
  1. 4
      app/build.gradle
  2. 2
      app/src/main/assets/defaultData/directLinkUpload.json
  3. 5
      app/src/main/assets/updateLog.md
  4. 2
      app/src/main/java/io/legado/app/help/SourceVerificationHelp.kt
  5. 2
      app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt
  6. 52
      app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt
  7. 156
      app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt
  8. 6
      app/src/main/java/io/legado/app/ui/book/read/SearchMenu.kt
  9. 2
      app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt
  10. 1
      app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt
  11. 15
      app/src/main/java/io/legado/app/utils/AnimationExtensions.kt
  12. 17
      app/src/main/java/io/legado/app/utils/AnimationUtilsSupport.kt
  13. 10
      app/src/main/res/layout/dialog_verification_code_view.xml

@ -164,7 +164,7 @@ dependencies {
implementation('androidx.constraintlayout:constraintlayout:2.1.4') implementation('androidx.constraintlayout:constraintlayout:2.1.4')
implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0') implementation('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0')
implementation('androidx.viewpager2:viewpager2:1.0.0') implementation('androidx.viewpager2:viewpager2:1.0.0')
implementation('androidx.webkit:webkit:1.4.0') implementation('androidx.webkit:webkit:1.5.0')
//google //google
implementation('com.google.android.material:material:1.6.1') implementation('com.google.android.material:material:1.6.1')
@ -207,7 +207,7 @@ dependencies {
implementation('io.github.jeremyliao:live-event-bus-x:1.8.0') implementation('io.github.jeremyliao:live-event-bus-x:1.8.0')
// //
implementation('org.jsoup:jsoup:1.15.2') implementation('org.jsoup:jsoup:1.15.3')
implementation('com.jayway.jsonpath:json-path:2.7.0') implementation('com.jayway.jsonpath:json-path:2.7.0')
implementation('cn.wanghaomiao:JsoupXpath:2.5.1') implementation('cn.wanghaomiao:JsoupXpath:2.5.1')
implementation(project(path: ':epublib')) implementation(project(path: ':epublib'))

@ -1,5 +1,5 @@
{ {
"uploadUrl": "http://sy.mgz6.cc/shuyuan,{\"method\":\"POST\",\"body\": {\"file\": \"fileRequest\"},\"type\": \"multipart/form-data\"}", "uploadUrl": "http://sy.mgz6.cc/shuyuan,{\"method\":\"POST\",\"body\": {\"file\": \"fileRequest\"},\"type\": \"multipart/form-data\"}",
"downloadUrlRule": "$.data@js:if (result == '') \n '' \n else \n 'http://shuyuan.mgz6.cc/shuyuan/' + result", "downloadUrlRule": "$.data@js:if (result == '') \n '' \n else \n 'https://shuyuan.mgz6.cc/shuyuan/' + result",
"summary": "有效期2天" "summary": "有效期2天"
} }

@ -11,6 +11,11 @@
* 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。 * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
**2022/08/23**
* 验证码输入框显示来自哪个书源
* 修复一键导入丢失url参数的问题
**2022/08/19** **2022/08/19**
* 更新cronet: 104.0.5112.97 * 更新cronet: 104.0.5112.97

@ -27,6 +27,7 @@ object SourceVerificationHelp {
appCtx.startActivity<VerificationCodeActivity> { appCtx.startActivity<VerificationCodeActivity> {
putExtra("imageUrl", url) putExtra("imageUrl", url)
putExtra("sourceOrigin", source.getKey()) putExtra("sourceOrigin", source.getKey())
putExtra("sourceName", source.getTag())
} }
} else { } else {
startBrowser(source, url, title, true) startBrowser(source, url, title, true)
@ -58,6 +59,7 @@ object SourceVerificationHelp {
putExtra("title", title) putExtra("title", title)
putExtra("url", url) putExtra("url", url)
putExtra("sourceOrigin", source.getKey()) putExtra("sourceOrigin", source.getKey())
putExtra("sourceName", source.getTag())
putExtra("sourceVerificationEnable", saveResult) putExtra("sourceVerificationEnable", saveResult)
IntentData.put(url, source.getHeaderMap(true)) IntentData.put(url, source.getHeaderMap(true))
} }

@ -46,7 +46,7 @@ class OnLineImportActivity :
finallyDialog(getString(R.string.error), it) finallyDialog(getString(R.string.error), it)
} }
intent.data?.let { intent.data?.let {
val url = it.getQueryParameter("src") val url = it.query?.substringAfter("src=")
if (url.isNullOrBlank()) { if (url.isNullOrBlank()) {
finish() finish()
return return

@ -2,12 +2,12 @@ package io.legado.app.ui.association
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.MenuItem
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseDialogFragment import io.legado.app.base.BaseDialogFragment
import io.legado.app.databinding.DialogVerificationCodeViewBinding import io.legado.app.databinding.DialogVerificationCodeViewBinding
@ -17,7 +17,9 @@ import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader import io.legado.app.help.glide.OkHttpModelLoader
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.widget.dialog.PhotoDialog import io.legado.app.ui.widget.dialog.PhotoDialog
import io.legado.app.utils.* import io.legado.app.utils.applyTint
import io.legado.app.utils.setLayout
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
/** /**
@ -26,12 +28,18 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding
* val key = "${sourceOrigin ?: ""}_verificationResult" * val key = "${sourceOrigin ?: ""}_verificationResult"
* CacheManager.get(key) * CacheManager.get(key)
*/ */
class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification_code_view), Toolbar.OnMenuItemClickListener { class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification_code_view),
Toolbar.OnMenuItemClickListener {
constructor(imageUrl: String, sourceOrigin: String? = null) : this() { constructor(
imageUrl: String,
sourceOrigin: String? = null,
sourceName: String? = null
) : this() {
arguments = Bundle().apply { arguments = Bundle().apply {
putString("sourceOrigin", sourceOrigin)
putString("imageUrl", imageUrl) putString("imageUrl", imageUrl)
putString("sourceOrigin", sourceOrigin)
putString("sourceName", sourceName)
} }
} }
@ -47,23 +55,23 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
initMenu() initMenu()
binding.run { binding.run {
toolBar.setBackgroundColor(primaryColor) toolBar.setBackgroundColor(primaryColor)
val sourceOrigin = arguments?.getString("sourceOrigin") arguments?.let { arguments ->
arguments?.getString("imageUrl")?.let { imageUrl -> toolBar.subtitle = arguments.getString("sourceName")
ImageLoader.load(requireContext(), imageUrl).apply { val sourceOrigin = arguments.getString("sourceOrigin")
sourceOrigin?.let { arguments.getString("imageUrl")?.let { imageUrl ->
apply( ImageLoader.load(requireContext(), imageUrl).apply {
RequestOptions().set( sourceOrigin?.let {
OkHttpModelLoader.sourceOriginOption, apply(
it RequestOptions().set(OkHttpModelLoader.sourceOriginOption, it)
) )
) }
}.error(R.drawable.image_loading_error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(verificationCodeImageView)
verificationCodeImageView.setOnClickListener {
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
} }
}.error(R.drawable.image_loading_error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(verificationCodeImageView)
verificationCodeImageView.setOnClickListener {
showDialogFragment(PhotoDialog(imageUrl, sourceOrigin))
} }
} }
} }
@ -86,7 +94,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification
CacheManager.putMemory(key, it) CacheManager.putMemory(key, it)
dismiss() dismiss()
} }
} }
} }
return false return false
} }

@ -43,10 +43,18 @@ class ReadMenu @JvmOverloads constructor(
var cnaShowMenu: Boolean = false var cnaShowMenu: Boolean = false
private val callBack: CallBack get() = activity as CallBack private val callBack: CallBack get() = activity as CallBack
private val binding = ViewReadMenuBinding.inflate(LayoutInflater.from(context), this, true) private val binding = ViewReadMenuBinding.inflate(LayoutInflater.from(context), this, true)
private lateinit var menuTopIn: Animation private val menuTopIn: Animation by lazy {
private lateinit var menuTopOut: Animation loadAnimation(context, R.anim.anim_readbook_top_in)
private lateinit var menuBottomIn: Animation }
private lateinit var menuBottomOut: Animation private val menuTopOut: Animation by lazy {
loadAnimation(context, R.anim.anim_readbook_top_out)
}
private val menuBottomIn: Animation by lazy {
loadAnimation(context, R.anim.anim_readbook_bottom_in)
}
private val menuBottomOut: Animation by lazy {
loadAnimation(context, R.anim.anim_readbook_bottom_out)
}
private val bgColor: Int = context.bottomBackground private val bgColor: Int = context.bottomBackground
private val textColor: Int = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor)) private val textColor: Int = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor))
private val bottomBackgroundList: ColorStateList = Selector.colorBuild() private val bottomBackgroundList: ColorStateList = Selector.colorBuild()
@ -71,6 +79,58 @@ class ReadMenu @JvmOverloads constructor(
} }
} }
} }
private val menuInListener = object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation) {
binding.tvSourceAction.isGone = ReadBook.isLocalBook
binding.tvLogin.isGone = ReadBook.bookSource?.loginUrl.isNullOrEmpty()
binding.tvPay.isGone = ReadBook.bookSource?.loginUrl.isNullOrEmpty()
|| ReadBook.curTextChapter?.isVip != true
|| ReadBook.curTextChapter?.isPay == true
callBack.upSystemUiVisibility()
binding.llBrightness.visible(showBrightnessView)
}
@SuppressLint("RtlHardcoded")
override fun onAnimationEnd(animation: Animation) {
val navigationBarHeight =
if (ReadBookConfig.hideNavigationBar) {
activity?.navigationBarHeight ?: 0
} else {
0
}
binding.run {
vwMenuBg.setOnClickListener { runMenuOut() }
root.padding = 0
when (activity?.navigationBarGravity) {
Gravity.BOTTOM -> root.bottomPadding = navigationBarHeight
Gravity.LEFT -> root.leftPadding = navigationBarHeight
Gravity.RIGHT -> root.rightPadding = navigationBarHeight
}
}
callBack.upSystemUiVisibility()
if (!LocalConfig.readMenuHelpVersionIsLast) {
callBack.showReadMenuHelp()
}
}
override fun onAnimationRepeat(animation: Animation) = Unit
}
private val menuOutListener = object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation) {
binding.vwMenuBg.setOnClickListener(null)
}
override fun onAnimationEnd(animation: Animation) {
this@ReadMenu.invisible()
binding.titleBar.invisible()
binding.bottomMenu.invisible()
cnaShowMenu = false
onMenuOutEnd?.invoke()
callBack.upSystemUiVisibility()
}
override fun onAnimationRepeat(animation: Animation) = Unit
}
init { init {
initView() initView()
@ -141,19 +201,29 @@ class ReadMenu @JvmOverloads constructor(
activity?.window?.attributes = params activity?.window?.attributes = params
} }
fun runMenuIn() { fun runMenuIn(anim: Boolean = AppConfig.isEInkMode) {
this.visible() this.visible()
binding.titleBar.visible() binding.titleBar.visible()
binding.bottomMenu.visible() binding.bottomMenu.visible()
binding.titleBar.startAnimation(menuTopIn) if (anim) {
binding.bottomMenu.startAnimation(menuBottomIn) binding.titleBar.startAnimation(menuTopIn)
binding.bottomMenu.startAnimation(menuBottomIn)
} else {
menuInListener.onAnimationStart(menuBottomIn)
menuInListener.onAnimationEnd(menuBottomIn)
}
} }
fun runMenuOut(onMenuOutEnd: (() -> Unit)? = null) { fun runMenuOut(anim: Boolean = AppConfig.isEInkMode, onMenuOutEnd: (() -> Unit)? = null) {
this.onMenuOutEnd = onMenuOutEnd this.onMenuOutEnd = onMenuOutEnd
if (this.isVisible) { if (this.isVisible) {
binding.titleBar.startAnimation(menuTopOut) if (anim) {
binding.bottomMenu.startAnimation(menuBottomOut) binding.titleBar.startAnimation(menuTopOut)
binding.bottomMenu.startAnimation(menuBottomOut)
} else {
menuOutListener.onAnimationStart(menuBottomOut)
menuOutListener.onAnimationEnd(menuBottomOut)
}
} }
} }
@ -288,7 +358,9 @@ class ReadMenu @JvmOverloads constructor(
} }
} }
llReadAloud.onLongClick { llReadAloud.onLongClick {
runMenuOut { callBack.showReadAloudDialog() } runMenuOut {
callBack.showReadAloudDialog()
}
} }
//界面 //界面
llFont.setOnClickListener { llFont.setOnClickListener {
@ -306,66 +378,8 @@ class ReadMenu @JvmOverloads constructor(
} }
private fun initAnimation() { private fun initAnimation() {
//显示菜单 menuTopIn.setAnimationListener(menuInListener)
menuTopIn = AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_top_in) menuTopOut.setAnimationListener(menuOutListener)
menuBottomIn = AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_bottom_in)
menuTopIn.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation) {
binding.tvSourceAction.isGone = ReadBook.isLocalBook
binding.tvLogin.isGone = ReadBook.bookSource?.loginUrl.isNullOrEmpty()
binding.tvPay.isGone = ReadBook.bookSource?.loginUrl.isNullOrEmpty()
|| ReadBook.curTextChapter?.isVip != true
|| ReadBook.curTextChapter?.isPay == true
callBack.upSystemUiVisibility()
binding.llBrightness.visible(showBrightnessView)
}
@SuppressLint("RtlHardcoded")
override fun onAnimationEnd(animation: Animation) {
val navigationBarHeight =
if (ReadBookConfig.hideNavigationBar) {
activity?.navigationBarHeight ?: 0
} else {
0
}
binding.run {
vwMenuBg.setOnClickListener { runMenuOut() }
root.padding = 0
when (activity?.navigationBarGravity) {
Gravity.BOTTOM -> root.bottomPadding = navigationBarHeight
Gravity.LEFT -> root.leftPadding = navigationBarHeight
Gravity.RIGHT -> root.rightPadding = navigationBarHeight
}
}
callBack.upSystemUiVisibility()
if (!LocalConfig.readMenuHelpVersionIsLast) {
callBack.showReadMenuHelp()
}
}
override fun onAnimationRepeat(animation: Animation) = Unit
})
//隐藏菜单
menuTopOut = AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_top_out)
menuBottomOut =
AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_bottom_out)
menuTopOut.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation) {
binding.vwMenuBg.setOnClickListener(null)
}
override fun onAnimationEnd(animation: Animation) {
this@ReadMenu.invisible()
binding.titleBar.invisible()
binding.bottomMenu.invisible()
cnaShowMenu = false
onMenuOutEnd?.invoke()
callBack.upSystemUiVisibility()
}
override fun onAnimationRepeat(animation: Animation) = Unit
})
} }
fun upBookView() { fun upBookView() {

@ -33,10 +33,8 @@ class SearchMenu @JvmOverloads constructor(
private val callBack: CallBack get() = activity as CallBack private val callBack: CallBack get() = activity as CallBack
private val binding = ViewSearchMenuBinding.inflate(LayoutInflater.from(context), this, true) private val binding = ViewSearchMenuBinding.inflate(LayoutInflater.from(context), this, true)
private val menuBottomIn: Animation = private val menuBottomIn: Animation = loadAnimation(context, R.anim.anim_readbook_bottom_in)
AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_bottom_in) private val menuBottomOut: Animation = loadAnimation(context, R.anim.anim_readbook_bottom_out)
private val menuBottomOut: Animation =
AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_bottom_out)
private val bgColor: Int = context.bottomBackground private val bgColor: Int = context.bottomBackground
private val textColor: Int = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor)) private val textColor: Int = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor))
private val bottomBackgroundList: ColorStateList = private val bottomBackgroundList: ColorStateList =

@ -341,7 +341,7 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
historyFlowJob?.cancel() historyFlowJob?.cancel()
historyFlowJob = launch { historyFlowJob = launch {
when { when {
key.isNullOrBlank() -> appDb.searchKeywordDao.flowByUsage() key.isNullOrBlank() -> appDb.searchKeywordDao.flowByTime()
else -> appDb.searchKeywordDao.flowSearch(key) else -> appDb.searchKeywordDao.flowSearch(key)
}.conflate().collect { }.conflate().collect {
historyKeyAdapter.setItems(it) historyKeyAdapter.setItems(it)

@ -45,6 +45,7 @@ class WebViewActivity : VMBaseActivity<ActivityWebViewBinding, WebViewModel>() {
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
binding.titleBar.title = intent.getStringExtra("title") ?: getString(R.string.loading) binding.titleBar.title = intent.getStringExtra("title") ?: getString(R.string.loading)
binding.titleBar.subtitle = intent.getStringExtra("sourceName")
viewModel.initData(intent) { viewModel.initData(intent) {
val url = viewModel.baseUrl val url = viewModel.baseUrl
val headerMap = viewModel.headerMap val headerMap = viewModel.headerMap

@ -0,0 +1,15 @@
package io.legado.app.utils
import android.content.Context
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.annotation.AnimRes
import io.legado.app.help.config.AppConfig
fun loadAnimation(context: Context, @AnimRes id: Int): Animation {
val animation = AnimationUtils.loadAnimation(context, id)
if (AppConfig.isEInkMode) {
animation.duration = 0
}
return animation
}

@ -1,17 +0,0 @@
package io.legado.app.utils
import android.content.Context
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.annotation.AnimRes
import io.legado.app.help.config.AppConfig
object AnimationUtilsSupport {
fun loadAnimation(context: Context, @AnimRes id: Int): Animation {
val animation = AnimationUtils.loadAnimation(context, id)
if (AppConfig.isEInkMode) {
animation.duration = 0
}
return animation
}
}

@ -10,26 +10,26 @@
android:id="@+id/tool_bar" android:id="@+id/tool_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/background_menu"
android:elevation="5dp" android:elevation="5dp"
android:theme="?attr/actionBarStyle" android:theme="?attr/actionBarStyle"
android:background="@color/background_menu"
app:title="@string/input_verification_code"
app:popupTheme="@style/AppTheme.PopupOverlay" app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/input_verification_code"
app:titleTextAppearance="@style/ToolbarTitle" /> app:titleTextAppearance="@style/ToolbarTitle" />
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/verification_code_image_view" android:id="@+id/verification_code_image_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="100dp"
android:scaleType="centerCrop"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:scaleType="centerCrop"
tools:ignore="UnusedAttribute" /> tools:ignore="UnusedAttribute" />
<io.legado.app.ui.widget.text.TextInputLayout <io.legado.app.ui.widget.text.TextInputLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="3dp" android:layout_marginTop="8dp"
android:layout_marginTop="8dp"> android:padding="3dp">
<io.legado.app.lib.theme.view.ThemeEditText <io.legado.app.lib.theme.view.ThemeEditText
android:id="@+id/verification_code" android:id="@+id/verification_code"

Loading…
Cancel
Save