From 33405e1e181bb9ab6fb631f4216374dc8c38814d Mon Sep 17 00:00:00 2001 From: Jakub Kalinowski Date: Sat, 13 Aug 2022 14:39:01 +0200 Subject: [PATCH] Handling multiple dialogs shown at the same time Reimplementing the multiple popups handling in the new popup solution. Handling multiple dialogs correctly Code style fixes One last ktlint problem Changed the approach, using an extension method Fixed double invocation of show() and target type dialog Removing unrelated changes Formatted some code Removing import wildcard --- .../common/dialogs/CheckmarkPopup.kt | 3 ++- .../common/dialogs/FrequencyPickerDialog.kt | 6 +++-- .../common/dialogs/HistoryEditorDialog.kt | 22 ++++++++++++++++++- .../activities/common/dialogs/NumberPopup.kt | 3 ++- .../common/dialogs/WeekdayPickerDialog.kt | 1 + .../habits/edit/EditHabitActivity.kt | 20 +++++++++-------- .../habits/list/ListHabitsScreen.kt | 6 +++-- .../habits/show/ShowHabitActivity.kt | 3 ++- .../org/isoron/uhabits/utils/DialogUtils.kt | 21 ++++++++++++++++++ 9 files changed, 68 insertions(+), 17 deletions(-) create mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/utils/DialogUtils.kt 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 5cfe90ea6..cfa5c6e24 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 = (activity!!.application as HabitsApplication).component commandRunner = component.commandRunner habit = component.habitList.getById(arguments!!.getLong("habit"))!! @@ -72,12 +74,20 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener { dataView = AndroidDataView(context!!, null) dataView.view = chart!! - return Dialog(context!!).apply { + val dialog = Dialog(context!!).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 6e1f8cf28..67cd5ce9e 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..0873dad87 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,8 @@ 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.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 1e90e1ae9..b993d0d20 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 @@ -228,7 +229,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) +}