mirror of
https://github.com/libre-tube/LibreTube.git
synced 2024-12-14 14:20:30 +05:30
Merge pull request #1344 from Bnyro/master
move the preference backup to the unified backup dialog
This commit is contained in:
commit
6f3cede7fb
@ -11,5 +11,6 @@ data class BackupFile(
|
||||
var watchPositions: List<WatchPosition>? = null,
|
||||
var searchHistory: List<SearchHistoryItem>? = null,
|
||||
var localSubscriptions: List<LocalSubscription>? = null,
|
||||
var customInstances: List<CustomInstance>? = null
|
||||
var customInstances: List<CustomInstance>? = null,
|
||||
var preferences: List<PreferenceItem>? = null
|
||||
)
|
||||
|
@ -0,0 +1,6 @@
|
||||
package com.github.libretube.obj
|
||||
|
||||
data class PreferenceItem(
|
||||
val key: String? = null,
|
||||
val value: Any? = null
|
||||
)
|
@ -8,7 +8,9 @@ import com.github.libretube.R
|
||||
import com.github.libretube.databinding.DialogBackupBinding
|
||||
import com.github.libretube.db.DatabaseHolder.Companion.Database
|
||||
import com.github.libretube.obj.BackupFile
|
||||
import com.github.libretube.obj.PreferenceItem
|
||||
import com.github.libretube.ui.adapters.BackupOptionsAdapter
|
||||
import com.github.libretube.util.PreferenceHelper
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
|
||||
class BackupDialog(
|
||||
@ -24,10 +26,11 @@ class BackupDialog(
|
||||
R.string.watch_positions,
|
||||
R.string.search_history,
|
||||
R.string.local_subscriptions,
|
||||
R.string.backup_customInstances
|
||||
R.string.backup_customInstances,
|
||||
R.string.preferences
|
||||
)
|
||||
|
||||
val selected = mutableListOf(false, false, false, false, false)
|
||||
val selected = MutableList(backupOptions.size) { false }
|
||||
|
||||
binding = DialogBackupBinding.inflate(layoutInflater)
|
||||
binding.backupOptionsRecycler.layoutManager = LinearLayoutManager(context)
|
||||
@ -62,6 +65,14 @@ class BackupDialog(
|
||||
backupFile.customInstances =
|
||||
Database.customInstanceDao().getAll()
|
||||
}
|
||||
if (selected[5]) {
|
||||
backupFile.preferences = PreferenceHelper.settings.all.map {
|
||||
PreferenceItem(
|
||||
it.key,
|
||||
it.value
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
thread.start()
|
||||
thread.join()
|
||||
|
@ -20,28 +20,12 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
|
||||
class AdvancedSettings : MaterialPreferenceFragment() {
|
||||
|
||||
// backup and restore prefs
|
||||
private lateinit var getPrefFile: ActivityResultLauncher<String>
|
||||
private lateinit var createPrefFile: ActivityResultLauncher<String>
|
||||
|
||||
// backup and restore database
|
||||
private lateinit var getBackupFile: ActivityResultLauncher<String>
|
||||
private lateinit var createBackupFile: ActivityResultLauncher<String>
|
||||
private var backupFile = BackupFile()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
getPrefFile =
|
||||
registerForActivityResult(
|
||||
ActivityResultContracts.GetContent()
|
||||
) { uri: Uri? ->
|
||||
BackupHelper(requireContext()).restoreSharedPreferences(uri)
|
||||
}
|
||||
createPrefFile = registerForActivityResult(
|
||||
CreateDocument("application/json")
|
||||
) { uri: Uri? ->
|
||||
BackupHelper(requireContext()).backupSharedPreferences(uri)
|
||||
}
|
||||
|
||||
getBackupFile =
|
||||
registerForActivityResult(
|
||||
ActivityResultContracts.GetContent()
|
||||
@ -76,21 +60,6 @@ class AdvancedSettings : MaterialPreferenceFragment() {
|
||||
true
|
||||
}
|
||||
|
||||
val backupSettings = findPreference<Preference>(PreferenceKeys.BACKUP_SETTINGS)
|
||||
backupSettings?.setOnPreferenceClickListener {
|
||||
createPrefFile.launch("preferences.xml")
|
||||
true
|
||||
}
|
||||
|
||||
val restoreSettings = findPreference<Preference>(PreferenceKeys.RESTORE_SETTINGS)
|
||||
restoreSettings?.setOnPreferenceClickListener {
|
||||
getPrefFile.launch("*/*")
|
||||
// reset the token
|
||||
PreferenceHelper.setToken("")
|
||||
activity?.recreate()
|
||||
true
|
||||
}
|
||||
|
||||
val advancesBackup = findPreference<Preference>("backup")
|
||||
advancesBackup?.setOnPreferenceClickListener {
|
||||
BackupDialog {
|
||||
|
@ -8,69 +8,15 @@ import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.github.libretube.db.DatabaseHolder.Companion.Database
|
||||
import com.github.libretube.extensions.query
|
||||
import com.github.libretube.obj.BackupFile
|
||||
import java.io.FileInputStream
|
||||
import com.github.libretube.obj.PreferenceItem
|
||||
import java.io.FileOutputStream
|
||||
import java.io.ObjectInputStream
|
||||
import java.io.ObjectOutputStream
|
||||
|
||||
/**
|
||||
* Backup and restore the preferences
|
||||
*/
|
||||
class BackupHelper(private val context: Context) {
|
||||
/**
|
||||
* Backup the default shared preferences to a file
|
||||
*/
|
||||
fun backupSharedPreferences(uri: Uri?) {
|
||||
if (uri == null) return
|
||||
try {
|
||||
context.contentResolver.openFileDescriptor(uri, "w")?.use {
|
||||
ObjectOutputStream(FileOutputStream(it.fileDescriptor)).use { output ->
|
||||
val pref = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
// write all preference objects to the output file
|
||||
output.writeObject(pref.all)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* restore the default shared preferences from a file
|
||||
*/
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun restoreSharedPreferences(uri: Uri?) {
|
||||
if (uri == null) return
|
||||
try {
|
||||
context.contentResolver.openFileDescriptor(uri, "r")?.use {
|
||||
ObjectInputStream(FileInputStream(it.fileDescriptor)).use { input ->
|
||||
// map all the preference keys and their values
|
||||
val entries = input.readObject() as Map<String, *>
|
||||
PreferenceManager.getDefaultSharedPreferences(context).edit(commit = true) {
|
||||
// clear the previous settings
|
||||
clear()
|
||||
|
||||
// decide for each preference which type it is and save it to the
|
||||
// preferences
|
||||
for ((key, value) in entries) {
|
||||
when (value) {
|
||||
is Boolean -> putBoolean(key, value)
|
||||
is Float -> putFloat(key, value)
|
||||
is Int -> putInt(key, value)
|
||||
is Long -> putLong(key, value)
|
||||
is String -> putString(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Backup the database
|
||||
* Write a [BackupFile] containing the database content as well as the preferences
|
||||
*/
|
||||
fun advancedBackup(uri: Uri?, backupFile: BackupFile) {
|
||||
if (uri == null) return
|
||||
@ -88,7 +34,7 @@ class BackupHelper(private val context: Context) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore a database backup
|
||||
* Restore data from a [BackupFile]
|
||||
*/
|
||||
fun restoreAdvancedBackup(uri: Uri?) {
|
||||
if (uri == null) return
|
||||
@ -116,6 +62,30 @@ class BackupHelper(private val context: Context) {
|
||||
Database.customInstanceDao().insertAll(
|
||||
*backupFile.customInstances?.toTypedArray().orEmpty()
|
||||
)
|
||||
|
||||
restorePreferences(backupFile.preferences)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the shared preferences from a backup file
|
||||
*/
|
||||
private fun restorePreferences(preferences: List<PreferenceItem>?) {
|
||||
if (preferences == null) return
|
||||
PreferenceManager.getDefaultSharedPreferences(context).edit(commit = true) {
|
||||
// clear the previous settings
|
||||
clear()
|
||||
|
||||
// decide for each preference which type it is and save it to the preferences
|
||||
preferences.forEach {
|
||||
when (it.value) {
|
||||
is Boolean -> putBoolean(it.key, it.value)
|
||||
is Float -> putFloat(it.key, it.value)
|
||||
is Int -> putInt(it.key, it.value)
|
||||
is Long -> putLong(it.key, it.value)
|
||||
is String -> putString(it.key, it.value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,14 +3,13 @@ package com.github.libretube.util
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.github.libretube.constants.PreferenceKeys
|
||||
|
||||
object PreferenceHelper {
|
||||
/**
|
||||
* for normal preferences
|
||||
*/
|
||||
private lateinit var settings: SharedPreferences
|
||||
lateinit var settings: SharedPreferences
|
||||
private lateinit var editor: SharedPreferences.Editor
|
||||
|
||||
/**
|
||||
@ -19,8 +18,6 @@ object PreferenceHelper {
|
||||
private lateinit var authSettings: SharedPreferences
|
||||
private lateinit var authEditor: SharedPreferences.Editor
|
||||
|
||||
private val mapper = ObjectMapper()
|
||||
|
||||
/**
|
||||
* set the context that is being used to access the shared preferences
|
||||
*/
|
||||
|
@ -38,20 +38,6 @@
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory app:title="@string/preferences">
|
||||
|
||||
<Preference
|
||||
android:icon="@drawable/ic_backup"
|
||||
app:key="backup_settings"
|
||||
app:title="@string/backup" />
|
||||
|
||||
<Preference
|
||||
android:icon="@drawable/ic_restore"
|
||||
app:key="restore_settings"
|
||||
app:title="@string/restore" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory app:title="@string/backup_restore">
|
||||
|
||||
<Preference
|
||||
|
Loading…
Reference in New Issue
Block a user