Refactor backup flow and remove backup summary

This commit is contained in:
2dust committed 2025-12-30 20:36:53 +08:00
1 parent e287ac88c8
commit 4b1fa29ade
11 files changed
+42 -32

No files matched your search

@@ -16,7 +16,6 @@ import com.v2ray.ang.databinding.ActivityAboutBinding
import com.v2ray.ang.extension.toast
import com.v2ray.ang.extension.toastError
import com.v2ray.ang.extension.toastSuccess
import com.v2ray.ang.handler.MmkvManager
import com.v2ray.ang.handler.SpeedtestManager
import com.v2ray.ang.util.Utils
import com.v2ray.ang.util.ZipUtil
@@ -27,7 +26,6 @@ import java.util.Locale
class AboutActivity : BaseActivity() {
private val binding by lazy { ActivityAboutBinding.inflate(layoutInflater) }
private val extDir by lazy { File(Utils.backupPath(this)) }
private val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
@@ -42,25 +40,50 @@ class AboutActivity : BaseActivity() {
}
}
private val createBackupFile =
registerForActivityResult(ActivityResultContracts.CreateDocument("application/zip")) { uri ->
if (uri != null) {
try {
val ret = backupConfigurationToCache()
if (ret.first) {
// Copy the cached zip file to user-selected location
contentResolver.openOutputStream(uri)?.use { output ->
File(ret.second).inputStream().use { input ->
input.copyTo(output)
}
}
// Clean up cache file
File(ret.second).delete()
toastSuccess(R.string.toast_success)
} else {
toastError(R.string.toast_failure)
}
} catch (e: Exception) {
Log.e(AppConfig.TAG, "Failed to backup configuration", e)
toastError(R.string.toast_failure)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
title = getString(R.string.title_about)
binding.tvBackupSummary.text = this.getString(R.string.summary_configuration_backup, extDir)
binding.layoutBackup.setOnClickListener {
val ret = backupConfiguration(extDir.absolutePath)
if (ret.first) {
toastSuccess(R.string.toast_success)
} else {
toastError(R.string.toast_failure)
}
val dateFormatted = SimpleDateFormat(
"yyyy-MM-dd-HH-mm-ss",
Locale.getDefault()
).format(System.currentTimeMillis())
val defaultFileName = "${getString(R.string.app_name)}_${dateFormatted}.zip"
// Let user choose where to save the backup file
createBackupFile.launch(defaultFileName)
}
binding.layoutShare.setOnClickListener {
val ret = backupConfiguration(cacheDir.absolutePath)
val ret = backupConfigurationToCache()
if (ret.first) {
startActivity(
Intent.createChooser(
@@ -132,14 +155,18 @@ class AboutActivity : BaseActivity() {
}
}
private fun backupConfiguration(outputZipFilePos: String): Pair<Boolean, String> {
val dateFormated = SimpleDateFormat(
/**
* Backup configuration to cache directory
* Returns Pair<success, zipFilePath>
*/
private fun backupConfigurationToCache(): Pair<Boolean, String> {
val dateFormatted = SimpleDateFormat(
"yyyy-MM-dd-HH-mm-ss",
Locale.getDefault()
).format(System.currentTimeMillis())
val folderName = "${getString(R.string.app_name)}_${dateFormated}"
val folderName = "${getString(R.string.app_name)}_${dateFormatted}"
val backupDir = this.cacheDir.absolutePath + "/$folderName"
val outputZipFilePath = "$outputZipFilePos/$folderName.zip"
val outputZipFilePath = "${this.cacheDir.absolutePath}/$folderName.zip"
val count = MMKV.backupAllToDirectory(backupDir)
if (count <= 0) {
@@ -43,14 +43,6 @@
android:text="@string/title_configuration_backup"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />
<TextView
android:id="@+id/tv_backup_summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_spacing_dp16"
android:maxLines="4"
android:textAppearance="@style/TextAppearance.AppCompat.Small" />
</LinearLayout>
</LinearLayout>
@@ -234,7 +234,6 @@
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">قناة Telegram</string>
<string name="title_configuration_backup">نسخ التكوين احتياطيًا</string>
<string name="summary_configuration_backup">موقع التخزين: [%s]، سيتم مسح النسخة الاحتياطية بعد إلغاء تثبيت التطبيق أو مسح التخزين</string>
<string name="title_configuration_restore">استعادة التكوين</string>
<string name="title_configuration_share">مشاركة التكوين</string>
@@ -234,7 +234,6 @@
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">টেলিগ্রাম চ্যানেল</string>
<string name="title_configuration_backup">কনফিগারেশন ব্যাকআপ</string>
<string name="summary_configuration_backup">স্টোরেজ অবস্থান: [%s], অ্যাপ আনইনস্টল বা স্টোরেজ ক্লিয়ার করার পরে ব্যাকআপ মুছে যাবে</string>
<string name="title_configuration_restore">কনফিগারেশন পুনরুদ্ধার</string>
<string name="title_configuration_share">কনফিগারেশন শেয়ার করুন</string>
@@ -234,7 +234,6 @@
<string name="title_oss_license">موجوزا کود بونچک</string>
<string name="title_tg_channel">تورگه تلگرام</string>
<string name="title_configuration_backup">لادراری گرؽڌن ز کانفیگ</string>
<string name="summary_configuration_backup">جاگه زفت کردن: [%s]، بعڌ پاک کردن برنومه یا پاک کردن جاگه زفت کردن، نوسخه لادرار هم پاک ابۊ.</string>
<string name="title_configuration_restore">وورگندن کانفیگ</string>
<string name="title_configuration_share">یک رسۊوی کانفیگ</string>
@@ -233,7 +233,6 @@
<string name="title_oss_license">مجوز های منبع باز</string>
<string name="title_tg_channel">کانال تلگرام</string>
<string name="title_configuration_backup">پشتیبان گیری از پیکربندی</string>
<string name="summary_configuration_backup">محل ذخیره سازی: [%s], پس از حذف نصب برنامه یا پاک کردن فضای ذخیره سازی، نسخه پشتیبان پاک می شود</string>
<string name="title_configuration_restore">بازیابی پیکربندی</string>
<string name="title_configuration_share">اشتراک گذاری پیکربندی</string>
<string name="title_pref_promotion">تبلیغات</string>
@@ -233,7 +233,6 @@
<string name="title_oss_license">Лицензии открытого исходного кода</string>
<string name="title_tg_channel">Telegram-канал</string>
<string name="title_configuration_backup">Резервирование конфигурации</string>
<string name="summary_configuration_backup">Путь: [%s]. Резервная копия будет стёрта при удалении приложения или очистке хранилища.</string>
<string name="title_configuration_restore">Восстановление конфигурации</string>
<string name="title_configuration_share">Поделиться конфигурацией</string>
@@ -235,7 +235,6 @@
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">Kênh Telegram</string>
<string name="title_configuration_backup">Sao lưu cấu hình</string>
<string name="summary_configuration_backup">Nơi lưu trữ: [%s], bản backup sẽ được dọn dẹp sau khi xóa ứng dụng hoặc xóa bộ nhớ.</string>
<string name="title_configuration_restore">Khôi phục cấu hình</string>
<string name="title_configuration_share">Chia sẻ cấu hình</string>
<string name="title_pref_promotion">Quảng bá server</string>
@@ -231,7 +231,6 @@
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">Telegram 频道</string>
<string name="title_configuration_backup">备份配置</string>
<string name="summary_configuration_backup">存储位置: [%s], 卸载 App 或清除存储后备份将被清除</string>
<string name="title_configuration_restore">还原配置</string>
<string name="title_configuration_share">分享配置</string>
@@ -232,7 +232,6 @@
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">Telegram 頻道</string>
<string name="title_configuration_backup">備份設定</string>
<string name="summary_configuration_backup">儲存位置: [%s], 卸載App或清除儲存後備份將被清除</string>
<string name="title_configuration_restore">還原設定</string>
<string name="title_configuration_share">分享設定</string>
@@ -237,7 +237,6 @@
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">Telegram channel</string>
<string name="title_configuration_backup">Backup configuration</string>
<string name="summary_configuration_backup">Storage location: [%s], The backup will be cleared after uninstalling the app or clearing the storage</string>
<string name="title_configuration_restore">Restore configuration</string>
<string name="title_configuration_share">Share configuration</string>