diff --git a/app/src/main/kotlin/com/github/gotify/settings/SettingsActivity.kt b/app/src/main/kotlin/com/github/gotify/settings/SettingsActivity.kt index fa88d2b..bb4a825 100644 --- a/app/src/main/kotlin/com/github/gotify/settings/SettingsActivity.kt +++ b/app/src/main/kotlin/com/github/gotify/settings/SettingsActivity.kt @@ -1,6 +1,7 @@ package com.github.gotify.settings -import android.app.AlertDialog +import android.app.Dialog +import android.content.DialogInterface import android.content.Intent import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener @@ -9,11 +10,13 @@ import android.view.MenuItem import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.preference.ListPreference +import androidx.preference.ListPreferenceDialogFragmentCompat import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager import com.github.gotify.R import com.github.gotify.databinding.SettingsActivityBinding +import com.google.android.material.dialog.MaterialAlertDialogBuilder internal class SettingsActivity : AppCompatActivity(), OnSharedPreferenceChangeListener { private lateinit var binding: SettingsActivityBinding @@ -64,7 +67,7 @@ internal class SettingsActivity : AppCompatActivity(), OnSharedPreferenceChangeL findPreference(getString(R.string.setting_key_message_layout)) messageLayout?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, _ -> - AlertDialog.Builder(context) + MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.setting_message_layout_dialog_title) .setMessage(R.string.setting_message_layout_dialog_message) .setPositiveButton( @@ -81,6 +84,24 @@ internal class SettingsActivity : AppCompatActivity(), OnSharedPreferenceChangeL } } + override fun onDisplayPreferenceDialog(preference: Preference) { + if (preference is ListPreference) { + showListPreferenceDialog(preference) + } else { + super.onDisplayPreferenceDialog(preference) + } + } + + private fun showListPreferenceDialog(preference: ListPreference) { + val dialogFragment = MaterialListPreference() + dialogFragment.arguments = Bundle(1).apply { putString("key", preference.key) } + dialogFragment.setTargetFragment(this, 0) + dialogFragment.show( + parentFragmentManager, + "androidx.preference.PreferenceFragment.DIALOG" + ) + } + private fun restartApp() { val packageManager = requireContext().packageManager val packageName = requireContext().packageName @@ -91,4 +112,46 @@ internal class SettingsActivity : AppCompatActivity(), OnSharedPreferenceChangeL Runtime.getRuntime().exit(0) } } + + class MaterialListPreference : ListPreferenceDialogFragmentCompat() { + private var mWhichButtonClicked = 0 + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE + val builder = MaterialAlertDialogBuilder(requireActivity()) + .setTitle(preference.dialogTitle) + .setPositiveButton(preference.positiveButtonText, this) + .setNegativeButton(preference.negativeButtonText, this) + + val contentView = context?.let { onCreateDialogView(it) } + if (contentView != null) { + onBindDialogView(contentView) + builder.setView(contentView) + } else { + builder.setMessage(preference.dialogMessage) + } + onPrepareDialogBuilder(builder) + return builder.create() + } + + override fun onClick(dialog: DialogInterface, which: Int) { + mWhichButtonClicked = which + } + + override fun onDismiss(dialog: DialogInterface) { + onDialogClosedWasCalledFromOnDismiss = true + super.onDismiss(dialog) + } + + private var onDialogClosedWasCalledFromOnDismiss = false + + override fun onDialogClosed(positiveResult: Boolean) { + if (onDialogClosedWasCalledFromOnDismiss) { + onDialogClosedWasCalledFromOnDismiss = false + super.onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE) + } else { + super.onDialogClosed(positiveResult) + } + } + } }