Add backup/restore config again
This commit is contained in:
parent
ae7760a245
commit
55c7d0fe5b
5 changed files with 56 additions and 8 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
Reference in a new issue