diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt index 9a862076f..fb7f43d51 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/CheckmarkPopup.kt @@ -35,6 +35,7 @@ import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.databinding.CheckmarkPopupBinding import org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome import org.isoron.uhabits.utils.dimBehind +import org.isoron.uhabits.utils.dismissCurrentAndShow import org.isoron.uhabits.utils.dp import org.isoron.uhabits.utils.sres @@ -117,7 +118,7 @@ class CheckmarkPopup( view.unknownBtn.setOnClickListener { onClick(UNKNOWN) } dialog.setCanceledOnTouchOutside(true) dialog.dimBehind() - dialog.show() + dialog.dismissCurrentAndShow() } fun save() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt index 8411e3a96..5173aa6f9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt @@ -149,8 +149,10 @@ class FrequencyPickerDialog( } contentView.xTimesPerYDaysRadioButton.isChecked -> { if (contentView.xTimesPerYDaysXTextView.text.isNotEmpty() && contentView.xTimesPerYDaysYTextView.text.isNotEmpty()) { - numerator = Integer.parseInt(contentView.xTimesPerYDaysXTextView.text.toString()) - denominator = Integer.parseInt(contentView.xTimesPerYDaysYTextView.text.toString()) + numerator = + Integer.parseInt(contentView.xTimesPerYDaysXTextView.text.toString()) + denominator = + Integer.parseInt(contentView.xTimesPerYDaysYTextView.text.toString()) } } else -> { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.kt index 2004137d7..27898e87f 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.activities.common.dialogs import android.app.Dialog +import android.content.DialogInterface import android.os.Bundle import androidx.appcompat.app.AppCompatDialogFragment import org.isoron.platform.gui.AndroidDataView @@ -49,6 +50,7 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener { private var onDateClickedListener: OnDateClickedListener? = null override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + clearCurrentDialog() val component = (requireActivity().application as HabitsApplication).component commandRunner = component.commandRunner habit = component.habitList.getById(requireArguments().getLong("habit"))!! @@ -72,12 +74,20 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener { dataView = AndroidDataView(requireContext(), null) dataView.view = chart!! - return Dialog(requireContext()).apply { + val dialog = Dialog(requireContext()).apply { val metrics = resources.displayMetrics val maxHeight = resources.getDimensionPixelSize(R.dimen.history_editor_max_height) setContentView(dataView) window!!.setLayout(metrics.widthPixels, min(metrics.heightPixels, maxHeight)) } + + currentDialog = dialog + return dialog + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + currentDialog = null } override fun onResume() { @@ -111,4 +121,14 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener { override fun onCommandFinished(command: Command) { refreshData() } + + companion object { + // HistoryEditorDialog handles multiple dialogs on its own, + // because sometimes we want it to be shown under another dialog (e.g. NumberPopup) + var currentDialog: Dialog? = null + fun clearCurrentDialog() { + currentDialog?.dismiss() + currentDialog = null + } + } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt index 20592a496..c3a464311 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPopup.kt @@ -31,6 +31,7 @@ import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.databinding.CheckmarkPopupBinding import org.isoron.uhabits.utils.dimBehind +import org.isoron.uhabits.utils.dismissCurrentAndShow import org.isoron.uhabits.utils.dp import org.isoron.uhabits.utils.requestFocusWithKeyboard import java.text.DecimalFormat @@ -103,7 +104,7 @@ class NumberPopup( view.value.requestFocusWithKeyboard() dialog.setCanceledOnTouchOutside(true) dialog.dimBehind() - dialog.show() + dialog.dismissCurrentAndShow() } fun save() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.kt index f2bfcdd73..3673032ec 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.kt @@ -73,6 +73,7 @@ class WeekdayPickerDialog : .setNegativeButton( android.R.string.cancel ) { _: DialogInterface?, _: Int -> dismiss() } + return builder.create() } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt index 572917d10..b3dc0d2da 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt @@ -59,6 +59,7 @@ import org.isoron.uhabits.core.models.Reminder import org.isoron.uhabits.core.models.WeekdayList import org.isoron.uhabits.databinding.ActivityEditHabitBinding import org.isoron.uhabits.utils.ColorUtils +import org.isoron.uhabits.utils.dismissCurrentAndShow import org.isoron.uhabits.utils.formatTime import org.isoron.uhabits.utils.toFormattedString @@ -156,23 +157,23 @@ class EditHabitActivity : AppCompatActivity() { val colorPickerDialogFactory = ColorPickerDialogFactory(this) binding.colorButton.setOnClickListener { - val dialog = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme) - dialog.setListener { paletteColor -> + val picker = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme) + picker.setListener { paletteColor -> this.color = paletteColor updateColors() } - dialog.show(supportFragmentManager, "colorPicker") + picker.dismissCurrentAndShow(supportFragmentManager, "colorPicker") } populateFrequency() binding.booleanFrequencyPicker.setOnClickListener { - val dialog = FrequencyPickerDialog(freqNum, freqDen) - dialog.onFrequencyPicked = { num, den -> + val picker = FrequencyPickerDialog(freqNum, freqDen) + picker.onFrequencyPicked = { num, den -> freqNum = num freqDen = den populateFrequency() } - dialog.show(supportFragmentManager, "frequencyPicker") + picker.dismissCurrentAndShow(supportFragmentManager, "frequencyPicker") } populateTargetType() @@ -189,7 +190,8 @@ class EditHabitActivity : AppCompatActivity() { populateTargetType() dialog.dismiss() } - builder.show() + val dialog = builder.create() + dialog.dismissCurrentAndShow() } binding.numericalFrequencyPicker.setOnClickListener { @@ -235,7 +237,7 @@ class EditHabitActivity : AppCompatActivity() { is24HourMode, androidColor ) - dialog.show(supportFragmentManager, "timePicker") + dialog.dismissCurrentAndShow(supportFragmentManager, "timePicker") } binding.reminderDatePicker.setOnClickListener { @@ -247,7 +249,7 @@ class EditHabitActivity : AppCompatActivity() { populateReminder() } dialog.setSelectedDays(reminderDays) - dialog.show(supportFragmentManager, "dayPicker") + dialog.dismissCurrentAndShow(supportFragmentManager, "dayPicker") } binding.buttonSave.setOnClickListener { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index 343b50644..fa74b0a49 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -64,6 +64,7 @@ import org.isoron.uhabits.tasks.ImportDataTask import org.isoron.uhabits.tasks.ImportDataTaskFactory import org.isoron.uhabits.utils.copyTo import org.isoron.uhabits.utils.currentTheme +import org.isoron.uhabits.utils.dismissCurrentAndShow import org.isoron.uhabits.utils.restartWithFade import org.isoron.uhabits.utils.showMessage import org.isoron.uhabits.utils.showSendEmailScreen @@ -163,7 +164,7 @@ class ListHabitsScreen } override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback, quantity: Int) { - ConfirmDeleteDialog(activity, callback, quantity).show() + ConfirmDeleteDialog(activity, callback, quantity).dismissCurrentAndShow() } override fun showEditHabitsScreen(selected: List) { @@ -224,7 +225,7 @@ class ListHabitsScreen override fun showColorPicker(defaultColor: PaletteColor, callback: OnColorPickedCallback) { val picker = colorPickerFactory.create(defaultColor, themeSwitcher.currentTheme!!) picker.setListener(callback) - picker.show(activity.supportFragmentManager, "picker") + picker.dialog?.dismissCurrentAndShow() } override fun showNumberPopup( diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt index f69d16249..3ecca1494 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.kt @@ -50,6 +50,7 @@ import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitPresenter import org.isoron.uhabits.core.ui.views.OnDateClickedListener import org.isoron.uhabits.intents.IntentFactory import org.isoron.uhabits.utils.currentTheme +import org.isoron.uhabits.utils.dismissCurrentAndShow import org.isoron.uhabits.utils.showMessage import org.isoron.uhabits.utils.showSendFileScreen import org.isoron.uhabits.widgets.WidgetUpdater @@ -229,7 +230,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener { } override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) { - ConfirmDeleteDialog(this@ShowHabitActivity, callback, 1).show() + ConfirmDeleteDialog(this@ShowHabitActivity, callback, 1).dismissCurrentAndShow() } override fun close() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/DialogUtils.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DialogUtils.kt new file mode 100644 index 000000000..855f865c7 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DialogUtils.kt @@ -0,0 +1,21 @@ +package org.isoron.uhabits.utils + +import android.app.Dialog +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager +import java.lang.ref.WeakReference + +var currentDialog: WeakReference = WeakReference(null) + +fun Dialog.dismissCurrentAndShow() { + currentDialog.get()?.dismiss() + currentDialog = WeakReference(this) + show() +} + +fun DialogFragment.dismissCurrentAndShow(fragmentManager: FragmentManager, tag: String) { + currentDialog.get()?.dismiss() + show(fragmentManager, tag) + fragmentManager.executePendingTransactions() + currentDialog = WeakReference(this.dialog) +}