From 61f32449dd383a558cf01f968d15a9bc0a15096e Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 12 Sep 2020 15:10:04 -0500 Subject: [PATCH] Numerical habits: allow Tasker to increment/decrement value --- .../automation/EditSettingController.kt | 15 +-- .../uhabits/automation/EditSettingRootView.kt | 53 +++++++- .../uhabits/automation/FireSettingReceiver.kt | 7 +- .../isoron/uhabits/automation/SettingUtils.kt | 2 +- .../src/main/res/layout/automation.xml | 116 ++++++++++-------- .../src/main/res/values/constants.xml | 7 +- .../src/main/res/values/strings.xml | 2 + .../core/ui/widgets/WidgetBehavior.java | 10 ++ 8 files changed, 145 insertions(+), 67 deletions(-) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingController.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingController.kt index 2fdd01250..9f234dc9c 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingController.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingController.kt @@ -22,8 +22,7 @@ package org.isoron.uhabits.automation import android.app.* import android.content.* import android.os.* -import org.isoron.uhabits.* -import org.isoron.uhabits.automation.FireSettingReceiver.* +import org.isoron.uhabits.R import org.isoron.uhabits.core.models.* class EditSettingController(private val activity: Activity) { @@ -45,11 +44,13 @@ class EditSettingController(private val activity: Activity) { } private fun getActionName(action: Int): String { - when (action) { - ACTION_CHECK -> return activity.getString(R.string.check) - ACTION_UNCHECK -> return activity.getString(R.string.uncheck) - ACTION_TOGGLE -> return activity.getString(R.string.toggle) - else -> return "???" + return when (action) { + ACTION_CHECK -> activity.getString(R.string.check) + ACTION_UNCHECK -> activity.getString(R.string.uncheck) + ACTION_TOGGLE -> activity.getString(R.string.toggle) + ACTION_INCREMENT -> activity.getString(R.string.increment) + ACTION_DECREMENT -> activity.getString(R.string.decrement) + else -> "???" } } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt index 83de784e1..0d6979ec1 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.automation import android.R.layout.* import android.content.* +import android.view.* import androidx.appcompat.widget.* import androidx.appcompat.widget.Toolbar import android.widget.* @@ -51,10 +52,17 @@ class EditSettingRootView( addView(inflate(getContext(), R.layout.automation, null)) ButterKnife.bind(this) populateHabitSpinner() - + habitSpinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener { + override fun onNothingSelected(parent: AdapterView<*>?) { + } + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + populateActionSpinner(habitList.getByPosition(position).isNumerical) + } + } args?.let { habitSpinner.setSelection(habitList.indexOf(it.habit)) - actionSpinner.setSelection(it.action) + populateActionSpinner(it.habit.isNumerical) + actionSpinner.setSelection(mapActionToSpinnerPosition(it.action)) } } @@ -72,16 +80,49 @@ class EditSettingRootView( @OnClick(R.id.buttonSave) fun onClickSave() { - val action = actionSpinner.selectedItemPosition - val habitPosition = habitSpinner.selectedItemPosition - val habit = habitList.getByPosition(habitPosition) + val habit = habitList.getByPosition(habitSpinner.selectedItemPosition) + val action = mapSpinnerPositionToAction(habit.isNumerical, + actionSpinner.selectedItemPosition) controller.onSave(habit, action) } + private fun mapSpinnerPositionToAction(isNumerical: Boolean, itemPosition: Int): Int { + return if (isNumerical) { + when (itemPosition) { + 0 -> ACTION_INCREMENT + else -> ACTION_DECREMENT + } + } else { + when (itemPosition) { + 0 -> ACTION_CHECK + 1 -> ACTION_UNCHECK + else -> ACTION_TOGGLE + } + } + } + + private fun mapActionToSpinnerPosition(action: Int): Int { + return when(action) { + ACTION_CHECK -> 0 + ACTION_UNCHECK -> 1 + ACTION_TOGGLE -> 2 + ACTION_INCREMENT -> 0 + ACTION_DECREMENT -> 1 + else -> 0 + } + } + private fun populateHabitSpinner() { - val names = habitList.mapTo(LinkedList()) { it.name } + val names = habitList.mapTo(LinkedList()) { it.name } val adapter = ArrayAdapter(context, simple_spinner_item, names) adapter.setDropDownViewResource(simple_spinner_dropdown_item) habitSpinner.adapter = adapter } + + private fun populateActionSpinner(isNumerical: Boolean) { + val entries = (if (isNumerical) R.array.actions_numerical else R.array.actions_yes_no) + val adapter = ArrayAdapter.createFromResource(context, entries, simple_spinner_item) + adapter.setDropDownViewResource(simple_spinner_dropdown_item) + actionSpinner.adapter = adapter + } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt index a5d63ade5..eb33a4515 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.kt @@ -30,6 +30,9 @@ import org.isoron.uhabits.receivers.* const val ACTION_CHECK = 0 const val ACTION_UNCHECK = 1 const val ACTION_TOGGLE = 2 +const val ACTION_INCREMENT = 3 +const val ACTION_DECREMENT = 4 + const val EXTRA_BUNDLE = "com.twofortyfouram.locale.intent.extra.BUNDLE" const val EXTRA_STRING_BLURB = "com.twofortyfouram.locale.intent.extra.BLURB" @@ -52,11 +55,13 @@ class FireSettingReceiver : BroadcastReceiver() { ACTION_CHECK -> controller.onAddRepetition(args.habit, timestamp) ACTION_UNCHECK -> controller.onRemoveRepetition(args.habit, timestamp) ACTION_TOGGLE -> controller.onToggleRepetition(args.habit, timestamp) + ACTION_INCREMENT -> controller.onIncrement(args.habit, timestamp, 1000) + ACTION_DECREMENT -> controller.onDecrement(args.habit, timestamp, 1000) } } @ReceiverScope - @Component(dependencies = arrayOf(HabitsApplicationComponent::class)) + @Component(dependencies = [HabitsApplicationComponent::class]) internal interface ReceiverComponent { val widgetController: WidgetBehavior } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/SettingUtils.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/SettingUtils.kt index 7a8b0310a..1a56c91b8 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/SettingUtils.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/SettingUtils.kt @@ -9,7 +9,7 @@ object SettingUtils { fun parseIntent(intent: Intent, allHabits: HabitList): Arguments? { val bundle = intent.getBundleExtra(EXTRA_BUNDLE) ?: return null val action = bundle.getInt("action") - if (action < 0 || action > 2) return null + if (action < 0 || action > 4) return null val habit = allHabits.getById(bundle.getLong("habit")) ?: return null return Arguments(action, habit) } diff --git a/android/uhabits-android/src/main/res/layout/automation.xml b/android/uhabits-android/src/main/res/layout/automation.xml index a34e55bbc..de413d078 100644 --- a/android/uhabits-android/src/main/res/layout/automation.xml +++ b/android/uhabits-android/src/main/res/layout/automation.xml @@ -22,67 +22,81 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical"> + android:orientation="vertical" + android:background="@color/white"> - + - + - + + - + - - + - + + + - + + + - - - + + + - + + + -