diff --git a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt
index 4afa01e5d..459986d17 100644
--- a/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/core/exceptions/resolve/ExceptionResolver.kt
@@ -1,11 +1,15 @@
package org.koitharu.kotatsu.core.exceptions.resolve
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.StringRes
import androidx.collection.ArrayMap
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.suspendCancellableCoroutine
import okhttp3.Headers
import org.koitharu.kotatsu.R
@@ -17,6 +21,7 @@ import org.koitharu.kotatsu.parsers.exception.NotFoundException
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.settings.sources.auth.SourceAuthActivity
import org.koitharu.kotatsu.utils.TaggedActivityResult
+import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.isSuccess
import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
@@ -95,5 +100,21 @@ class ExceptionResolver private constructor(
}
fun canResolve(e: Throwable) = getResolveStringId(e) != 0
+
+ fun showDetails(context: Context, e: Throwable) {
+ val stackTrace = e.stackTraceToString()
+ val dialog = MaterialAlertDialogBuilder(context)
+ .setTitle(e.getDisplayMessage(context.resources))
+ .setMessage(stackTrace)
+ .setPositiveButton(androidx.preference.R.string.copy) { _, _ ->
+ val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
+ clipboardManager.setPrimaryClip(
+ ClipData.newPlainText(context.getString(R.string.error), stackTrace),
+ )
+ }
+ .setNegativeButton(R.string.close, null)
+ .create()
+ dialog.show()
+ }
}
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt
index 2bb76f37f..43b517fff 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt
@@ -1,5 +1,6 @@
package org.koitharu.kotatsu.reader.ui.pager
+import android.content.Context
import android.net.Uri
import androidx.core.net.toUri
import androidx.lifecycle.Observer
@@ -59,6 +60,11 @@ class PageHolderDelegate(
}
}
+ fun showErrorDetails(context: Context) {
+ val e = error ?: return
+ ExceptionResolver.showDetails(context, e)
+ }
+
fun onAttachedToWindow() {
readerSettings.observeForever(this)
}
@@ -87,6 +93,7 @@ class PageHolderDelegate(
}
override fun onImageLoadError(e: Throwable) {
+ e.printStackTraceDebug()
val file = this.file
error = e
if (state == State.LOADED && e is IOException && file != null && file.exists()) {
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt
index efa8e4dcd..073fa0185 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/standard/PageHolder.kt
@@ -33,8 +33,8 @@ open class PageHolder(
binding.ssiv.bindToLifecycle(owner)
binding.ssiv.isEagerLoadingEnabled = !isLowRamDevice(context)
binding.ssiv.addOnImageEventListener(delegate)
- @Suppress("LeakingThis")
bindingInfo.buttonRetry.setOnClickListener(this)
+ bindingInfo.buttonErrorDetails.setOnClickListener(this)
binding.textViewNumber.isVisible = settings.isPagesNumbersEnabled
}
@@ -115,6 +115,7 @@ open class PageHolder(
override fun onClick(v: View) {
when (v.id) {
R.id.button_retry -> delegate.retry(boundData?.toMangaPage() ?: return)
+ R.id.button_error_details -> delegate.showErrorDetails(v.context)
}
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt
index c8cfa3714..4218e0533 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonHolder.kt
@@ -19,7 +19,6 @@ import org.koitharu.kotatsu.utils.GoneOnInvisibleListener
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.hideCompat
import org.koitharu.kotatsu.utils.ext.ifZero
-import org.koitharu.kotatsu.utils.ext.setProgressCompat
import org.koitharu.kotatsu.utils.ext.showCompat
class WebtoonHolder(
@@ -40,6 +39,7 @@ class WebtoonHolder(
binding.ssiv.regionDecoderFactory = SkiaPooledImageRegionDecoder.Factory()
binding.ssiv.addOnImageEventListener(delegate)
bindingInfo.buttonRetry.setOnClickListener(this)
+ bindingInfo.buttonErrorDetails.setOnClickListener(this)
}
override fun onBind(data: ReaderPage) {
@@ -104,6 +104,7 @@ class WebtoonHolder(
override fun onClick(v: View) {
when (v.id) {
R.id.button_retry -> delegate.retry(boundData?.toMangaPage() ?: return)
+ R.id.button_error_details -> delegate.showErrorDetails(v.context)
}
}
diff --git a/app/src/main/res/layout-v23/layout_page_info.xml b/app/src/main/res/layout-v23/layout_page_info.xml
deleted file mode 100644
index d1c0e2c1e..000000000
--- a/app/src/main/res/layout-v23/layout_page_info.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_page_info.xml b/app/src/main/res/layout/layout_page_info.xml
index 69ab64707..e0c6ebf56 100644
--- a/app/src/main/res/layout/layout_page_info.xml
+++ b/app/src/main/res/layout/layout_page_info.xml
@@ -5,15 +5,13 @@
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="android.widget.FrameLayout">
-
-
+ android:max="100" />
-
+
-
\ No newline at end of file
+
+