Add backup/restore config again

This commit is contained in:
frknkrc44 2025-08-23 01:14:45 +03:00
commit 55c7d0fe5b
No known key found for this signature in database
GPG key ID: 784AE1CC0DCFD34F
5 changed files with 56 additions and 8 deletions

View file

@ -2,9 +2,7 @@ package icu.nullptr.hidemyapplist.ui.util
import android.content.Context
import android.content.res.Configuration
import android.content.res.Resources
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.widget.ImageView
import androidx.annotation.AttrRes

View file

@ -1,6 +1,5 @@
package org.frknkrc44.hma_oss.ui.activity
import android.content.res.Resources
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity

View file

@ -3,23 +3,25 @@ package org.frknkrc44.hma_oss.ui.fragment
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.Fragment
import by.kirich1409.viewbindingdelegate.viewBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import icu.nullptr.hidemyapplist.hmaApp
import icu.nullptr.hidemyapplist.service.ConfigManager
import icu.nullptr.hidemyapplist.service.ServiceClient
import icu.nullptr.hidemyapplist.ui.activity.AboutActivity
import icu.nullptr.hidemyapplist.ui.util.ThemeUtils.getColor
import icu.nullptr.hidemyapplist.ui.util.ThemeUtils.setCircleBackground
import icu.nullptr.hidemyapplist.ui.util.ThemeUtils.themeColor
import icu.nullptr.hidemyapplist.ui.util.makeToast
import icu.nullptr.hidemyapplist.ui.util.setupToolbar
import org.frknkrc44.hma_oss.BuildConfig
import org.frknkrc44.hma_oss.R
import org.frknkrc44.hma_oss.databinding.FragmentHomeBinding
import java.io.IOException
import java.util.Calendar
/**
* A simple [Fragment] subclass.
@ -29,6 +31,46 @@ import org.frknkrc44.hma_oss.databinding.FragmentHomeBinding
class HomeFragment : Fragment(R.layout.fragment_home) {
private val binding by viewBinding<FragmentHomeBinding>()
private val backupSAFLauncher =
registerForActivityResult(ActivityResultContracts.CreateDocument("application/json")) backup@{ uri ->
if (uri == null) return@backup
ConfigManager.configFile.inputStream().use { input ->
hmaApp.contentResolver.openOutputStream(uri).use { output ->
if (output == null) makeToast(R.string.home_export_failed)
else input.copyTo(output)
}
}
makeToast(R.string.home_exported)
}
private val restoreSAFLauncher =
registerForActivityResult(ActivityResultContracts.GetContent()) restore@{ uri ->
if (uri == null) return@restore
runCatching {
val backup = hmaApp.contentResolver
.openInputStream(uri)?.reader().use { it?.readText() }
?: throw IOException(getString(R.string.home_import_file_damaged))
ConfigManager.importConfig(backup)
makeToast(R.string.home_import_successful)
}.onFailure {
it.printStackTrace()
MaterialAlertDialogBuilder(requireContext())
.setCancelable(false)
.setTitle(R.string.home_import_failed)
.setMessage(it.message)
.setPositiveButton(android.R.string.ok, null)
.setNegativeButton(R.string.show_crash_log) { _, _ ->
MaterialAlertDialogBuilder(requireActivity())
.setCancelable(false)
.setTitle(R.string.home_import_failed)
.setMessage(it.stackTraceToString())
.setPositiveButton(android.R.string.ok, null)
.show()
}
.show()
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
setupToolbar(
toolbar = binding.toolbar,
@ -108,6 +150,14 @@ class HomeFragment : Fragment(R.layout.fragment_home) {
itemIcon.setImageResource(R.drawable.ic_outline_layers_24)
itemIcon.setCircleBackground(getColor(R.color.invalid))
}
binding.backupConfig.setOnClickListener {
backupSAFLauncher.launch("HMA_Config_${Calendar.getInstance().timeInMillis}.json")
}
binding.restoreConfig.setOnClickListener {
restoreSAFLauncher.launch("application/json")
}
}
companion object {

View file

@ -56,6 +56,7 @@
android:layout_height="wrap_content">
<com.google.android.material.button.MaterialButton
android:id="@+id/backup_config"
app:icon="@drawable/outline_backup_24"
android:text="@string/home_backup_config"
android:layout_marginRight="8dp"
@ -64,6 +65,7 @@
android:layout_weight="1" />
<com.google.android.material.button.MaterialButton
android:id="@+id/restore_config"
app:icon="@drawable/outline_settings_backup_restore_24"
android:text="@string/home_restore_config"
android:layout_marginLeft="8dp"

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_nav_graph"
app:startDestination="@id/home_nav_graph">
<include app:graph="@navigation/home_nav_graph" />