From 9ff244b3a76711f197ae390a049a0288c07bb51b Mon Sep 17 00:00:00 2001 From: Kawika Heftel Date: Wed, 22 Jul 2020 16:35:29 -0600 Subject: [PATCH 1/5] fix(android): LocalNotification `on` not working properly --- .../plugin/notification/DateMatch.java | 44 +++++++++++-------- .../LocalNotificationManager.java | 6 ++- .../TimedNotificationPublisher.java | 7 ++- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java index 73be127af..72a48ece8 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java @@ -92,46 +92,52 @@ public long nextTrigger(Date date) { * Postpone trigger if first schedule matches the past */ private long postponeTriggerIfNeeded(Calendar current, Calendar next) { - int currentYear = current.get(Calendar.YEAR); - if (matchesUnit(Calendar.YEAR, current, next)) { - next.set(Calendar.YEAR, currentYear + 1); - this.unit = Calendar.YEAR; - } else if (matchesUnit(Calendar.MONTH, current, next)) { - next.set(Calendar.YEAR, currentYear + 1); - this.unit = Calendar.MONTH; - } else if (matchesUnit(Calendar.DAY_OF_MONTH, current, next)) { - next.set(Calendar.MONTH, current.get(Calendar.MONTH) + 1); - this.unit = Calendar.DAY_OF_MONTH; - } else if (matchesUnit(Calendar.HOUR_OF_DAY, current, next)) { - next.set(Calendar.DAY_OF_MONTH, current.get(Calendar.DAY_OF_MONTH) + 1); - this.unit = Calendar.DAY_OF_MONTH; - } else if (matchesUnit(Calendar.MINUTE, current, next)) { - next.set(Calendar.HOUR_OF_DAY, current.get(Calendar.HOUR_OF_DAY) + 1); - this.unit = Calendar.MINUTE; + if (next.getTimeInMillis() <= current.getTimeInMillis() && unit != -1) { + Integer incrementUnit = -1; + if (unit == Calendar.YEAR || unit == Calendar.MONTH) { + incrementUnit = Calendar.YEAR; + } else if (unit == Calendar.DAY_OF_MONTH) { + incrementUnit = Calendar.MONTH; + } else if (unit == Calendar.HOUR_OF_DAY) { + incrementUnit = Calendar.DAY_OF_MONTH; + } else if (unit == Calendar.MINUTE) { + incrementUnit = Calendar.HOUR_OF_DAY; + } + + if (incrementUnit != -1) { + next.set(incrementUnit, next.get(incrementUnit) + 1); + } } + // SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + // Logger.info(Logger.tags("LN"), "Next notification set to " + sdf.format(next.getTime())); return next.getTimeInMillis(); } - private boolean matchesUnit(Integer unit, Calendar current, Calendar next) { - return next.get(unit) < current.get(unit); - } + // private boolean matchesUnit(Integer unit, Calendar current, Calendar next) { + // return next.get(unit) < current.get(unit); + // } private Calendar buildNextTriggerTime(Date date) { Calendar next = buildCalendar(date); if (year != null) { next.set(Calendar.YEAR, year); + if (unit == -1) unit = Calendar.YEAR; } if (month != null) { next.set(Calendar.MONTH, month); + if (unit == -1) unit = Calendar.MONTH; } if (day != null) { next.set(Calendar.DAY_OF_MONTH, day); + if (unit == -1) unit = Calendar.DAY_OF_MONTH; } if (hour != null) { next.set(Calendar.HOUR_OF_DAY, hour); + if (unit == -1) unit = Calendar.HOUR_OF_DAY; } if (minute != null) { next.set(Calendar.MINUTE, minute); + if (unit == -1) unit = Calendar.MINUTE; } return next; } diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java index 7d5e461ae..f29dc622e 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java @@ -32,6 +32,7 @@ import org.json.JSONException; import org.json.JSONObject; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @@ -338,9 +339,12 @@ private void triggerScheduledNotification(Notification notification, LocalNotifi // Cron like scheduler DateMatch on = schedule.getOn(); if (on != null) { + long trigger = on.nextTrigger(new Date()); notificationIntent.putExtra(TimedNotificationPublisher.CRON_KEY, on.toMatchString()); pendingIntent = PendingIntent.getBroadcast(context, request.getId(), notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); - alarmManager.setExact(AlarmManager.RTC, on.nextTrigger(new Date()), pendingIntent); + alarmManager.setExact(AlarmManager.RTC, trigger, pendingIntent); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Logger.info(Logger.tags("LN"), "notification " + request.getId() + " will next fire at " + sdf.format(new Date(trigger))); } } diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java index 260f544d7..8e31b20b9 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java @@ -9,6 +9,7 @@ import android.content.Intent; import com.getcapacitor.Logger; +import java.text.SimpleDateFormat; import java.util.Date; /** @@ -42,8 +43,10 @@ private void rescheduleNotificationIfNeeded(Context context, Intent intent, int long trigger = date.nextTrigger(new Date()); Intent clone = (Intent) intent.clone(); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, id, clone, PendingIntent.FLAG_CANCEL_CURRENT); - alarmManager.set(AlarmManager.RTC, trigger, pendingIntent); + alarmManager.setExact(AlarmManager.RTC, trigger, pendingIntent); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Logger.info(Logger.tags("LN"), "notification " + id + " will next fire at " + sdf.format(new Date(trigger))); } } - + } \ No newline at end of file From 5fc58d9c75f9f6fbf2da4b05f9a2fe151972afec Mon Sep 17 00:00:00 2001 From: Carl Poole Date: Thu, 23 Jul 2020 15:43:46 -0500 Subject: [PATCH 2/5] Removed logging and commented out method after testing --- .../com/getcapacitor/plugin/notification/DateMatch.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java index 72a48ece8..4767eb077 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java @@ -108,15 +108,10 @@ private long postponeTriggerIfNeeded(Calendar current, Calendar next) { next.set(incrementUnit, next.get(incrementUnit) + 1); } } - // SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - // Logger.info(Logger.tags("LN"), "Next notification set to " + sdf.format(next.getTime())); + return next.getTimeInMillis(); } - // private boolean matchesUnit(Integer unit, Calendar current, Calendar next) { - // return next.get(unit) < current.get(unit); - // } - private Calendar buildNextTriggerTime(Date date) { Calendar next = buildCalendar(date); if (year != null) { From bb4f89b289e22398d76c9b8ca8c4ea306dc280a4 Mon Sep 17 00:00:00 2001 From: Carl Poole Date: Thu, 23 Jul 2020 15:53:43 -0500 Subject: [PATCH 3/5] Changed these logs to debug --- .../plugin/notification/LocalNotificationManager.java | 2 +- .../plugin/notification/TimedNotificationPublisher.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java index f29dc622e..1f55d0ec3 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/LocalNotificationManager.java @@ -344,7 +344,7 @@ private void triggerScheduledNotification(Notification notification, LocalNotifi pendingIntent = PendingIntent.getBroadcast(context, request.getId(), notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.setExact(AlarmManager.RTC, trigger, pendingIntent); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - Logger.info(Logger.tags("LN"), "notification " + request.getId() + " will next fire at " + sdf.format(new Date(trigger))); + Logger.debug(Logger.tags("LN"), "notification " + request.getId() + " will next fire at " + sdf.format(new Date(trigger))); } } diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java index 8e31b20b9..835126260 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/TimedNotificationPublisher.java @@ -45,7 +45,7 @@ private void rescheduleNotificationIfNeeded(Context context, Intent intent, int PendingIntent pendingIntent = PendingIntent.getBroadcast(context, id, clone, PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.setExact(AlarmManager.RTC, trigger, pendingIntent); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - Logger.info(Logger.tags("LN"), "notification " + id + " will next fire at " + sdf.format(new Date(trigger))); + Logger.debug(Logger.tags("LN"), "notification " + id + " will next fire at " + sdf.format(new Date(trigger))); } } From 243c69f3a90581c34fc19a30cf638be6307c053d Mon Sep 17 00:00:00 2001 From: Kawika Heftel Date: Fri, 24 Jul 2020 11:52:01 -0600 Subject: [PATCH 4/5] Update android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java Co-authored-by: jcesarmobile --- .../java/com/getcapacitor/plugin/notification/DateMatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java index 4767eb077..443fa2272 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java @@ -108,7 +108,7 @@ private long postponeTriggerIfNeeded(Calendar current, Calendar next) { next.set(incrementUnit, next.get(incrementUnit) + 1); } } - + next.set(Calendar.SECOND, 0); return next.getTimeInMillis(); } From ac48412f0e29280e0ce210fad6d2398071f84bb8 Mon Sep 17 00:00:00 2001 From: Kawika Heftel Date: Fri, 24 Jul 2020 11:58:50 -0600 Subject: [PATCH 5/5] fix: zero calendar millisecond and second in DateMatch --- .../java/com/getcapacitor/plugin/notification/DateMatch.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java index 443fa2272..064cc0e15 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/notification/DateMatch.java @@ -73,6 +73,8 @@ public void setMinute(Integer minute) { private Calendar buildCalendar(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.SECOND, 0); return cal; } @@ -108,7 +110,6 @@ private long postponeTriggerIfNeeded(Calendar current, Calendar next) { next.set(incrementUnit, next.get(incrementUnit) + 1); } } - next.set(Calendar.SECOND, 0); return next.getTimeInMillis(); }