quarck / calendarnotification Goto Github PK
View Code? Open in Web Editor NEWAndroid app extending calendar notifications with snooze button and notifications persistence
License: GNU General Public License v3.0
Android app extending calendar notifications with snooze button and notifications persistence
License: GNU General Public License v3.0
Remove info about next time
This occurs on the Samsung S7. Action to reproduce:
Like as if user was not looking at the phone for a couple of days, then T+1d would result date in the past
$subj
This:
val lastFireTime = Math.max(lastNotification, lastReminder);
val numRemindersFired = (lastFireTime - lastReminder) / interval
val maxFires = settings.maxNumberOfReminders
val silentUntil = QuietHoursManager.getSilentUntil(settings)
if (maxFires == 0 || numRemindersFired <= maxFires) {
is no longer valid with quiet time
In the list of snoozed items, include a function "Snooze all until ..." and allow a date/time to be entered.
It would be great if you could add an option with a drop down menu called snooze for and snooze until and have that populated with many different options. This gives users the ability to size for an exact amount based on the event. I'm including some snap shots.
As described / requested by users:
Allow the user to set a custom notification reminder in minutes that will trigger the notification again if it wasnt snoozed or dismissed.
So if the user doesnt interact with the notification for 5 min (for example) it will trigger the alarm again.
and
if the notification start because an event in the calendar, the ringtone should repeat it self until the user intervene.
The parameters that in your program will be:
- How many time the ringtone will repeat it self, for example 2 time or indefinitely until the user demist or delay the event.
- The delay between repeat ringtone notification.
At least this issue was observed on Sprint Galaxy S6 running android 6.0.1. Notifications all work giving the sound was selected.
java.lang.RuntimeException: Unable to start receiver com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverReminderAlarm: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2955)
at android.app.ActivityThread.access$1800(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1498)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:1015)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:147)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:136)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
at com.github.quarck.calnotify.eventsstorage.EventsStorage.getEventsImpl(EventsStorage.kt:271)
at com.github.quarck.calnotify.eventsstorage.EventsStorage.getEvents(EventsStorage.kt:384)
at com.github.quarck.calnotify.EventsManager.hasActiveEvents(EventsManager.kt:95)
at com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverReminderAlarm$onReceive$1.invoke(BroadcastReceiverReminderAlarm.kt:53)
at com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverReminderAlarm$onReceive$1.invoke(BroadcastReceiverReminderAlarm.kt:39)
at com.github.quarck.calnotify.utils.SystemUtilsKt.wakeLocked(SystemUtils.kt:49)
at com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverReminderAlarm.onReceive(BroadcastReceiverReminderAlarm.kt:49)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2948)
... 9 more
This is a pretty minor issue, but the snooze and dismiss icons' gray color are too light; they should be the same darkness as the text next to them. They also seem slightly low res and blurry on my device (a Nexus 5, which has an XXHDPI screen I think). For comparison, other apps (FastMail and Signal in this case) have crisper and darker icons.
Thanks for the useful app!
Phone: Samsung S7
Situation to reproduce:
Observe:
When looking at the list of items that have had an alarm fire, or are snoozed, sort them by Snooze Date/Time order and re-order when any change is made. This way when a new item enters the list and is snoozed for e.g. 3 hrs, it is resorted down the list into the correct sort location.
$SUBJ
As requested by users:
Add the option to specify the color of the notification led, maybe even different colors for different calendars, the same would go for the notification sound.
Requested by Nils
Probably it would make sense to re-write UI to use fragments instead of activities
It looks that there is accidentally O(N^N) complexity on adding events so when there are already multiple events -- it takes a while to add a new one.
many of these:
05-16 19:26:56.831 30486 30493 W SQLiteConnectionPool: A SQLiteConnection object for database '+data+user+0+com_github_quarck_calnotify+databases+Events' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
Situation:
Current time: 0:40, GMT+1
Alarm time: 1:40, GMT+1 (e.g. in one hour)
Alarm is displayed as "Snoozed until tomorrow, 1:40", while it is already today. GMT offset is not accounted when calculating today / tomorrow (e.g. in GMT+0 timezone current would be 23:40 and alarm time 0:40)
When Calendar Notification Plus is installed via both F-Droid and Google Play, it does not ask for permission to access the calendar. It therefore doesn't work until it is manually given that permission via Android's settings. Tested on a Nexus 5 running Android 6.0.1.
(Sorry, just realized it does the same thing with Google Play, hence the incorrect title.)
$subj
UserVoice has a cost. There might be a free alternative in this list:
http://alternativeto.net/software/uservoice/
$subj
Now there are too many settings for a single screen already
If app is power optimised - it might not fire reminders / alarms precisely
java.lang.RuntimeException: Unable to start receiver com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverEventReminder: java.lang.IllegalStateException: desc must not be null
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2452)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
at android.app.ActivityThread.handleReceiver(Native Method)
at android.app.ActivityThread.access$1700(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: desc must not be null
at com.github.quarck.calnotify.calendar.CalendarUtils.cursorToEventRecord(CalendarUtils.kt:60)
at com.github.quarck.calnotify.calendar.CalendarUtils.getFiredEventsDetails(CalendarUtils.kt:97)
at com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverEventReminder.onReceive(BroadcastReceiverEventReminder.kt:50)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2445)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
at android.app.ActivityThread.handleReceiver(Native Method)
at android.app.ActivityThread.access$1700(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
Like Galaxy Pocket Neo
When an alarm fires, have an option to allow it to wake the screen and display the alarm (I am looking for functionality similar to Calendar Snooze here - I learned about your app from your comments there, thankyou!).
java.lang.RuntimeException: Unable to start receiver com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverCalendarChanged: java.lang.IllegalStateException: location must not be null
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2452)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:595)
at android.app.ActivityThread.handleReceiver(Native Method)
at android.app.ActivityThread.access$1700(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: location must not be null
at com.github.quarck.calnotify.calendar.CalendarUtils.cursorToEventRecord(CalendarUtils.kt:58)
at com.github.quarck.calnotify.calendar.CalendarUtils.getEvent(CalendarUtils.kt:153)
at com.github.quarck.calnotify.EventsManager$Companion.reloadCalendar(EventsManager.kt:89)
at com.github.quarck.calnotify.EventsManager$Companion.onCalendarChanged(EventsManager.kt:154)
at com.github.quarck.calnotify.broadcastreceivers.BroadcastReceiverCalendarChanged.onReceive(BroadcastReceiverCalendarChanged.kt:32)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2445)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:595)
at android.app.ActivityThread.handleReceiver(Native Method)
at android.app.ActivityThread.access$1700(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
$subj
This has to be off by default, but allow user to configure notification dismissal action via press on power / volume buttons.
Requested by David.
More information here:
http://developer.android.com/training/monitoring-device-state/doze-standby.html
Without it, some alarms can fire slightly later
When there are more than 8 events on the screen, new events are not sounded as event is added into "collapsed" area
Reduce priority for "collapsed view" notifications to "main priority minus one"
$subj
05-14 01:40:08.430 28760-28760/com.github.quarck.calnotify W/dalvikvm: DexOpt: resolve class illegal access: Lcom/github/quarck/calnotify/ui/ServiceUINotifier$Companion; -> Lkotlin/jvm/internal/DefaultConstructorMarker;
05-14 01:40:08.430 28760-28760/com.github.quarck.calnotify E/dalvikvm: Could not find class 'kotlin.jvm.internal.DefaultConstructorMarker', referenced from method com.github.quarck.calnotify.ui.ServiceUINotifier$Companion.
05-14 01:40:08.430 28760-28760/com.github.quarck.calnotify W/dalvikvm: VFY: unable to resolve check-cast 2852 (Lkotlin/jvm/internal/DefaultConstructorMarker;) in Lcom/github/quarck/calnotify/ui/ServiceUINotifier$Companion;
05-14 01:40:08.430 28760-28760/com.github.quarck.calnotify D/dalvikvm: VFY: replacing opcode 0x1f at 0x0039
05-14 01:40:08.430 28760-28760/com.github.quarck.calnotify D/ServiceUINotifier: onBind
It seems to be always using default system sound
First label and "enable" checkbox are at the same position
... and implement color picker manually.
That thing doubled *.apk size from 1.18Mb to 2.07Mb
$subj
Could be useful for cyanogenmod ROMs
When a event notification is snoozed, Calendar Notification keeps an open window in the task switcher. Since the point of snoozing the event is to put it out of sight and mind for a certain amount of time, CN should not be visible. Tested on a Nexus 5 running Android 6.0.1.
Thanks.
$subj
E.g. notifications appearing at the top of the screen on Android >= 5.0, when screen is unlocked
I also noticed that the reminders seem to be coming every 5 minutes even though I selected 3 minutes. That is not something I am concerned about since I selected 3 minutes only to make the testing happen faster. I would normally use 10 minutes.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.