diff --git a/app/src/main/java/com/example/hpostesting/presentation/main_base/SettingsFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/main_base/SettingsFragment.kt index 3cd46c0..dea3a37 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/main_base/SettingsFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/main_base/SettingsFragment.kt @@ -28,6 +28,7 @@ import androidx.fragment.app.Fragment import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceManager import androidx.preference.SwitchPreferenceCompat import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.DataHolder @@ -35,6 +36,7 @@ import com.example.hpostesting.data.constant.LanguageManager import com.example.hpostesting.data.repository.DatabaseRepository import com.example.hpostesting.firebase.FirebaseConfig import com.example.hpostesting.firebase.FirebaseManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder import `in`.sminnovations.hpostesting.R import `in`.sminnovations.hpostesting.databinding.FragmentSlideshowBinding @@ -148,24 +150,28 @@ class PrefsFragment : PreferenceFragmentCompat() { true } } + + val servers = firebaseManager.getAvailableServers() val serverNames = servers.map { it.serverName }.toTypedArray() - val serverSelectorPreference = ListPreference(requireContext()).apply { + val serverSelectorPreference = CustomDialogPreference(requireContext()).apply { key = "server_preference" title = "Select the Server" - summary = "Current server : $currentServer " - entries = serverNames - entryValues = serverNames - value = currentServer - setDefaultValue(currentServer) + summary = "Current server: $currentServer" + setEntries(serverNames) + setEntryValues(serverNames) + setValue(currentServer) icon = ContextCompat.getDrawable(requireContext(), R.drawable.baseline_cloud_sync_24) - onPreferenceChangeListener = Preference.OnPreferenceChangeListener { old, newValue -> - val getPreferenceConfig = servers.find { it.serverName ==newValue } - switchFirebaseServer(getPreferenceConfig!!) + setOnPreferenceChangeListener { newValue -> + val preferenceConfig = servers.find { it.serverName == newValue } + switchFirebaseServer(preferenceConfig!!) true } } + + // Add preferences to screen + preferenceScreen.addPreference(languagePreference) preferenceScreen.addPreference(languagePreference) @@ -239,23 +245,16 @@ class PrefsFragment : PreferenceFragmentCompat() { if (isLanguageChanged) { Toast.makeText(requireContext(), R.string.language_update, Toast.LENGTH_SHORT).show() } - - } - - private fun updateServerPreference(newServer: String) { - preferenceManager.findPreference("server_preference")?.let { pref -> - pref.value = newServer + (findPreference("server_preference"))?.let { pref -> + pref.setValue(newServer) pref.summary = "Current server: $newServer" - pref.callChangeListener(newServer) } } - - private fun switchFirebaseServer(firebaseConfig: FirebaseConfig) { firebaseManager.switchServer(firebaseConfig) Toast.makeText( @@ -295,3 +294,47 @@ class PrefsFragment : PreferenceFragmentCompat() { } + +// CustomDialogPreference.kt +class CustomDialogPreference(context: Context) : Preference(context) { + private var entries: Array = arrayOf() + private var entryValues: Array = arrayOf() + private var currentValue: String = "" + private var onValueChangeListener: ((String) -> Boolean)? = null + + fun setEntries(entries: Array) { + this.entries = entries + } + + fun setEntryValues(values: Array) { + this.entryValues = values + } + + fun setValue(value: String) { + currentValue = value + persistString(value) + } + + fun setOnPreferenceChangeListener(listener: (String) -> Boolean) { + onValueChangeListener = listener + } + + override fun onClick() { + val builder = MaterialAlertDialogBuilder(context) + builder.setTitle(title) + + builder.setSingleChoiceItems(entries, entries.indexOf(currentValue)) { dialog, which -> + val newValue = entryValues[which] + if (onValueChangeListener?.invoke(newValue) == true) { + setValue(newValue) + dialog.dismiss() + } + } + + builder.setNegativeButton("Cancel") { dialog, _ -> + dialog.dismiss() + } + + builder.show() + } +}