From af1ede871576dd140f7607141737e8b5fd8db932 Mon Sep 17 00:00:00 2001 From: Nam Nguyen Date: Thu, 3 Sep 2020 09:36:13 +0700 Subject: [PATCH 1/2] Remove format changes in Replace Yes/No buttons by "Enter" for numerical habits --- .../uhabits/intents/PendingIntentFactory.kt | 16 +++++++------- .../notifications/AndroidNotificationTray.kt | 21 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) 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 7741698b2..cb2f84532 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 @@ -36,7 +36,7 @@ class PendingIntentFactory private val intentFactory: IntentFactory) { fun addCheckmark(habit: Habit, timestamp: Timestamp?): PendingIntent = - getBroadcast( + PendingIntent.getBroadcast( context, 1, Intent(context, WidgetReceiver::class.java).apply { data = Uri.parse(habit.uriString) @@ -46,7 +46,7 @@ class PendingIntentFactory FLAG_UPDATE_CURRENT) fun dismissNotification(habit: Habit): PendingIntent = - getBroadcast( + PendingIntent.getBroadcast( context, 0, Intent(context, ReminderReceiver::class.java).apply { action = WidgetReceiver.ACTION_DISMISS_REMINDER @@ -55,7 +55,7 @@ class PendingIntentFactory FLAG_UPDATE_CURRENT) fun removeRepetition(habit: Habit): PendingIntent = - getBroadcast( + PendingIntent.getBroadcast( context, 3, Intent(context, WidgetReceiver::class.java).apply { action = WidgetReceiver.ACTION_REMOVE_REPETITION @@ -71,8 +71,10 @@ class PendingIntentFactory context, habit)) .getPendingIntent(0, FLAG_UPDATE_CURRENT)!! - fun showReminder(habit: Habit, reminderTime: Long?, timestamp: Long): PendingIntent = - getBroadcast( + fun showReminder(habit: Habit, + reminderTime: Long?, + timestamp: Long): PendingIntent = + PendingIntent.getBroadcast( context, (habit.getId()!! % Integer.MAX_VALUE).toInt() + 1, Intent(context, ReminderReceiver::class.java).apply { @@ -84,7 +86,7 @@ class PendingIntentFactory FLAG_UPDATE_CURRENT) fun snoozeNotification(habit: Habit): PendingIntent = - getBroadcast( + PendingIntent.getBroadcast( context, 0, Intent(context, ReminderReceiver::class.java).apply { data = Uri.parse(habit.uriString) @@ -93,7 +95,7 @@ class PendingIntentFactory FLAG_UPDATE_CURRENT) fun toggleCheckmark(habit: Habit, timestamp: Long?): PendingIntent = - getBroadcast( + PendingIntent.getBroadcast( context, 2, Intent(context, WidgetReceiver::class.java).apply { data = Uri.parse(habit.uriString) 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 f0a3e8d2b..4589c5057 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 @@ -69,11 +69,11 @@ class AndroidNotificationTray } catch (e: RuntimeException) { // Some Xiaomi phones produce a RuntimeException if custom notification sounds are used. Log.i("AndroidNotificationTray", - "Failed to show notification. Retrying without sound.") + "Failed to show notification. Retrying without sound.") val n = buildNotification(habit, - reminderTime, - timestamp, - disableSound = true) + reminderTime, + timestamp, + disableSound = true) notificationManager.notify(notificationId, n) } @@ -95,7 +95,8 @@ class AndroidNotificationTray context.getString(R.string.no), pendingIntents.removeRepetition(habit)) - val enterAction = Action(R.drawable.ic_action_check, + val enterAction = Action( + R.drawable.ic_action_check, context.getString(R.string.enter), pendingIntents.setNumericalValue(context, habit, 0, null)) @@ -110,7 +111,7 @@ class AndroidNotificationTray val builder = Builder(context, REMINDERS_CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setContentTitle(habit.name) - .setContentText(if (habit.question.isBlank()) defaultText else habit.question) + .setContentText(if(habit.question.isBlank()) defaultText else habit.question) .setContentIntent(pendingIntents.showHabit(habit)) .setDeleteIntent(pendingIntents.dismissNotification(habit)) .setSound(null) @@ -137,8 +138,8 @@ class AndroidNotificationTray builder.setLights(Color.RED, 1000, 1000) val snoozeAction = Action(R.drawable.ic_action_snooze, - context.getString(R.string.snooze), - pendingIntents.snoozeNotification(habit)) + context.getString(R.string.snooze), + pendingIntents.snoozeNotification(habit)) wearableExtender.addAction(snoozeAction) builder.addAction(snoozeAction) @@ -153,8 +154,8 @@ class AndroidNotificationTray as NotificationManager if (SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel(REMINDERS_CHANNEL_ID, - context.resources.getString(R.string.reminder), - NotificationManager.IMPORTANCE_DEFAULT) + context.resources.getString(R.string.reminder), + NotificationManager.IMPORTANCE_DEFAULT) notificationManager.createNotificationChannel(channel) } } From 88c9bfcfa53b8ec0be900daa313d7689096c7625 Mon Sep 17 00:00:00 2001 From: Nam Nguyen Date: Fri, 4 Sep 2020 11:03:59 +0700 Subject: [PATCH 2/2] 1. Close Notification drawer after clicking Android Notification Actions 2. Unlock device on clicking notification action --- .../uhabits/notifications/SnoozeDelayPickerActivity.java | 8 ++++++++ .../java/org/isoron/uhabits/receivers/WidgetReceiver.java | 4 +++- .../activities/NumericalCheckmarkWidgetActivity.kt | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java index 0beeb9ca2..7074e02ea 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java @@ -46,6 +46,14 @@ public class SnoozeDelayPickerActivity extends FragmentActivity habit = appComponent.getHabitList().getById(parseId(getIntent().getData())); if (habit == null) finish(); + // Unlock device on clicking notification action + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); + km.requestDismissKeyguard(this, null); + } else { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); + } + int theme = R.style.Theme_AppCompat_Light_Dialog_Alert; dialog = new AlertDialog.Builder(new ContextThemeWrapper(this, theme)) .setTitle(R.string.select_snooze_delay) 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..d8f41c154 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 @@ -67,7 +67,6 @@ public class WidgetReceiver extends BroadcastReceiver IntentParser parser = app.getComponent().getIntentParser(); WidgetBehavior controller = component.getWidgetController(); - Preferences prefs = app.getComponent().getPreferences(); Log.i(TAG, String.format("Received intent: %s", intent.toString())); @@ -105,6 +104,9 @@ public class WidgetReceiver extends BroadcastReceiver data.getTimestamp()); break; case ACTION_SET_NUMERICAL_VALUE: + // close Notification drawer + context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + Intent numberSelectorIntent = new Intent(context, NumericalCheckmarkWidgetActivity.class); numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt index fcba1cce8..916310dfd 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt @@ -51,6 +51,14 @@ class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPi component.notificationTray) widgetUpdater = component.widgetUpdater showNumberSelector(this) + + // Unlock device on clicking notification action + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val km = getSystemService(KEYGUARD_SERVICE) as KeyguardManager + km.requestDismissKeyguard(this, null) + } else { + window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD) + } } override fun onNumberPicked(newValue: Double) {