From 545bb8209bd21bd8198cbc152cc69944e11abc69 Mon Sep 17 00:00:00 2001 From: KristianTashkov Date: Wed, 29 Jul 2020 15:22:36 +0300 Subject: [PATCH] Make reminder negative button set explicit fail state --- .../isoron/uhabits/intents/IntentParser.kt | 9 +++-- .../uhabits/intents/PendingIntentFactory.kt | 11 ++++++ .../notifications/AndroidNotificationTray.kt | 34 ++++++++++++++----- .../uhabits/receivers/WidgetReceiver.java | 12 +++++++ .../core/ui/widgets/WidgetBehavior.java | 7 ++++ 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt index ca2204c06..2a23815a0 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt @@ -33,12 +33,13 @@ class IntentParser fun parseCheckmarkIntent(intent: Intent): CheckmarkIntentData { val uri = intent.data ?: throw IllegalArgumentException("uri is null") - return CheckmarkIntentData(parseHabit(uri), parseTimestamp(intent)) + return CheckmarkIntentData(parseHabit(uri), parseTimestamp(intent), parseValue(intent)) } fun copyIntentData(source: Intent, destination: Intent) { destination.data = source.data; destination.putExtra("timestamp", source.getLongExtra("timestamp", DateUtils.getToday().unixTime)) + destination.putExtra("value", source.getIntExtra("value", 0)) } private fun parseHabit(uri: Uri): Habit { @@ -58,5 +59,9 @@ class IntentParser return Timestamp(timestamp) } - class CheckmarkIntentData(var habit: Habit, var timestamp: Timestamp) + private fun parseValue(intent: Intent): Int { + return intent.getIntExtra("value", 0) + } + + class CheckmarkIntentData(var habit: Habit, var timestamp: Timestamp, var value: Int) } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt index cb2f84532..2c742a917 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt @@ -118,4 +118,15 @@ class PendingIntentFactory if (timestamp != null) putExtra("timestamp", timestamp) }, FLAG_UPDATE_CURRENT) + + fun setYesNoValue(habit: Habit, timestamp: Timestamp?, value: Int): PendingIntent = + PendingIntent.getBroadcast( + context, value, + Intent(context, WidgetReceiver::class.java).apply { + data = Uri.parse(habit.uriString) + action = WidgetReceiver.ACTION_SET_YESNO_VALUE + putExtra("value", value) + if (timestamp != null) putExtra("timestamp", timestamp.unixTime) + }, + FLAG_UPDATE_CURRENT) } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt index 1f6ab6ad0..0bd83c3a8 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt @@ -84,16 +84,32 @@ class AndroidNotificationTray reminderTime: Long, timestamp: Timestamp, disableSound: Boolean = false): Notification { + val addRepetitionAction = if (!preferences.isAdvancedCheckmarksEnabled) { + Action( + R.drawable.ic_action_check, + context.getString(R.string.yes), + pendingIntents.addCheckmark(habit, timestamp)) + } + else { + Action( + R.drawable.ic_action_check, + context.getString(R.string.yes), + pendingIntents.setYesNoValue(habit, timestamp, Checkmark.CHECKED_EXPLICITLY)) + } - val addRepetitionAction = Action( - R.drawable.ic_action_check, - context.getString(R.string.yes), - pendingIntents.addCheckmark(habit, timestamp)) - - val removeRepetitionAction = Action( - R.drawable.ic_action_cancel, - context.getString(R.string.no), - pendingIntents.removeRepetition(habit)) + val removeRepetitionAction = if (!preferences.isAdvancedCheckmarksEnabled) { + Action( + R.drawable.ic_action_cancel, + context.getString(R.string.no), + pendingIntents.removeRepetition(habit)) + } + else { + Action( + R.drawable.ic_action_cancel, + context.getString(R.string.no), + pendingIntents.setYesNoValue( + habit, timestamp, Checkmark.FAILED_EXPLICITLY_NECESSARY)) + } val wearableBg = decodeResource(context.resources, R.drawable.stripe) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java index 2942f8141..66d8b0ca2 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java @@ -52,6 +52,9 @@ public class WidgetReceiver extends BroadcastReceiver public static final String ACTION_SET_NUMERICAL_VALUE = "org.isoron.uhabits.ACTION_SET_NUMERICAL_VALUE"; + public static final String ACTION_SET_YESNO_VALUE = + "org.isoron.uhabits.ACTION_SET_YESNO_VALUE"; + private static final String TAG = "WidgetReceiver"; @Override @@ -112,6 +115,15 @@ public class WidgetReceiver extends BroadcastReceiver parser.copyIntentData(intent,numberSelectorIntent); context.startActivity(numberSelectorIntent); break; + case ACTION_SET_YESNO_VALUE: + Log.d(TAG, String.format( + "onSetYesNoValue habit=%d timestamp=%d value=%d", + data.getHabit().getId(), + data.getTimestamp().getUnixTime(), + data.getValue())); + controller.setYesNoValue( + data.getHabit(), data.getTimestamp(), data.getValue()); + break; } } catch (RuntimeException e) diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java index a304f504c..532d5460c 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java @@ -80,4 +80,11 @@ public class WidgetBehavior habit.getId()); } + public void setYesNoValue(@NonNull Habit habit, Timestamp timestamp, int newValue) { + notificationTray.cancel(habit); + commandRunner.execute( + new CreateRepetitionCommand(habitList, habit, timestamp, newValue), + habit.getId()); + } + }