From 9e7f1167f08eb28acf2d221792a5f8599349e578 Mon Sep 17 00:00:00 2001 From: Daniel Alome Date: Fri, 5 Jun 2026 14:36:31 +0100 Subject: [PATCH] ADFA-4072: treat system back button as Cancel in settings dialogs --- .../itsaky/androidide/preferences/editorPrefExts.kt | 3 --- .../itsaky/androidide/preferences/generalPrefExts.kt | 3 --- .../com/itsaky/androidide/preferences/xmlPrefExts.kt | 4 ---- .../preferences/ChoiceBasedDialogPreference.kt | 4 ++++ .../itsaky/androidide/preferences/DialogPreference.kt | 11 ++++++++++- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/itsaky/androidide/preferences/editorPrefExts.kt b/app/src/main/java/com/itsaky/androidide/preferences/editorPrefExts.kt index 154eb21232..d31daeb9d0 100644 --- a/app/src/main/java/com/itsaky/androidide/preferences/editorPrefExts.kt +++ b/app/src/main/java/com/itsaky/androidide/preferences/editorPrefExts.kt @@ -131,9 +131,6 @@ private class TabSize( override val tooltipTag: String = TooltipTag.PREFS_EDITOR, ) : SingleChoicePreference() { - @IgnoredOnParcel - override val dialogCancellable = true - @IgnoredOnParcel private val tabSizes = intArrayOf(2, 4, 6, 8) diff --git a/app/src/main/java/com/itsaky/androidide/preferences/generalPrefExts.kt b/app/src/main/java/com/itsaky/androidide/preferences/generalPrefExts.kt index a10d783422..bdd2c517ec 100644 --- a/app/src/main/java/com/itsaky/androidide/preferences/generalPrefExts.kt +++ b/app/src/main/java/com/itsaky/androidide/preferences/generalPrefExts.kt @@ -78,9 +78,6 @@ class UiMode( override val icon: Int? = R.drawable.ic_ui_mode ) : SingleChoicePreference() { - @IgnoredOnParcel - override val dialogCancellable = true - @IgnoredOnParcel override val tooltipTag: String = PREFS_GENERAL diff --git a/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt b/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt index 71207f605d..8e975a0993 100644 --- a/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt +++ b/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt @@ -21,7 +21,6 @@ import androidx.preference.Preference import com.itsaky.androidide.idetooltips.TooltipTag import com.itsaky.androidide.preferences.internal.XmlPreferences import com.itsaky.androidide.resources.R.string -import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize import org.eclipse.lemminx.dom.builder.EmptyElements @@ -212,9 +211,6 @@ private class EmptyElementsBehavior( override val tooltipTag: String = TooltipTag.PREFS_EDITOR_XML, ) : SingleChoicePreference() { - @IgnoredOnParcel - override val dialogCancellable = true - override fun getEntries(preference: Preference): Array { val entries = EmptyElements.entries val currentBehavior = EmptyElements.valueOf(XmlPreferences.emptyElementsBehavior) diff --git a/preferences/src/main/java/com/itsaky/androidide/preferences/ChoiceBasedDialogPreference.kt b/preferences/src/main/java/com/itsaky/androidide/preferences/ChoiceBasedDialogPreference.kt index e44dacb813..949502f147 100644 --- a/preferences/src/main/java/com/itsaky/androidide/preferences/ChoiceBasedDialogPreference.kt +++ b/preferences/src/main/java/com/itsaky/androidide/preferences/ChoiceBasedDialogPreference.kt @@ -72,4 +72,8 @@ abstract class ChoiceBasedDialogPreference : DialogPreference(), PreferenceChoic } override fun onChoicesCancelled(preference: Preference) {} + + final override fun onDialogCancelled(preference: Preference) { + onChoicesCancelled(preference) + } } \ No newline at end of file diff --git a/preferences/src/main/java/com/itsaky/androidide/preferences/DialogPreference.kt b/preferences/src/main/java/com/itsaky/androidide/preferences/DialogPreference.kt index c49d68329b..4aedd03ab2 100644 --- a/preferences/src/main/java/com/itsaky/androidide/preferences/DialogPreference.kt +++ b/preferences/src/main/java/com/itsaky/androidide/preferences/DialogPreference.kt @@ -34,7 +34,7 @@ abstract class DialogPreference : SimplePreference() { get() = this.title open val dialogMessage: Int? = null - open val dialogCancellable: Boolean = false + open val dialogCancellable: Boolean = true open val tooltipTag: String = "" override fun onPreferenceClick(preference: Preference): Boolean { @@ -42,6 +42,7 @@ abstract class DialogPreference : SimplePreference() { dialog.setTitle(this.dialogTitle) dialogMessage?.let { dialog.setMessage(it) } dialog.setCancelable(this.dialogCancellable) + dialog.setOnCancelListener { onDialogCancelled(preference) } onConfigureDialog(preference, dialog) val alertDialog = dialog.create() alertDialog.show() @@ -57,4 +58,12 @@ abstract class DialogPreference : SimplePreference() { protected open fun onConfigureDialog(preference: Preference, dialog: MaterialAlertDialogBuilder) { } + + /** + * Called when the dialog is cancelled by the user (e.g. the system back button), as opposed to + * being dismissed by an action button. The default behaviour discards any unconfirmed changes, + * matching the dialog's cancel button. + */ + protected open fun onDialogCancelled(preference: Preference) { + } }