Browse Source

refactor(plugin): modernize plugin architecture and improve type definitions

- Update package.json with modern build tooling and dependencies
- Streamline and enhance TypeScript definitions for better type safety
- Reorganize plugin structure for better maintainability
- Add comprehensive interface definitions for notification features
- Implement proper build configuration with rollup
- Update tsconfig.json for stricter type checking and ES2020 modules

Breaking Changes:
- Changed module structure to use ES modules
- Updated interface definitions with stricter typing
- Removed redundant notification options
- Simplified API surface while maintaining core functionality

Dependencies:
- Upgrade @capacitor dependencies to v5.7.8
- Add rollup and typescript build tools
- Update test framework configuration
master
Matthew Raymer 4 weeks ago
parent
commit
a336b39754
  1. 19
      .eslintrc.json
  2. 66
      .gitignore
  3. BIN
      .gradle/8.13/checksums/checksums.lock
  4. BIN
      .gradle/8.13/checksums/md5-checksums.bin
  5. BIN
      .gradle/8.13/checksums/sha1-checksums.bin
  6. BIN
      .gradle/8.13/executionHistory/executionHistory.bin
  7. BIN
      .gradle/8.13/executionHistory/executionHistory.lock
  8. BIN
      .gradle/8.13/fileChanges/last-build.bin
  9. BIN
      .gradle/8.13/fileHashes/fileHashes.bin
  10. BIN
      .gradle/8.13/fileHashes/fileHashes.lock
  11. BIN
      .gradle/8.13/fileHashes/resourceHashesCache.bin
  12. 0
      .gradle/8.13/gc.properties
  13. BIN
      .gradle/buildOutputCleanup/buildOutputCleanup.lock
  14. 2
      .gradle/buildOutputCleanup/cache.properties
  15. BIN
      .gradle/buildOutputCleanup/outputFiles.bin
  16. BIN
      .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.globals.work.bin
  17. BIN
      .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.strings.work.bin
  18. BIN
      .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/_.work.bin
  19. BIN
      .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/buildfingerprint.bin
  20. BIN
      .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/entry.bin
  21. BIN
      .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/projectfingerprint.bin
  22. 1
      .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/work.bin
  23. BIN
      .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.globals.work.bin
  24. BIN
      .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.strings.work.bin
  25. BIN
      .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/_.work.bin
  26. BIN
      .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/buildfingerprint.bin
  27. BIN
      .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/entry.bin
  28. BIN
      .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/projectfingerprint.bin
  29. BIN
      .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/work.bin
  30. 1
      .gradle/configuration-cache/4hvyddttlxo92r0wto9feha2i/candidates.bin
  31. 1
      .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.globals.work.bin
  32. BIN
      .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.strings.work.bin
  33. BIN
      .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/_.work.bin
  34. BIN
      .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/buildfingerprint.bin
  35. BIN
      .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/entry.bin
  36. BIN
      .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/projectfingerprint.bin
  37. BIN
      .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/work.bin
  38. 1
      .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/.globals.work.bin
  39. BIN
      .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/.strings.work.bin
  40. BIN
      .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/_lib.work.bin
  41. BIN
      .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/buildfingerprint.bin
  42. BIN
      .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/entry.bin
  43. BIN
      .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/projectfingerprint.bin
  44. BIN
      .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/work.bin
  45. 1
      .gradle/configuration-cache/685mgn6n09vojr2sffwrpu5ai/candidates.bin
  46. 1
      .gradle/configuration-cache/6b2wdv4910jdk5r1pwy2wgbme/candidates.bin
  47. 1
      .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/.globals.work.bin
  48. BIN
      .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/.strings.work.bin
  49. BIN
      .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/_lib.work.bin
  50. BIN
      .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/buildfingerprint.bin
  51. BIN
      .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/entry.bin
  52. BIN
      .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/projectfingerprint.bin
  53. BIN
      .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/work.bin
  54. 1
      .gradle/configuration-cache/6czuitwtho9y27nvd4eawu40i/candidates.bin
  55. 1
      .gradle/configuration-cache/7kdhbijltiwsjnddlavxu2zpa/candidates.bin
  56. 1
      .gradle/configuration-cache/8x4ypt5nue0899in5q5whr6kb/candidates.bin
  57. 3
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/.globals.work.bin
  58. BIN
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/.strings.work.bin
  59. BIN
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/_lib.work.bin
  60. 1
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/build.work.bin
  61. BIN
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/buildfingerprint.bin
  62. BIN
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/entry.bin
  63. BIN
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/projectfingerprint.bin
  64. BIN
      .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/work.bin
  65. 1
      .gradle/configuration-cache/amg1wvcaaabrt4jjzabw7fe5w/candidates.bin
  66. BIN
      .gradle/configuration-cache/configuration-cache.lock
  67. 1
      .gradle/configuration-cache/csrr7nvdo4rldjtfl3c2jferq/candidates.bin
  68. 1
      .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/.globals.work.bin
  69. BIN
      .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/.strings.work.bin
  70. BIN
      .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/_.work.bin
  71. BIN
      .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/buildfingerprint.bin
  72. BIN
      .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/entry.bin
  73. BIN
      .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/projectfingerprint.bin
  74. 4
      .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/work.bin
  75. 1
      .gradle/configuration-cache/erwtyj4abzfi70xys5njdh4cd/candidates.bin
  76. 1
      .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/.globals.work.bin
  77. BIN
      .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/.strings.work.bin
  78. BIN
      .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/_lib.work.bin
  79. BIN
      .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/buildfingerprint.bin
  80. BIN
      .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/entry.bin
  81. BIN
      .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/projectfingerprint.bin
  82. BIN
      .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/work.bin
  83. 1
      .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/.globals.work.bin
  84. BIN
      .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/.strings.work.bin
  85. BIN
      .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/_lib.work.bin
  86. BIN
      .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/buildfingerprint.bin
  87. BIN
      .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/entry.bin
  88. BIN
      .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/projectfingerprint.bin
  89. BIN
      .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/work.bin
  90. 0
      .gradle/configuration-cache/gc.properties
  91. BIN
      .gradle/file-system.probe
  92. 0
      .gradle/vcs-1/gc.properties
  93. 10
      .prettierrc
  94. 199
      README.md
  95. 0
      android/Configure
  96. 100
      android/app/build.gradle
  97. 9
      android/app/capacitor.build.gradle
  98. 1
      android/app/src/androidTest/java/com/timesafari/dailynotification/.LCKDailyNotificationPluginTest.java~
  99. 104
      android/app/src/androidTest/java/com/timesafari/dailynotification/DailyNotificationConfigTest.java
  100. 126
      android/app/src/androidTest/java/com/timesafari/dailynotification/DailyNotificationConstantsTest.java

