From 9b1c155f77fb9804ea7ad42c310969bac7eb07ea Mon Sep 17 00:00:00 2001
From: HapeLee <1321903405@qq.com>
Date: Wed, 27 Aug 2025 13:58:04 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=9D=E5=A7=8B=E5=8C=96?=
=?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=A4=87=E4=BB=BD=E5=A4=B1=E8=B4=A5=E4=B8=8E?=
=?UTF-8?q?NPE=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 4 +-
.../io/legato/kazusa/help/storage/Restore.kt | 45 +++++-----
.../kazusa/ui/welcome/WebDavFragment.kt | 54 ++++++++----
.../kazusa/ui/welcome/WelcomeActivity.kt | 10 ---
app/src/main/res/layout/fragment_privacy.xml | 84 ++++++++++++-------
.../main/res/layout/fragment_webdav_auth.xml | 35 ++++++--
6 files changed, 143 insertions(+), 89 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0071c1b67..e6b190ab9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -135,7 +135,9 @@
+ android:enableOnBackInvokedCallback="true"
+ android:exported="false"
+ android:windowSoftInputMode="adjustPan|stateHidden" />
- val edit = appCtx.defaultSharedPreferences.edit()
+ appCtx.defaultSharedPreferences.edit {
- map.forEach { (key, value) ->
- if (BackupConfig.keyIsNotIgnore(key)) {
- when (key) {
- PreferKey.webDavPassword -> {
- kotlin.runCatching {
- aes.decryptStr(value.toString())
- }.getOrNull()?.let {
- edit.putString(key, it)
- } ?: let {
- if (appCtx.getPrefString(PreferKey.webDavPassword)
- .isNullOrBlank()
- ) {
- edit.putString(key, value.toString())
+ map.forEach { (key, value) ->
+ if (BackupConfig.keyIsNotIgnore(key)) {
+ when (key) {
+ PreferKey.webDavPassword -> {
+ kotlin.runCatching {
+ aes.decryptStr(value.toString())
+ }.getOrNull()?.let {
+ putString(key, it)
+ } ?: let {
+ if (appCtx.getPrefString(PreferKey.webDavPassword)
+ .isNullOrBlank()
+ ) {
+ putString(key, value.toString())
+ }
}
}
- }
- else -> when (value) {
- is Int -> edit.putInt(key, value)
- is Boolean -> edit.putBoolean(key, value)
- is Long -> edit.putLong(key, value)
- is Float -> edit.putFloat(key, value)
- is String -> edit.putString(key, value)
+ else -> when (value) {
+ is Int -> putInt(key, value)
+ is Boolean -> putBoolean(key, value)
+ is Long -> putLong(key, value)
+ is Float -> putFloat(key, value)
+ is String -> putString(key, value)
+ }
}
}
}
}
- edit.apply()
}
ReadBookConfig.apply {
comicStyleSelect = appCtx.getPrefInt(PreferKey.comicStyleSelect)
diff --git a/app/src/main/java/io/legato/kazusa/ui/welcome/WebDavFragment.kt b/app/src/main/java/io/legato/kazusa/ui/welcome/WebDavFragment.kt
index d82c0cdfb..539e607e0 100644
--- a/app/src/main/java/io/legato/kazusa/ui/welcome/WebDavFragment.kt
+++ b/app/src/main/java/io/legato/kazusa/ui/welcome/WebDavFragment.kt
@@ -26,7 +26,9 @@ import io.legato.kazusa.lib.dialogs.alert
import io.legato.kazusa.lib.dialogs.selector
import io.legato.kazusa.ui.file.HandleFileContract
import io.legato.kazusa.ui.widget.dialog.WaitDialog
+import io.legato.kazusa.utils.gone
import io.legato.kazusa.utils.toastOnUi
+import io.legato.kazusa.utils.visible
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.Job
@@ -43,12 +45,6 @@ class WebDavFragment : BaseFragment(R.layout.fragment_webdav_auth) {
private var restoreJob: Job? = null
private val waitDialog by lazy { WaitDialog(requireContext()) }
- interface WebDavActions {
- fun onSaveWebDavConfig()
- }
-
- var listener: WebDavActions? = null
-
private val restoreDoc = registerForActivityResult(HandleFileContract()) {
it.uri?.let { uri ->
waitDialog.setText("恢复中…")
@@ -102,28 +98,44 @@ class WebDavFragment : BaseFragment(R.layout.fragment_webdav_auth) {
}
binding.btnCheck.setOnClickListener {
- saveWebDavConfig()
-
+ val config = WebDavConfig(
+ url = binding.editUrl.text.toString(),
+ account = binding.editAccount.text.toString(),
+ password = binding.editPassword.text.toString()
+ )
+ saveWebDavConfig(config)
lifecycleScope.launch {
testWebDav()
}
}
binding.btnRestore.setOnClickListener {
- restore()
+ val config = WebDavConfig(
+ url = binding.editUrl.text.toString(),
+ account = binding.editAccount.text.toString(),
+ password = binding.editPassword.text.toString()
+ )
+ lifecycleScope.launch {
+ try {
+ binding.progressRestore.visible()
+ binding.btnRestore.text = ""
+ saveWebDavConfig(config)
+ AppWebDav.upConfig()
+ restore()
+ } finally {
+ binding.progressRestore.gone()
+ binding.btnRestore.text = "获取备份"
+ }
+ }
}
}
- fun saveWebDavConfig(onSaved: (() -> Unit)? = null) {
- val url = binding.editUrl.text.toString()
- val account = binding.editAccount.text.toString()
- val password = binding.editPassword.text.toString()
-
+ fun saveWebDavConfig(config: WebDavConfig, onSaved: (() -> Unit)? = null) {
PreferenceManager.getDefaultSharedPreferences(requireContext()).edit {
- putString(PreferKey.webDavUrl, url)
- putString(PreferKey.webDavAccount, account)
- putString(PreferKey.webDavPassword, password)
+ putString(PreferKey.webDavUrl, config.url)
+ putString(PreferKey.webDavAccount, config.account)
+ putString(PreferKey.webDavPassword, config.password)
}
onSaved?.invoke()
@@ -205,6 +217,14 @@ class WebDavFragment : BaseFragment(R.layout.fragment_webdav_auth) {
override fun onDestroyView() {
super.onDestroyView()
+ waitDialog.dismiss() // 确保释放
_binding = null
}
+
}
+
+data class WebDavConfig(
+ val url: String,
+ val account: String,
+ val password: String
+)
diff --git a/app/src/main/java/io/legato/kazusa/ui/welcome/WelcomeActivity.kt b/app/src/main/java/io/legato/kazusa/ui/welcome/WelcomeActivity.kt
index bc6c39961..3f26e5ea4 100644
--- a/app/src/main/java/io/legato/kazusa/ui/welcome/WelcomeActivity.kt
+++ b/app/src/main/java/io/legato/kazusa/ui/welcome/WelcomeActivity.kt
@@ -17,8 +17,6 @@ class WelcomeActivity : BaseActivity() {
override val binding by viewBinding(ActivityWelcomeBinding::inflate)
- private val webDavFragment: WebDavFragment
- get() = pages[1] as WebDavFragment
private val pages = listOf(
PrivacyFragment(),
WebDavFragment(),
@@ -71,13 +69,6 @@ class WelcomeActivity : BaseActivity() {
// 初始化按钮文字
binding.btnNext.text = "阅读并同意"
- (webDavFragment).listener = object : WebDavFragment.WebDavActions {
- override fun onSaveWebDavConfig() {
- webDavFragment.saveWebDavConfig()
- }
- }
-
-
binding.btnNext.setOnClickListener {
val current = binding.viewPager.currentItem
when (current) {
@@ -92,7 +83,6 @@ class WelcomeActivity : BaseActivity() {
}
else -> {
- webDavFragment.listener?.onSaveWebDavConfig()
binding.viewPager.currentItem = current + 1
}
}
diff --git a/app/src/main/res/layout/fragment_privacy.xml b/app/src/main/res/layout/fragment_privacy.xml
index b9bc6e778..635c007f8 100644
--- a/app/src/main/res/layout/fragment_privacy.xml
+++ b/app/src/main/res/layout/fragment_privacy.xml
@@ -1,45 +1,65 @@
-
+ android:paddingHorizontal="16dp"
+ android:paddingBottom="8dp">
-
+ android:layout_height="match_parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
-
+ android:orientation="vertical">
-
+
-
+
-
-
+
-
\ No newline at end of file
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_webdav_auth.xml b/app/src/main/res/layout/fragment_webdav_auth.xml
index da44664fd..11b96b49d 100644
--- a/app/src/main/res/layout/fragment_webdav_auth.xml
+++ b/app/src/main/res/layout/fragment_webdav_auth.xml
@@ -56,20 +56,41 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
-
+ android:layout_marginEnd="8dp"
+ android:layout_weight="1">
+
+
+
+
+
+