diff --git a/app/src/main/java/io/legado/app/help/update/AppUpdateGitHub.kt b/app/src/main/java/io/legado/app/help/update/AppUpdateGitHub.kt index 5d1c513cf..6377aa2eb 100644 --- a/app/src/main/java/io/legado/app/help/update/AppUpdateGitHub.kt +++ b/app/src/main/java/io/legado/app/help/update/AppUpdateGitHub.kt @@ -64,6 +64,23 @@ object AppUpdateGitHub : AppUpdate.AppUpdateInterface { } } + suspend fun getReleaseByTag(tag: String): AppUpdate.UpdateInfo? { + val url = "https://api.github.com/repos/HapeLee/legado-with-MD3/releases/tags/$tag" + val res = okHttpClient.newCallResponse { url(url) } + if (!res.isSuccessful) return null + + val body = res.body.text() + val release = GSON.fromJsonObject(body).getOrElse { return null } + val info = release.gitReleaseToAppReleaseInfo().firstOrNull() ?: return null + + return AppUpdate.UpdateInfo( + tagName = info.versionName, + updateLog = info.note, + downloadUrl = info.downloadUrl, + fileName = info.name + ) + } + override fun check(scope: CoroutineScope): Coroutine { return Coroutine.async(scope) { val currentVersion = AppConst.appInfo.versionName diff --git a/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt b/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt index f847a242b..83af4ff6f 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutActivity.kt @@ -123,7 +123,7 @@ class AboutActivity : BaseActivity() { AppUpdate.gitHubUpdate?.run { check(lifecycleScope) .onSuccess { - showDialogFragment(UpdateDialog(it)) + showDialogFragment(UpdateDialog(it, UpdateDialog.Mode.UPDATE)) }.onError { appCtx.toastOnUi("${getString(R.string.check_update)}\n${it.localizedMessage}") }.onFinally { diff --git a/app/src/main/java/io/legado/app/ui/about/UpdateDialog.kt b/app/src/main/java/io/legado/app/ui/about/UpdateDialog.kt index 87fcad18f..acae915ef 100644 --- a/app/src/main/java/io/legado/app/ui/about/UpdateDialog.kt +++ b/app/src/main/java/io/legado/app/ui/about/UpdateDialog.kt @@ -12,6 +12,7 @@ import io.legado.app.help.config.AppConfig import io.legado.app.help.update.AppUpdate import io.legado.app.help.update.AppVariant import io.legado.app.model.Download +import io.legado.app.utils.gone import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import io.noties.markwon.Markwon @@ -21,12 +22,15 @@ import io.noties.markwon.image.glide.GlideImagesPlugin class UpdateDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_update) { - constructor(updateInfo: AppUpdate.UpdateInfo) : this() { + enum class Mode { UPDATE, VIEW_LOG } + + constructor(updateInfo: AppUpdate.UpdateInfo, mode: Mode = Mode.UPDATE) : this() { arguments = Bundle().apply { putString("newVersion", updateInfo.tagName) putString("updateBody", updateInfo.updateLog) putString("url", updateInfo.downloadUrl) putString("name", updateInfo.fileName) + putString("mode", mode.name) } } @@ -38,28 +42,24 @@ class UpdateDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_update) { else -> AppConst.appInfo.appVariant } - val binding by viewBinding(DialogUpdateBinding::bind) + private val binding by viewBinding(DialogUpdateBinding::bind) - override fun onStart() { - super.onStart() - } + private val mode: Mode + get() = Mode.valueOf(arguments?.getString("mode") ?: Mode.UPDATE.name) override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { - //binding.toolBar.setBackgroundColor(primaryColor) - binding.tvCurrentVersion.text = BuildConfig.VERSION_NAME binding.tvVersion.text = arguments?.getString("newVersion") - binding.tvAbi.text = Build.SUPPORTED_ABIS.firstOrNull() ?: "unknown" - binding.tvUrl.text = arguments?.getString("url") binding.tvVariable.text = checkVariant.toString() val updateBody = arguments?.getString("updateBody") - if (updateBody == null) { + if (updateBody.isNullOrBlank()) { toastOnUi("没有数据") dismiss() return } + binding.textView.post { Markwon.builder(requireContext()) .usePlugin(GlideImagesPlugin.create(requireContext())) @@ -69,19 +69,29 @@ class UpdateDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_update) { .setMarkdown(binding.textView, updateBody) } - binding.btnUpdate.setOnClickListener { - val url = arguments?.getString("url") - val fileName = arguments?.getString("name") - - if (url.isNullOrBlank() || fileName.isNullOrBlank()) { - toastOnUi("下载信息不完整") - return@setOnClickListener + when (mode) { + Mode.UPDATE -> { + val url = arguments?.getString("url") + val fileName = arguments?.getString("name") + binding.ivAward.gone() + binding.btnUpdate.setOnClickListener { + if (url.isNullOrBlank() || fileName.isNullOrBlank()) { + toastOnUi("下载信息不完整") + return@setOnClickListener + } + Download.start(requireContext(), url, fileName) + toastOnUi("开始下载: $fileName") + } } - Download.start(requireContext(), url, fileName) - toastOnUi("开始下载: $fileName") + Mode.VIEW_LOG -> { + binding.bottomSheetTitle.text = "已经更新至" + binding.tvVersion.text = BuildConfig.VERSION_NAME + binding.btnUpdate.gone() + binding.llCurrent.gone() + binding.tvCurrentVersion.gone() + binding.tvUrl.gone() + } } - } - } 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 a1eb4ba4d..66fb46bde 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 @@ -39,8 +39,10 @@ import io.legado.app.help.config.AppConfig import io.legado.app.help.config.LocalConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.storage.Backup +import io.legado.app.help.update.AppUpdateGitHub import io.legado.app.lib.dialogs.alert import io.legado.app.ui.about.CrashLogsDialog +import io.legado.app.ui.about.UpdateDialog import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment @@ -235,7 +237,7 @@ open class MainActivity : VMBaseActivity(), /** * 版本更新日志 */ - private suspend fun upVersion() = suspendCoroutine { block -> + private suspend fun upVersion() = suspendCoroutine { block -> if (LocalConfig.versionCode == appInfo.versionCode) { block.resume(null) return@suspendCoroutine @@ -244,17 +246,32 @@ open class MainActivity : VMBaseActivity(), if (LocalConfig.isFirstOpenApp) { val help = String(assets.open("web/help/md/appHelp.md").readBytes()) val dialog = TextDialog(getString(R.string.help), help, TextDialog.Mode.MD) - dialog.setOnDismissListener { - block.resume(null) - } + dialog.setOnDismissListener { block.resume(null) } showDialogFragment(dialog) - } else if (!BuildConfig.DEBUG) { - val log = String(assets.open("updateLog.md").readBytes()) - val dialog = TextDialog(getString(R.string.update_log), log, TextDialog.Mode.MD) - dialog.setOnDismissListener { - block.resume(null) + return@suspendCoroutine + } + if (!BuildConfig.DEBUG) { + lifecycleScope.launch { + try { + val info = AppUpdateGitHub.getReleaseByTag(BuildConfig.VERSION_NAME) + if (info != null) { + val dialog = UpdateDialog(info, UpdateDialog.Mode.VIEW_LOG) + dialog.setOnDismissListener { block.resume(null) } + showDialogFragment(dialog) + } else { + val fallback = String(assets.open("updateLog.md").readBytes()) + val dialog = TextDialog(getString(R.string.update_log), fallback, TextDialog.Mode.MD) + dialog.setOnDismissListener { block.resume(null) } + showDialogFragment(dialog) + } + } catch (e: Exception) { + e.printStackTrace() + val fallback = String(assets.open("updateLog.md").readBytes()) + val dialog = TextDialog(getString(R.string.update_log), fallback, TextDialog.Mode.MD) + dialog.setOnDismissListener { block.resume(null) } + showDialogFragment(dialog) + } } - showDialogFragment(dialog) } else { block.resume(null) } diff --git a/app/src/main/res/drawable/ic_award.xml b/app/src/main/res/drawable/ic_award.xml new file mode 100644 index 000000000..4939610ba --- /dev/null +++ b/app/src/main/res/drawable/ic_award.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_update.xml b/app/src/main/res/layout/dialog_update.xml index d1048c340..20d57cfb4 100644 --- a/app/src/main/res/layout/dialog_update.xml +++ b/app/src/main/res/layout/dialog_update.xml @@ -11,7 +11,7 @@ android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center" - android:paddingBottom="16dp"> + android:paddingBottom="4dp"> - + + - - + android:textStyle="bold" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv_award" + app:layout_constraintBottom_toBottomOf="parent"/> - + style="@style/Widget.Material3Expressive.Button.IconButton.Tonal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent"/> + + android:paddingVertical="4dp"> @@ -147,6 +163,7 @@ android:layout_height="wrap_content" android:textStyle="bold" android:textSize="14sp" + android:paddingTop="8dp" android:text="@string/update_log"/> - \ No newline at end of file