BackupFragment.kt 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package com.example.modifier.ui.backup
  2. import android.annotation.SuppressLint
  3. import android.os.Bundle
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import androidx.appcompat.content.res.AppCompatResources
  8. import androidx.fragment.app.Fragment
  9. import androidx.lifecycle.Lifecycle
  10. import androidx.lifecycle.lifecycleScope
  11. import androidx.lifecycle.repeatOnLifecycle
  12. import androidx.recyclerview.widget.LinearLayoutManager
  13. import com.example.modifier.Global
  14. import com.example.modifier.MyApplication
  15. import com.example.modifier.R
  16. import com.example.modifier.Utils
  17. import com.example.modifier.adapter.BackupAdapter
  18. import com.example.modifier.data.AppContainer
  19. import com.example.modifier.data.AppDatabase
  20. import com.example.modifier.data.BackupItem
  21. import com.example.modifier.data.BackupItemDao
  22. import com.example.modifier.databinding.FragmentBackupBinding
  23. import com.example.modifier.service.ModifierService
  24. import kotlinx.coroutines.Dispatchers
  25. import kotlinx.coroutines.launch
  26. import kotlinx.coroutines.withContext
  27. import java.time.LocalDateTime
  28. import java.util.Date
  29. class BackupFragment : Fragment() {
  30. private lateinit var binding: FragmentBackupBinding
  31. private val list = mutableListOf<BackupItem>()
  32. private lateinit var adapter: BackupAdapter
  33. private val backupItemDao: BackupItemDao by lazy {
  34. AppDatabase.getDatabase(requireContext()).itemDao()
  35. }
  36. override fun onCreateView(
  37. inflater: LayoutInflater, container: ViewGroup?,
  38. savedInstanceState: Bundle?
  39. ): View {
  40. if (this::binding.isInitialized) {
  41. return binding.root
  42. }
  43. binding = FragmentBackupBinding.inflate(inflater, container, false)
  44. adapter = BackupAdapter(requireContext(), list, backupItemDao)
  45. binding.rvBackup.adapter = adapter
  46. binding.rvBackup.layoutManager = LinearLayoutManager(requireContext())
  47. binding.fabBackup.setOnClickListener {
  48. Utils.makeLoadingButton(requireContext(), binding.fabBackup)
  49. lifecycleScope.launch {
  50. withContext(Dispatchers.IO) {
  51. val backup = Global.backup(backupItemDao, "manual", 0)
  52. list.add(0, backup)
  53. }
  54. adapter.notifyItemInserted(0)
  55. binding.fabBackup.isEnabled = true
  56. binding.fabBackup.icon =
  57. AppCompatResources.getDrawable(requireContext(), R.drawable.ic_add)
  58. }
  59. }
  60. binding.refresh.setOnRefreshListener {
  61. lifecycleScope.launch {
  62. withContext(Dispatchers.IO) {
  63. refresh()
  64. }
  65. }
  66. }
  67. binding.lifecycleOwner = this
  68. viewLifecycleOwner.lifecycleScope.launch {
  69. // repeatOnLifecycle launches the block in a new coroutine every time the
  70. // lifecycle is in the STARTED state (or above) and cancels it when it's STOPPED.
  71. viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
  72. withContext(Dispatchers.IO) {
  73. refresh()
  74. }
  75. }
  76. }
  77. return binding.root
  78. }
  79. private suspend fun refresh() {
  80. val all = backupItemDao.getAll()
  81. list.clear()
  82. list.addAll(all)
  83. withContext(Dispatchers.Main) {
  84. adapter.notifyDataSetChanged()
  85. }
  86. binding.refresh.isRefreshing = false
  87. }
  88. }