修复在刘海屏手机中显示顶部栏时候列表上下滚动 (#4691)

* 修复在刘海屏手机中显示顶部栏时候列表上下滚动

* 修复解密失败一直显示加载框问题

* 修复有些源图片解密失败
This commit is contained in:
lhjgege
2025-02-16 18:40:40 +08:00
committed by GitHub
parent a6300ebdf8
commit 81ff0f1506
5 changed files with 106 additions and 163 deletions
@@ -27,7 +27,7 @@ object OkHttpModelLoader : ModelLoader<GlideUrl?, InputStream?> {
} }
return ModelLoader.LoadData( return ModelLoader.LoadData(
modelWithHeader, modelWithHeader,
OkHttpStreamFetcher(modelWithHeader, options) OkHttpStreamFetcher(model,modelWithHeader, options)
) )
} }
@@ -1,5 +1,6 @@
package io.legado.app.help.glide package io.legado.app.help.glide
import android.net.Uri
import com.bumptech.glide.Priority import com.bumptech.glide.Priority
import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.HttpException import com.bumptech.glide.load.HttpException
@@ -28,6 +29,7 @@ import java.io.InputStream
class OkHttpStreamFetcher( class OkHttpStreamFetcher(
private val oldUrl: GlideUrl,
private val url: GlideUrl, private val url: GlideUrl,
private val options: Options, private val options: Options,
) : ) :
@@ -99,25 +101,24 @@ class OkHttpStreamFetcher(
override fun onResponse(call: Call, response: Response) { override fun onResponse(call: Call, response: Response) {
responseBody = response.body responseBody = response.body
val manga = options.get(OkHttpModelLoader.mangaOption) == true
val decodeResult = if (manga) {
ImageUtils.decode(
url.toStringUrl(),
responseBody!!.byteStream().readBytes(),
isCover = false,
source,
ReadMange.book
).let {
ByteArrayInputStream(it)
}
} else {
ImageUtils.decode(
url.toStringUrl(), responseBody!!.byteStream(),
isCover = true, source
)
}
if (response.isSuccessful) { if (response.isSuccessful) {
val manga = options.get(OkHttpModelLoader.mangaOption) == true
val decodeResult = if (manga) {
ImageUtils.decode(
Uri.decode(oldUrl.toStringUrl()),
responseBody!!.byteStream().readBytes(),
isCover = false,
source,
ReadMange.book
)?.let {
ByteArrayInputStream(it)
}
} else {
ImageUtils.decode(
url.toStringUrl(), responseBody!!.byteStream(),
isCover = true, source
)
}
if (decodeResult == null) { if (decodeResult == null) {
callback?.onLoadFailed(NoStackTraceException("封面二次解密失败")) callback?.onLoadFailed(NoStackTraceException("封面二次解密失败"))
} else { } else {
@@ -1,17 +1,15 @@
package io.legado.app.ui.book.manga package io.legado.app.ui.book.manga
import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.view.KeyEvent import android.view.KeyEvent
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View
import android.view.WindowInsets
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
@@ -31,10 +29,8 @@ import io.legado.app.databinding.ActivityMangeBinding
import io.legado.app.databinding.ViewLoadMoreBinding import io.legado.app.databinding.ViewLoadMoreBinding
import io.legado.app.help.book.isImage import io.legado.app.help.book.isImage
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig
import io.legado.app.help.storage.Backup import io.legado.app.help.storage.Backup
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.ThemeStore
import io.legado.app.model.ReadMange import io.legado.app.model.ReadMange
import io.legado.app.model.ReadMange.mFirstLoading import io.legado.app.model.ReadMange.mFirstLoading
import io.legado.app.model.recyclerView.MangeContent import io.legado.app.model.recyclerView.MangeContent
@@ -47,25 +43,21 @@ import io.legado.app.ui.book.read.MangaMenu
import io.legado.app.ui.book.read.ReadBookActivity.Companion.RESULT_DELETED import io.legado.app.ui.book.read.ReadBookActivity.Companion.RESULT_DELETED
import io.legado.app.ui.book.toc.TocActivityResult import io.legado.app.ui.book.toc.TocActivityResult
import io.legado.app.ui.widget.recycler.LoadMoreView import io.legado.app.ui.widget.recycler.LoadMoreView
import io.legado.app.utils.ColorUtils
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.StartActivityContract import io.legado.app.utils.StartActivityContract
import io.legado.app.utils.getCompatColor import io.legado.app.utils.getCompatColor
import io.legado.app.utils.gone import io.legado.app.utils.gone
import io.legado.app.utils.immersionFullScreen import io.legado.app.utils.immersionFullScreen
import io.legado.app.utils.printOnDebug import io.legado.app.utils.printOnDebug
import io.legado.app.utils.setLightStatusBar
import io.legado.app.utils.setNavigationBarColorAuto
import io.legado.app.utils.showDialogFragment import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible import io.legado.app.utils.visible
import splitties.dimensions.dp
class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>(), class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>(),
ReadMange.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack { ReadMange.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack {
private val menuLayoutIsVisible get() = binding.mangaMenu.isVisible
private val mLayoutManager by lazy { private val mLayoutManager by lazy {
LinearLayoutManager(this@ReadMangaActivity) LinearLayoutManager(this@ReadMangaActivity)
} }
@@ -98,6 +90,10 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>()
} }
} }
private val windowInsetsControllerCompat by lazy {
WindowInsetsControllerCompat(window, binding.root)
}
//打开目录返回选择章节返回结果 //打开目录返回选择章节返回结果
private val tocActivity = private val tocActivity =
registerForActivityResult(TocActivityResult()) { registerForActivityResult(TocActivityResult()) {
@@ -117,7 +113,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>()
override val viewModel by viewModels<MangaViewModel>() override val viewModel by viewModels<MangaViewModel>()
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
immersionFullScreen(WindowInsetsControllerCompat(window, binding.root)) immersionFullScreen(windowInsetsControllerCompat)
ReadMange.register(this) ReadMange.register(this)
binding.mRecyclerMange.run { binding.mRecyclerMange.run {
adapter = mAdapter adapter = mAdapter
@@ -182,6 +178,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>()
} }
} }
loadMoreView.gone() loadMoreView.gone()
binding.mangaMenu.setTitleBarPadding(
ViewCompat.getRootWindowInsets(findViewById(android.R.id.content))?.getInsets(
WindowInsetsCompat.Type.statusBars()
)?.top ?: dp(25)
)
} }
override fun onNewIntent(intent: Intent) { override fun onNewIntent(intent: Intent) {
@@ -257,7 +258,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>()
networkChangedListener.register() networkChangedListener.register()
networkChangedListener.onNetworkChanged = { networkChangedListener.onNetworkChanged = {
// 当网络是可用状态且无需初始化时同步进度(初始化中已有同步进度逻辑) // 当网络是可用状态且无需初始化时同步进度(初始化中已有同步进度逻辑)
if (AppConfig.syncBookProgressPlus && NetworkUtils.isAvailable()&&!justInitData) { if (AppConfig.syncBookProgressPlus && NetworkUtils.isAvailable() && !justInitData) {
ReadMange.syncProgress({ progress -> sureNewProgress(progress) }) ReadMange.syncProgress({ progress -> sureNewProgress(progress) })
} }
} }
@@ -369,19 +370,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>()
return super.onCompatOptionsItemSelected(item) return super.onCompatOptionsItemSelected(item)
} }
override fun upNavigationBarColor() {
when {
binding.mangaMenu.isVisible -> super.upNavigationBarColor()
!AppConfig.immNavigationBar -> super.upNavigationBarColor()
else -> setNavigationBarColorAuto(ReadBookConfig.bgMeanColor)
}
}
@SuppressLint("RtlHardcoded")
private fun upNavigationBar(value: Boolean) {
binding.mangaMenu.isVisible = value
}
override fun openBookInfoActivity() { override fun openBookInfoActivity() {
ReadMange.book?.let { ReadMange.book?.let {
bookInfoActivity.launch { bookInfoActivity.launch {
@@ -392,74 +380,8 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangeBinding, MangaViewModel>()
} }
override fun upSystemUiVisibility(value: Boolean) { override fun upSystemUiVisibility(value: Boolean) {
upSystemUiVisibility(isInMultiWindow, !menuLayoutIsVisible, false) binding.mangaMenu.isVisible = value
upNavigationBarColor() immersionFullScreen(WindowInsetsControllerCompat(window, binding.root))
upNavigationBar(value)
if (!value) {
immersionFullScreen(WindowInsetsControllerCompat(window, binding.root))
}
}
/**
* 更新状态栏,导航栏
*/
fun upSystemUiVisibility(
isInMultiWindow: Boolean,
toolBarHide: Boolean = true,
useBgMeanColor: Boolean = false,
) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.insetsController?.run {
if (toolBarHide && ReadBookConfig.hideNavigationBar) {
hide(WindowInsets.Type.navigationBars())
} else {
show(WindowInsets.Type.navigationBars())
}
if (toolBarHide && ReadBookConfig.hideStatusBar) {
hide(WindowInsets.Type.statusBars())
} else {
show(WindowInsets.Type.statusBars())
}
}
}
upSystemUiVisibilityO(isInMultiWindow, toolBarHide)
if (toolBarHide) {
setLightStatusBar(ReadBookConfig.durConfig.curStatusIconDark())
} else {
val statusBarColor =
if (AppConfig.readBarStyleFollowPage
&& ReadBookConfig.durConfig.curBgType() == 0
|| useBgMeanColor
) {
ReadBookConfig.bgMeanColor
} else {
ThemeStore.statusBarColor(this, AppConfig.isTransparentStatusBar)
}
setLightStatusBar(ColorUtils.isColorLight(statusBarColor))
}
}
@Suppress("DEPRECATION")
private fun upSystemUiVisibilityO(
isInMultiWindow: Boolean,
toolBarHide: Boolean = true,
) {
var flag = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_IMMERSIVE
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
if (!isInMultiWindow) {
flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
if (ReadBookConfig.hideNavigationBar) {
flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
if (toolBarHide) {
flag = flag or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
}
}
if (ReadBookConfig.hideStatusBar && toolBarHide) {
flag = flag or View.SYSTEM_UI_FLAG_FULLSCREEN
}
window.decorView.systemUiVisibility = flag
} }
override fun dispatchKeyEvent(event: KeyEvent): Boolean { override fun dispatchKeyEvent(event: KeyEvent): Boolean {
@@ -36,6 +36,9 @@ import io.legado.app.utils.modifyBegin
import io.legado.app.utils.openUrl import io.legado.app.utils.openUrl
import io.legado.app.utils.startActivity import io.legado.app.utils.startActivity
import io.legado.app.utils.visible import io.legado.app.utils.visible
import splitties.views.bottomPadding
import splitties.views.leftPadding
import splitties.views.rightPadding
class MangaMenu @JvmOverloads constructor( class MangaMenu @JvmOverloads constructor(
context: Context, context: Context,
@@ -81,7 +84,7 @@ class MangaMenu @JvmOverloads constructor(
} }
override fun onAnimationEnd(animation: Animation) { override fun onAnimationEnd(animation: Animation) {
binding.titleBar.invisible() binding.flTitleBar.invisible()
isMenuOutAnimating = false isMenuOutAnimating = false
canShowMenu = false canShowMenu = false
callBack.upSystemUiVisibility(false) callBack.upSystemUiVisibility(false)
@@ -108,7 +111,7 @@ class MangaMenu @JvmOverloads constructor(
} }
init { init {
initView() initView(true)
bindEvent() bindEvent()
} }
@@ -117,6 +120,7 @@ class MangaMenu @JvmOverloads constructor(
if (immersiveMenu) { if (immersiveMenu) {
val lightTextColor = ColorUtils.withAlpha(ColorUtils.lightenColor(textColor), 0.75f) val lightTextColor = ColorUtils.withAlpha(ColorUtils.lightenColor(textColor), 0.75f)
titleBar.setTextColor(textColor) titleBar.setTextColor(textColor)
flTitleBar.setBackgroundColor(bgColor)
titleBar.setBackgroundColor(bgColor) titleBar.setBackgroundColor(bgColor)
titleBar.setColorFilter(textColor) titleBar.setColorFilter(textColor)
tvChapterName.setTextColor(lightTextColor) tvChapterName.setTextColor(lightTextColor)
@@ -125,6 +129,7 @@ class MangaMenu @JvmOverloads constructor(
val bgColor = context.primaryColor val bgColor = context.primaryColor
val textColor = context.primaryTextColor val textColor = context.primaryTextColor
titleBar.setTextColor(textColor) titleBar.setTextColor(textColor)
flTitleBar.setBackgroundColor(bgColor)
titleBar.setBackgroundColor(bgColor) titleBar.setBackgroundColor(bgColor)
titleBar.setColorFilter(textColor) titleBar.setColorFilter(textColor)
tvChapterName.setTextColor(textColor) tvChapterName.setTextColor(textColor)
@@ -173,7 +178,7 @@ class MangaMenu @JvmOverloads constructor(
} }
if (this.isVisible) { if (this.isVisible) {
if (anim) { if (anim) {
binding.titleBar.startAnimation(menuTopOut) binding.flTitleBar.startAnimation(menuTopOut)
} else { } else {
menuOutListener.onAnimationStart(menuBottomOut) menuOutListener.onAnimationStart(menuBottomOut)
menuOutListener.onAnimationEnd(menuBottomOut) menuOutListener.onAnimationEnd(menuBottomOut)
@@ -183,9 +188,9 @@ class MangaMenu @JvmOverloads constructor(
fun runMenuIn(anim: Boolean = !AppConfig.isEInkMode) { fun runMenuIn(anim: Boolean = !AppConfig.isEInkMode) {
this.visible() this.visible()
binding.titleBar.visible() binding.flTitleBar.visible()
if (anim) { if (anim) {
binding.titleBar.startAnimation(menuTopIn) binding.flTitleBar.startAnimation(menuTopIn)
} else { } else {
menuInListener.onAnimationStart(menuBottomIn) menuInListener.onAnimationStart(menuBottomIn)
menuInListener.onAnimationEnd(menuBottomIn) menuInListener.onAnimationEnd(menuBottomIn)
@@ -228,9 +233,15 @@ class MangaMenu @JvmOverloads constructor(
tvChapterUrl.setOnLongClickListener(chapterViewLongClickListener) tvChapterUrl.setOnLongClickListener(chapterViewLongClickListener)
} }
fun setTitleBarPadding(top: Int) {
binding.flTitleBar.run {
setPadding(leftPadding, this.paddingTop.plus(top), rightPadding, bottomPadding)
}
}
interface CallBack { interface CallBack {
fun openBookInfoActivity() fun openBookInfoActivity()
fun upSystemUiVisibility(value:Boolean) fun upSystemUiVisibility(value: Boolean)
} }
} }
+53 -44
View File
@@ -15,59 +15,68 @@
tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" /> tools:layout_editor_absoluteY="0dp" />
<io.legado.app.ui.widget.TitleBar <FrameLayout
android:id="@+id/title_bar" android:id="@+id/fl_title_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="?attr/actionBarStyle"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout <io.legado.app.ui.widget.TitleBar
android:id="@+id/title_bar_addition" android:id="@+id/title_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
android:theme="?attr/actionBarStyle">
<TextView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/tv_chapter_name" android:id="@+id/title_bar_addition"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:singleLine="true"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/tv_source_action"
app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/tv_chapter_url" android:id="@+id/tv_chapter_name"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dp" android:paddingLeft="10dp"
android:paddingRight="10dp" android:paddingRight="10dp"
android:singleLine="true" android:singleLine="true"
android:visibility="gone" android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/tv_source_action" app:layout_constraintRight_toLeftOf="@+id/tv_source_action"
app:layout_constraintTop_toBottomOf="@+id/tv_chapter_name" /> app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<io.legado.app.ui.widget.text.AccentBgTextView <TextView
android:id="@+id/tv_source_action" android:id="@+id/tv_chapter_url"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="wrap_content"
android:layout_margin="1dp" android:paddingLeft="10dp"
android:gravity="center" android:paddingRight="10dp"
android:maxWidth="120dp" android:singleLine="true"
android:paddingLeft="6dp" android:visibility="gone"
android:paddingRight="6dp" app:layout_constraintLeft_toLeftOf="parent"
android:text="@string/book_source" app:layout_constraintRight_toLeftOf="@+id/tv_source_action"
app:layout_constraintBottom_toBottomOf="@+id/tv_chapter_url" app:layout_constraintTop_toBottomOf="@+id/tv_chapter_name"
app:layout_constraintRight_toRightOf="parent" tools:visibility="visible" />
app:layout_constraintTop_toTopOf="parent"
app:radius="2dp" />
</androidx.constraintlayout.widget.ConstraintLayout> <io.legado.app.ui.widget.text.AccentBgTextView
android:id="@+id/tv_source_action"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_margin="1dp"
android:gravity="center"
android:maxWidth="120dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:text="@string/book_source"
app:layout_constraintBottom_toBottomOf="@+id/tv_chapter_url"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:radius="2dp"
tools:visibility="visible" />
</io.legado.app.ui.widget.TitleBar> </androidx.constraintlayout.widget.ConstraintLayout>
</io.legado.app.ui.widget.TitleBar>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>