Commit 1f75e63c authored by topjohnwu's avatar topjohnwu

Fix crashes in MarkdownWindow

Fix #1628
parent cb3f9b97
......@@ -39,7 +39,7 @@ android {
exclude '/META-INF/*.kotlin_module'
exclude '/META-INF/rxkotlin.properties'
exclude '/androidsupportmultidexversion.txt'
exclude '/org/**'
exclude '/org/bouncycastle/**'
exclude '/kotlin/**'
exclude '/kotlinx/**'
}
......
......@@ -8,11 +8,13 @@ import com.skoumal.teanity.extensions.subscribeK
import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.data.repository.StringRepository
import com.topjohnwu.magisk.extensions.inject
import io.reactivex.Completable
import io.reactivex.Single
import ru.noties.markwon.Markwon
import ru.noties.markwon.html.HtmlPlugin
import ru.noties.markwon.image.ImagesPlugin
import ru.noties.markwon.image.svg.SvgPlugin
import timber.log.Timber
import java.io.InputStream
import java.util.*
......@@ -33,26 +35,35 @@ object MarkDownWindow {
}
fun show(activity: Context, title: String?, content: Single<String>) {
content.subscribeK {
val markwon = Markwon.builder(activity)
.usePlugin(HtmlPlugin.create())
.usePlugin(ImagesPlugin.create(activity))
.usePlugin(SvgPlugin.create(activity.resources))
.build()
val alert = AlertDialog.Builder(activity)
alert.setTitle(title)
val mv = LayoutInflater.from(activity).inflate(R.layout.markdown_window, null)
val tv = mv.findViewById<TextView>(R.id.md_txt)
try {
val markwon = Markwon.builder(activity)
.usePlugin(HtmlPlugin.create())
.usePlugin(ImagesPlugin.create(activity))
.usePlugin(SvgPlugin.create(activity.resources))
.build()
val mv = LayoutInflater.from(activity).inflate(R.layout.markdown_window, null)
val tv = mv.findViewById<TextView>(R.id.md_txt)
content.map {
runCatching {
markwon.setMarkdown(tv, it)
} catch (e: ExceptionInInitializerError) {
//Nothing we can do about this error other than show error message
tv.setText(R.string.download_file_error)
}.onFailure {
Timber.e(it)
// Always wrap the actual exception as it could be ExceptionInInitializerError,
// which is a fatal error and RxJava will send it to the global handler and crash
throw MarkwonException(it)
}
alert.setView(mv)
alert.setNegativeButton(R.string.close) { dialog, _ -> dialog.dismiss() }
alert.show()
}.ignoreElement().onErrorResumeNext {
// Nothing we can actually do other than show error message
tv.setText(R.string.download_file_error)
Completable.complete()
}.subscribeK {
AlertDialog.Builder(activity)
.setTitle(title)
.setView(mv)
.setNegativeButton(R.string.close) { dialog, _ -> dialog.dismiss() }
.show()
}
}
class MarkwonException(e: Throwable): Exception(e)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment