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
pull/1456/head
Jakub Kalinowski 3 years ago committed by Jakub Kalinowski
parent 0eae43fe55
commit 33405e1e18

@ -35,6 +35,7 @@ import org.isoron.uhabits.core.preferences.Preferences
import org.isoron.uhabits.databinding.CheckmarkPopupBinding import org.isoron.uhabits.databinding.CheckmarkPopupBinding
import org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome import org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome
import org.isoron.uhabits.utils.dimBehind import org.isoron.uhabits.utils.dimBehind
import org.isoron.uhabits.utils.dismissCurrentAndShow
import org.isoron.uhabits.utils.dp import org.isoron.uhabits.utils.dp
import org.isoron.uhabits.utils.sres import org.isoron.uhabits.utils.sres
@ -117,7 +118,7 @@ class CheckmarkPopup(
view.unknownBtn.setOnClickListener { onClick(UNKNOWN) } view.unknownBtn.setOnClickListener { onClick(UNKNOWN) }
dialog.setCanceledOnTouchOutside(true) dialog.setCanceledOnTouchOutside(true)
dialog.dimBehind() dialog.dimBehind()
dialog.show() dialog.dismissCurrentAndShow()
} }
fun save() { fun save() {

@ -149,8 +149,10 @@ class FrequencyPickerDialog(
} }
contentView.xTimesPerYDaysRadioButton.isChecked -> { contentView.xTimesPerYDaysRadioButton.isChecked -> {
if (contentView.xTimesPerYDaysXTextView.text.isNotEmpty() && contentView.xTimesPerYDaysYTextView.text.isNotEmpty()) { if (contentView.xTimesPerYDaysXTextView.text.isNotEmpty() && contentView.xTimesPerYDaysYTextView.text.isNotEmpty()) {
numerator = Integer.parseInt(contentView.xTimesPerYDaysXTextView.text.toString()) numerator =
denominator = Integer.parseInt(contentView.xTimesPerYDaysYTextView.text.toString()) Integer.parseInt(contentView.xTimesPerYDaysXTextView.text.toString())
denominator =
Integer.parseInt(contentView.xTimesPerYDaysYTextView.text.toString())
} }
} }
else -> { else -> {

@ -19,6 +19,7 @@
package org.isoron.uhabits.activities.common.dialogs package org.isoron.uhabits.activities.common.dialogs
import android.app.Dialog import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatDialogFragment import androidx.appcompat.app.AppCompatDialogFragment
import org.isoron.platform.gui.AndroidDataView import org.isoron.platform.gui.AndroidDataView
@ -49,6 +50,7 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener {
private var onDateClickedListener: OnDateClickedListener? = null private var onDateClickedListener: OnDateClickedListener? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
clearCurrentDialog()
val component = (activity!!.application as HabitsApplication).component val component = (activity!!.application as HabitsApplication).component
commandRunner = component.commandRunner commandRunner = component.commandRunner
habit = component.habitList.getById(arguments!!.getLong("habit"))!! habit = component.habitList.getById(arguments!!.getLong("habit"))!!
@ -72,12 +74,20 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener {
dataView = AndroidDataView(context!!, null) dataView = AndroidDataView(context!!, null)
dataView.view = chart!! dataView.view = chart!!
return Dialog(context!!).apply { val dialog = Dialog(context!!).apply {
val metrics = resources.displayMetrics val metrics = resources.displayMetrics
val maxHeight = resources.getDimensionPixelSize(R.dimen.history_editor_max_height) val maxHeight = resources.getDimensionPixelSize(R.dimen.history_editor_max_height)
setContentView(dataView) setContentView(dataView)
window!!.setLayout(metrics.widthPixels, min(metrics.heightPixels, maxHeight)) 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() { override fun onResume() {
@ -111,4 +121,14 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener {
override fun onCommandFinished(command: Command) { override fun onCommandFinished(command: Command) {
refreshData() 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
}
}
} }

@ -31,6 +31,7 @@ import org.isoron.uhabits.core.models.Entry
import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.preferences.Preferences
import org.isoron.uhabits.databinding.CheckmarkPopupBinding import org.isoron.uhabits.databinding.CheckmarkPopupBinding
import org.isoron.uhabits.utils.dimBehind import org.isoron.uhabits.utils.dimBehind
import org.isoron.uhabits.utils.dismissCurrentAndShow
import org.isoron.uhabits.utils.dp import org.isoron.uhabits.utils.dp
import org.isoron.uhabits.utils.requestFocusWithKeyboard import org.isoron.uhabits.utils.requestFocusWithKeyboard
import java.text.DecimalFormat import java.text.DecimalFormat
@ -103,7 +104,7 @@ class NumberPopup(
view.value.requestFocusWithKeyboard() view.value.requestFocusWithKeyboard()
dialog.setCanceledOnTouchOutside(true) dialog.setCanceledOnTouchOutside(true)
dialog.dimBehind() dialog.dimBehind()
dialog.show() dialog.dismissCurrentAndShow()
} }
fun save() { fun save() {

@ -73,6 +73,7 @@ class WeekdayPickerDialog :
.setNegativeButton( .setNegativeButton(
android.R.string.cancel android.R.string.cancel
) { _: DialogInterface?, _: Int -> dismiss() } ) { _: DialogInterface?, _: Int -> dismiss() }
return builder.create() return builder.create()
} }

@ -59,6 +59,7 @@ import org.isoron.uhabits.core.models.Reminder
import org.isoron.uhabits.core.models.WeekdayList import org.isoron.uhabits.core.models.WeekdayList
import org.isoron.uhabits.databinding.ActivityEditHabitBinding import org.isoron.uhabits.databinding.ActivityEditHabitBinding
import org.isoron.uhabits.utils.ColorUtils import org.isoron.uhabits.utils.ColorUtils
import org.isoron.uhabits.utils.dismissCurrentAndShow
import org.isoron.uhabits.utils.formatTime import org.isoron.uhabits.utils.formatTime
import org.isoron.uhabits.utils.toFormattedString import org.isoron.uhabits.utils.toFormattedString
@ -156,23 +157,23 @@ class EditHabitActivity : AppCompatActivity() {
val colorPickerDialogFactory = ColorPickerDialogFactory(this) val colorPickerDialogFactory = ColorPickerDialogFactory(this)
binding.colorButton.setOnClickListener { binding.colorButton.setOnClickListener {
val dialog = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme) val picker = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme)
dialog.setListener { paletteColor -> picker.setListener { paletteColor ->
this.color = paletteColor this.color = paletteColor
updateColors() updateColors()
} }
dialog.show(supportFragmentManager, "colorPicker") picker.dismissCurrentAndShow(supportFragmentManager, "colorPicker")
} }
populateFrequency() populateFrequency()
binding.booleanFrequencyPicker.setOnClickListener { binding.booleanFrequencyPicker.setOnClickListener {
val dialog = FrequencyPickerDialog(freqNum, freqDen) val picker = FrequencyPickerDialog(freqNum, freqDen)
dialog.onFrequencyPicked = { num, den -> picker.onFrequencyPicked = { num, den ->
freqNum = num freqNum = num
freqDen = den freqDen = den
populateFrequency() populateFrequency()
} }
dialog.show(supportFragmentManager, "frequencyPicker") picker.dismissCurrentAndShow(supportFragmentManager, "frequencyPicker")
} }
populateTargetType() populateTargetType()
@ -189,7 +190,8 @@ class EditHabitActivity : AppCompatActivity() {
populateTargetType() populateTargetType()
dialog.dismiss() dialog.dismiss()
} }
builder.show() val dialog = builder.create()
dialog.dismissCurrentAndShow()
} }
binding.numericalFrequencyPicker.setOnClickListener { binding.numericalFrequencyPicker.setOnClickListener {
@ -235,7 +237,7 @@ class EditHabitActivity : AppCompatActivity() {
is24HourMode, is24HourMode,
androidColor androidColor
) )
dialog.show(supportFragmentManager, "timePicker") dialog.dismissCurrentAndShow(supportFragmentManager, "timePicker")
} }
binding.reminderDatePicker.setOnClickListener { binding.reminderDatePicker.setOnClickListener {
@ -247,7 +249,7 @@ class EditHabitActivity : AppCompatActivity() {
populateReminder() populateReminder()
} }
dialog.setSelectedDays(reminderDays) dialog.setSelectedDays(reminderDays)
dialog.show(supportFragmentManager, "dayPicker") dialog.dismissCurrentAndShow(supportFragmentManager, "dayPicker")
} }
binding.buttonSave.setOnClickListener { binding.buttonSave.setOnClickListener {

@ -64,6 +64,7 @@ import org.isoron.uhabits.tasks.ImportDataTask
import org.isoron.uhabits.tasks.ImportDataTaskFactory import org.isoron.uhabits.tasks.ImportDataTaskFactory
import org.isoron.uhabits.utils.copyTo import org.isoron.uhabits.utils.copyTo
import org.isoron.uhabits.utils.currentTheme import org.isoron.uhabits.utils.currentTheme
import org.isoron.uhabits.utils.dismissCurrentAndShow
import org.isoron.uhabits.utils.restartWithFade import org.isoron.uhabits.utils.restartWithFade
import org.isoron.uhabits.utils.showMessage import org.isoron.uhabits.utils.showMessage
import org.isoron.uhabits.utils.showSendEmailScreen import org.isoron.uhabits.utils.showSendEmailScreen
@ -163,7 +164,7 @@ class ListHabitsScreen
} }
override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback, quantity: Int) { override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback, quantity: Int) {
ConfirmDeleteDialog(activity, callback, quantity).show() ConfirmDeleteDialog(activity, callback, quantity).dismissCurrentAndShow()
} }
override fun showEditHabitsScreen(selected: List<Habit>) { override fun showEditHabitsScreen(selected: List<Habit>) {
@ -224,7 +225,8 @@ class ListHabitsScreen
override fun showColorPicker(defaultColor: PaletteColor, callback: OnColorPickedCallback) { override fun showColorPicker(defaultColor: PaletteColor, callback: OnColorPickedCallback) {
val picker = colorPickerFactory.create(defaultColor, themeSwitcher.currentTheme!!) val picker = colorPickerFactory.create(defaultColor, themeSwitcher.currentTheme!!)
picker.setListener(callback) picker.setListener(callback)
picker.show(activity.supportFragmentManager, "picker") //picker.show(activity.supportFragmentManager, "picker")
picker.dialog?.dismissCurrentAndShow()
} }
override fun showNumberPopup( override fun showNumberPopup(

@ -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.core.ui.views.OnDateClickedListener
import org.isoron.uhabits.intents.IntentFactory import org.isoron.uhabits.intents.IntentFactory
import org.isoron.uhabits.utils.currentTheme import org.isoron.uhabits.utils.currentTheme
import org.isoron.uhabits.utils.dismissCurrentAndShow
import org.isoron.uhabits.utils.showMessage import org.isoron.uhabits.utils.showMessage
import org.isoron.uhabits.utils.showSendFileScreen import org.isoron.uhabits.utils.showSendFileScreen
import org.isoron.uhabits.widgets.WidgetUpdater import org.isoron.uhabits.widgets.WidgetUpdater
@ -228,7 +229,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener {
} }
override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) { override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) {
ConfirmDeleteDialog(this@ShowHabitActivity, callback, 1).show() ConfirmDeleteDialog(this@ShowHabitActivity, callback, 1).dismissCurrentAndShow()
} }
override fun close() { override fun close() {

@ -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<Dialog> = 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)
}
Loading…
Cancel
Save