From 08d42cf6ac7c4748a42f0faa94dac6b925ae1ead Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Sat, 26 Aug 2023 17:12:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/CrashHandler.kt | 5 +- .../io/legado/app/help/config/LocalConfig.kt | 7 +- .../io/legado/app/ui/main/MainActivity.kt | 15 ++++ .../java/io/legado/app/utils/ToastUtils.kt | 71 +++++++++++-------- app/src/main/res/layout/view_toast.xml | 27 +++++++ 5 files changed, 94 insertions(+), 31 deletions(-) create mode 100644 app/src/main/res/layout/view_toast.xml diff --git a/app/src/main/java/io/legado/app/help/CrashHandler.kt b/app/src/main/java/io/legado/app/help/CrashHandler.kt index ea5d6fa47..2037ff2a8 100644 --- a/app/src/main/java/io/legado/app/help/CrashHandler.kt +++ b/app/src/main/java/io/legado/app/help/CrashHandler.kt @@ -8,6 +8,7 @@ import android.webkit.WebSettings import io.legado.app.constant.AppConst import io.legado.app.exception.NoStackTraceException import io.legado.app.help.config.AppConfig +import io.legado.app.help.config.LocalConfig import io.legado.app.model.ReadAloud import io.legado.app.utils.* import splitties.init.appCtx @@ -20,7 +21,6 @@ import java.util.concurrent.TimeUnit /** * 异常管理类 */ -@Suppress("DEPRECATION") class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { /** @@ -47,9 +47,10 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { */ private fun handleException(ex: Throwable?) { if (ex == null) return + LocalConfig.appCrash = true //保存日志文件 saveCrashInfo2File(ex) - context.longToastOnUi(ex.stackTraceStr) + context.longToastOnUiLegacy(ex.stackTraceStr) Thread.sleep(3000) } diff --git a/app/src/main/java/io/legado/app/help/config/LocalConfig.kt b/app/src/main/java/io/legado/app/help/config/LocalConfig.kt index eee9f0e65..ff7e8e63a 100644 --- a/app/src/main/java/io/legado/app/help/config/LocalConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/LocalConfig.kt @@ -116,5 +116,10 @@ by appCtx.getSharedPreferences("local", Context.MODE_PRIVATE) { putBoolean("deleteBookOriginal", value) } + var appCrash: Boolean + get() = getBoolean("appCrash") + set(value) { + putBoolean("appCrash", value) + } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 68c22974a..e5fcc5bb4 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -35,6 +35,7 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.elevation import io.legado.app.lib.theme.primaryColor import io.legado.app.service.BaseReadAloudService +import io.legado.app.ui.about.CrashLogsDialog import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment import io.legado.app.ui.main.bookshelf.style1.BookshelfFragment1 import io.legado.app.ui.main.bookshelf.style2.BookshelfFragment2 @@ -134,6 +135,7 @@ class MainActivity : VMBaseActivity(), upVersion() //设置本地密码 setLocalPassword() + notifyAppCrash() //备份同步 backupSync() //自动更新书籍 @@ -266,6 +268,19 @@ class MainActivity : VMBaseActivity(), } } + private fun notifyAppCrash() { + if (!LocalConfig.appCrash || BuildConfig.DEBUG) { + return + } + LocalConfig.appCrash = false + alert(getString(R.string.draw), "检测到阅读发生了崩溃,是否打开崩溃日志以便报告问题?") { + yesButton { + showDialogFragment() + } + noButton() + } + } + /** * 备份同步 */ diff --git a/app/src/main/java/io/legado/app/utils/ToastUtils.kt b/app/src/main/java/io/legado/app/utils/ToastUtils.kt index f2e690a5d..6a3383549 100644 --- a/app/src/main/java/io/legado/app/utils/ToastUtils.kt +++ b/app/src/main/java/io/legado/app/utils/ToastUtils.kt @@ -2,71 +2,86 @@ package io.legado.app.utils +import android.annotation.SuppressLint import android.content.Context +import android.view.LayoutInflater +import android.widget.TextView import android.widget.Toast +import androidx.cardview.widget.CardView import androidx.fragment.app.Fragment import io.legado.app.BuildConfig +import io.legado.app.R import io.legado.app.help.config.AppConfig +import io.legado.app.lib.theme.bottomBackground +import io.legado.app.lib.theme.getPrimaryTextColor private var toast: Toast? = null -fun Context.toastOnUi(message: Int) { +private var toastLegacy: Toast? = null + +fun Context.toastOnUi(message: Int, duration: Int = Toast.LENGTH_SHORT) { + toastOnUi(getString(message), duration) +} + +@SuppressLint("InflateParams") +@Suppress("DEPRECATION") +fun Context.toastOnUi(message: CharSequence?, duration: Int = Toast.LENGTH_SHORT) { runOnUI { kotlin.runCatching { if (toast == null || BuildConfig.DEBUG || AppConfig.recordLog) { - toast = Toast.makeText(this, message, Toast.LENGTH_SHORT) - } else { - toast?.setText(message) - toast?.duration = Toast.LENGTH_SHORT + toast?.cancel() + toast = Toast(this) + toast?.view = LayoutInflater.from(this).inflate(R.layout.view_toast, null) } + val toastView = toast?.view!! + val cardView = toastView.findViewById(R.id.cv_content) + cardView.setCardBackgroundColor(bottomBackground) + val isLight = ColorUtils.isColorLight(bottomBackground) + val textView = toastView.findViewById(R.id.tv_text) + textView.setTextColor(getPrimaryTextColor(isLight)) + textView.text = message + toast?.duration = duration toast?.show() } } } -fun Context.toastOnUi(message: CharSequence?) { +fun Context.toastOnUiLegacy(message: CharSequence) { runOnUI { kotlin.runCatching { - if (toast == null || BuildConfig.DEBUG || AppConfig.recordLog) { - toast = Toast.makeText(this, message.toString(), Toast.LENGTH_SHORT) + if (toastLegacy == null || BuildConfig.DEBUG || AppConfig.recordLog) { + toastLegacy = Toast.makeText(this, message, Toast.LENGTH_SHORT) } else { - toast?.setText(message.toString()) - toast?.duration = Toast.LENGTH_SHORT + toastLegacy?.setText(message) + toastLegacy?.duration = Toast.LENGTH_SHORT } - toast?.show() + toastLegacy?.show() } } } fun Context.longToastOnUi(message: Int) { - runOnUI { - kotlin.runCatching { - if (toast == null || BuildConfig.DEBUG || AppConfig.recordLog) { - toast = Toast.makeText(this, message, Toast.LENGTH_LONG) - } else { - toast?.setText(message) - toast?.duration = Toast.LENGTH_LONG - } - toast?.show() - } - } + toastOnUi(message, Toast.LENGTH_LONG) } fun Context.longToastOnUi(message: CharSequence?) { + toastOnUi(message, Toast.LENGTH_LONG) +} + +fun Context.longToastOnUiLegacy(message: CharSequence) { runOnUI { kotlin.runCatching { - if (toast == null || BuildConfig.DEBUG || AppConfig.recordLog) { - toast = Toast.makeText(this, message.toString(), Toast.LENGTH_LONG) + if (toastLegacy == null || BuildConfig.DEBUG || AppConfig.recordLog) { + toastLegacy = Toast.makeText(this, message, Toast.LENGTH_LONG) } else { - toast?.setText(message.toString()) - toast?.duration = Toast.LENGTH_LONG + toastLegacy?.setText(message) + toastLegacy?.duration = Toast.LENGTH_LONG } - toast?.show() + toastLegacy?.show() } } } - fun Fragment.toastOnUi(message: Int) = requireActivity().toastOnUi(message) fun Fragment.toastOnUi(message: CharSequence) = requireActivity().toastOnUi(message) diff --git a/app/src/main/res/layout/view_toast.xml b/app/src/main/res/layout/view_toast.xml new file mode 100644 index 000000000..097530272 --- /dev/null +++ b/app/src/main/res/layout/view_toast.xml @@ -0,0 +1,27 @@ + + + + + + + + + +