From 403ed8b250bced208f9b78a7f0121f74aa6b48aa Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 19 Jun 2020 06:24:51 -0500 Subject: [PATCH] EditHabitActivity: Make save button functional --- .../common/dialogs/FrequencyPickerDialog.kt | 18 ++-- .../habits/edit/EditHabitActivity.kt | 102 ++++++++++++++++-- .../habits/list/ListHabitsScreen.kt | 4 +- .../isoron/uhabits/intents/IntentFactory.kt | 8 +- .../main/res/layout/activity_edit_habit.xml | 10 +- .../list/ListHabitsSelectionMenuBehavior.java | 1 + 6 files changed, 122 insertions(+), 21 deletions(-) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt index b003ce1a5..eb0deb83a 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt @@ -88,15 +88,21 @@ class FrequencyPickerDialog(var freqNumerator: Int, // NOP } contentView.everyXDaysRadioButton.isChecked -> { - denominator = Integer.parseInt(contentView.everyXDaysTextView.text.toString()) + if (contentView.everyXDaysTextView.text.isNotEmpty()) { + denominator = Integer.parseInt(contentView.everyXDaysTextView.text.toString()) + } } contentView.xTimesPerWeekRadioButton.isChecked -> { - numerator = Integer.parseInt(contentView.xTimesPerWeekTextView.text.toString()) - denominator = 7 + if (contentView.xTimesPerWeekTextView.text.isNotEmpty()) { + numerator = Integer.parseInt(contentView.xTimesPerWeekTextView.text.toString()) + denominator = 7 + } } else -> { - numerator = Integer.parseInt(contentView.xTimesPerMonthTextView.text.toString()) - denominator = 31 + if (contentView.xTimesPerMonthTextView.text.isNotEmpty()) { + numerator = Integer.parseInt(contentView.xTimesPerMonthTextView.text.toString()) + denominator = 30 + } } } if (numerator >= denominator || numerator < 1) { @@ -138,7 +144,7 @@ class FrequencyPickerDialog(var freqNumerator: Int, contentView.xTimesPerMonthTextView.setText(freqNumerator.toString()) focus(contentView.xTimesPerMonthTextView) } else { - Log.w("FrequencyPickerDialog", "Unknown frequency: " + freqNumerator + "/" + freqDenominator) + Log.w("FrequencyPickerDialog", "Unknown frequency: $freqNumerator/$freqDenominator") contentView.everyDayRadioButton.isChecked = true } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt index e9dc33e4c..3e6f4f1ff 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt @@ -26,39 +26,68 @@ import android.text.format.* import android.view.* import androidx.appcompat.app.* import com.android.datetimepicker.time.* +import kotlinx.android.synthetic.main.activity_edit_habit.* import org.isoron.androidbase.utils.* import org.isoron.uhabits.* import org.isoron.uhabits.activities.* import org.isoron.uhabits.activities.common.dialogs.* +import org.isoron.uhabits.core.commands.* import org.isoron.uhabits.core.models.* -import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.databinding.* -import org.isoron.uhabits.preferences.* import org.isoron.uhabits.utils.* class EditHabitActivity : AppCompatActivity() { private lateinit var themeSwitcher: AndroidThemeSwitcher - private lateinit var binding: ActivityEditHabitBinding + private lateinit var commandRunner: CommandRunner + var habitId = -1L var paletteColor = 11 var androidColor = 0 - var freqNum = 1 var freqDen = 1 var reminderHour = -1 var reminderMin = -1 - var reminderDays = WeekdayList.EVERY_DAY + var reminderDays: WeekdayList = WeekdayList.EVERY_DAY + + override fun onCreate(state: Bundle?) { + super.onCreate(state) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val prefs = Preferences(SharedPreferencesStorage(this)) - themeSwitcher = AndroidThemeSwitcher(this, prefs) + val component = (application as HabitsApplication).component + themeSwitcher = AndroidThemeSwitcher(this, component.preferences) themeSwitcher.apply() binding = ActivityEditHabitBinding.inflate(layoutInflater) setContentView(binding.root) + + if (intent.hasExtra("habitId")) { + binding.toolbar.title = getString(R.string.edit_habit) + habitId = intent.getLongExtra("habitId", -1) + val habit = component.habitList.getById(habitId)!! + paletteColor = habit.color + freqNum = habit.frequency.numerator + freqDen = habit.frequency.denominator + if (habit.hasReminder()) { + reminderHour = habit.reminder.hour + reminderMin = habit.reminder.minute + reminderDays = habit.reminder.days + } + binding.nameInput.setText(habit.name) + binding.questionInput.setText(habit.question) + binding.notesInput.setText(habit.description) + } + + if (state != null) { + habitId = state.getLong("habitId") + paletteColor = state.getInt("paletteColor") + freqNum = state.getInt("freqNum") + freqDen = state.getInt("freqDen") + reminderHour = state.getInt("reminderHour") + reminderMin = state.getInt("reminderMin") + reminderDays = WeekdayList(state.getInt("reminderDays")) + } + updateColors() setSupportActionBar(binding.toolbar) @@ -120,8 +149,47 @@ class EditHabitActivity : AppCompatActivity() { } binding.buttonSave.setOnClickListener { - finish() + if(validate()) save() + } + } + + private fun save() { + val component = (application as HabitsApplication).component + val habit = component.modelFactory.buildHabit() + + var original: Habit? = null + if (habitId >= 0) { + original = component.habitList.getById(habitId)!! + habit.copyFrom(original) + } + + habit.name = nameInput.text.trim().toString() + habit.question = questionInput.text.trim().toString() + habit.description = notesInput.text.trim().toString() + habit.color = paletteColor + if (reminderHour >= 0) { + habit.setReminder(Reminder(reminderHour, reminderMin, reminderDays)) + } + habit.frequency = Frequency(freqNum, freqDen) + habit.unit = "" + habit.targetValue = 1.0 + habit.type = Habit.YES_NO_HABIT + + val command = if (habitId >= 0) { + component.editHabitCommandFactory.create(component.habitList, original, habit) + } else { + component.createHabitCommandFactory.create(component.habitList, habit) } + component.commandRunner.execute(command, null) + finish() + } + + private fun validate(): Boolean { + if (nameInput.text.isEmpty()) { + nameInput.error = getString(R.string.validation_name_should_not_be_blank) + return false + } + return true } private fun populateReminder() { @@ -160,4 +228,18 @@ class EditHabitActivity : AppCompatActivity() { binding.toolbar.setBackgroundColor(androidColor) } } + + override fun onSaveInstanceState(state: Bundle) { + super.onSaveInstanceState(state) + with(state) { + putLong("habitId", habitId) + putInt("paletteColor", paletteColor) + putInt("androidColor", androidColor) + putInt("freqNum", freqNum) + putInt("freqDen", freqDen) + putInt("reminderHour", reminderHour) + putInt("reminderMin", reminderMin) + putInt("reminderDays", reminderDays.toInteger()) + } + } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index 1d91f4720..da34194ca 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -147,8 +147,8 @@ class ListHabitsScreen } override fun showEditHabitsScreen(habits: List) { - val dialog = editHabitDialogFactory.edit(habits[0]) - activity.showDialog(dialog, "editNumericalHabit") + val intent = intentFactory.startEditActivity(activity!!, habits[0]) + activity.startActivity(intent) } override fun showFAQScreen() { diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt index 03d418f68..f2aedd3d9 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt @@ -84,7 +84,13 @@ class IntentFactory fun codeContributors(context: Context) = buildViewIntent(context.getString(R.string.codeContributorsURL)) - fun startEditActivity(context: Context): Intent? { + fun startEditActivity(context: Context): Intent { return Intent(context, EditHabitActivity::class.java) } + + fun startEditActivity(context: Context, habit: Habit): Intent { + val intent = startEditActivity(context) + intent.putExtra("habitId", habit.id) + return intent + } } diff --git a/android/uhabits-android/src/main/res/layout/activity_edit_habit.xml b/android/uhabits-android/src/main/res/layout/activity_edit_habit.xml index f81c28aeb..86d523ee2 100644 --- a/android/uhabits-android/src/main/res/layout/activity_edit_habit.xml +++ b/android/uhabits-android/src/main/res/layout/activity_edit_habit.xml @@ -74,14 +74,17 @@ android:text="@string/name" /> - - + @@ -128,7 +131,9 @@ android:text="@string/question" /> @@ -203,6 +208,7 @@ android:text="@string/notes" /> diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java index 906362cf0..33556b66b 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java @@ -112,6 +112,7 @@ public class ListHabitsSelectionMenuBehavior public void onEditHabits() { screen.showEditHabitsScreen(adapter.getSelected()); + adapter.clearSelection(); } public void onUnarchiveHabits()