From 1d05b9ed10a9d77e2c7000b002632663a0233e77 Mon Sep 17 00:00:00 2001 From: Peketr Date: Mon, 18 Mar 2024 13:57:49 +0100 Subject: [PATCH 1/7] change toolchain to 17 for development --- uhabits-android/build.gradle.kts | 2 +- uhabits-core/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index ed6968598..4e17ed177 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -37,7 +37,7 @@ Updating gradle might fix this, so try again in the future to remove this and ru If this doesn't produce any warning, try to remove it. */ kotlin { - jvmToolchain(11) + jvmToolchain(17) } android { diff --git a/uhabits-core/build.gradle.kts b/uhabits-core/build.gradle.kts index 6a7ca5c93..b4f09b2bb 100644 --- a/uhabits-core/build.gradle.kts +++ b/uhabits-core/build.gradle.kts @@ -24,7 +24,7 @@ plugins { kotlin { jvm().withJava() - jvmToolchain(11) + jvmToolchain(17) sourceSets { val commonMain by getting { From ca428a7dd5db9829ee998f4894eefb7393784c3c Mon Sep 17 00:00:00 2001 From: Peketr Date: Mon, 18 Mar 2024 14:42:31 +0100 Subject: [PATCH 2/7] add increment to Edit UI and Habit --- .../habits/edit/EditHabitActivity.kt | 36 ++++++++++++++++ .../main/res/layout/activity_edit_habit.xml | 41 +++++++++++++++++++ .../src/main/res/values/strings.xml | 4 ++ .../org/isoron/uhabits/core/models/Habit.kt | 4 +- 4 files changed, 84 insertions(+), 1 deletion(-) 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 a2f329d71..d1dc0dfb5 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 @@ -85,6 +85,7 @@ class EditHabitActivity : AppCompatActivity() { var reminderMin = -1 var reminderDays: WeekdayList = WeekdayList.EVERY_DAY var targetType = NumericalHabitType.AT_LEAST + var increment = 0.0 override fun onCreate(state: Bundle?) { super.onCreate(state) @@ -105,6 +106,7 @@ class EditHabitActivity : AppCompatActivity() { freqNum = habit.frequency.numerator freqDen = habit.frequency.denominator targetType = habit.targetType + increment = habit.increment habit.reminder?.let { reminderHour = it.hour reminderMin = it.minute @@ -115,6 +117,7 @@ class EditHabitActivity : AppCompatActivity() { binding.notesInput.setText(habit.description) binding.unitInput.setText(habit.unit) binding.targetInput.setText(habit.targetValue.toString()) + } else { habitType = HabitType.fromInt(intent.getIntExtra("habitType", HabitType.YES_NO.value)) } @@ -128,6 +131,7 @@ class EditHabitActivity : AppCompatActivity() { reminderHour = state.getInt("reminderHour") reminderMin = state.getInt("reminderMin") reminderDays = WeekdayList(state.getInt("reminderDays")) + increment = state.getDouble("increment") } updateColors() @@ -254,6 +258,23 @@ class EditHabitActivity : AppCompatActivity() { for (fragment in supportFragmentManager.fragments) { (fragment as DialogFragment).dismiss() } + + populateWidgetAction() + binding.widgetActionPicker.setOnClickListener { + val builder = AlertDialog.Builder(this) + val arrayAdapter = ArrayAdapter(this, android.R.layout.select_dialog_item) + arrayAdapter.add(getString(R.string.widget_action_dialog)) + arrayAdapter.add(getString(R.string.widget_action_increment)) + builder.setAdapter(arrayAdapter) { dialog, which -> + increment = when (which) { + 1 -> 1.0 + else -> 0.0 + } + populateWidgetAction() + dialog.dismiss() + } + builder.show() + } } private fun save() { @@ -281,6 +302,7 @@ class EditHabitActivity : AppCompatActivity() { habit.targetValue = binding.targetInput.text.toString().toDouble() habit.targetType = targetType habit.unit = binding.unitInput.text.trim().toString() + habit.increment = binding.incrementInput.text.toString().toDouble() } habit.type = habitType @@ -341,6 +363,19 @@ class EditHabitActivity : AppCompatActivity() { } } + @SuppressLint("StringFormatMatches") + private fun populateWidgetAction() { + binding.widgetActionPicker.text = when (increment){ + 0.0 -> getString(R.string.widget_action_dialog) + else -> getString(R.string.widget_action_increment) + } + binding.incrementInput.setText(increment.toString()) + if (increment != 0.0) + binding.incrementRightBox.visibility = View.VISIBLE + else + binding.incrementRightBox.visibility = View.GONE + } + private fun populateTargetType() { binding.targetTypePicker.text = when (targetType) { NumericalHabitType.AT_MOST -> getString(R.string.target_type_at_most) @@ -375,6 +410,7 @@ class EditHabitActivity : AppCompatActivity() { putInt("reminderHour", reminderHour) putInt("reminderMin", reminderMin) putInt("reminderDays", reminderDays.toInteger()) + putDouble("increment",increment) } } } diff --git a/uhabits-android/src/main/res/layout/activity_edit_habit.xml b/uhabits-android/src/main/res/layout/activity_edit_habit.xml index 75dddb551..acf06dee1 100644 --- a/uhabits-android/src/main/res/layout/activity_edit_habit.xml +++ b/uhabits-android/src/main/res/layout/activity_edit_habit.xml @@ -208,6 +208,47 @@ + + + + + + + + + + + + + + + diff --git a/uhabits-android/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml index 9fec1cbca..34b47e281 100644 --- a/uhabits-android/src/main/res/values/strings.xml +++ b/uhabits-android/src/main/res/values/strings.xml @@ -118,6 +118,9 @@ Developers Version %s Frequency + Widget Click Action + Open Dialog + Increment Checkmark Checkmark Stack Widget Frequency Stack Widget @@ -212,6 +215,7 @@ e.g. Exercise Color e.g. 15 + e.g. 2.0 e.g. Run e.g. How many miles did you run today? e.g. miles diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt index a06d01ec9..c7bc1a510 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/Habit.kt @@ -39,7 +39,8 @@ data class Habit( val computedEntries: EntryList, val originalEntries: EntryList, val scores: ScoreList, - val streaks: StreakList + val streaks: StreakList, + var increment: Double = 0.0 ) { init { if (uuid == null) this.uuid = UUID.randomUUID().toString().replace("-", "") @@ -119,6 +120,7 @@ data class Habit( this.type = other.type this.unit = other.unit this.uuid = other.uuid + this.increment = other.increment } override fun equals(other: Any?): Boolean { From bcf9120ec1b15e2676b1333efc3450bdf2068732 Mon Sep 17 00:00:00 2001 From: Peketr Date: Mon, 18 Mar 2024 15:26:14 +0100 Subject: [PATCH 3/7] connect functionality --- .../isoron/uhabits/intents/PendingIntentFactory.kt | 12 ++++++++++++ .../org/isoron/uhabits/receivers/WidgetReceiver.kt | 12 ++++++++++++ .../org/isoron/uhabits/widgets/CheckmarkWidget.kt | 5 ++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt index 038cfe3a4..96ece8753 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt @@ -146,6 +146,18 @@ class PendingIntentFactory FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT ) + fun incrementNumerical(habit: Habit, timestamp: Long?): PendingIntent = + getBroadcast( + context, + 2, + Intent(context, WidgetReceiver::class.java).apply { + data = Uri.parse(habit.uriString) + action = WidgetReceiver.ACTION_INCREMENT_NUMERICAL + if (timestamp != null) putExtra("timestamp", timestamp) + }, + FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT + ) + fun updateWidgets(): PendingIntent = getBroadcast( context, diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt index fc44eefbc..a4ff36eee 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt @@ -99,6 +99,17 @@ class WidgetReceiver : BroadcastReceiver() { widgetUpdater.updateWidgets() widgetUpdater.scheduleStartDayWidgetUpdate() } + ACTION_INCREMENT_NUMERICAL -> { + Log.d( + TAG, + String.format( + "onIncrementNumerical habit=%d timestamp=%d", + data!!.habit.id, + data.timestamp.unixTime + ) + ) + controller.onIncrement(data.habit,data.timestamp,(data.habit.increment * 1000).toInt()) + } } } catch (e: RuntimeException) { Log.e("WidgetReceiver", "could not process intent", e) @@ -116,6 +127,7 @@ class WidgetReceiver : BroadcastReceiver() { const val ACTION_DISMISS_REMINDER = "org.isoron.uhabits.ACTION_DISMISS_REMINDER" const val ACTION_REMOVE_REPETITION = "org.isoron.uhabits.ACTION_REMOVE_REPETITION" const val ACTION_TOGGLE_REPETITION = "org.isoron.uhabits.ACTION_TOGGLE_REPETITION" + const val ACTION_INCREMENT_NUMERICAL = "org.isoron.uhabits.ACTION_INCREMENT_NUMERICAL" const val ACTION_UPDATE_WIDGETS_VALUE = "org.isoron.uhabits.ACTION_UPDATE_WIDGETS_VALUE" private const val TAG = "WidgetReceiver" var lastReceivedIntent: Intent? = null diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt index 017f67a29..6471ea9c1 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt @@ -41,7 +41,10 @@ open class CheckmarkWidget( override fun getOnClickPendingIntent(context: Context): PendingIntent? { return if (habit.isNumerical) { - pendingIntentFactory.showNumberPicker(habit, DateUtils.getTodayWithOffset()) + if (habit.increment == 0.0) + pendingIntentFactory.showNumberPicker(habit, DateUtils.getTodayWithOffset()) + else + pendingIntentFactory.incrementNumerical(habit, null) } else { pendingIntentFactory.toggleCheckmark(habit, null) } From 745ef6ac4aff8a5d78cb077cc3868f79374b7718 Mon Sep 17 00:00:00 2001 From: Peketr Date: Mon, 18 Mar 2024 15:36:36 +0100 Subject: [PATCH 4/7] add database entry --- .../src/jvmMain/java/org/isoron/uhabits/core/Constants.kt | 2 +- .../isoron/uhabits/core/models/sqlite/records/HabitRecord.kt | 5 +++++ uhabits-core/src/jvmMain/resources/migrations/26.sql | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 uhabits-core/src/jvmMain/resources/migrations/26.sql diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/Constants.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/Constants.kt index be6c9634b..328b8cd40 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/Constants.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/Constants.kt @@ -20,4 +20,4 @@ package org.isoron.uhabits.core const val DATABASE_FILENAME = "uhabits.db" -const val DATABASE_VERSION = 25 +const val DATABASE_VERSION = 26 diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.kt index dc0386799..b9b761185 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/records/HabitRecord.kt @@ -88,6 +88,9 @@ class HabitRecord { @field:Column var uuid: String? = null + @field:Column + var increment: Double? = 0.0 + fun copyFrom(model: Habit) { id = model.id name = model.name @@ -114,6 +117,7 @@ class HabitRecord { reminderMin = reminder!!.minute reminderDays = reminder.days.toInteger() } + increment = model.increment } fun copyTo(habit: Habit) { @@ -137,5 +141,6 @@ class HabitRecord { WeekdayList(reminderDays!!) ) } + habit.increment = increment!! } } diff --git a/uhabits-core/src/jvmMain/resources/migrations/26.sql b/uhabits-core/src/jvmMain/resources/migrations/26.sql new file mode 100644 index 000000000..da37dfd5f --- /dev/null +++ b/uhabits-core/src/jvmMain/resources/migrations/26.sql @@ -0,0 +1 @@ +alter table Habits add column increment; \ No newline at end of file From 6f8075db19782c7adb464d07afa8852a1eda030b Mon Sep 17 00:00:00 2001 From: Peketr Date: Thu, 21 Mar 2024 15:51:55 +0100 Subject: [PATCH 5/7] remove WidgetAction Edit UI when Yes/No habit is being edited --- .../isoron/uhabits/activities/habits/edit/EditHabitActivity.kt | 1 + 1 file changed, 1 insertion(+) 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 d1dc0dfb5..6b9a0421d 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 @@ -141,6 +141,7 @@ class EditHabitActivity : AppCompatActivity() { binding.unitOuterBox.visibility = View.GONE binding.targetOuterBox.visibility = View.GONE binding.targetTypeOuterBox.visibility = View.GONE + binding.incrementOuterBox.visibility = View.GONE } HabitType.NUMERICAL -> { binding.nameInput.hint = getString(R.string.measurable_short_example) From 8b9fc9ebc87a55a5f4749fb6924cbae7c626ebe6 Mon Sep 17 00:00:00 2001 From: Peketr Date: Thu, 28 Mar 2024 15:23:44 +0100 Subject: [PATCH 6/7] Revert "change toolchain to 17 for development" This reverts commit 1d05b9ed10a9d77e2c7000b002632663a0233e77. --- uhabits-android/build.gradle.kts | 2 +- uhabits-core/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 4e17ed177..ed6968598 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -37,7 +37,7 @@ Updating gradle might fix this, so try again in the future to remove this and ru If this doesn't produce any warning, try to remove it. */ kotlin { - jvmToolchain(17) + jvmToolchain(11) } android { diff --git a/uhabits-core/build.gradle.kts b/uhabits-core/build.gradle.kts index b4f09b2bb..6a7ca5c93 100644 --- a/uhabits-core/build.gradle.kts +++ b/uhabits-core/build.gradle.kts @@ -24,7 +24,7 @@ plugins { kotlin { jvm().withJava() - jvmToolchain(17) + jvmToolchain(11) sourceSets { val commonMain by getting { From 133c98da374a1e01ed0b24f6b57d52229d63c339 Mon Sep 17 00:00:00 2001 From: rivago Date: Thu, 4 Apr 2024 14:37:30 +0200 Subject: [PATCH 7/7] fix ktlint --- .../activities/habits/edit/EditHabitActivity.kt | 10 +++++----- .../org/isoron/uhabits/receivers/WidgetReceiver.kt | 2 +- .../java/org/isoron/uhabits/widgets/CheckmarkWidget.kt | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) 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 6b9a0421d..88d456125 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 @@ -117,7 +117,6 @@ class EditHabitActivity : AppCompatActivity() { binding.notesInput.setText(habit.description) binding.unitInput.setText(habit.unit) binding.targetInput.setText(habit.targetValue.toString()) - } else { habitType = HabitType.fromInt(intent.getIntExtra("habitType", HabitType.YES_NO.value)) } @@ -366,15 +365,16 @@ class EditHabitActivity : AppCompatActivity() { @SuppressLint("StringFormatMatches") private fun populateWidgetAction() { - binding.widgetActionPicker.text = when (increment){ + binding.widgetActionPicker.text = when (increment) { 0.0 -> getString(R.string.widget_action_dialog) else -> getString(R.string.widget_action_increment) } binding.incrementInput.setText(increment.toString()) - if (increment != 0.0) + if (increment != 0.0) { binding.incrementRightBox.visibility = View.VISIBLE - else + } else { binding.incrementRightBox.visibility = View.GONE + } } private fun populateTargetType() { @@ -411,7 +411,7 @@ class EditHabitActivity : AppCompatActivity() { putInt("reminderHour", reminderHour) putInt("reminderMin", reminderMin) putInt("reminderDays", reminderDays.toInteger()) - putDouble("increment",increment) + putDouble("increment", increment) } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt index a4ff36eee..680374e29 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt @@ -108,7 +108,7 @@ class WidgetReceiver : BroadcastReceiver() { data.timestamp.unixTime ) ) - controller.onIncrement(data.habit,data.timestamp,(data.habit.increment * 1000).toInt()) + controller.onIncrement(data.habit, data.timestamp, (data.habit.increment * 1000).toInt()) } } } catch (e: RuntimeException) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt index 6471ea9c1..08b2c8301 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt @@ -41,10 +41,11 @@ open class CheckmarkWidget( override fun getOnClickPendingIntent(context: Context): PendingIntent? { return if (habit.isNumerical) { - if (habit.increment == 0.0) + if (habit.increment == 0.0) { pendingIntentFactory.showNumberPicker(habit, DateUtils.getTodayWithOffset()) - else + } else { pendingIntentFactory.incrementNumerical(habit, null) + } } else { pendingIntentFactory.toggleCheckmark(habit, null) }