Compose
This commit is contained in:
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user