From 8ce809d30f4b90ebbf0ed08467bbfaeaccc0f847 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 1 Dec 2022 13:48:08 +0100 Subject: [PATCH] Add import export settings --- .../github/libretube/obj/ImportPlaylist.kt | 8 ++ .../libretube/obj/ImportPlaylistFile.kt | 7 ++ .../ui/base/BasePreferenceFragment.kt | 7 ++ .../ui/preferences/AdvancedSettings.kt | 52 ---------- .../ui/preferences/BackupRestoreSettings.kt | 98 +++++++++++++++++++ .../ui/preferences/InstanceSettings.kt | 47 --------- .../libretube/ui/preferences/MainSettings.kt | 44 +++------ app/src/main/res/values/strings.xml | 4 + app/src/main/res/xml/advanced_settings.xml | 14 --- .../main/res/xml/import_export_settings.xml | 49 ++++++++++ app/src/main/res/xml/settings.xml | 6 ++ 11 files changed, 195 insertions(+), 141 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt create mode 100644 app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt create mode 100644 app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt create mode 100644 app/src/main/res/xml/import_export_settings.xml diff --git a/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt b/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt new file mode 100644 index 000000000..fc25c8789 --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/ImportPlaylist.kt @@ -0,0 +1,8 @@ +package com.github.libretube.obj + +data class ImportPlaylist( + val name: String? = null, + val type: String? = null, + val visibility: String? = null, + val videos: List = listOf() +) diff --git a/app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt b/app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt new file mode 100644 index 000000000..43f9ff4a0 --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/ImportPlaylistFile.kt @@ -0,0 +1,7 @@ +package com.github.libretube.obj + +data class ImportPlaylistFile( + val format: String? = null, + val version: Int? = null, + val playlists: List? = null +) diff --git a/app/src/main/java/com/github/libretube/ui/base/BasePreferenceFragment.kt b/app/src/main/java/com/github/libretube/ui/base/BasePreferenceFragment.kt index 6ac596c4d..fe2eb9a39 100644 --- a/app/src/main/java/com/github/libretube/ui/base/BasePreferenceFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/base/BasePreferenceFragment.kt @@ -1,6 +1,7 @@ package com.github.libretube.ui.base import android.os.Bundle +import androidx.fragment.app.Fragment import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.Preference @@ -70,4 +71,10 @@ open class BasePreferenceFragment : PreferenceFragmentCompat() { else -> super.onDisplayPreferenceDialog(preference) } } + + fun Fragment?.runOnUiThread(action: () -> Unit) { + this ?: return + if (!isAdded) return // Fragment not attached to an Activity + activity?.runOnUiThread(action) + } } diff --git a/app/src/main/java/com/github/libretube/ui/preferences/AdvancedSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/AdvancedSettings.kt index 6835dd7f5..e1ef6be6a 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/AdvancedSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/AdvancedSettings.kt @@ -1,49 +1,18 @@ package com.github.libretube.ui.preferences -import android.net.Uri import android.os.Bundle -import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.contract.ActivityResultContracts -import androidx.activity.result.contract.ActivityResultContracts.CreateDocument import androidx.preference.ListPreference import androidx.preference.Preference import com.github.libretube.R import com.github.libretube.constants.PreferenceKeys -import com.github.libretube.obj.BackupFile import com.github.libretube.ui.activities.SettingsActivity import com.github.libretube.ui.base.BasePreferenceFragment -import com.github.libretube.ui.dialogs.BackupDialog -import com.github.libretube.util.BackupHelper import com.github.libretube.util.ImageHelper import com.github.libretube.util.PreferenceHelper import com.google.android.material.dialog.MaterialAlertDialogBuilder -import java.time.LocalDate -import java.time.LocalTime class AdvancedSettings : BasePreferenceFragment() { - // backup and restore database - private lateinit var getBackupFile: ActivityResultLauncher - private lateinit var createBackupFile: ActivityResultLauncher - private var backupFile = BackupFile() - - override fun onCreate(savedInstanceState: Bundle?) { - getBackupFile = - registerForActivityResult( - ActivityResultContracts.GetContent() - ) { uri: Uri? -> - BackupHelper(requireContext()).restoreAdvancedBackup(uri) - } - - createBackupFile = registerForActivityResult( - CreateDocument("application/json") - ) { uri: Uri? -> - BackupHelper(requireContext()).advancedBackup(uri, backupFile) - } - - super.onCreate(savedInstanceState) - } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.advanced_settings, rootKey) @@ -61,22 +30,6 @@ class AdvancedSettings : BasePreferenceFragment() { showResetDialog() true } - - val advancesBackup = findPreference("backup") - advancesBackup?.setOnPreferenceClickListener { - BackupDialog { - backupFile = it - createBackupFile.launch(getBackupFileName()) - } - .show(childFragmentManager, null) - true - } - - val restoreAdvancedBackup = findPreference("restore") - restoreAdvancedBackup?.setOnPreferenceClickListener { - getBackupFile.launch("application/json") - true - } } private fun showResetDialog() { @@ -95,9 +48,4 @@ class AdvancedSettings : BasePreferenceFragment() { } .show() } - - private fun getBackupFileName(): String { - val time = LocalTime.now().toString().split(".").firstOrNull() - return "libretube-backup-${LocalDate.now()}-$time.json" - } } diff --git a/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt new file mode 100644 index 000000000..04d115e91 --- /dev/null +++ b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt @@ -0,0 +1,98 @@ +package com.github.libretube.ui.preferences + +import android.net.Uri +import android.os.Bundle +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.result.contract.ActivityResultContracts.CreateDocument +import androidx.preference.Preference +import com.github.libretube.R +import com.github.libretube.constants.PreferenceKeys +import com.github.libretube.obj.BackupFile +import com.github.libretube.ui.base.BasePreferenceFragment +import com.github.libretube.ui.dialogs.BackupDialog +import com.github.libretube.util.BackupHelper +import com.github.libretube.util.ImportHelper +import java.time.LocalDate +import java.time.LocalTime + +class BackupRestoreSettings : BasePreferenceFragment() { + + // backup and restore database + private lateinit var getBackupFile: ActivityResultLauncher + private lateinit var createBackupFile: ActivityResultLauncher + private var backupFile = BackupFile() + + /** + * result listeners for importing and exporting subscriptions + */ + private lateinit var getSubscriptionsFile: ActivityResultLauncher + private lateinit var createSubscriptionsFile: ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + getSubscriptionsFile = + registerForActivityResult( + ActivityResultContracts.GetContent() + ) { uri: Uri? -> + ImportHelper(requireActivity()).importSubscriptions(uri) + } + createSubscriptionsFile = registerForActivityResult( + CreateDocument("application/json") + ) { uri: Uri? -> + ImportHelper(requireActivity()).exportSubscriptions(uri) + } + + getBackupFile = + registerForActivityResult( + ActivityResultContracts.GetContent() + ) { uri: Uri? -> + BackupHelper(requireContext()).restoreAdvancedBackup(uri) + } + + createBackupFile = registerForActivityResult( + CreateDocument("application/json") + ) { uri: Uri? -> + BackupHelper(requireContext()).advancedBackup(uri, backupFile) + } + + super.onCreate(savedInstanceState) + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.import_export_settings, rootKey) + + val importSubscriptions = findPreference(PreferenceKeys.IMPORT_SUBS) + importSubscriptions?.setOnPreferenceClickListener { + // check StorageAccess + getSubscriptionsFile.launch("*/*") + true + } + + val exportSubscriptions = findPreference(PreferenceKeys.EXPORT_SUBS) + exportSubscriptions?.setOnPreferenceClickListener { + createSubscriptionsFile.launch("subscriptions.json") + true + } + + val advancesBackup = findPreference("backup") + advancesBackup?.setOnPreferenceClickListener { + BackupDialog { + backupFile = it + createBackupFile.launch(getBackupFileName()) + } + .show(childFragmentManager, null) + true + } + + val restoreAdvancedBackup = findPreference("restore") + restoreAdvancedBackup?.setOnPreferenceClickListener { + getBackupFile.launch("application/json") + true + } + } + + private fun getBackupFileName(): String { + val time = LocalTime.now().toString().split(".").firstOrNull() + return "libretube-backup-${LocalDate.now()}-$time.json" + } +} diff --git a/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt index 0c34906fb..211b7e177 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt @@ -1,12 +1,7 @@ package com.github.libretube.ui.preferences -import android.net.Uri import android.os.Bundle import android.widget.Toast -import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.contract.ActivityResultContracts -import androidx.activity.result.contract.ActivityResultContracts.CreateDocument -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.preference.ListPreference import androidx.preference.Preference @@ -22,33 +17,10 @@ import com.github.libretube.ui.dialogs.CustomInstanceDialog import com.github.libretube.ui.dialogs.DeleteAccountDialog import com.github.libretube.ui.dialogs.LoginDialog import com.github.libretube.ui.dialogs.LogoutDialog -import com.github.libretube.util.ImportHelper import com.github.libretube.util.PreferenceHelper class InstanceSettings : BasePreferenceFragment() { - /** - * result listeners for importing and exporting subscriptions - */ - private lateinit var getContent: ActivityResultLauncher - private lateinit var createFile: ActivityResultLauncher - - override fun onCreate(savedInstanceState: Bundle?) { - getContent = - registerForActivityResult( - ActivityResultContracts.GetContent() - ) { uri: Uri? -> - ImportHelper(requireActivity()).importSubscriptions(uri) - } - createFile = registerForActivityResult( - CreateDocument("application/json") - ) { uri: Uri? -> - ImportHelper(requireActivity()).exportSubscriptions(uri) - } - - super.onCreate(savedInstanceState) - } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.instance_settings, rootKey) @@ -138,19 +110,6 @@ class InstanceSettings : BasePreferenceFragment() { newFragment.show(childFragmentManager, DeleteAccountDialog::class.java.name) true } - - val importSubscriptions = findPreference(PreferenceKeys.IMPORT_SUBS) - importSubscriptions?.setOnPreferenceClickListener { - // check StorageAccess - getContent.launch("*/*") - true - } - - val exportSubscriptions = findPreference(PreferenceKeys.EXPORT_SUBS) - exportSubscriptions?.setOnPreferenceClickListener { - createFile.launch("subscriptions.json") - true - } } private fun initCustomInstances(instancePref: ListPreference) { @@ -201,10 +160,4 @@ class InstanceSettings : BasePreferenceFragment() { PreferenceHelper.setToken("") Toast.makeText(context, getString(R.string.loggedout), Toast.LENGTH_SHORT).show() } - - private fun Fragment?.runOnUiThread(action: () -> Unit) { - this ?: return - if (!isAdded) return // Fragment not attached to an Activity - activity?.runOnUiThread(action) - } } diff --git a/app/src/main/java/com/github/libretube/ui/preferences/MainSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/MainSettings.kt index f67495781..c87ca340b 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/MainSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/MainSettings.kt @@ -23,65 +23,52 @@ class MainSettings : BasePreferenceFragment() { val general = findPreference("general") general?.setOnPreferenceClickListener { - val newFragment = GeneralSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(GeneralSettings()) } val instance = findPreference("instance") instance?.setOnPreferenceClickListener { - val newFragment = InstanceSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(InstanceSettings()) } val appearance = findPreference("appearance") appearance?.setOnPreferenceClickListener { - val newFragment = AppearanceSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(AppearanceSettings()) } val sponsorBlock = findPreference("sponsorblock") sponsorBlock?.setOnPreferenceClickListener { - val newFragment = SponsorBlockSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(SponsorBlockSettings()) } val player = findPreference("player") player?.setOnPreferenceClickListener { - val newFragment = PlayerSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(PlayerSettings()) } val audioVideo = findPreference("audio_video") audioVideo?.setOnPreferenceClickListener { - val newFragment = AudioVideoSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(AudioVideoSettings()) } val history = findPreference("history") history?.setOnPreferenceClickListener { - val newFragment = HistorySettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(HistorySettings()) } val notifications = findPreference("notifications") notifications?.setOnPreferenceClickListener { - val newFragment = NotificationSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(NotificationSettings()) + } + + val backupRestore = findPreference("backup_restore") + backupRestore?.setOnPreferenceClickListener { + navigateToSettingsFragment(BackupRestoreSettings()) } val advanced = findPreference("advanced") advanced?.setOnPreferenceClickListener { - val newFragment = AdvancedSettings() - navigateToSettingsFragment(newFragment) - true + navigateToSettingsFragment(AdvancedSettings()) } val update = findPreference("update") @@ -131,9 +118,10 @@ class MainSettings : BasePreferenceFragment() { } } - private fun navigateToSettingsFragment(newFragment: Fragment) { + private fun navigateToSettingsFragment(newFragment: Fragment): Boolean { parentFragmentManager.beginTransaction() .replace(R.id.settings, newFragment) .commitNow() + return true } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a229cf42b..0d835fa5b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -403,6 +403,10 @@ Tap twice at the left or right to rewind or forward the player position. You\'re all caught up You\'ve seen all new videos + Import playlists + Export playlists + App Backup + Import & export subscriptions, playlists, ... Download Service diff --git a/app/src/main/res/xml/advanced_settings.xml b/app/src/main/res/xml/advanced_settings.xml index 04a6529a9..c9a298603 100644 --- a/app/src/main/res/xml/advanced_settings.xml +++ b/app/src/main/res/xml/advanced_settings.xml @@ -39,20 +39,6 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 5a0b51e07..d6edb9183 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -50,6 +50,12 @@ app:key="notifications" app:title="@string/notifications" /> + +