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"> + + + + + +