kunfei 4 سال پیش
والد
کامیت
bfc90481a8

+ 30 - 3
app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt

@@ -31,6 +31,7 @@ import io.legado.app.help.config.ReadTipConfig
 import io.legado.app.help.coroutine.Coroutine
 import io.legado.app.help.storage.AppWebDav
 import io.legado.app.help.storage.Backup
+import io.legado.app.lib.dialogs.SelectItem
 import io.legado.app.lib.dialogs.alert
 import io.legado.app.lib.dialogs.selector
 import io.legado.app.lib.theme.accentColor
@@ -50,6 +51,7 @@ import io.legado.app.ui.book.read.config.TipConfigDialog.Companion.TIP_COLOR
 import io.legado.app.ui.book.read.page.ContentTextView
 import io.legado.app.ui.book.read.page.ReadView
 import io.legado.app.ui.book.read.page.entities.PageDirection
+import io.legado.app.ui.book.read.page.provider.ImageProvider
 import io.legado.app.ui.book.read.page.provider.TextPageFactory
 import io.legado.app.ui.book.searchContent.SearchContentActivity
 import io.legado.app.ui.book.searchContent.SearchResult
@@ -60,6 +62,7 @@ import io.legado.app.ui.dict.DictDialog
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.replace.ReplaceRuleActivity
 import io.legado.app.ui.replace.edit.ReplaceEditActivity
+import io.legado.app.ui.widget.PopupAction
 import io.legado.app.ui.widget.dialog.PhotoDialog
 import io.legado.app.ui.widget.dialog.TextDialog
 import io.legado.app.utils.*
@@ -131,7 +134,9 @@ class ReadBookActivity : BaseReadBookActivity(),
     val textActionMenu: TextActionMenu by lazy {
         TextActionMenu(this, this)
     }
-
+    private val popupAction by lazy {
+        PopupAction(this)
+    }
     override val isInitFinish: Boolean get() = viewModel.isInitFinish
     override val isScroll: Boolean get() = binding.readView.isScroll
     private var keepScreenJon: Job? = null
@@ -954,8 +959,29 @@ class ReadBookActivity : BaseReadBookActivity(),
     /**
      * 长按图片
      */
-    override fun onImageLongPress(src: String) {
-        showDialogFragment(PhotoDialog(src))
+    override fun onImageLongPress(x: Float, y: Float, src: String) {
+        popupAction.setItems(
+            listOf(
+                SelectItem("查看", "show"),
+                SelectItem("刷新", "refresh")
+            )
+        )
+        popupAction.onActionClick = {
+            when (it) {
+                "show" -> showDialogFragment(PhotoDialog(src))
+                "refresh" -> {
+                    ImageProvider.bitmapLruCache.remove(src)
+                }
+            }
+            popupAction.dismiss()
+        }
+        val navigationBarHeight =
+            if (!ReadBookConfig.hideNavigationBar && navigationBarGravity == Gravity.BOTTOM)
+                navigationBarHeight else 0
+        popupAction.showAtLocation(
+            binding.readView, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, x.toInt(),
+            binding.root.height + navigationBarHeight - y.toInt()
+        )
     }
 
     /**
@@ -1076,6 +1102,7 @@ class ReadBookActivity : BaseReadBookActivity(),
     override fun onDestroy() {
         super.onDestroy()
         textActionMenu.dismiss()
+        popupAction.dismiss()
         binding.readView.onDestroy()
         ReadBook.msg = null
         ReadBook.callBack = null

+ 2 - 2
app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt

@@ -228,7 +228,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
     ) {
         touch(x, y) { _, relativePos, _, lineIndex, _, charIndex, textChar ->
             if (textChar.isImage) {
-                callBack.onImageLongPress(textChar.charData)
+                callBack.onImageLongPress(x, y, textChar.charData)
             } else {
                 if (!selectAble) return@touch
                 textChar.selected = true
@@ -467,7 +467,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at
         var isSelectingSearchResult: Boolean
         fun upSelectedStart(x: Float, y: Float, top: Float)
         fun upSelectedEnd(x: Float, y: Float)
+        fun onImageLongPress(x: Float, y: Float, src: String)
         fun onCancelSelect()
-        fun onImageLongPress(src: String)
     }
 }

+ 1 - 1
app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt

@@ -33,7 +33,7 @@ object ImageProvider {
     private const val M = 1024 * 1024
     private val cacheSize =
         max(50 * M, min(100 * M, (Runtime.getRuntime().maxMemory() / 8).toInt()))
-    private val bitmapLruCache = object : LruCache<String, Bitmap>(cacheSize) {
+    val bitmapLruCache = object : LruCache<String, Bitmap>(cacheSize) {
         override fun sizeOf(key: String, bitmap: Bitmap): Int {
             return bitmap.byteCount
         }

+ 63 - 0
app/src/main/java/io/legado/app/ui/widget/PopupAction.kt

@@ -0,0 +1,63 @@
+package io.legado.app.ui.widget
+
+import android.content.Context
+import android.view.ViewGroup
+import android.widget.PopupWindow
+import io.legado.app.base.adapter.ItemViewHolder
+import io.legado.app.base.adapter.RecyclerAdapter
+import io.legado.app.databinding.ItemTextBinding
+import io.legado.app.databinding.PopupActionBinding
+import io.legado.app.lib.dialogs.SelectItem
+import splitties.systemservices.layoutInflater
+
+class PopupAction(private val context: Context) :
+    PopupWindow(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) {
+
+    val binding = PopupActionBinding.inflate(context.layoutInflater)
+    val adapter by lazy {
+        Adapter(context)
+    }
+    var onActionClick: ((action: String) -> Unit)? = null
+
+    init {
+        contentView = binding.root
+
+        isTouchable = true
+        isOutsideTouchable = true
+        isFocusable = false
+
+        binding.recyclerView.adapter = adapter
+    }
+
+    fun setItems(items: List<SelectItem<String>>) {
+        adapter.setItems(items)
+    }
+
+    inner class Adapter(context: Context) :
+        RecyclerAdapter<SelectItem<String>, ItemTextBinding>(context) {
+
+        override fun getViewBinding(parent: ViewGroup): ItemTextBinding {
+            return ItemTextBinding.inflate(inflater, parent, false)
+        }
+
+        override fun convert(
+            holder: ItemViewHolder,
+            binding: ItemTextBinding,
+            item: SelectItem<String>,
+            payloads: MutableList<Any>
+        ) {
+            with(binding) {
+                textView.text = item.title
+            }
+        }
+
+        override fun registerListener(holder: ItemViewHolder, binding: ItemTextBinding) {
+            holder.itemView.setOnClickListener {
+                getItem(holder.layoutPosition)?.let { item ->
+                    onActionClick?.invoke(item.value)
+                }
+            }
+        }
+    }
+
+}

+ 21 - 0
app/src/main/res/layout/popup_action.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/shape_card_view"
+    android:orientation="vertical"
+    android:padding="5dp">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:orientation="horizontal"
+        app:flexDirection="row"
+        app:flexWrap="wrap"
+        app:layoutManager="com.google.android.flexbox.FlexboxLayoutManager" />
+
+</LinearLayout>
+