diff --git a/app/build.gradle b/app/build.gradle index 794fb472d..90f219fa8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -85,4 +85,5 @@ dependencies { coreLibraryDesugaring libs.desugaring implementation libs.cronet.embedded + implementation libs.gson } diff --git a/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt b/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt index 50e49356c..94df2f77d 100644 --- a/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt @@ -9,8 +9,9 @@ import android.widget.TextView import android.widget.Toast import androidx.core.text.HtmlCompat import androidx.fragment.app.DialogFragment -import androidx.preference.PreferenceManager import com.github.libretube.R +import com.github.libretube.obj.CustomInstance +import com.github.libretube.util.PreferenceHelper import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText import java.net.URL @@ -36,17 +37,22 @@ class CustomInstanceDialog : DialogFragment() { } addInstanceButton.setOnClickListener { - val instanceName = instanceNameEditText.text.toString() - val instanceApiUrl = instanceApiUrlEditText.text.toString() - val instanceFrontendUrl = instanceFrontendUrlEditText.text.toString() + val customInstance = CustomInstance() + customInstance.name = instanceNameEditText.text.toString() + customInstance.apiUrl = instanceApiUrlEditText.text.toString() + customInstance.frontendUrl = instanceFrontendUrlEditText.text.toString() - if (instanceName != "" && instanceApiUrl != "" && instanceFrontendUrl != "") { + if ( + customInstance.name != "" && + customInstance.apiUrl != "" && + customInstance.frontendUrl != "" + ) { try { // check whether the URL is valid, otherwise catch - URL(instanceApiUrl).toURI() - URL(instanceFrontendUrl).toURI() + URL(customInstance.apiUrl).toURI() + URL(customInstance.frontendUrl).toURI() - saveCustomInstance(instanceName, instanceApiUrl, instanceFrontendUrl) + PreferenceHelper.saveCustomInstance(requireContext(), customInstance) activity?.recreate() dismiss() } catch (e: Exception) { @@ -80,49 +86,4 @@ class CustomInstanceDialog : DialogFragment() { builder.create() } ?: throw IllegalStateException("Activity cannot be null") } - - private fun saveCustomInstance( - instanceName: String, - instanceApiUrl: String, - instanceFrontendApiUrl: String - ) { - val sharedPreferences = PreferenceManager - .getDefaultSharedPreferences(requireContext()) - - // get the names of the other custom instances - var customInstancesNames = try { - sharedPreferences - .getStringSet("custom_instances_name", HashSet())!!.toList() - } catch (e: Exception) { - emptyList() - } - - // get the api urls of the other custom instances - var customInstancesUrls = try { - sharedPreferences - .getStringSet("custom_instances_url", HashSet())!!.toList() - } catch (e: Exception) { - emptyList() - } - - // get the frontend urls of the other custom instances - var customInstancesFrontendUrls = try { - sharedPreferences - .getStringSet("custom_instances_url", HashSet())!!.toList() - } catch (e: Exception) { - emptyList() - } - - // append new instance to the list - customInstancesNames += instanceName - customInstancesUrls += instanceApiUrl - customInstancesFrontendUrls += instanceFrontendApiUrl - - // save them to the shared preferences - sharedPreferences.edit() - .putStringSet("custom_instances_name", HashSet(customInstancesNames)) - .putStringSet("custom_instances_url", HashSet(customInstancesUrls)) - .putStringSet("custom_instances_frontend_url", HashSet(customInstancesFrontendUrls)) - .apply() - } } diff --git a/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt b/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt index 7fec764a2..70e576340 100644 --- a/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt @@ -55,8 +55,6 @@ class ShareDialog( // get the frontend url if it's a custom instance private fun getCustomInstanceFrontendUrl(): String { - val sharedPreferences = - PreferenceManager.getDefaultSharedPreferences(requireContext()) val instancePref = PreferenceHelper.getString( requireContext(), "selectInstance", @@ -64,27 +62,12 @@ class ShareDialog( ) // get the api urls of the other custom instances - var customInstancesUrls = try { - sharedPreferences - .getStringSet("custom_instances_url", HashSet())!!.toList() - } catch (e: Exception) { - emptyList() - } - - // get the frontend urls of the other custom instances - var customInstancesFrontendUrls = try { - sharedPreferences - .getStringSet("custom_instances_url", HashSet())!!.toList() - } catch (e: Exception) { - emptyList() - } + val customInstances = PreferenceHelper.getCustomInstances(requireContext()) // return the custom instance frontend url if available - return if (customInstancesUrls.contains(instancePref)) { - val index = customInstancesUrls.indexOf(instancePref) - return customInstancesFrontendUrls[index] - } else { - "" + customInstances.forEach { instance -> + if (instance.apiUrl == instancePref) return instance.apiUrl } + return "" } } diff --git a/app/src/main/java/com/github/libretube/obj/CustomInstance.kt b/app/src/main/java/com/github/libretube/obj/CustomInstance.kt new file mode 100644 index 000000000..880044448 --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/CustomInstance.kt @@ -0,0 +1,7 @@ +package com.github.libretube.obj + +class CustomInstance( + var name: String = "", + var apiUrl: String = "", + var frontendUrl: String = "" +) diff --git a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt index 193b3aa7c..6173b1f03 100644 --- a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt @@ -135,9 +135,7 @@ class InstanceSettings : PreferenceFragmentCompat() { val clearCustomInstances = findPreference("clearCustomInstances") clearCustomInstances?.setOnPreferenceClickListener { - PreferenceHelper.removePreference(requireContext(), "custom_instances_name") - PreferenceHelper.removePreference(requireContext(), "custom_instances_url") - PreferenceHelper.removePreference(requireContext(), "custom_instances_frontend_url") + PreferenceHelper.removePreference(requireContext(), "customInstances") activity?.recreate() true } @@ -216,27 +214,15 @@ class InstanceSettings : PreferenceFragmentCompat() { } private fun initCustomInstances() { - val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) + val customInstances = PreferenceHelper.getCustomInstances(requireContext()) - // get the names of the custom instances - val customInstancesNames = try { - sharedPreferences - .getStringSet("custom_instances_name", HashSet())!!.toList() - } catch (e: Exception) { - emptyList() + var instanceNames = resources.getStringArray(R.array.instances) + var instanceValues = resources.getStringArray(R.array.instancesValue) + customInstances.forEach{instance -> + instanceNames += instance.name + instanceValues += instance.apiUrl } - // get the urls of the custom instances - val customInstancesUrls = try { - sharedPreferences - .getStringSet("custom_instances_url", HashSet())!!.toList() - } catch (e: Exception) { - emptyList() - } - - val instanceNames = resources.getStringArray(R.array.instances) + customInstancesNames - val instanceValues = resources.getStringArray(R.array.instancesValue) + customInstancesUrls - // add custom instances to the list preference val instance = findPreference("selectInstance") instance?.entries = instanceNames diff --git a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt index 805251d0e..2da49ac4d 100644 --- a/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PreferenceHelper.kt @@ -3,6 +3,10 @@ package com.github.libretube.util import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager +import com.github.libretube.obj.CustomInstance +import com.google.common.reflect.TypeToken +import com.google.gson.Gson +import java.lang.reflect.Type object PreferenceHelper { fun setString(context: Context, key: String?, value: String?) { @@ -81,6 +85,29 @@ object PreferenceHelper { editor.putString("username", newValue) } + fun saveCustomInstance(context: Context, customInstance: CustomInstance) { + val editor = getDefaultSharedPreferencesEditor(context) + val gson = Gson() + + val customInstancesList = getCustomInstances(context) + customInstancesList += customInstance + + val json = gson.toJson(customInstancesList) + editor.putString("customInstances", json).commit() + } + + fun getCustomInstances(context: Context): ArrayList { + val settings = getDefaultSharedPreferences(context) + val gson = Gson() + val json: String = settings.getString("customInstances", "")!! + val type: Type = object : TypeToken?>() {}.type + return try { + gson.fromJson(json, type) + } catch (e: Exception) { + arrayListOf() + } + } + private fun getDefaultSharedPreferences(context: Context): SharedPreferences { return PreferenceManager.getDefaultSharedPreferences(context) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 63fc52d9e..2e6834caa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,7 @@ mobileffmpeg = "4.5.1.LTS" desugaring = "1.1.5" cronetEmbedded = "101.4951.41" leakcanary = "2.8.1" +gson = "2.9.0" [libraries] androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } @@ -41,3 +42,4 @@ desugaring = { group = "com.android.tools", name = "desugar_jdk_libs", version.r exoplayer-extension-cronet = { group = "com.google.android.exoplayer", name = "extension-cronet", version.ref = "exoplayer" } cronet-embedded = { group = "org.chromium.net", name = "cronet-embedded", version.ref = "cronetEmbedded" } square-leakcanary = { group = "com.squareup.leakcanary", name = "leakcanary-android", version.ref = "leakcanary" } +gson = { group = "com.google.code.gson", name="gson", version.ref = "gson"} \ No newline at end of file