diff --git a/app/src/main/java/io/legado/app/help/PaintPool.kt b/app/src/main/java/io/legado/app/help/PaintPool.kt new file mode 100644 index 000000000..953b5375b --- /dev/null +++ b/app/src/main/java/io/legado/app/help/PaintPool.kt @@ -0,0 +1,17 @@ +package io.legado.app.help + +import android.graphics.Paint +import io.legado.app.utils.objectpool.BaseSafeObjectPool + +object PaintPool : BaseSafeObjectPool(8) { + + private val emptyPaint = Paint() + + override fun create(): Paint = Paint() + + override fun recycle(target: Paint) { + target.set(emptyPaint) + super.recycle(target) + } + +} diff --git a/app/src/main/java/io/legado/app/help/config/ThemeConfig.kt b/app/src/main/java/io/legado/app/help/config/ThemeConfig.kt index 53dd5ee22..2296d30a6 100644 --- a/app/src/main/java/io/legado/app/help/config/ThemeConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/ThemeConfig.kt @@ -55,7 +55,6 @@ object ThemeConfig { initNightMode() BookCover.upDefaultCover() postEvent(EventBus.RECREATE, "") - postEvent(EventBus.UP_CONFIG, arrayOf(2, 9)) } private fun initNightMode() { @@ -74,10 +73,12 @@ object ThemeConfig { context.getPrefString(PreferKey.bgImage), context.getPrefInt(PreferKey.bgImageBlurring, 0) ) + Theme.Dark -> Pair( context.getPrefString(PreferKey.bgImageN), context.getPrefInt(PreferKey.bgImageNBlurring, 0) ) + else -> null } ?: return null if (bgCfg.first.isNullOrBlank()) return null @@ -218,6 +219,7 @@ object ThemeConfig { .bottomBackground(Color.WHITE) .apply() } + AppConfig.isNightTheme -> { val primary = getPrefInt(PreferKey.cNPrimary, getCompatColor(R.color.md_blue_grey_600)) @@ -238,6 +240,7 @@ object ThemeConfig { .bottomBackground(ColorUtils.withAlpha(bBackground, 1f)) .apply() } + else -> { val primary = getPrefInt(PreferKey.cPrimary, getCompatColor(R.color.md_brown_500)) 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 6173b9265..58e2f1ffa 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 @@ -460,6 +460,7 @@ class ReadView(context: Context, attrs: AttributeSet) : fun onDestroy() { pageDelegate?.onDestroy() curPage.cancelSelect() + invalidateTextPage() } /** diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt index de204e42d..d96de4ce2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/column/TextColumn.kt @@ -2,6 +2,7 @@ package io.legado.app.ui.book.read.page.entities.column import android.graphics.Canvas import androidx.annotation.Keep +import io.legado.app.help.PaintPool import io.legado.app.help.config.ReadBookConfig import io.legado.app.lib.theme.ThemeStore import io.legado.app.ui.book.read.page.ContentTextView @@ -42,15 +43,18 @@ data class TextColumn( } else { ChapterProvider.contentPaint } - if (textLine.isReadAloud || isSearchResult) { - synchronized(textPaint) { - textPaint.color = ThemeStore.accentColor - canvas.drawText(charData, start, textLine.lineBase - textLine.lineTop, textPaint) - textPaint.color = ReadBookConfig.textColor - } + val textColor = if (textLine.isReadAloud || isSearchResult) { + ThemeStore.accentColor } else { - canvas.drawText(charData, start, textLine.lineBase - textLine.lineTop, textPaint) + ReadBookConfig.textColor } + val paint = PaintPool.obtain() + paint.set(textPaint) + if (paint.color != textColor) { + paint.color = textColor + } + canvas.drawText(charData, start, textLine.lineBase - textLine.lineTop, paint) + PaintPool.recycle(paint) if (selected) { canvas.drawRect(start, 0f, end, textLine.height, view.selectedPaint) } diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi23Impl.kt b/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi23Impl.kt index f9c19cac6..bc0964f53 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi23Impl.kt +++ b/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi23Impl.kt @@ -2,8 +2,8 @@ package io.legado.app.utils.canvasrecorder import android.graphics.Canvas import android.graphics.Picture -import io.legado.app.utils.canvasrecorder.objectpool.synchronized import io.legado.app.utils.canvasrecorder.pools.PicturePool +import io.legado.app.utils.objectpool.synchronized class CanvasRecorderApi23Impl : BaseCanvasRecorder() { diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi29Impl.kt b/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi29Impl.kt index 7fd6dbd7d..ce7205c88 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi29Impl.kt +++ b/app/src/main/java/io/legado/app/utils/canvasrecorder/CanvasRecorderApi29Impl.kt @@ -5,7 +5,7 @@ import android.graphics.Picture import android.graphics.RenderNode import android.os.Build import androidx.annotation.RequiresApi -import io.legado.app.utils.canvasrecorder.objectpool.synchronized +import io.legado.app.utils.objectpool.synchronized import io.legado.app.utils.canvasrecorder.pools.PicturePool import io.legado.app.utils.canvasrecorder.pools.RenderNodePool diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/BaseObjectPool.kt b/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/BaseObjectPool.kt deleted file mode 100644 index 59b7410de..000000000 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/BaseObjectPool.kt +++ /dev/null @@ -1,24 +0,0 @@ -package io.legado.app.utils.canvasrecorder.objectpool - -import androidx.annotation.CallSuper -import java.lang.ref.SoftReference -import java.util.LinkedList - -abstract class BaseObjectPool : ObjectPool { - - private val pool = LinkedList>() - - override fun obtain(): T { - while (true) { - if (pool.isEmpty()) break - return pool.poll()?.get() ?: continue - } - return create() - } - - @CallSuper - override fun recycle(target: T) { - pool.add(SoftReference(target)) - } - -} diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/PicturePool.kt b/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/PicturePool.kt index ca0f25572..cdf35774c 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/PicturePool.kt +++ b/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/PicturePool.kt @@ -1,9 +1,9 @@ package io.legado.app.utils.canvasrecorder.pools import android.graphics.Picture -import io.legado.app.utils.canvasrecorder.objectpool.BaseObjectPool +import io.legado.app.utils.objectpool.BaseObjectPool -class PicturePool : BaseObjectPool() { +class PicturePool : BaseObjectPool(64) { override fun create(): Picture = Picture() diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/RenderNodePool.kt b/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/RenderNodePool.kt index 3cf1fda2b..b7a9e8ca0 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/RenderNodePool.kt +++ b/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/RenderNodePool.kt @@ -3,10 +3,10 @@ package io.legado.app.utils.canvasrecorder.pools import android.graphics.RenderNode import android.os.Build import androidx.annotation.RequiresApi -import io.legado.app.utils.canvasrecorder.objectpool.BaseObjectPool +import io.legado.app.utils.objectpool.BaseObjectPool @RequiresApi(Build.VERSION_CODES.Q) -class RenderNodePool : BaseObjectPool() { +class RenderNodePool : BaseObjectPool(64) { override fun recycle(target: RenderNode) { target.discardDisplayList() diff --git a/app/src/main/java/io/legado/app/utils/objectpool/BaseObjectPool.kt b/app/src/main/java/io/legado/app/utils/objectpool/BaseObjectPool.kt new file mode 100644 index 000000000..b40201f70 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/objectpool/BaseObjectPool.kt @@ -0,0 +1,19 @@ +package io.legado.app.utils.objectpool + +import androidx.annotation.CallSuper +import androidx.core.util.Pools + +abstract class BaseObjectPool(size: Int) : ObjectPool { + + open val pool = Pools.SimplePool(size) + + override fun obtain(): T { + return pool.acquire() ?: create() + } + + @CallSuper + override fun recycle(target: T) { + pool.release(target) + } + +} diff --git a/app/src/main/java/io/legado/app/utils/objectpool/BaseSafeObjectPool.kt b/app/src/main/java/io/legado/app/utils/objectpool/BaseSafeObjectPool.kt new file mode 100644 index 000000000..d5fb1eca6 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/objectpool/BaseSafeObjectPool.kt @@ -0,0 +1,9 @@ +package io.legado.app.utils.objectpool + +import androidx.core.util.Pools + +abstract class BaseSafeObjectPool(size: Int): BaseObjectPool(size) { + + override val pool = Pools.SynchronizedPool(size) + +} diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPool.kt b/app/src/main/java/io/legado/app/utils/objectpool/ObjectPool.kt similarity index 64% rename from app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPool.kt rename to app/src/main/java/io/legado/app/utils/objectpool/ObjectPool.kt index 71fd824c6..f63a14d79 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPool.kt +++ b/app/src/main/java/io/legado/app/utils/objectpool/ObjectPool.kt @@ -1,4 +1,4 @@ -package io.legado.app.utils.canvasrecorder.objectpool +package io.legado.app.utils.objectpool interface ObjectPool { diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPoolExtensions.kt b/app/src/main/java/io/legado/app/utils/objectpool/ObjectPoolExtensions.kt similarity index 59% rename from app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPoolExtensions.kt rename to app/src/main/java/io/legado/app/utils/objectpool/ObjectPoolExtensions.kt index c623ddee6..a38c4d521 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPoolExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/objectpool/ObjectPoolExtensions.kt @@ -1,3 +1,3 @@ -package io.legado.app.utils.canvasrecorder.objectpool +package io.legado.app.utils.objectpool fun ObjectPool.synchronized(): ObjectPool = ObjectPoolLocked(this) diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPoolLocked.kt b/app/src/main/java/io/legado/app/utils/objectpool/ObjectPoolLocked.kt similarity index 84% rename from app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPoolLocked.kt rename to app/src/main/java/io/legado/app/utils/objectpool/ObjectPoolLocked.kt index 893ac7731..890067b6e 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/objectpool/ObjectPoolLocked.kt +++ b/app/src/main/java/io/legado/app/utils/objectpool/ObjectPoolLocked.kt @@ -1,4 +1,4 @@ -package io.legado.app.utils.canvasrecorder.objectpool +package io.legado.app.utils.objectpool class ObjectPoolLocked(private val delegate: ObjectPool) : ObjectPool by delegate {