Fix crashes in MarkdownWindow

Fix #1628
This commit is contained in:
topjohnwu 2019-08-02 01:16:04 -07:00
parent cb3f9b9740
commit 1f75e63c37
2 changed files with 31 additions and 20 deletions

View File

@ -39,7 +39,7 @@ android {
exclude '/META-INF/*.kotlin_module' exclude '/META-INF/*.kotlin_module'
exclude '/META-INF/rxkotlin.properties' exclude '/META-INF/rxkotlin.properties'
exclude '/androidsupportmultidexversion.txt' exclude '/androidsupportmultidexversion.txt'
exclude '/org/**' exclude '/org/bouncycastle/**'
exclude '/kotlin/**' exclude '/kotlin/**'
exclude '/kotlinx/**' exclude '/kotlinx/**'
} }

View File

@ -8,11 +8,13 @@ import com.skoumal.teanity.extensions.subscribeK
import com.topjohnwu.magisk.R import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.data.repository.StringRepository import com.topjohnwu.magisk.data.repository.StringRepository
import com.topjohnwu.magisk.extensions.inject import com.topjohnwu.magisk.extensions.inject
import io.reactivex.Completable
import io.reactivex.Single import io.reactivex.Single
import ru.noties.markwon.Markwon import ru.noties.markwon.Markwon
import ru.noties.markwon.html.HtmlPlugin import ru.noties.markwon.html.HtmlPlugin
import ru.noties.markwon.image.ImagesPlugin import ru.noties.markwon.image.ImagesPlugin
import ru.noties.markwon.image.svg.SvgPlugin import ru.noties.markwon.image.svg.SvgPlugin
import timber.log.Timber
import java.io.InputStream import java.io.InputStream
import java.util.* import java.util.*
@ -33,26 +35,35 @@ object MarkDownWindow {
} }
fun show(activity: Context, title: String?, content: Single<String>) { fun show(activity: Context, title: String?, content: Single<String>) {
content.subscribeK { val markwon = Markwon.builder(activity)
val markwon = Markwon.builder(activity) .usePlugin(HtmlPlugin.create())
.usePlugin(HtmlPlugin.create()) .usePlugin(ImagesPlugin.create(activity))
.usePlugin(ImagesPlugin.create(activity)) .usePlugin(SvgPlugin.create(activity.resources))
.usePlugin(SvgPlugin.create(activity.resources)) .build()
.build() val mv = LayoutInflater.from(activity).inflate(R.layout.markdown_window, null)
val alert = AlertDialog.Builder(activity) val tv = mv.findViewById<TextView>(R.id.md_txt)
alert.setTitle(title)
val mv = LayoutInflater.from(activity).inflate(R.layout.markdown_window, null)
val tv = mv.findViewById<TextView>(R.id.md_txt)
try {
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)
}
alert.setView(mv) content.map {
alert.setNegativeButton(R.string.close) { dialog, _ -> dialog.dismiss() } runCatching {
alert.show() markwon.setMarkdown(tv, it)
}.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)
}
}.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)
} }