This commit is contained in:
HapeLee
2025-11-18 20:53:25 +08:00
parent 3aece2eadd
commit 158b472bef
5 changed files with 197 additions and 88 deletions
@@ -5,7 +5,11 @@ package io.legado.app.ui.about
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.activity.compose.setContent
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.material3.MaterialTheme
import androidx.core.app.ComponentActivity
import androidx.core.net.toUri
import androidx.lifecycle.lifecycleScope
import io.legado.app.BuildConfig
@@ -47,9 +51,7 @@ import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class AboutActivity : BaseActivity<ActivityAboutBinding>() {
override val binding by viewBinding(ActivityAboutBinding::inflate)
class AboutActivity : AppCompatActivity() {
private val waitDialog by lazy {
WaitDialog(this).setText(R.string.checking_update)
@@ -57,96 +59,36 @@ class AboutActivity : BaseActivity<ActivityAboutBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setSupportActionBar(binding.topBar)
binding.tvVersion.text = appInfo.versionName
binding.btnUpdate.setOnClickListener {
checkUpdate()
}
binding.btnGithub.setOnClickListener {
openUrl(R.string.github_url)
}
binding.btnWeb.setOnClickListener {
openUrl(R.string.legado_url)
}
binding.llContributors.setOnClickListener {
openUrl(R.string.contributors_url)
}
binding.llUpdateLog.setOnClickListener {
lifecycleScope.launch {
upVersion()
setContent {
MaterialTheme {
AboutScreen(
onCheckUpdate = { checkUpdate() },
onOpenUrl = { openUrl(it) },
onShowMdFile = { title, file -> showMdFile(title, file) },
onSaveLog = { saveLog() },
onCreateHeapDump = { createHeapDump() },
onShowCrashLogs = { showDialogFragment<CrashLogsDialog>() }
)
}
}
binding.llPrivacyPolicy.setOnClickListener {
showMdFile(getString(R.string.privacy_policy), "privacyPolicy.md")
}
binding.llLicense.setOnClickListener {
showMdFile(getString(R.string.license), "LICENSE.md")
}
binding.llDisclaimer.setOnClickListener {
showMdFile(getString(R.string.disclaimer), "disclaimer.md")
}
binding.llCrashLog.setOnClickListener {
showDialogFragment<CrashLogsDialog>()
}
binding.llSaveLog.setOnClickListener {
saveLog()
}
binding.llCreateHeapDump.setOnClickListener {
createHeapDump()
}
}
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.about, menu)
return super.onCompatCreateOptionsMenu(menu)
return true
}
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_share_it -> share(
getString(R.string.app_share_description),
getString(R.string.app_name)
)
}
return super.onCompatOptionsItemSelected(item)
}
private suspend fun upVersion() {
try {
val info = withContext(Dispatchers.IO) {
AppUpdateGitHub.getReleaseByTag(BuildConfig.VERSION_NAME)
}
withContext(Dispatchers.Main) {
val dialog = if (info != null) {
UpdateDialog(info, UpdateDialog.Mode.VIEW_LOG)
} else {
val fallback = String(assets.open("updateLog.md").readBytes())
TextDialog(getString(R.string.update_log), fallback, TextDialog.Mode.MD)
}
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)
withContext(Dispatchers.Main) {
showDialogFragment(dialog)
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.menu_share_it -> {
share(
getString(R.string.app_share_description),
getString(R.string.app_name)
)
true
}
else -> super.onOptionsItemSelected(item)
}
}
@@ -158,9 +100,9 @@ class AboutActivity : BaseActivity<ActivityAboutBinding>() {
private fun checkUpdate() {
waitDialog.show()
AppUpdate.gitHubUpdate?.run {
check(lifecycleScope)
kotlin.check(lifecycleScope)
.onSuccess {
showDialogFragment(UpdateDialog(it, UpdateDialog.Mode.UPDATE))
showDialogFragment(UpdateDialog(it))
}.onError {
appCtx.toastOnUi("${getString(R.string.check_update)}\n${it.localizedMessage}")
}.onFinally {
@@ -0,0 +1,107 @@
package io.legado.app.ui.about
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.DividerDefaults
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import io.legado.app.R
import io.legado.app.constant.AppConst.appInfo
@Composable
fun AboutScreen(
onCheckUpdate: () -> Unit = {},
onOpenUrl: (String) -> Unit = {},
onShowMdFile: (String, String) -> Unit = { _, _ -> },
onSaveLog: () -> Unit = {},
onCreateHeapDump: () -> Unit = {},
onShowCrashLogs: () -> Unit = {},
versionName: String = "1.0.0"
) {
val context = LocalContext.current
val version = remember { appInfo.versionName }
Scaffold(
topBar = {
TopAppBar(
title = { Text(stringResource(R.string.about)) }
)
}
) { padding ->
Column(
modifier = Modifier
.padding(padding)
.padding(16.dp)
.verticalScroll(rememberScrollState())
) {
Text(text = "版本:$version", style = MaterialTheme.typography.bodyLarge)
Spacer(Modifier.height(8.dp))
Button(onClick = onCheckUpdate) {
Text(stringResource(R.string.check_update))
}
Spacer(Modifier.height(8.dp))
Button(onClick = { onOpenUrl(context.getString(R.string.github_url)) }) {
Text(stringResource(R.string.github_url))
}
Button(onClick = { onOpenUrl(context.getString(R.string.legado_url)) }) {
Text(stringResource(R.string.web_service))
}
HorizontalDivider(
Modifier.padding(vertical = 8.dp),
DividerDefaults.Thickness,
DividerDefaults.color
)
Text(text = "文档与政策", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(4.dp))
TextButton(onClick = { onShowMdFile(context.getString(R.string.privacy_policy), "privacyPolicy.md") }) {
Text(stringResource(R.string.privacy_policy))
}
TextButton(onClick = { onShowMdFile(context.getString(R.string.license), "LICENSE.md") }) {
Text(stringResource(R.string.license))
}
TextButton(onClick = { onShowMdFile(context.getString(R.string.disclaimer), "disclaimer.md") }) {
Text(stringResource(R.string.disclaimer))
}
HorizontalDivider(
Modifier.padding(vertical = 8.dp),
DividerDefaults.Thickness,
DividerDefaults.color
)
Text(text = "开发工具", style = MaterialTheme.typography.titleMedium)
Spacer(Modifier.height(4.dp))
TextButton(onClick = onShowCrashLogs) {
Text(stringResource(R.string.crash_log))
}
TextButton(onClick = onSaveLog) {
Text(stringResource(R.string.save_log))
}
TextButton(onClick = onCreateHeapDump) {
Text(stringResource(R.string.create_heap_dump))
}
}
}
}