From 323ddcc11a0992fdddb9eefe769b4382e8d81e8f Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Mon, 20 Jan 2020 06:08:29 -0600 Subject: [PATCH] Implement FrequencyPickerDialog --- .../common/dialogs/FrequencyPickerDialog.kt | 164 ++++++++++++++++++ .../habits/edit/EditHabitActivity.kt | 26 ++- .../src/main/res/drawable/bg_input_box.xml | 11 ++ ..._box_background.xml => bg_input_group.xml} | 0 .../main/res/layout/activity_edit_habit.xml | 12 +- .../res/layout/frequency_picker_dialog.xml | 120 +++++++++++++ 6 files changed, 326 insertions(+), 7 deletions(-) create mode 100644 android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt create mode 100644 android/uhabits-android/src/main/res/drawable/bg_input_box.xml rename android/uhabits-android/src/main/res/drawable/{input_box_background.xml => bg_input_group.xml} (100%) create mode 100644 android/uhabits-android/src/main/res/layout/frequency_picker_dialog.xml 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 new file mode 100644 index 000000000..b003ce1a5 --- /dev/null +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.activities.common.dialogs + +import android.app.* +import android.os.* +import android.util.* +import android.view.* +import android.widget.* +import androidx.appcompat.app.* +import androidx.appcompat.app.AlertDialog +import kotlinx.android.synthetic.main.frequency_picker_dialog.view.* +import org.isoron.uhabits.* + + +class FrequencyPickerDialog(var freqNumerator: Int, + var freqDenominator: Int + ) : AppCompatDialogFragment() { + + lateinit var contentView: View + var onFrequencyPicked: (num: Int, den: Int) -> Unit = {_,_ -> } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val inflater = LayoutInflater.from(activity!!) + contentView = inflater.inflate(R.layout.frequency_picker_dialog, null) + + contentView.everyDayRadioButton.setOnClickListener { + check(contentView.everyDayRadioButton) + unfocusAll() + } + + contentView.everyXDaysRadioButton.setOnClickListener { + check(contentView.everyXDaysRadioButton) + val everyXDaysTextView = contentView.everyXDaysTextView + focus(everyXDaysTextView) + } + + contentView.everyXDaysTextView.setOnFocusChangeListener { v, hasFocus -> + if(hasFocus) check(contentView.everyXDaysRadioButton) + } + + contentView.xTimesPerWeekRadioButton.setOnClickListener { + check(contentView.xTimesPerWeekRadioButton) + focus(contentView.xTimesPerWeekTextView) + } + + contentView.xTimesPerWeekTextView.setOnFocusChangeListener { v, hasFocus -> + if(hasFocus) check(contentView.xTimesPerWeekRadioButton) + } + + contentView.xTimesPerMonthRadioButton.setOnClickListener { + check(contentView.xTimesPerMonthRadioButton) + focus(contentView.xTimesPerMonthTextView) + } + + contentView.xTimesPerMonthTextView.setOnFocusChangeListener { v, hasFocus -> + if(hasFocus) check(contentView.xTimesPerMonthRadioButton) + } + + return AlertDialog.Builder(activity!!) + .setView(contentView) + .setPositiveButton(R.string.save) { _, _ -> onSaveClicked() } + .create() + } + + private fun onSaveClicked() { + var numerator = 1 + var denominator = 1 + when { + contentView.everyDayRadioButton.isChecked -> { + // NOP + } + contentView.everyXDaysRadioButton.isChecked -> { + denominator = Integer.parseInt(contentView.everyXDaysTextView.text.toString()) + } + contentView.xTimesPerWeekRadioButton.isChecked -> { + numerator = Integer.parseInt(contentView.xTimesPerWeekTextView.text.toString()) + denominator = 7 + } + else -> { + numerator = Integer.parseInt(contentView.xTimesPerMonthTextView.text.toString()) + denominator = 31 + } + } + if (numerator >= denominator || numerator < 1) { + numerator = 1 + denominator = 1 + } + onFrequencyPicked(numerator, denominator) + dismiss() + } + + private fun check(view: RadioButton?) { + uncheckAll() + view?.isChecked = true + view?.requestFocus() + } + + override fun onResume() { + super.onResume() + populateViews() + } + + private fun populateViews() { + uncheckAll() + if (freqNumerator == 1) { + if(freqDenominator == 1) { + contentView.everyDayRadioButton.isChecked = true + } else { + contentView.everyXDaysRadioButton.isChecked = true + contentView.everyXDaysTextView.setText(freqDenominator.toString()) + focus(contentView.everyXDaysTextView) + } + } else { + if(freqDenominator == 7) { + contentView.xTimesPerWeekRadioButton.isChecked = true + contentView.xTimesPerWeekTextView.setText(freqNumerator.toString()) + focus(contentView.xTimesPerWeekTextView) + } else if (freqDenominator == 30 || freqDenominator == 31) { + contentView.xTimesPerMonthRadioButton.isChecked = true + contentView.xTimesPerMonthTextView.setText(freqNumerator.toString()) + focus(contentView.xTimesPerMonthTextView) + } else { + Log.w("FrequencyPickerDialog", "Unknown frequency: " + freqNumerator + "/" + freqDenominator) + contentView.everyDayRadioButton.isChecked = true + } + } + } + + private fun focus(view: EditText) { + view.requestFocus() + view.setSelection(view.text.length) + } + + private fun uncheckAll() { + contentView.everyDayRadioButton.isChecked = false + contentView.everyXDaysRadioButton.isChecked = false + contentView.xTimesPerWeekRadioButton.isChecked = false + contentView.xTimesPerMonthRadioButton.isChecked = false + } + + private fun unfocusAll() { + contentView.everyXDaysTextView.clearFocus() + contentView.xTimesPerWeekTextView.clearFocus() + contentView.xTimesPerMonthTextView.clearFocus() + } +} \ No newline at end of file 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 10f153ff4..1ca2a56f7 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 @@ -29,7 +29,6 @@ import org.isoron.uhabits.* import org.isoron.uhabits.activities.* import org.isoron.uhabits.activities.common.dialogs.* import org.isoron.uhabits.core.preferences.* -import org.isoron.uhabits.core.ui.* import org.isoron.uhabits.preferences.* import org.isoron.uhabits.utils.* @@ -38,6 +37,8 @@ class EditHabitActivity : AppCompatActivity() { private lateinit var themeSwitcher: AndroidThemeSwitcher var paletteColor = 11 + var freqNum = 1 + var freqDen = 1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -62,6 +63,29 @@ class EditHabitActivity : AppCompatActivity() { } dialog.show(supportFragmentManager, "colorPicker") } + + populateFrequency() + frequencyPicker.setOnClickListener { + val dialog = FrequencyPickerDialog(freqNum, freqDen) + dialog.onFrequencyPicked = {num, den -> + freqNum = num + freqDen = den + populateFrequency() + } + dialog.show(supportFragmentManager, "frequencyPicker") + } + } + + private fun populateFrequency() { + val label = when { + freqNum == 1 && freqDen == 1 -> "Every day" + freqNum == 1 && freqDen == 7 -> "Every week" + freqNum == 1 && freqDen > 1 -> "Every $freqDen days" + freqDen == 7 -> "$freqNum times per week" + freqDen == 31 -> "$freqNum times per month" + else -> "Unknown" + } + frequencyPicker.text = label } private fun updateColors() { diff --git a/android/uhabits-android/src/main/res/drawable/bg_input_box.xml b/android/uhabits-android/src/main/res/drawable/bg_input_box.xml new file mode 100644 index 000000000..8f83bd772 --- /dev/null +++ b/android/uhabits-android/src/main/res/drawable/bg_input_box.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/android/uhabits-android/src/main/res/drawable/input_box_background.xml b/android/uhabits-android/src/main/res/drawable/bg_input_group.xml similarity index 100% rename from android/uhabits-android/src/main/res/drawable/input_box_background.xml rename to android/uhabits-android/src/main/res/drawable/bg_input_group.xml 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 98a90d1fa..f83e13cea 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 @@ -71,7 +71,7 @@ @@ -111,7 +111,7 @@ @@ -158,7 +158,7 @@ @@ -199,7 +199,7 @@ @@ -240,7 +240,7 @@ @@ -282,7 +282,7 @@ diff --git a/android/uhabits-android/src/main/res/layout/frequency_picker_dialog.xml b/android/uhabits-android/src/main/res/layout/frequency_picker_dialog.xml new file mode 100644 index 000000000..609d591fe --- /dev/null +++ b/android/uhabits-android/src/main/res/layout/frequency_picker_dialog.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file