19
.eslintrc.json

@ -0,0 +1,19 @@
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"env": {
"node": true,
"jest": true
},
"rules": {
"@typescript-eslint/explicit-function-return-type": "warn",
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
"no-console": ["warn", { "allow": ["warn", "error"] }]
}
}

66
.gitignore

@ -1,15 +1,61 @@
dist/
# Dependencies
node_modules/
.DS_Store
Pods/
*.iml
npm-debug.log
yarn-debug.log
yarn-error.log
# Build output
dist/
build/
*.tsbuildinfo
# IDE
.idea/
.vscode/
build/
*.tgz
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Android
android/app/build/
android/build/
android/gradle/
android/gradlew
android/gradlew.bat
android/.gradle/
android/local.properties
android/.idea/
android/*.iml
# iOS
ios/Pods/
ios/build/
ios/Podfile.lock
ios/.xcode.env.local
ios/DerivedData/
ios/*.xcworkspace/
ios/*.xcodeproj/*
!ios/*.xcodeproj/project.pbxproj
!ios/*.xcodeproj/xcshareddata/
!ios/*.xcworkspace/contents.xcworkspacedata
# Testing
coverage/
.nyc_output/
# Logs
logs/
*.log
# Ignore Gradle project-specific cache directory
.gradle
# Environment
.env
.env.local
.env.*.local
# Ignore Gradle build output directory
build
# Temporary files
*.tmp
*.temp
.cache/

BIN
.gradle/8.13/checksums/checksums.lock

Binary file not shown.

BIN
.gradle/8.13/checksums/md5-checksums.bin

Binary file not shown.

BIN
.gradle/8.13/checksums/sha1-checksums.bin

Binary file not shown.

BIN
.gradle/8.13/executionHistory/executionHistory.bin

Binary file not shown.

BIN
.gradle/8.13/executionHistory/executionHistory.lock

Binary file not shown.

BIN
.gradle/8.13/fileChanges/last-build.bin

Binary file not shown.

BIN
.gradle/8.13/fileHashes/fileHashes.bin

Binary file not shown.

BIN
.gradle/8.13/fileHashes/fileHashes.lock

Binary file not shown.

BIN
.gradle/8.13/fileHashes/resourceHashesCache.bin

Binary file not shown.

0
.gradle/8.13/gc.properties

BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock

Binary file not shown.

2
.gradle/buildOutputCleanup/cache.properties

@ -0,0 +1,2 @@
#Fri Mar 28 09:01:29 UTC 2025
gradle.version=8.13

BIN
.gradle/buildOutputCleanup/outputFiles.bin

Binary file not shown.

BIN
.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.globals.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/_.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/projectfingerprint.bin

Binary file not shown.

1
.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/work.bin

@ -0,0 +1 @@
_{€ż=lLgÍ’Ĺđßw�xD=‚ŚHç–ÎăzâQbK6ňEĂ+Il/b‹‡zjîíĺěB4Ł˝Čí`Süć8�Oo}]ř�yä~­Űuĺ\”tŁÄžqT€DVEq·Gů5Úb´*r¨üD® ›L¤Ę-dą­CüŇ1ä„'°ćK«±‘%úeţżA'pîâűž9Ö]jPor�zŻT×Ţb_�OĹ«xŮ™WÝ6-˘‘V“i¤yŐ?ęŘ�AB'±Âz'�š¨˙P:ŻB÷�ëcŚÝď\Q¤*Á2Ş˛[µ»+ pTvmoä¬ŮżÝAJş±Ś×yGłŘ’ďď•˝P@fŤkâ—…™`%w �§Whé\Ó»n?±ŞD⏭ďíŃł˂ý±¶őŤŮĽDžr]‚î9ë<lšXÍ7ó4o��€�q?Îľ®e-â˛J¦ť?·ő*

BIN
.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.globals.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/_.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/projectfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/work.bin

Binary file not shown.

1
.gradle/configuration-cache/4hvyddttlxo92r0wto9feha2i/candidates.bin

@ -0,0 +1 @@
6c6d7154-1c12-44da-bab9-788cea5132bå

1
.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.globals.work.bin

@ -0,0 +1 @@
TºlXå�†^)~cÇÈüúŒD

BIN
.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/_.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/projectfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/work.bin

Binary file not shown.

1
.gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/.globals.work.bin

@ -0,0 +1 @@
^«ę©«±e v—a†r“»ĎÝ+×˝

BIN
.gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/_lib.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/projectfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/work.bin

Binary file not shown.

1
.gradle/configuration-cache/685mgn6n09vojr2sffwrpu5ai/candidates.bin

@ -0,0 +1 @@
96e7369f-9457-47f1-8304-05bf876b89fæ

1
.gradle/configuration-cache/6b2wdv4910jdk5r1pwy2wgbme/candidates.bin

@ -0,0 +1 @@
102cc785-1d0d-4dbb-a688-2153e21cdbf¹

1
.gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/.globals.work.bin

@ -0,0 +1 @@
- �f0���Jj�R&�Ν+���

BIN
.gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/_lib.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/projectfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/work.bin

Binary file not shown.

1
.gradle/configuration-cache/6czuitwtho9y27nvd4eawu40i/candidates.bin

@ -0,0 +1 @@
5dbbc9a7-8a29-4ae7-b3f0-33b5a5e5203±

1
.gradle/configuration-cache/7kdhbijltiwsjnddlavxu2zpa/candidates.bin

@ -0,0 +1 @@
f93c619e-5608-44c0-ae77-793c324d124å

1
.gradle/configuration-cache/8x4ypt5nue0899in5q5whr6kb/candidates.bin

@ -0,0 +1 @@
0809f6f5-185b-4807-b8df-47cb0fd7076オ

3
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/.globals.work.bin

@ -0,0 +1,3 @@
M�4�YG�4#����
1z�


BIN
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/_lib.work.bin

Binary file not shown.

1
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/build.work.bin

@ -0,0 +1 @@
�U2 C��'���?��s��9�

BIN
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/projectfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/work.bin

Binary file not shown.

1
.gradle/configuration-cache/amg1wvcaaabrt4jjzabw7fe5w/candidates.bin

@ -0,0 +1 @@
6277d4cb-02d2-4a97-aa8b-c333720dfd7á

BIN
.gradle/configuration-cache/configuration-cache.lock

Binary file not shown.

1
.gradle/configuration-cache/csrr7nvdo4rldjtfl3c2jferq/candidates.bin

@ -0,0 +1 @@
da5353e4-2da1-4b2a-8d76-9f7a80dfac3ä

1
.gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/.globals.work.bin

@ -0,0 +1 @@
ΐ��η«6‰Τ©&U��τ,²bj¤Λa\…Ό‹JLneγϋΒkhυ?滉bΕ άεΨ?UFζΓnά�υβ^

BIN
.gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/_.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/projectfingerprint.bin

Binary file not shown.

4
.gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/work.bin

@ -0,0 +1,4 @@
E[Ď$—ĄqQíëŐĆ>b�Ô‚ŢX›^CÄRKýĘ ˛ŐUöpY˘ćhΖµ• pŠĚüĚ*»R­ze �ć@dVµe_WKy=T$ŐĆ_Wf§ŐnŔš¤!|ŢR©Ş_– ĄÉ�7§ ëíŚ2¶w‰4|–\Ýň:€}ţH�-�´ßßy@2QŠ©KŤČ�‡B@YTŹ
yhůGŤlŃÓsÚe­,
p¨Öěeĺ.‹Î� ëő<ŁĘb�»
Tń�“`”ż¨Ż˙‡.@íŽ";�6źÇ<ĹäíŞďHÜżÔz M1P}¨Řř9s?č…ו,Ń'tGöşWĎÜ:wś©†|ÉŞř‚‰îÉÝ�ť’äŮ=eí2¤|žŮ74�]ôC  …ľŰđ]ńňdT)Bh§ĽˇUfaÜâŚ�5Ęü řR)rŔň)Š�ËKR˘‡FČ�‡ÇcCâ.h(Úą˙Aé�×­

1
.gradle/configuration-cache/erwtyj4abzfi70xys5njdh4cd/candidates.bin

@ -0,0 +1 @@
f64db575-a480-4fdc-82c4-6fc81d961b4ã

1
.gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/.globals.work.bin

@ -0,0 +1 @@
Úß ù¶R¿P<-Op2¥0ÞX«|

BIN
.gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/_lib.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/projectfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/work.bin

Binary file not shown.

1
.gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/.globals.work.bin

@ -0,0 +1 @@
o£Ÿ…mäc-½Œ¬¸ u1¡G

BIN
.gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/.strings.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/_lib.work.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/buildfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/entry.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/projectfingerprint.bin

Binary file not shown.

BIN
.gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/work.bin

Binary file not shown.

0
.gradle/configuration-cache/gc.properties

BIN
.gradle/file-system.probe

Binary file not shown.

0
.gradle/vcs-1/gc.properties

10
.prettierrc

@ -0,0 +1,10 @@
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"bracketSpacing": true,
"arrowParens": "avoid"
}

199
README.md

@ -1,143 +1,146 @@
# Daily Notification Plugin for Capacitor
# Daily Notification Plugin
A Capacitor plugin for scheduling and managing daily notifications with advanced features and robust error handling.
A Capacitor plugin for scheduling and managing daily notifications on Android devices.
## Features
- Schedule daily notifications with custom time and content
- Support for different priority levels
- Timezone-aware scheduling
- Offline support with caching
- Comprehensive permission handling
- Automatic retry logic
- Detailed notification status tracking
- Configurable settings management
- Schedule daily notifications with precise timing
- Handle system state changes (battery, power, etc.)
- Support for adaptive scheduling based on device state
- Background task management
- Battery optimization support
- Rich logging system
- Comprehensive error handling
## Installation
```bash
npm install daily-notification-plugin
npx cap sync
npm install @timesafari/daily-notification-plugin
```
## iOS Setup
No additional setup required for iOS. The plugin automatically handles all necessary configurations.
## Usage
### Basic Usage
```typescript
import { DailyNotification } from 'daily-notification-plugin';
import { DailyNotification } from '@timesafari/daily-notification-plugin';
// Initialize the plugin
const dailyNotification = new DailyNotification();
// Schedule a daily notification
await DailyNotification.scheduleDailyNotification({
url: 'https://api.example.com/updates',
time: '09:00',
title: 'Daily Update',
body: 'Your daily update is ready'
await dailyNotification.scheduleDailyNotification({
sound: true,
priority: 'default',
timezone: 'UTC'
});
```
### Advanced Features
// Get notification status
const status = await dailyNotification.getNotificationStatus();
#### Custom Priority
```typescript
await DailyNotification.scheduleDailyNotification({
url: 'https://api.example.com/updates',
time: '09:00',
// Update settings
await dailyNotification.updateSettings({
sound: false,
priority: 'high'
});
```
#### Timezone Support
// Cancel all notifications
await dailyNotification.cancelAllNotifications();
```typescript
await DailyNotification.scheduleDailyNotification({
url: 'https://api.example.com/updates',
time: '09:00',
timezone: 'America/New_York'
});
// Get battery status
const batteryStatus = await dailyNotification.getBatteryStatus();
// Request battery optimization exemption
await dailyNotification.requestBatteryOptimizationExemption();
```
#### Check Notification Status
## Configuration
```typescript
const status = await DailyNotification.getNotificationStatus();
console.log('Notification status:', status);
```
### Android
#### Update Settings
Add the following permissions to your `AndroidManifest.xml`:
```typescript
await DailyNotification.updateSettings({
sound: true,
priority: 'high',
timezone: 'America/Los_Angeles'
});
```xml
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```
## API Documentation
## Development
### Methods
### Prerequisites
#### scheduleDailyNotification(options: ScheduleOptions)
Schedule a new daily notification.
- Node.js 14 or later
- Android Studio
- Android SDK
- Gradle
#### getLastNotification()
Get information about the last delivered notification.
### Building
#### cancelAllNotifications()
Cancel all pending notifications.
```bash
# Install dependencies
npm install
#### getNotificationStatus()
Get current notification status and settings.
# Build the plugin
npm run build
#### updateSettings(settings: NotificationSettings)
Update notification settings.
# Run tests
npm test
```
#### checkPermissions()
Check current notification permissions.
### Project Structure
#### requestPermissions()
Request notification permissions.
```
daily-notification-plugin/
├── android/ # Android implementation
│ ├── app/ # Main application module
│ └── build.gradle # Root build configuration
├── src/ # TypeScript source
├── tests/ # Test files
├── package.json # Package configuration
└── README.md # This file
```
### Types
## Contributing
```typescript
interface ScheduleOptions {
url: string;
time: string;
title?: string;
body?: string;
sound?: boolean;
priority?: 'high' | 'default' | 'low';
timezone?: string;
}
interface NotificationSettings {
sound?: boolean;
priority?: string;
timezone?: string;
}
```
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## Error Handling
## License
The plugin provides detailed error messages for various scenarios:
- Invalid parameters
- Permission issues
- Scheduling failures
- Invalid time formats
- Invalid timezone identifiers
- Invalid priority values
This project is licensed under the MIT License - see the LICENSE file for details.
## Contributing
## Author
Contributions are welcome! Please read our contributing guidelines and submit pull requests to our GitHub repository.
Matthew Raymer
## License
## Security
This plugin follows security best practices:
- Uses AndroidX for modern security features
- Implements proper permission handling
- Follows Android security guidelines
- Uses secure storage for sensitive data
- Implements proper error handling
- Logs security-relevant events
- Uses secure communication channels
- Implements proper access control
- Follows Android's security model
- Uses secure defaults
## Changelog
MIT License - see LICENSE file for details
### 1.0.0
- Initial release
- Basic notification scheduling
- System state handling
- Battery optimization support
- Background task management
- Rich logging system

0
android/Configure

100
android/app/build.gradle

@ -1,15 +1,12 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'jacoco'
android {
namespace "com.timesafari.dailynotification"
compileSdkVersion 33
buildToolsVersion "33.0.2"
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.timesafari.dailynotification"
minSdkVersion 22
targetSdkVersion 33
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -22,98 +19,27 @@ android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
testOptions {
unitTests.all {
useJUnitPlatform()
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
google()
mavenCentral()
maven {
url "${project.rootDir}/capacitor-cordova-android-plugins/src/main/libs"
}
maven {
url "${project.rootDir}/libs"
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation project(':capacitor-android')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
// Android SDK
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
// AndroidX Core
implementation 'androidx.core:core:1.9.0'
implementation 'androidx.core:core-ktx:1.12.0'
// AndroidX AppCompat
implementation 'androidx.appcompat:appcompat:1.6.1'
// AndroidX Test
testImplementation 'androidx.test:core:1.5.0'
testImplementation 'androidx.test:runner:1.5.2'
testImplementation 'androidx.test.ext:junit:1.1.5'
testImplementation 'androidx.test.espresso:espresso-core:3.5.1'
testImplementation 'androidx.test:rules:1.5.0'
testImplementation 'androidx.test:core-ktx:1.5.0'
// JUnit
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.9.2'
// Mockito
testImplementation 'org.mockito:mockito-core:4.5.1'
testImplementation 'org.mockito:mockito-inline:4.5.1'
// AndroidX WorkManager
implementation 'androidx.work:work-runtime:2.8.1'
// AndroidX Room (for local storage)
implementation 'androidx.room:room-runtime:2.6.1'
annotationProcessor 'androidx.room:room-compiler:2.6.1'
// AndroidX Lifecycle
implementation 'androidx.lifecycle:lifecycle-runtime:2.7.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.7.0'
// AndroidX Security
implementation 'androidx.security:security-crypto:1.1.0-alpha06'
// AndroidX Notification
implementation 'androidx.media:media:1.7.0'
// AndroidX Broadcast
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
// Capacitor dependencies
implementation 'com.getcapacitor:capacitor:5.0.0'
implementation 'com.getcapacitor:capacitor-android:5.0.0'
// Testing dependencies
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test:rules:1.5.0'
androidTestImplementation 'org.mockito:mockito-android:4.5.1'
}
apply from: 'capacitor.build.gradle'
@ -124,5 +50,5 @@ try {
apply plugin: 'com.google.gms.google-services'
}
} catch(Exception e) {
logger.warn("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}

9
android/app/capacitor.build.gradle

@ -9,6 +9,11 @@ android {
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies {
implementation project(':capacitor-android')
implementation project(':capacitor-cordova-android-plugins')
}
if (hasProperty('postBuildExtras')) {
postBuildExtras()
}

1
android/app/src/androidTest/java/com/timesafari/dailynotification/.LCKDailyNotificationPluginTest.java~

@ -1 +0,0 @@
/home/matthew/projects/timesafari/daily-notification-plugin/android/app/src/androidTest/java/com/timesafari/dailynotification/DailyNotificationPluginTest.java

104
android/app/src/androidTest/java/com/timesafari/dailynotification/DailyNotificationConfigTest.java

@ -1,104 +0,0 @@
/**
* DailyNotificationConfigTest.java
* Daily Notification Plugin for Capacitor
*
* Tests for the DailyNotificationConfig
*
* Features:
* - Unit tests
* - Singleton pattern
* - Configuration management
* - Default values
*
* @author Matthew Raymer
*/
package com.timesafari.dailynotification;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.TimeZone;
import static org.junit.Assert.*;
@RunWith(MockitoJUnitRunner.class)
public class DailyNotificationConfigTest {
private DailyNotificationConfig config;
@Before
public void setUp() {
config = DailyNotificationConfig.getInstance();
}
@Test
public void testSingletonPattern() {
DailyNotificationConfig config2 = DailyNotificationConfig.getInstance();
assertSame("Config instances should be the same", config, config2);
}
@Test
public void testDefaultValues() {
assertEquals("Default max notifications should be 10", 10,
config.getMaxNotificationsPerDay());
assertEquals("Default timezone should be system default",
TimeZone.getDefault(), config.getDefaultTimeZone());
assertTrue("Default logging should be enabled", config.isLoggingEnabled());
assertEquals("Default retention days should be 7", 7,
config.getRetentionDays());
}
@Test
public void testMaxNotificationsPerDay() {
config.setMaxNotificationsPerDay(5);
assertEquals("Max notifications should be 5", 5,
config.getMaxNotificationsPerDay());
}
@Test
public void testDefaultTimeZone() {
TimeZone newTimeZone = TimeZone.getTimeZone("America/New_York");
config.setDefaultTimeZone(newTimeZone);
assertEquals("Default timezone should be America/New_York",
newTimeZone, config.getDefaultTimeZone());
}
@Test
public void testLoggingEnabled() {
config.setLoggingEnabled(false);
assertFalse("Logging should be disabled", config.isLoggingEnabled());
config.setLoggingEnabled(true);
assertTrue("Logging should be enabled", config.isLoggingEnabled());
}
@Test
public void testRetentionDays() {
config.setRetentionDays(14);
assertEquals("Retention days should be 14", 14,
config.getRetentionDays());
}
@Test
public void testResetToDefaults() {
// Change values
config.setMaxNotificationsPerDay(5);
config.setDefaultTimeZone(TimeZone.getTimeZone("America/New_York"));
config.setLoggingEnabled(false);
config.setRetentionDays(14);
// Reset to defaults
config.resetToDefaults();
// Verify defaults
assertEquals("Max notifications should be reset to 10", 10,
config.getMaxNotificationsPerDay());
assertEquals("Default timezone should be reset to system default",
TimeZone.getDefault(), config.getDefaultTimeZone());
assertTrue("Logging should be reset to enabled", config.isLoggingEnabled());
assertEquals("Retention days should be reset to 7", 7,
config.getRetentionDays());
}
}

126
android/app/src/androidTest/java/com/timesafari/dailynotification/DailyNotificationConstantsTest.java

@ -1,126 +0,0 @@
/**
* DailyNotificationConstantsTest.java
* Daily Notification Plugin for Capacitor
*
* Tests for the DailyNotificationConstants
*
* Features:
* - Unit tests
* - Constant validation
* - Default values
* - Error messages
*
* @author Matthew Raymer
*/
package com.timesafari.dailynotification;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.*;
@RunWith(MockitoJUnitRunner.class)
public class DailyNotificationConstantsTest {
@Test
public void testDefaultValues() {
assertEquals("Default title should be 'Daily Notification'",
"Daily Notification", DailyNotificationConstants.DEFAULT_TITLE);
assertEquals("Default body should be 'Your daily update is ready'",
"Your daily update is ready", DailyNotificationConstants.DEFAULT_BODY);
}
@Test
public void testNotificationIdentifiers() {
assertTrue("Notification ID prefix should start with 'daily-notification-'",
DailyNotificationConstants.NOTIFICATION_ID_PREFIX.startsWith("daily-notification-"));
assertEquals("Event name should be 'notification'",
"notification", DailyNotificationConstants.EVENT_NAME);
}
@Test
public void testSettingsKeys() {
assertEquals("Sound setting key should be 'sound'",
"sound", DailyNotificationConstants.Settings.SOUND);
assertEquals("Priority setting key should be 'priority'",
"priority", DailyNotificationConstants.Settings.PRIORITY);
assertEquals("Timezone setting key should be 'timezone'",
"timezone", DailyNotificationConstants.Settings.TIMEZONE);
assertEquals("Retry count setting key should be 'retryCount'",
"retryCount", DailyNotificationConstants.Settings.RETRY_COUNT);
assertEquals("Retry interval setting key should be 'retryInterval'",
"retryInterval", DailyNotificationConstants.Settings.RETRY_INTERVAL);
}
@Test
public void testSettingsDefaultValues() {
assertTrue("Default sound should be true",
DailyNotificationConstants.Settings.DEFAULT_SOUND);
assertEquals("Default priority should be 'default'",
"default", DailyNotificationConstants.Settings.DEFAULT_PRIORITY);
assertEquals("Default retry count should be 3",
3, DailyNotificationConstants.Settings.DEFAULT_RETRY_COUNT);
assertEquals("Default retry interval should be 1000",
1000, DailyNotificationConstants.Settings.DEFAULT_RETRY_INTERVAL);
}
@Test
public void testPluginMethodKeys() {
assertEquals("URL key should be 'url'",
"url", DailyNotificationConstants.Keys.URL);
assertEquals("Time key should be 'time'",
"time", DailyNotificationConstants.Keys.TIME);
assertEquals("Title key should be 'title'",
"title", DailyNotificationConstants.Keys.TITLE);
assertEquals("Body key should be 'body'",
"body", DailyNotificationConstants.Keys.BODY);
assertEquals("Sound key should be 'sound'",
"sound", DailyNotificationConstants.Keys.SOUND);
assertEquals("Priority key should be 'priority'",
"priority", DailyNotificationConstants.Keys.PRIORITY);
assertEquals("Timezone key should be 'timezone'",
"timezone", DailyNotificationConstants.Keys.TIMEZONE);
}
@Test
public void testChannelSettings() {
assertEquals("Channel ID should be 'daily_notification_channel'",
"daily_notification_channel", DailyNotificationConstants.Channel.ID);
assertEquals("Channel name should be 'Daily Notifications'",
"Daily Notifications", DailyNotificationConstants.Channel.NAME);
assertEquals("Channel description should be 'Daily notification updates'",
"Daily notification updates", DailyNotificationConstants.Channel.DESCRIPTION);
assertTrue("Channel should enable vibration",
DailyNotificationConstants.Channel.ENABLE_VIBRATION);
assertTrue("Channel should enable lights",
DailyNotificationConstants.Channel.ENABLE_LIGHTS);
}
@Test
public void testTimeConstants() {
assertEquals("Milliseconds per day should be 86400000",
86400000, DailyNotificationConstants.Time.MILLIS_PER_DAY);
assertEquals("Maximum hours should be 24",
24, DailyNotificationConstants.Time.MAX_HOURS);
assertEquals("Maximum minutes should be 60",
60, DailyNotificationConstants.Time.MAX_MINUTES);
}
@Test
public void testErrorMessages() {
assertEquals("Missing parameters error message should be correct",
"Missing required parameters", DailyNotificationConstants.Errors.MISSING_PARAMS);
assertEquals("Invalid time error message should be correct",
"Invalid time format", DailyNotificationConstants.Errors.INVALID_TIME);
assertEquals("Invalid timezone error message should be correct",
"Invalid timezone", DailyNotificationConstants.Errors.INVALID_TIMEZONE);
assertEquals("Invalid priority error message should be correct",
"Invalid priority value", DailyNotificationConstants.Errors.INVALID_PRIORITY);
assertEquals("Scheduling failed error message should be correct",
"Failed to schedule notification", DailyNotificationConstants.Errors.SCHEDULING_FAILED);
assertEquals("Permission denied error message should be correct",
"Notification permission denied", DailyNotificationConstants.Errors.PERMISSION_DENIED);
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save