Compare commits

..
500 Commits
Author SHA1 Message Date
Pranshul 2f4b74cdd1 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-15 19:51:09 +05:30
Pranshul 4c3df3a9e7 Added discord link
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-15 18:28:44 +05:30
Pranshul 17811ccafc Added discord link
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-15 18:25:16 +05:30
Pranshul 2d616d7bb6 Merge branch 'master' of https://github.com/PranshulGG/WeatherMaster 2024-11-15 17:13:01 +05:30
Pranshul 0e3d367125 Updated 1.7.9 2024-11-15 17:11:46 +05:30
Pranshul 9c00bb34f6 Update app.js
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-15 14:57:17 +05:30
Pranshul 7094d76126 fixed #116 2024-11-15 14:56:02 +05:30
Pranshul 888eb78b8d Fixed notification #111 v1.7.8 2024-11-15 14:54:51 +05:30
Pranshul 27f4c7bd9e Fixed notification #111 v1.7.8 2024-11-14 21:50:39 +05:30
Pranshul a23588eb44 Merge branch 'master' of https://github.com/PranshulGG/WeatherMaster 2024-11-14 21:48:58 +05:30
Pranshul a8aa1ea4b8 weather report updated #79 1.7.8 2024-11-14 21:48:21 +05:30
Pranshul 01c8c0d7b7 weather report updated #79 2024-11-14 21:06:48 +05:30
Pranshul 4f39898fff Update output-metadata.json
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-14 14:26:05 +05:30
Pranshul 09198e2077 Delete preview/figma_btn.svg
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-14 14:25:46 +05:30
Pranshul f841b86636 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-14 10:44:55 +05:30
Pranshul 14af368b46 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-13 13:51:18 +05:30
Pranshul 11521a0240 updated 1.7.7 2024-11-11 19:18:15 +05:30
Pranshul 3a9368f8dc added new provider
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-08 08:02:42 +05:30
Pranshul f0210183d5 updated 1.7.6 2024-11-07 13:19:59 +05:30
Pranshul 721e4cf474 updated 1.7.5 2024-11-06 19:57:47 +05:30
Pranshul dc472890f1 updated 1.7.5 2024-11-06 19:49:27 +05:30
Pranshul 442cd39a0a Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-05 09:32:40 +05:30
Pranshul 585084258e Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-05 09:32:25 +05:30
Pranshul 8def261e5c Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 22:56:19 +05:30
Pranshul 4ea966ef1e added some info
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 18:54:43 +05:30
Pranshul aadd8b0e04 added some info
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 18:50:23 +05:30
Pranshul 73a34c3f0a some info related to package name
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 18:42:09 +05:30
Pranshul 654457b7e6 some info related package name
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 18:41:16 +05:30
Pranshul 1063ef81f8 Delete app/src/main/assets/README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 18:40:52 +05:30
Pranshul 0f9ac86115 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 18:40:29 +05:30
Pranshul 73fc34c63b Create README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-11-02 18:36:26 +05:30
Pranshul 993c400ee5 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-31 18:53:21 +05:30
Pranshul 3a0a1a6202 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-31 18:53:00 +05:30
Pranshul 716dce7eff Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-29 20:30:45 +05:30
Pranshul d6b8868353 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-28 19:58:51 +05:30
Pranshul 6c14930f19 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-28 19:58:42 +05:30
Pranshul 8fe55eca53 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-28 19:44:09 +05:30
Pranshul e8681f0f46 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-28 19:32:35 +05:30
Pranshul b8c836e26f Update issue templates 2024-10-28 12:37:10 +05:30
Pranshul 7df25d1337 Update issue templates 2024-10-28 12:35:33 +05:30
Pranshul 2b63ad929b Update issue templates 2024-10-28 12:33:58 +05:30
Pranshul 9992fdc86f updated 1.7.4
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-28 11:25:35 +05:30
Pranshul 4aa983b568 text edit
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-27 21:06:21 +05:30
Pranshul 5f9be07e2f updated 1.7.4 2024-10-27 16:53:35 +05:30
Pranshul da19ae77ad Merge pull request #98 from IzzySoft/fastlane
initial fastlane data from IzzyOnDroid
2024-10-25 18:24:03 +05:30
Izzy 591c345763 initial fastlane data from IzzyOnDroid 2024-10-25 14:29:58 +02:00
Pranshul 0a0dd06680 Merge branch 'master' of https://github.com/PranshulGG/WeatherMaster 2024-10-25 12:34:30 +05:30
Pranshul 39c6e62b19 Fixed froggie image #91 2024-10-25 12:34:14 +05:30
Pranshul 6074ba8906 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-24 19:36:11 +05:30
Pranshul 5cff5d8bb1 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-24 19:30:19 +05:30
Pranshul 0dd4b27da6 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-24 19:29:38 +05:30
Pranshul 397c79bbd7 Merge branch 'master' of https://github.com/PranshulGG/WeatherMaster 2024-10-24 19:24:06 +05:30
Pranshul 8570bb23e9 Added badge 2024-10-24 19:23:46 +05:30
Pranshul c6835c58fb Merge pull request #94 from l3lack-eyes/patch-2
added Persian (fa) to langs.js
2024-10-23 20:43:48 +05:30
l3lack-eyes 86d858ea44 added Persian (fa) to langs.js
Signed-off-by: l3lack-eyes <138435463+l3lack-eyes@users.noreply.github.com>
2024-10-23 17:51:59 +03:30
Pranshul 908f328f13 Updated 1.7.3 2024-10-23 09:54:57 +05:30
Pranshul bb8ebbcdb6 Updated 1.7.2 2024-10-22 21:00:00 +05:30
Pranshul 6a8d33c7b0 Updated 1.7.2 2024-10-22 20:48:52 +05:30
Pranshul 5bb5603248 Updated 1.7.2 2024-10-22 20:48:09 +05:30
Pranshul 126fbeb220 Updated 1.7.0 2024-10-21 19:57:36 +05:30
Pranshul 5d01b49fd9 Updated 1.7.0 2024-10-21 19:57:19 +05:30
Pranshul f58615695d Updated 1.7.0 2024-10-21 19:45:17 +05:30
Pranshul 366f28567f Updated 1.7.0 2024-10-21 19:35:32 +05:30
Pranshul 2f6f616a7a Updated 1.7.0 2024-10-21 19:34:13 +05:30
Pranshul 07db7e8863 Updated 1.6.9 2024-10-20 20:52:54 +05:30
Pranshul ddb7e5148a Updated 1.6.9 2024-10-20 19:17:40 +05:30
Pranshul 2371c1a437 Updated 1.6.9 2024-10-20 19:16:12 +05:30
Pranshul 36f6fd0e34 Added pollen feature 2024-10-18 21:28:24 +05:30
Pranshul 2f03cded8d Updated 1.6.8 2024-10-18 20:16:13 +05:30
Pranshul acff83428b Updated 1.6.8 2024-10-18 20:04:46 +05:30
Pranshul 1fdd8ef68c Merge pull request #80 from er2de2/master
Update langs.js
2024-10-18 11:31:46 +05:30
er2de2 a59d3c2996 Update langs.js
update polish translation

Signed-off-by: er2de2 <62346235+er2de2@users.noreply.github.com>
2024-10-18 06:07:10 +02:00
Pranshul d4437ee0fe Removed table || updated german 2024-10-17 19:19:07 +05:30
Pranshul 711d4619df 1.6.7 Updated 2024-10-17 18:00:44 +05:30
Pranshul a7872fff19 1.6.6 Updated 2024-10-16 15:23:34 +05:30
Pranshul 8cd8ab3a09 1.6.6 Updated 2024-10-16 13:49:30 +05:30
Pranshul e1da57d913 1.6.6 Updated 2024-10-16 12:12:00 +05:30
Pranshul 5e0138907c 1.6.6 Updated 2024-10-15 21:19:17 +05:30
Pranshul aba6fadb52 Merge branch 'master' of https://github.com/PranshulGG/WeatherMaster 2024-10-15 21:10:51 +05:30
Pranshul 355e1fbaa6 1.6.6 Updated 2024-10-15 21:09:54 +05:30
Pranshul 60caa4430d 1.6.6 Updated 2024-10-15 21:08:08 +05:30
Pranshul 32e4081252 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-15 20:10:52 +05:30
Pranshul e5f868c35b 1.6.6 Updated 2024-10-15 20:02:45 +05:30
Pranshul 38368367d4 Merge branch 'master' of https://github.com/PranshulGG/WeatherMaster 2024-10-15 20:02:07 +05:30
Pranshul cff2984b93 Add files via upload
Signed-off-by: Pranshul <hukamisingh94@gmail.com>
2024-10-15 20:01:56 +05:30
Pranshul d3c7962b0a 1.6.6 Updated 2024-10-15 20:01:20 +05:30
Pranshul 6ea2410e2a 1.6.6 Updated 2024-10-15 19:59:42 +05:30
Pranshul 2170970082 Delete weathermaster.jks
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-15 19:57:31 +05:30
Pranshul 24a0ae6015 1.6.6 Updated 2024-10-15 19:56:53 +05:30
Pranshul 684f1c6887 1.6.6 Updated 2024-10-15 19:31:24 +05:30
Pranshul 547de6711a updated 1.6.6 (W) 2024-10-15 19:29:47 +05:30
Pranshul 7e00edf477 Your commit message 2024-10-15 19:29:01 +05:30
Pranshul 873df9a097 1.6.6 Updated 2024-10-15 19:27:15 +05:30
Pranshul 1fe5d703ff day_summary.js added
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-14 19:05:55 +05:30
Pranshul 5175581ab7 soil temperature, soil moisture added
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-14 13:11:59 +05:30
Pranshul 0be0741a24 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-13 08:47:30 +05:30
Pranshul 741f8e6777 screenshots updated
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:38:01 +05:30
Pranshul d52a1d882d screenshots updated
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:36:50 +05:30
Pranshul d589656483 updated screenshots
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:33:26 +05:30
Pranshul 3c296e59ce Add files via upload
Signed-off-by: Pranshul <hukamisingh94@gmail.com>
2024-10-12 22:32:43 +05:30
Pranshul ec0a75a708 Delete preview/radar.png
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:31:59 +05:30
Pranshul eca127c815 screenshots updated
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:28:18 +05:30
Pranshul 9d8ed27fd2 Add files via upload
Signed-off-by: Pranshul <hukamisingh94@gmail.com>
2024-10-12 22:27:49 +05:30
Pranshul 987878031e Delete preview/radar.png
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:27:37 +05:30
Pranshul af16ba7701 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:27:23 +05:30
Pranshul 02cfe1262b Add files via upload
Signed-off-by: Pranshul <hukamisingh94@gmail.com>
2024-10-12 22:27:01 +05:30
Pranshul 95cc6f55ba Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:24:02 +05:30
Pranshul 88adf09d63 Add files via upload
Signed-off-by: Pranshul <hukamisingh94@gmail.com>
2024-10-12 22:21:42 +05:30
Pranshul 7b8e99e718 Delete preview/settings.jpeg
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:21:19 +05:30
Pranshul 78d59ce712 Delete preview/search_screen.png
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:21:12 +05:30
Pranshul e8e77e6f16 Delete preview/rain_8_days.jpeg
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:21:06 +05:30
Pranshul f86dcd1cc2 Delete preview/moonphases.png
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:20:55 +05:30
Pranshul 908c54a9fe Delete preview/map_sun_moon.png
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:20:48 +05:30
Pranshul e2e353d1f9 Delete preview/gov_alert.png
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:20:40 +05:30
Pranshul f869282f57 Delete preview/forecast_page.jpeg
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:20:33 +05:30
Pranshul 9a74bdf776 Delete preview/current.jpeg
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:20:24 +05:30
Pranshul b17aebcea9 Delete preview/details.png
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:20:18 +05:30
Pranshul b42b3c8aa0 Delete preview/air_uv.jpeg
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 22:20:11 +05:30
Pranshul 70c9f2df23 removed user-scale
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 19:02:22 +05:30
Pranshul 308e9ac07c Added met norway as a provider
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-12 15:22:04 +05:30
Pranshul d07c5f8e52 Removed clearSkyDay animation
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-10 19:49:04 +05:30
Pranshul 2f52768d76 Update README.md 2024-10-10 14:19:50 +05:30
Pranshul 9b44734b14 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-09 22:25:18 +05:30
Pranshul 78dcab6ebe Update LICENSE
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-09 22:25:00 +05:30
Pranshul d4e4ce19cb Clear sky animation added for daytime, along with birds and leaves. Beta
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-09 21:52:52 +05:30
Pranshul 7f35fb5e8b Clear sky animation added for daytime, along with birds and leaves.
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-08 22:09:51 +05:30
Pranshul c6883c1455 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-08 15:04:33 +05:30
Pranshul d3576fb557 API updated weatherapi.com
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-06 20:20:05 +05:30
Pranshul 75bc67a62c Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 13:24:58 +05:30
Pranshul 6e8c4bb4d2 Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 13:24:44 +05:30
Pranshul ea3d1eb67b Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 13:16:19 +05:30
Pranshul 6d941f0503 Add files via upload
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 13:13:51 +05:30
Pranshul 9d26fc16a5 Create LICENSE
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 13:06:34 +05:30
Pranshul c11474e424 Add files via upload
Signed-off-by: Pranshul <hukamisingh94@gmail.com>
2024-10-05 13:05:00 +05:30
Pranshul 614d4a2b61 Update apiKeysRotation.js
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 13:03:12 +05:30
Pranshul 70f896478c Create README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 13:01:56 +05:30
Pranshul d420dd7786 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	README.md
#	app/src/main/assets/app/apiKeysRotation.js
#	app/src/main/assets/app/bg_animations.js
#	app/src/main/assets/app/renderWeather.js
#	app/src/main/assets/ui-files/ui.css
2024-10-05 12:59:47 +05:30
Pranshul 56816c4be3 1.6.4 updated 2024-10-05 12:58:21 +05:30
Pranshul 28b277870e Rewrote the entire project 2024-10-05 12:55:24 +05:30
Pranshul 302c94f8e1 1.6.4 Updated 2024-10-05 12:51:21 +05:30
Pranshul d0e4112c6d Update README.md
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-05 12:48:17 +05:30
Pranshul 469b0c47d2 Background animation updated
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-02 21:57:09 +05:30
Pranshul aac561e030 timezone key updated
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-10-01 11:49:33 +05:30
Pranshul 29c87a05c2 Alerts loading delay from 2000ms to 3000ms
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-09-30 22:14:49 +05:30
Pranshul db32742aa0 Text overlay fixed
Signed-off-by: Pranshul <pranshul.devmain@gmail.com>
2024-09-30 08:50:46 +05:30
Pranshul 351a3333e5 User scale removed 2024-09-30 08:11:20 +05:30
Pranshul 309b85cac7 Update README.md 2024-09-29 23:17:48 +05:30
Pranshul 149df5c6c8 Removed Moon Phases page 2024-09-29 20:51:23 +05:30
Pranshul fdd9456ff4 Update README.md 2024-09-29 13:01:24 +05:30
Pranshul a3cf119d7a Updated bg_animations.js 2024-09-29 08:32:35 +05:30
Pranshul 43a93fc1a0 Animations added: fog, cloudy, rain, thunder, stars 2024-09-28 11:53:45 +05:30
Pranshul 4f14dc6777 Added background animation file 2024-09-27 21:34:37 +05:30
Pranshul 2a85211c2d Update apiKeysRotation.js 2024-09-26 21:48:12 +05:30
Pranshul d20473ff04 Delete weathermaster.jks 2024-09-26 21:29:30 +05:30
Pranshul 3c0c2bda43 Changed background 2024-09-26 19:50:08 +05:30
Pranshul 04199f297b API URL updated 2024-09-26 10:38:57 +05:30
Pranshul c26e188791 Update README.md 2024-09-25 21:03:11 +05:30
Pranshul 580b574212 Update README.md 2024-09-25 16:15:47 +05:30
Pranshul f3e3dddfe7 Add files via upload 2024-09-25 16:06:22 +05:30
Pranshul 8b8e610a96 Update README.md 2024-09-25 15:38:52 +05:30
Pranshul ac040099bf Update figma_btn.svg 2024-09-25 15:38:31 +05:30
Pranshul 69e123fc7c Update README.md 2024-09-25 15:35:13 +05:30
Pranshul d20022afa1 Update and rename translate_btn.svg to figma_btn.svg 2024-09-25 15:34:50 +05:30
Pranshul 55f8c68913 Update README.md 2024-09-25 14:17:28 +05:30
Pranshul bc33e0abcf Removed 2000ms delay on navigation 2024-09-25 11:46:18 +05:30
Pranshul 5427836d6f Update fetch 2024-09-25 09:04:06 +05:30
Pranshul 33049709ec Updated API url 2024-09-25 09:03:11 +05:30
Pranshul c20f04b213 Removed country list 2024-09-25 09:00:19 +05:30
Pranshul 9f160b5032 Error message updated radar page 2024-09-24 20:04:41 +05:30
Pranshul 1377f9cc22 Update components.js 2024-09-24 14:34:13 +05:30
Pranshul e387460838 Fixed wind arrow 2024-09-24 08:22:44 +05:30
Pranshul 256dabf848 Merge remote-tracking branch 'origin/master' 2024-09-23 22:07:25 +05:30
Pranshul deee5cc6d6 1.6.3 updated 2024-09-23 22:07:11 +05:30
Pranshul 488d729592 Update README.md 2024-09-23 22:05:57 +05:30
Pranshul 46bb029cbe Merge remote-tracking branch 'origin/master' 2024-09-23 21:58:04 +05:30
Pranshul 711ca8f6e1 1.6.3 updated 2024-09-23 21:55:22 +05:30
Pranshul 81485d948e Update README.md 2024-09-23 08:31:20 +05:30
Pranshul 8509ba6881 Update README.md 2024-09-18 18:00:00 +05:30
Pranshul 01ff58743f Update README.md 2024-09-17 21:44:57 +05:30
Pranshul 68d1140516 Update README.md 2024-09-17 15:58:01 +05:30
Pranshul 525e54c113 Update README.md 2024-09-17 15:30:58 +05:30
Pranshul bb2e8bd162 Add files via upload 2024-09-16 23:12:46 +05:30
Pranshul d2acdc8955 Delete preview/thumbnail.png 2024-09-16 23:12:29 +05:30
Pranshul cd58bacf6e Update README.md 2024-09-16 22:52:37 +05:30
Pranshul 46d9e86d53 Add files via upload 2024-09-16 22:51:44 +05:30
Pranshul 58db7fbcb5 Update README.md 2024-09-16 22:41:11 +05:30
Pranshul 8b741f51ff Add files via upload 2024-09-16 22:40:40 +05:30
Pranshul 47bd440181 Merge remote-tracking branch 'origin/master' 2024-09-16 21:11:58 +05:30
Pranshul 56623ce870 added language files | removed notifications file 2024-09-16 21:11:52 +05:30
Pranshul 7f3c58f0af Update README.md 2024-09-16 20:47:57 +05:30
Pranshul 41e2fbbc80 Merge remote-tracking branch 'origin/master' 2024-09-16 20:40:23 +05:30
Pranshul 1972687e2d added language files | removed notifications file 2024-09-16 20:40:10 +05:30
Pranshul 0d9abb0f78 Update README.md 2024-09-14 18:25:28 +05:30
Pranshul f99ca0926f Update README.md 2024-09-14 18:25:13 +05:30
Pranshul e343b1ad94 Updated 2024-09-14 18:19:05 +05:30
Pranshul 9ace809542 Delete preview/translate_btn.png 2024-09-14 18:12:59 +05:30
Pranshul fc5a7fccea Add files via upload 2024-09-14 18:10:02 +05:30
PranshulGG 2a8d3fb210 Merge remote-tracking branch 'origin/master' 2024-09-14 00:04:29 +05:30
PranshulGG d30b7827f7 1.6.1 updated 2024-09-14 00:04:20 +05:30
Pranshul 4565038b1a Update README.md 2024-09-14 00:03:18 +05:30
PranshulGG 8bec6a8229 Merge remote-tracking branch 'origin/master' 2024-09-11 21:05:54 +05:30
PranshulGG a275f19381 1.5.9 updated 2024-09-11 21:05:40 +05:30
Pranshul 4f0a1751f9 Update README.md 2024-09-11 21:04:01 +05:30
Pranshul 5b698d0b50 Update README.md 2024-09-10 21:38:43 +05:30
Pranshul db2679192a Update README.md 2024-09-10 18:01:06 +05:30
Pranshul 138362a3db Update README.md 2024-09-10 17:59:12 +05:30
PranshulGG f9047b9939 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	app/src/main/assets/index.html
2024-09-10 17:56:04 +05:30
Pranshul 29f454e1e7 Add files via upload 2024-09-10 17:52:42 +05:30
Pranshul 6ffaa232a5 Delete preview/current.jpeg 2024-09-10 17:52:33 +05:30
PranshulGG f6a83ccfb9 1.5.8 updated 2024-09-10 17:42:56 +05:30
Pranshul 084084e1f8 Update README.md 2024-09-10 17:41:31 +05:30
Pranshul 845f10e7d9 Merge pull request #27 from PinguDEV-original/rename-today-to-24h-forecast
Rename 'Today' to '24-Hour Forecast'
2024-09-06 20:31:45 +05:30
Pinguin 575b9841a5 Rename 'Today' to '24-Hour Forecast' 2024-09-06 16:50:20 +02:00
Pranshul fd83f13d36 Update README.md 2024-09-05 09:55:02 +05:30
Pranshul 3a8b033d85 Update README.md 2024-09-05 09:54:32 +05:30
Pranshul 4f3ddb641e Update README.md 2024-09-04 13:20:18 +05:30
Pranshul f68115d270 Update README.md 2024-09-03 19:51:52 +05:30
PranshulGG bc449524fc Merge remote-tracking branch 'origin/master' 2024-09-03 19:50:49 +05:30
Pranshul 9c9485a54a Update README.md 2024-09-03 19:47:48 +05:30
PranshulGG 6db9d21293 1.5.7 updated 2024-09-03 19:46:48 +05:30
Pranshul b5594c2d5c Update README.md 2024-09-02 08:36:06 +05:30
Pranshul 372b23347c Update README.md 2024-08-31 22:14:53 +05:30
PranshulGG 6acb265ec7 Merge remote-tracking branch 'origin/master' 2024-08-30 23:22:20 +05:30
PranshulGG c39255774e 1.5.6 updated 2024-08-30 23:22:14 +05:30
Pranshul 68bb514e54 Update README.md 2024-08-30 23:19:59 +05:30
PranshulGG 20fb956f36 Merge remote-tracking branch 'origin/master' 2024-08-30 11:29:39 +05:30
PranshulGG e57f67a416 1.5.5 updated 2024-08-30 11:29:33 +05:30
Pranshul fcf83d935c Update README.md 2024-08-30 11:25:49 +05:30
Pranshul 27149216a1 Update README.md 2024-08-29 22:47:41 +05:30
Pranshul 82418bf058 Update README.md 2024-08-28 18:49:33 +05:30
Pranshul f0efb45168 Update README.md 2024-08-28 16:15:41 +05:30
PranshulGG 9a39f833d8 Merge remote-tracking branch 'origin/master' 2024-08-27 23:19:19 +05:30
PranshulGG 706ccf7e26 1.5.4 updated 2024-08-27 23:19:09 +05:30
Pranshul 2cde29bf13 Update README.md 2024-08-27 23:15:20 +05:30
PranshulGG a00b922056 Merge remote-tracking branch 'origin/master' 2024-08-27 12:40:43 +05:30
PranshulGG 5ce6f21804 1.5.3 updated 2024-08-27 12:40:36 +05:30
Pranshul 3102208c1d Update README.md 2024-08-27 12:32:46 +05:30
PranshulGG e5c8bb4b77 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	app/src/main/assets/app/app.js
#	app/src/main/assets/pages/alertPage.html
2024-08-26 14:10:14 +05:30
PranshulGG 97f63a5fec 1.5.2 updated 2024-08-26 14:09:40 +05:30
Pranshul af58d16478 Update README.md 2024-08-26 14:02:37 +05:30
Pranshul dbb7d7e338 Update scroll.js 2024-08-25 12:40:36 +05:30
Pranshul d6bafdd156 Update README.md 2024-08-24 19:57:29 +05:30
Pranshul 07fb35e555 Update README.md 2024-08-24 16:04:42 +05:30
Pranshul bc209605e6 Update README.md 2024-08-24 16:04:24 +05:30
Pranshul 431a8c85aa Update alertPage.html 2024-08-24 13:29:46 +05:30
Pranshul 632dfd450f Update app.js 2024-08-24 13:27:57 +05:30
PranshulGG 4ee8c3c73d Merge remote-tracking branch 'origin/master' 2024-08-24 13:26:34 +05:30
PranshulGG 5833903cd5 1.5.1 updated 2024-08-24 13:26:30 +05:30
Pranshul 1a61f42d1e Update README.md 2024-08-24 13:09:08 +05:30
PranshulGG de4a4ffbb1 Merge remote-tracking branch 'origin/master' 2024-08-24 13:04:52 +05:30
PranshulGG f5eb40dbc1 1.5.1 updated 2024-08-24 13:04:45 +05:30
Pranshul 7611579f30 Update README.md 2024-08-23 23:08:41 +05:30
Pranshul b68dedbdc0 Update apiKeysRotation.js 2024-08-23 22:14:12 +05:30
Pranshul e47e47ba94 Update README.md 2024-08-23 21:50:05 +05:30
PranshulGG 093cea9c45 Merge remote-tracking branch 'origin/master' 2024-08-23 20:42:34 +05:30
PranshulGG 16b05b04e1 1.5.0 updated 2024-08-23 20:42:01 +05:30
Pranshul dc84c12ba2 Update README.md 2024-08-23 20:38:49 +05:30
PranshulGG bc7cb28b56 1.4.9 updated 2024-08-23 13:19:38 +05:30
PranshulGG f0d689bae7 Merge remote-tracking branch 'origin/master' 2024-08-23 13:17:01 +05:30
PranshulGG d95d1fbc86 1.4.9 updated 2024-08-23 13:16:56 +05:30
Pranshul 7a36d89d53 Update README.md 2024-08-23 13:16:54 +05:30
PranshulGG eaef994eca Merge remote-tracking branch 'origin/master' 2024-08-23 13:14:05 +05:30
PranshulGG c55ae3eb92 1.4.9 updated 2024-08-23 13:13:26 +05:30
Pranshul 8bd22bb3ae Update README.md 2024-08-22 22:38:53 +05:30
Pranshul 9d6cc8cc39 Update README.md 2024-08-22 22:32:57 +05:30
Pranshul 8fcc3d42f0 Update README.md 2024-08-22 22:24:14 +05:30
Pranshul 81a8386c2a Update README.md 2024-08-22 22:23:47 +05:30
Pranshul 77e9eb78dc Update README.md 2024-08-22 22:20:03 +05:30
Pranshul 676c7070f4 Update README.md 2024-08-22 22:19:26 +05:30
Pranshul 83e0ec83f7 Add files via upload 2024-08-22 22:18:34 +05:30
Pranshul 197b3dc708 Update README.md 2024-08-22 22:18:18 +05:30
Pranshul 3fdd200427 Add files via upload 2024-08-22 21:15:10 +05:30
Pranshul 74f7b33a8c Delete preview/settings.jpeg 2024-08-22 21:15:00 +05:30
PranshulGG 81df5b8c82 Merge remote-tracking branch 'origin/master' 2024-08-22 20:05:17 +05:30
PranshulGG 35ef2b39c1 1.4.8 updated 2024-08-22 20:05:12 +05:30
Pranshul 3857c9fc09 Update README.md 2024-08-22 19:58:48 +05:30
PranshulGG 9619c86e83 Merge remote-tracking branch 'origin/master' 2024-08-22 19:55:39 +05:30
PranshulGG 7b0363f5c4 1.4.8 updated 2024-08-22 19:55:34 +05:30
Pranshul 2a5642ed3a Update README.md 2024-08-22 18:58:57 +05:30
Pranshul 1057d4fca6 Update README.md 2024-08-22 18:58:44 +05:30
Pranshul b1c80784a8 Update README.md 2024-08-22 15:19:21 +05:30
PranshulGG 5304fef58b 1.4.7 updated 2024-08-22 15:14:28 +05:30
PranshulGG a354c9a5b4 Merge remote-tracking branch 'origin/master' 2024-08-22 15:13:51 +05:30
PranshulGG 7e8cf4c580 1.4.7 updated 2024-08-22 15:13:37 +05:30
Pranshul 73438160ca Update README.md 2024-08-22 11:16:25 +05:30
Pranshul 3a2e513801 Update README.md 2024-08-22 11:09:47 +05:30
Pranshul a4a220f8b1 Update README.md 2024-08-21 22:24:55 +05:30
Pranshul 201b23943b Add files via upload 2024-08-21 22:23:48 +05:30
Pranshul 5da2c06361 Delete preview/rain_8_days.png 2024-08-21 22:23:34 +05:30
Pranshul e84d44520d Delete preview/air_uv.png 2024-08-21 22:23:27 +05:30
Pranshul 554e6921bf Delete preview/current.png 2024-08-21 22:23:18 +05:30
Pranshul a531660d5e Delete preview/settings.png 2024-08-21 22:23:11 +05:30
Pranshul b6cefd0f60 Update README.md 2024-08-21 16:02:08 +05:30
Pranshul 047a0a31e6 Update README.md 2024-08-21 16:00:21 +05:30
PranshulGG b9c259f01c Merge remote-tracking branch 'origin/master' 2024-08-21 15:53:17 +05:30
PranshulGG a545a27738 1.4.6 updated 2024-08-21 15:53:10 +05:30
Pranshul 689d5e3335 Update README.md 2024-08-21 09:17:15 +05:30
Pranshul 9eff2c822f Update README.md 2024-08-20 20:32:36 +05:30
Pranshul d908745573 Update README.md 2024-08-20 18:28:45 +05:30
PranshulGG bc25ea771e 1.4.5 updated 2024-08-20 18:25:02 +05:30
PranshulGG ef64a87c02 1.4.5 updated 2024-08-20 18:24:26 +05:30
PranshulGG b6f3c0c119 Merge remote-tracking branch 'origin/master' 2024-08-19 21:20:53 +05:30
PranshulGG 144550e770 1.4.4 updated 2024-08-19 21:20:47 +05:30
Pranshul 3dde738477 Update README.md 2024-08-19 21:19:01 +05:30
Pranshul 88fe45be25 Update README.md 2024-08-19 21:18:03 +05:30
Pranshul 3ece93ee05 Update README.md 2024-08-19 21:17:38 +05:30
PranshulGG bc747eaed3 1.4.4 updated 2024-08-19 21:08:09 +05:30
PranshulGG 1ed44bd0d2 1.4.3 updated 2024-08-19 13:52:07 +05:30
PranshulGG a93a1346d1 1.4.3 updated 2024-08-19 13:50:22 +05:30
PranshulGG 37a83f3a41 1.4.3 updated 2024-08-19 13:49:51 +05:30
PranshulGG fc9a194f0d 1.4.2 updated 2024-08-18 22:22:33 +05:30
PranshulGG e6557c9b11 1.4.2 updated 2024-08-18 22:16:50 +05:30
PranshulGG 775ddd5d9c 1.4.2 updated 2024-08-18 22:15:59 +05:30
PranshulGG 15b5b65ee4 1.4.1 updated 2024-08-16 20:17:10 +05:30
PranshulGG cb22065786 1.4.1 updated 2024-08-16 20:13:58 +05:30
PranshulGG 24dcf4e0f9 1.4.1 updated 2024-08-16 20:13:27 +05:30
PranshulGG debb6a95cc Merge remote-tracking branch 'origin/master' 2024-08-16 20:12:07 +05:30
PranshulGG d0f704efd9 1.4.1 updated 2024-08-16 20:12:00 +05:30
Pranshul 8505955a99 Update README.md 2024-08-11 19:59:41 +05:30
Pranshul e25e333c9a Update README.md 2024-08-06 21:46:42 +05:30
Pranshul d4907e2927 Update README.md 2024-08-06 21:45:04 +05:30
Pranshul 514f5e8d28 Update README.md 2024-08-06 21:36:40 +05:30
Pranshul e264f2c728 Add files via upload 2024-08-06 21:36:11 +05:30
Pranshul c95d87bd93 Update README.md 2024-08-06 21:35:43 +05:30
Pranshul 10ba7ce8dc Delete screenshots directory 2024-08-06 21:27:58 +05:30
Pranshul f807c78afe Update README.md 2024-08-06 21:13:59 +05:30
PranshulGG 35531544e8 1.4.0 updated 2024-08-06 20:55:58 +05:30
PranshulGG 5c464d9e32 1.4.0 updated 2024-08-06 20:52:45 +05:30
PranshulGG 822b9917df 1.4.0 updated 2024-08-06 20:34:41 +05:30
PranshulGG 7b5678fdb0 1.4.0 updated 2024-08-06 20:33:45 +05:30
PranshulGG 16e91fe96e 1.3.7 updated 2024-08-04 23:47:44 +05:30
PranshulGG 5f0556348d 1.3.7 updated 2024-08-04 23:43:31 +05:30
PranshulGG 9d453e3923 1.3.6 updated 2024-08-04 20:16:54 +05:30
PranshulGG d2af5b7461 Merge remote-tracking branch 'origin/master' 2024-08-04 19:43:40 +05:30
PranshulGG 9dc1e4a7d8 1.3.6 updated 2024-08-04 19:43:34 +05:30
Pranshul da8ec6977f Update README.md 2024-08-02 22:16:35 +05:30
Pranshul ebf35b0cda Update README.md 2024-08-02 22:16:19 +05:30
Pranshul 7a7ce8b310 Update README.md 2024-08-02 22:15:01 +05:30
Pranshul ef3d022bcf Update README.md 2024-08-02 22:11:58 +05:30
Pranshul 47628908d9 Update README.md 2024-08-02 22:08:54 +05:30
PranshulGG 43b48bcb18 Merge remote-tracking branch 'origin/master' 2024-07-31 23:40:37 +05:30
PranshulGG 42655190c2 1.3.5 updated 2024-07-31 23:40:32 +05:30
Pranshul 7b351b70c8 Update README.md 2024-07-31 22:59:47 +05:30
Pranshul 93ac1a44c6 Update README.md 2024-07-31 21:26:26 +05:30
PranshulGG 35bf96024e 1.3.5 updated 2024-07-31 21:24:43 +05:30
PranshulGG f9c82f4156 1.3.5 updated 2024-07-31 21:22:08 +05:30
PranshulGG 17b10db0d3 Merge remote-tracking branch 'origin/master' 2024-07-31 21:16:06 +05:30
PranshulGG 8c5a8e6267 1.3.5 updated 2024-07-31 21:15:53 +05:30
Pranshul 8429204a23 Update README.md 2024-07-30 22:28:49 +05:30
PranshulGG 924d328e02 Merge remote-tracking branch 'origin/master' 2024-07-30 21:00:19 +05:30
PranshulGG 75b6445152 1.3.4 updated 2024-07-30 21:00:13 +05:30
Pranshul 3b87aae42e Add files via upload 2024-07-30 20:48:02 +05:30
Pranshul 6b9cdd261c Add files via upload 2024-07-30 20:46:57 +05:30
Pranshul 2732073c85 Delete screenshots directory 2024-07-30 20:46:38 +05:30
Pranshul e8e2d50839 Update README.md 2024-07-30 20:03:10 +05:30
PranshulGG e84aaeebd7 Merge remote-tracking branch 'origin/master' 2024-07-30 17:18:48 +05:30
PranshulGG 80c4e619d2 1.3.4 updated 2024-07-30 17:18:41 +05:30
Pranshul baef120023 Update README.md 2024-07-30 00:30:37 +05:30
PranshulGG 2e1dc3f615 Merge remote-tracking branch 'origin/master' 2024-07-30 00:27:02 +05:30
PranshulGG 4977a60818 1.3.3 updated 2024-07-30 00:26:55 +05:30
Pranshul ce646715b2 Add files via upload 2024-07-29 13:46:15 +05:30
Pranshul 7dfb821e62 Delete screenshots directory 2024-07-29 13:45:46 +05:30
PranshulGG 440676c1cf 1.3.2 updated 2024-07-29 00:24:31 +05:30
PranshulGG c7b93a8bb4 1.3.2 updated 2024-07-29 00:21:17 +05:30
PranshulGG 0d0adcfbfe 1.3.2 updated 2024-07-29 00:10:30 +05:30
PranshulGG f406a202ac 1.3.2 updated 2024-07-29 00:06:57 +05:30
PranshulGG 941db8202f Merge remote-tracking branch 'origin/master' 2024-07-29 00:06:46 +05:30
PranshulGG 123bf2829b 1.3.2 updated 2024-07-29 00:06:29 +05:30
Pranshul dee87ddb76 Update README.md 2024-07-29 00:03:11 +05:30
PranshulGG 99bfa6e9c5 Merge remote-tracking branch 'origin/master' 2024-07-28 23:53:20 +05:30
PranshulGG a63a7345b7 1.3.2 updated 2024-07-28 23:53:12 +05:30
Pranshul a89cc1dfd2 Update README.md 2024-07-28 15:19:03 +05:30
Pranshul 6f822a2be3 Update README.md 2024-07-27 23:49:33 +05:30
Pranshul e40fc20915 Add files via upload 2024-07-27 23:49:08 +05:30
Pranshul a0128fdb3b Delete screenshots directory 2024-07-27 23:48:48 +05:30
PranshulGG 8b4d58d218 Merge remote-tracking branch 'origin/master' 2024-07-27 23:32:35 +05:30
PranshulGG d538d69c0c 1.3.1 updated 2024-07-27 23:32:30 +05:30
Pranshul 9137cbadec Delete .idea directory 2024-07-27 23:32:26 +05:30
PranshulGG 7135784416 1.3.1 updated 2024-07-27 23:31:20 +05:30
PranshulGG 68b85cd735 1.3.1 updated 2024-07-27 23:30:20 +05:30
PranshulGG df9b0019d9 1.3.1 updated 2024-07-27 23:28:55 +05:30
PranshulGG bb165a433a 1.3.1 updated 2024-07-27 22:41:55 +05:30
PranshulGG a8f603e6f3 Merge remote-tracking branch 'origin/master' 2024-07-27 22:34:46 +05:30
PranshulGG b721a1f502 1.3.1 updated 2024-07-27 22:34:40 +05:30
Pranshul 5e45d47086 Add files via upload 2024-07-27 18:56:21 +05:30
Pranshul 1131f3b30c Delete screenshots directory 2024-07-27 18:55:53 +05:30
Pranshul d05f44eefe Add files via upload 2024-07-27 18:52:36 +05:30
Pranshul 86dcf5f245 Delete screenshots directory 2024-07-27 18:52:17 +05:30
PranshulGG cb22027a07 Merge remote-tracking branch 'origin/master' 2024-07-27 18:30:28 +05:30
PranshulGG 1a6f822479 1.3.0 updated 2024-07-27 18:30:22 +05:30
Pranshul ab3642df38 Update README.md 2024-07-25 09:13:13 +05:30
Pranshul 34590cc644 Update README.md 2024-07-25 09:10:53 +05:30
PranshulGG 30921d7611 1.2.9 updated 2024-07-23 22:00:07 +05:30
PranshulGG 03112cff3d Merge remote-tracking branch 'origin/master' 2024-07-23 21:54:26 +05:30
PranshulGG 1da05f7977 1.2.9 updated 2024-07-23 21:54:19 +05:30
Pranshul d2aa9b8725 Update README.md 2024-07-22 22:47:40 +05:30
PranshulGG 2a9c6b72de 1.2.8 updated 2024-07-22 20:34:34 +05:30
PranshulGG e4d2b90db2 1.2.8 updated 2024-07-22 20:31:35 +05:30
PranshulGG b376f71d71 1.2.8 updated 2024-07-22 20:30:59 +05:30
PranshulGG 2024698ff9 Merge remote-tracking branch 'origin/master' 2024-07-22 19:27:18 +05:30
PranshulGG 80fd48a0f5 1.2.8 updated 2024-07-22 19:26:45 +05:30
Pranshul 177f7f7d90 Update README.md 2024-07-22 16:53:51 +05:30
Pranshul 83a86d8281 Update README.md 2024-07-21 23:06:05 +05:30
Pranshul 5a6d8c1737 Add files via upload 2024-07-21 23:05:07 +05:30
Pranshul 4dbf0346dd Delete screenshots directory 2024-07-21 23:02:46 +05:30
PranshulGG 13d0cd65b6 1.2.7 updated 2024-07-21 22:53:12 +05:30
PranshulGG a7961f25e6 1.2.7 updated 2024-07-21 22:52:43 +05:30
PranshulGG 6880ca5002 Merge remote-tracking branch 'origin/master' 2024-07-21 22:33:44 +05:30
PranshulGG 1efab4398c 1.2.7 updated 2024-07-21 22:33:34 +05:30
Pranshul 0e71b43681 Update README.md 2024-07-21 18:06:01 +05:30
PranshulGG eac7854367 1.2.6 updated 2024-07-21 18:02:05 +05:30
PranshulGG 8b11235874 Merge remote-tracking branch 'origin/master' 2024-07-21 18:01:48 +05:30
PranshulGG f97e5bff69 1.2.6 updated 2024-07-21 18:01:39 +05:30
Pranshul 4138353d90 Update README.md 2024-07-19 20:07:56 +05:30
PranshulGG 0709c70933 1.2.4 updated 2024-07-17 20:42:57 +05:30
PranshulGG 0f1cb7fc46 1.2.4 updated 2024-07-17 20:27:37 +05:30
PranshulGG 51d9d9e7cd 1.2.4 updated 2024-07-17 20:13:33 +05:30
PranshulGG 27b9e49434 Merge remote-tracking branch 'origin/master' 2024-07-17 20:11:56 +05:30
PranshulGG 0f291ddabe 1.2.4 updated 2024-07-17 20:11:45 +05:30
Pranshul ac16bc5cb5 Update README.md 2024-07-17 12:02:48 +05:30
PranshulGG 9115bb70af 1.2.3 updated 2024-07-16 22:05:50 +05:30
PranshulGG 779ff65f2a 1.2.2 updated 2024-07-16 13:46:53 +05:30
PranshulGG 2a80c5bf3a 1.2.2 updated 2024-07-16 13:41:01 +05:30
PranshulGG c07c67e7ba Merge remote-tracking branch 'origin/master' 2024-07-15 23:34:56 +05:30
PranshulGG eb533aafd0 1.2.1 updated 2024-07-15 23:34:48 +05:30
Pranshul 0f776ac60f Add files via upload 2024-07-15 23:32:15 +05:30
Pranshul 77e0a9c9d0 Delete screenshots/img_sunMoon.jpeg 2024-07-15 23:31:46 +05:30
PranshulGG 7abf650497 Merge remote-tracking branch 'origin/master' 2024-07-15 23:26:30 +05:30
PranshulGG 80e1dc2071 1.2.1 updated 2024-07-15 23:26:09 +05:30
Pranshul cde17fff5a Update README.md 2024-07-15 20:42:31 +05:30
Pranshul 03276ac8a0 Add files via upload 2024-07-15 20:41:30 +05:30
Pranshul a0da9446ac Delete screenshots/img_5.jpeg 2024-07-15 20:40:23 +05:30
Pranshul 7d870502c6 Delete screenshots/Img_2.jpeg 2024-07-15 20:40:14 +05:30
Pranshul fa4355936d Update README.md 2024-07-15 20:34:02 +05:30
PranshulGG f66d96b967 1.2.0 updated 2024-07-15 20:30:27 +05:30
PranshulGG 00fe4002eb 1.1.9 updated 2024-07-14 19:36:15 +05:30
PranshulGG 15c051ef11 1.1.9 updated 2024-07-14 19:09:07 +05:30
PranshulGG bb50d96fbe Merge remote-tracking branch 'origin/master' 2024-07-14 18:48:21 +05:30
PranshulGG ed543652c3 1.1.9 updated 2024-07-14 18:48:08 +05:30
Pranshul b377edcd8e Update README.md 2024-07-14 18:11:18 +05:30
PranshulGG be90cafbe6 1.1.9 updated 2024-07-14 18:07:25 +05:30
PranshulGG 2c9a3db6bd 1.1.8 updated 2024-07-13 22:38:23 +05:30
PranshulGG 714aa0cd15 Merge remote-tracking branch 'origin/master' 2024-07-13 22:29:03 +05:30
PranshulGG 1d9eafc7ad 1.1.8 updated 2024-07-13 22:28:51 +05:30
Pranshul 8a43d216c0 Update README.md 2024-07-13 15:14:35 +05:30
Pranshul 0affed00bc Add files via upload 2024-07-13 15:13:40 +05:30
Pranshul 685a54fcf6 Delete screenshots directory 2024-07-13 15:13:21 +05:30
PranshulGG b78c0acee1 1.1.7 updated 2024-07-13 12:44:01 +05:30
PranshulGG dbb4fc4d39 1.1.7 updated 2024-07-13 12:38:19 +05:30
PranshulGG 39a35e8772 1.1.7 updated 2024-07-13 12:34:23 +05:30
Pranshul 90e3041004 Update app.js 2024-07-13 11:18:17 +05:30
Pranshul c7fe849019 Update README.md 2024-07-12 21:45:44 +05:30
Pranshul 3d11b83d12 Update README.md 2024-07-12 21:45:04 +05:30
Pranshul 51a1ed9789 Add files via upload 2024-07-12 21:43:31 +05:30
Pranshul d69efc672c Delete screenshots directory 2024-07-12 19:18:47 +05:30
PranshulGG 6684b707fd 1.1.6 updated 2024-07-12 19:15:44 +05:30
PranshulGG bf2d2363ce Merge remote-tracking branch 'origin/master' 2024-07-12 19:15:09 +05:30
PranshulGG 8a1ffdf973 1.1.6 updated 2024-07-12 19:14:43 +05:30
PranshulGG 21985370ec 1.1.6 updated 2024-07-12 19:14:21 +05:30
Pranshul db90b0f08c Update README.md 2024-07-11 22:46:56 +05:30
Pranshul c1b5bc9a86 Update README.md 2024-07-11 22:43:57 +05:30
Pranshul 9c55f9d346 Add files via upload 2024-07-11 22:41:23 +05:30
Pranshul d616342fcc Delete imgs directory 2024-07-11 22:40:05 +05:30
PranshulGG f50fb24ab4 1.1.5 updated 2024-07-11 21:26:07 +05:30
PranshulGG 2617fd5ab4 Merge remote-tracking branch 'origin/master' 2024-07-11 21:17:41 +05:30
PranshulGG 5f9c3de599 1.1.5 updated 2024-07-11 21:16:29 +05:30
PranshulGG 28f27d145f 1.1.3 updated 2024-07-06 20:34:56 +05:30
Pranshul 115d22c0c8 Update README.md 2024-06-19 20:18:36 +05:30
Pranshul f48ada8393 Update README.md 2024-06-19 20:10:01 +05:30
Pranshul 3cce03db2e Update README.md 2024-06-19 20:04:09 +05:30
Pranshul 2b7ace23f1 Add files via upload 2024-06-19 20:03:28 +05:30
Pranshul 3b253005e9 Delete preview directory 2024-06-19 20:02:35 +05:30
Pranshul 5920608aa1 Add files via upload 2024-06-19 20:00:32 +05:30
Pranshul 9bee5d3122 Delete preview/5.png 2024-06-19 20:00:01 +05:30
Pranshul 278c8859ca Delete preview/4.png 2024-06-19 19:59:42 +05:30
Pranshul f5a01422be Delete preview/3.png 2024-06-19 19:59:34 +05:30
Pranshul ee92f5e931 Delete preview/2.png 2024-06-19 19:59:27 +05:30
Pranshul 9282db2407 Delete preview/1.png 2024-06-19 19:59:20 +05:30
PranshulGG 59b10fe4c4 1.1.3 updated 2024-06-19 14:22:58 +05:30
PranshulGG 3632466130 Merge remote-tracking branch 'origin/master' 2024-06-19 14:11:14 +05:30
PranshulGG 2e89f154cf 1.1.3 updated 2024-06-19 14:03:42 +05:30
Pranshul dd9be44e2b Update README.md 2024-06-18 00:29:39 +05:30
PranshulGG 01d42ee5e2 updated app 2024-06-17 14:19:13 +05:30
PranshulGG 6de6311fb0 updated build.gradle , app 2024-06-17 14:14:30 +05:30
PranshulGG e94e638198 Merge remote-tracking branch 'origin/master' 2024-06-17 14:08:21 +05:30
PranshulGG 9ba27220c2 updated build.gradle , app 2024-06-17 14:08:09 +05:30
Pranshul f973dd51ef Update README.md 2024-06-17 12:24:58 +05:30
Pranshul 6d6d95299e Update README.md 2024-06-16 21:51:43 +05:30
Pranshul de9465f179 Update README.md 2024-06-16 21:51:00 +05:30
Pranshul 38530d4c39 Update README.md 2024-06-16 19:50:49 +05:30
Pranshul b77d0df48b Create README.md 2024-06-16 19:50:39 +05:30
Pranshul 7596f23c36 Add files via upload 2024-06-16 19:46:55 +05:30
Pranshul 7555280c0d Create LICENSE 2024-06-16 19:14:09 +05:30
PranshulGG 4a6c58eb63 updated MainActivity 2024-06-16 19:08:29 +05:30
PranshulGG 228dcd44e2 updated MainActivity 2024-06-16 19:04:02 +05:30
PranshulGG e5715cd2c8 updated themes 2024-06-16 18:59:45 +05:30
PranshulGG d6fc0c8126 updated app.js 2024-06-16 18:55:36 +05:30
PranshulGG 1c65fdee7b Release 2024-06-16 18:53:12 +05:30
PranshulGG 255a375210 Release 2024-06-16 18:51:19 +05:30
PranshulGG 2232d1bbd8 Release 2024-06-16 18:49:27 +05:30
1205 changed files with 59616 additions and 97881 deletions

No files matched your search

-4
View File
@@ -1,4 +0,0 @@
# These are supported funding model platforms
github: [PranshulGG]
ko_fi: pranshulgg
liberapay: PranshulGG
+36
View File
@@ -0,0 +1,36 @@
---
name: Bug report
about: Bug reports help identify and fix issues or unexpected behaviors in the app.
title: ''
labels: ''
assignees: ''
---
## Bug Description
A clear and concise description of the issue.
### Steps to Reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
### Expected Behavior
What you expected to happen.
### Actual Behavior
What actually happens.
### Screenshots
If applicable, add screenshots to help explain the problem.
### Environment
- OS: [e.g., Windows, macOS, Ubuntu]
- App version: [e.g., v1.0.0]
- Device: [e.g., iPhone 12, Samsung Galaxy S21]
- Browser (if applicable): [e.g., Chrome, Safari]
### Additional Context
Add any other context or logs about the problem here.
-51
View File
@@ -1,51 +0,0 @@
name: Bug Report
description: Report a bug
labels: [ "bug" ]
body:
- type: markdown
attributes:
value: |
Please fill out the sections below to help everyone identify and fix the bug
- type: textarea
id: description
attributes:
label: Describe your issue
placeholder: When I click here this happens
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce
placeholder: |
1. Go to page X
2. Click here
3. Click there
validations:
required: true
- type: textarea
id: expected
attributes:
label: What was the expected result?
placeholder: I expected this to happen
- type: input
id: source_used
attributes:
label: Which weather source are you using?
placeholder: Example "Open Meteo"
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Put here any screenshots or videos (optional)
- type: checkboxes
id: acknowledgementsCheck
attributes:
label: Acknowledgements
description: Your issue will be closed if you don’t read this carefully.
options:
- label: I have reviewed the existing issues to confirm that this is a unique report and not related to any currently open or closed tickets.
required: true
- label: I understand that this app is provided as-is, without any guarantees, and I might not receive a response to my request. Sometimes you might not get the response you want.
required: true
+23
View File
@@ -0,0 +1,23 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
## Feature Request
A clear and concise description of the feature you're requesting.
### Problem Statement
Describe the problem or limitation you're facing that the new feature would solve.
### Proposed Solution
Explain how you think the feature should work.
### Alternatives Considered
Describe any alternative solutions or features you've considered.
### Additional Context
Add any other context or screenshots about the feature request here.
@@ -1,51 +0,0 @@
name: Feature Request
description: Suggest an idea to improve this project
body:
- type: markdown
attributes:
value: |
Please provide detailed information to help us understand your idea and its potential impact.
- type: textarea
id: description
attributes:
label: Problem Statement
placeholder: Describe the problem or limitation you're facing that the new feature would solve.
description: Clearly explain the challenge or issue you're encountering to help us understand the context.
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed Solution
placeholder: Explain how you think the feature should work and address the problem.
description: Describe the solution in detail, including any specific behaviors or functionality it should have.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives Considered
placeholder: Describe any alternative solutions or features you've considered.
description: If there are other ways to solve the issue, please share them here.
- type: textarea
id: additional
attributes:
label: Additional Context
placeholder: Provide any extra details, links, or examples that might help clarify your request.
description: This field is optional but highly encouraged if you have additional information.
- type: checkboxes
id: acknowledgementsCheck
attributes:
label: Acknowledgements
description: Please confirm the following before submitting your feature request
options:
- label: I have searched the existing issues and discussions to ensure this feature has not already been requested.
required: true
- label: I understand that submitting a request does not guarantee it will be implemented.
required: true
- label: I have provided all necessary information to clearly explain my request.
required: true
- type: markdown
attributes:
value: |
Thank you for suggesting an improvement! Your feedback is valuable, and we will review it as soon as possible.
-30
View File
@@ -1,30 +0,0 @@
name: New source
description: Suggest an new source
body:
- type: markdown
attributes:
value: |
Please fill out the sections below
- type: textarea
id: api_link
attributes:
label: Link to publicly available API or Docs
placeholder: Link here
validations:
required: true
- type: textarea
id: details
attributes:
label: Additional details/context about this source
validations:
required: true
- type: checkboxes
id: acknowledgementsCheck
attributes:
label: Acknowledgements
description: Your issue will be closed if you don’t read this carefully.
options:
- label: I have reviewed the existing issues to confirm that this is a unique report and not related to any currently open or closed tickets.
required: true
- label: I understand that this app is provided as-is, without any guarantees, and I might not receive a response to my request. Sometimes you might not get the response you want.
required: true
+28
View File
@@ -0,0 +1,28 @@
---
name: 'UI/UX Issue '
about: UI/UX issues highlight problems related to the user interface or experience.
title: ''
labels: ''
assignees: ''
---
## UI/UX Issue
A clear and concise description of the user interface or user experience problem.
### Steps to Reproduce
1. Go to '...'
2. Click on '...'
3. Observe the UI/UX issue.
### Expected Behavior
What you expected the interface or experience to be like.
### Actual Behavior
What is currently happening.
### Screenshots
Provide screenshots of the UI/UX issue, if applicable.
### Additional Context
Any additional context, such as suggestions for improvement.
-65
View File
@@ -1,65 +0,0 @@
name: WeatherMaster Signed Release
on:
workflow_dispatch:
push:
tags:
- "*"
jobs:
build:
runs-on: ubuntu-24.04
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
GEO_NAMES_USERNAME: ${{ secrets.GEO_NAMES_USERNAME }}
MF_KEY: ${{ secrets.MF_KEY }}
ACCU_KEY: ${{ secrets.ACCU_KEY }}
WEATHERAPI_KEY: ${{ secrets.WEATHERAPI_KEY }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: "21.0.7"
- name: Setup Android SDK
uses: android-actions/setup-android@v3
with:
packages: 'platform-tools'
- name: Decode keystore
run: |
mkdir keystore
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > keystore/release.jks
- name: Verify environment
run: |
java -version
./gradlew --version
- name: Build signed APK
run: |
./gradlew \
--no-daemon \
--no-build-cache \
-PGEO_NAMES_USERNAME="${{ secrets.GEO_NAMES_USERNAME }}" \
-PMF_KEY="${{ secrets.MF_KEY }}" \
-PACCU_KEY="${{ secrets.ACCU_KEY }}" \
-PWEATHERAPI_KEY="${{ secrets.WEATHERAPI_KEY }}" \
clean assembleRelease
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: signed-release-apk
path: app/build/outputs/apk/release/*.apk
-3
View File
@@ -13,6 +13,3 @@
.externalNativeBuild
.cxx
local.properties
/weathermaster.jks
/.idea
gradle.properties
+3
View File
@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/app/src/main/assets/pages/forecastPage.html" charset="UTF-8" />
</component>
</project>
+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="jbr-17" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
</project>
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

@@ -0,0 +1,29 @@
Index: README.md
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+> # WeatherMaster \r\n \r\n<img src=\"https://github.com/PranshulGG/WeatherMaster/blob/master/app/src/main/assets/weather-icons/02d.svg?short_path=21e6bd2\" alt=\"\" width=\"150px\">\r\n\r\nWeatherMaster is developed with pure HTML, CSS, JavaScript, and Java. Designed to mimic the look and feel of a native Android app.\r\n\r\n\r\n# \uD83D\uDC41️ Preview\r\n\r\n<div > \r\n<img alt=\"App image\" src=\"screenshots/1.png\" width=\"30%\" style=\"border-radius: 10px;\">\r\n<img alt=\"App image\" src=\"screenshots/2.png\" width=\"30%\">\r\n<img alt=\"App image\" src=\"screenshots/3.png\" width=\"30%\">\r\n<img alt=\"App image\" src=\"screenshots/4.png\" width=\"30%\">\r\n<img alt=\"App image\" src=\"screenshots/5.png\" width=\"30%\">\r\n \r\n</div>\r\n\r\n<br>\r\n\r\n\r\n# \uD83D\uDCF2 Download\r\n\r\n<p align=\"left\">\r\n <a href=\"https://github.com/PranshulGG/WeatherMaster/releases\"><img alt=\"GitHub\" src=\"https://github.com/PranshulGG/CalcMaster-A-Calculator-App/blob/master/previewed/badge_github.png\" height=\"120\"/></a>\r\n</p>\r\n\r\n\r\n# ✨ Features:\r\n\r\n - <strong>Native Android Experience: </stronge>Enjoy a user interface and interaction that closely resemble a native Android Weather app.\r\n \r\n - <strong>Material Design: </stronge>The app is built using Material Web Components, ensuring a clean, consistent, and visually appealing design.\r\n\r\n - <strong>Customization Options: </stronge>Enjoy a ton of customization options. Adjust themes, Units.\r\n \r\n - <strong>Responsive Design: </stronge>WeatherMaster is fully responsive for all mobile devices.\r\n \r\n - <strong>User-Friendly Interface: </stronge>The app's interface is designed to be straightforward and user-friendly.\r\n\r\n\r\n# \uD83D\uDEE0️ Built With:\r\n\r\n - <strong>HTML & CSS: </stronge> For the basic structure and styling of the app.\r\n \r\n - <strong>JavaScript: </stronge>To handle the app's logic and interactivity.\r\n\r\n - <strong>Weather data: </stronge> Using <a href=\"https://openweathermap.org/\">OpenWeatherMap</a> to fetch weather and <a href=\"https://ipgeolocation.io/\">ipgeolocation.io</a> for Moonset and Moonrise timings\r\n\r\n - <strong>Java: </stronge>Mainly used for JavaScript interface and permissions, allowing the app to run on Android devices.\r\n \r\n - <strong>Material Web Components: </stronge>Utilized to create a consistent and attractive Material Design look and feel.\r\n\r\n - <strong>Weather icons</strong>: <a href=\"https://gitlab.com/bignutty/google-weather-icons\">Google weather icons\r\n\r\n # \uD83D\uDCDD Todos:\r\n \r\n - ⬛ Make it lightweight\r\n - ⬛ Notification alerts\r\n - ⬛ A feature that allows you to add multiple locations\r\n - ⬛ More detailed weather\r\n - ✅ Change app colors according to the weather\r\n \r\n<br>\r\n<br>\r\n\r\n> [!NOTE]\r\n> The app is designed to run on Android devices and does not support web browsers. Attempting to open the app in a browser will not work.\r\n\r\n<br>\r\n\r\n\r\n# Contact\r\nFor any questions or feedback, feel free to open an issue on GitHub or contact pranshul.devmain@gmail.com\r\n\r\n<br>\r\n\r\n# License\r\nThis project is licensed under the MIT License. See the `LICENSE` file for details.\r\n\r\n\r\n\r\n\r\n\r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/README.md b/README.md
--- a/README.md (revision dbb4fc4d3912cc1ed4676def82edb8120a7814a4)
+++ b/README.md (date 1720854695916)
@@ -8,11 +8,13 @@
# 👁️ Preview
<div >
-<img alt="App image" src="screenshots/1.png" width="30%" style="border-radius: 10px;">
-<img alt="App image" src="screenshots/2.png" width="30%">
-<img alt="App image" src="screenshots/3.png" width="30%">
-<img alt="App image" src="screenshots/4.png" width="30%">
-<img alt="App image" src="screenshots/5.png" width="30%">
+<img alt="App image" src="screenshots/img_1.jpeg" width="30%" style="border-radius: 10px;">
+<img alt="App image" src="screenshots/Img_2.jpeg" width="30%">
+<img alt="App image" src="screenshots/img_3.jpeg" width="30%">
+<img alt="App image" src="screenshots/img_4.jpeg" width="30%">
+<img alt="App image" src="screenshots/img_5.jpeg" width="30%">
+<img alt="App image" src="screenshots/img_6.jpeg" width="30%">
+
</div>
@@ -0,0 +1,59 @@
<changelist name="Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]" date="1720854808110" recycled="false" toDelete="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]/shelved.patch" />
<option name="DESCRIPTION" value="Uncommitted changes before Update at 13-07-2024 12:43 pm [Changes]" />
<binary>
<option name="BEFORE_PATH" value="screenshots/3.png" />
<option name="AFTER_PATH" />
<option name="SHELVED_PATH" />
</binary>
<binary>
<option name="BEFORE_PATH" />
<option name="AFTER_PATH" value="screenshots/img_1.jpeg" />
<option name="SHELVED_PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]/img_1.jpeg" />
</binary>
<binary>
<option name="BEFORE_PATH" value="screenshots/4.png" />
<option name="AFTER_PATH" />
<option name="SHELVED_PATH" />
</binary>
<binary>
<option name="BEFORE_PATH" />
<option name="AFTER_PATH" value="screenshots/img_4.jpeg" />
<option name="SHELVED_PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]/img_4.jpeg" />
</binary>
<binary>
<option name="BEFORE_PATH" value="screenshots/5.png" />
<option name="AFTER_PATH" />
<option name="SHELVED_PATH" />
</binary>
<binary>
<option name="BEFORE_PATH" value="screenshots/1.png" />
<option name="AFTER_PATH" />
<option name="SHELVED_PATH" />
</binary>
<binary>
<option name="BEFORE_PATH" />
<option name="AFTER_PATH" value="screenshots/img_3.jpeg" />
<option name="SHELVED_PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]/img_3.jpeg" />
</binary>
<binary>
<option name="BEFORE_PATH" />
<option name="AFTER_PATH" value="screenshots/img_6.jpeg" />
<option name="SHELVED_PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]/img_6.jpeg" />
</binary>
<binary>
<option name="BEFORE_PATH" />
<option name="AFTER_PATH" value="screenshots/img_5.jpeg" />
<option name="SHELVED_PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]/img_5.jpeg" />
</binary>
<binary>
<option name="BEFORE_PATH" value="screenshots/2.png" />
<option name="AFTER_PATH" />
<option name="SHELVED_PATH" />
</binary>
<binary>
<option name="BEFORE_PATH" />
<option name="AFTER_PATH" value="screenshots/Img_2.jpeg" />
<option name="SHELVED_PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_13-07-2024_12_43_pm_[Changes]/Img_2.jpeg" />
</binary>
</changelist>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
-66
View File
@@ -1,66 +0,0 @@
# Contributing to WeatherMaster
Thanks for contributing to WeatherMaster :P Before opening a PR, please read
through the guidelines below. They are intended to keep the codebase
consistent and make contributions easier to review and maintain
## Before Contributing
Before starting work on a contribution, please open an issue first and
describe what you would like to change.
For small changes like typo fixe or other
obvious minor fixes, opening an issue is optional
## General stuff
- Keep changes focused and avoid unrelated refactors.
- Follow the existing architecture and patterns used in the project.
- Prefer reusing existing abstractions over introducing new ones.
- Don't introduce a new pattern or framework for a single feature.
- Keep platform-independent logic independent of UI code where
possible
- Avoid unnecessary changes to existing behavior.
## Adding a New Weather Source
The goal is that adding a new source should primarily require changes to the
source itself, rather than adding special cases throughout the codebase
When implementing a new source:
- Use the existing source abstractions and interfaces.
- Do not add source-specific UI.
- Do not add source-specific logic to existing UI components.
- If the source requires information that the existing architecture cannot
represent, discuss the change before implementing a
source-specific workaround
## AI-Assisted Contributions
AI tools are allowed, but contributors are expected to understand and take
ownership of the code they submit
Please disclose AI usage in your PR description, including what the AI was
used for
PRs that appear to be largely or entirely AI-generated without meaningful
review, understanding, or contribution from the author will be closed
## Attributions
Add your attribution above the feature you implemented. Attribution should only be added for feature
implementations
For example:
```kt
/**
* Initial YOUR_FEATURE integration implemented by https://github.com/YOUR_GITHUB
*/
```
_Thanks :P_
-57
View File
@@ -1,57 +0,0 @@
# Privacy Policy
WeatherMaster is an open-source application.
We respect your privacy. The application itself does **not**:
- Collect, store, or share personal information.
- Track your IP address, usage data, or device identifiers.
- Send personal data to us directly.
---
## Third-Party Services & APIs
WeatherMaster relies on external weather and geolocation services to provide forecasts and
location-based functionality.
These third-party services may process certain technical information, including:
- IP address
- Approximate or precise location data
- Device or network-related information required for API requests
This data processing is handled by the respective service providers under their own privacy
policies. WeatherMaster itself does not control or store this data.
---
## Location Permission
The app may request access to your device's location to display local weather information.
- Granting location permission is optional.
- Your precise location is used locally within the app to fetch weather data from external APIs.
- WeatherMaster does not store your precise location.
---
## Children
This application is not directed toward children under the age of 13 and does not knowingly collect
personal information.
---
## Changes
This Privacy Policy may be updated from time to time. Continued use of the app after changes become
effective constitutes acceptance of the revised policy.
---
## Contact
If you have any questions about privacy, please contact:
**Email:** <pranshul.devmain@gmail.com>
+107 -96
View File
@@ -1,11 +1,12 @@
<div align="center">
<img src="preview/icon.png" alt="" width="150px">
</div>
<img src="https://github.com/PranshulGG/WeatherMaster/blob/master/preview/partly_cloudy_day.svg" alt="" width="120px">
</div>
<h1 align="center">
WeatherMaster
</h1>
<div align="center">
<img src="https://img.shields.io/github/license/PranshulGG/WeatherMaster?style=for-the-badge&color=cba6f7&labelColor=302D41">
<img src="https://img.shields.io/github/repo-size/PranshulGG/WeatherMaster?style=for-the-badge&color=cba6f7&labelColor=302D41">
<img src="https://img.shields.io/github/last-commit/PranshulGG/WeatherMaster?style=for-the-badge&color=b1d18a&labelColor=1f3701">
<img src="https://img.shields.io/github/release/PranshulGG/WeatherMaster?style=for-the-badge&color=dbc66e&labelColor=3a3000">
<br>
@@ -14,124 +15,134 @@
<a href="https://discord.gg/sSW2E4nqmn">
<img src="https://img.shields.io/discord/1302477023410782229?label=Discord&style=for-the-badge&color=ffb0c8&labelColor=541d32">
</a>
</div>
<div align="center">
<img src="https://shields.rbtlog.dev/simple/com.pranshulgg.weather_master_app?style=for-the-badge" alt="RB Status">
</div>
<div align="center">
<h3>WeatherMaster: inspired by the Google Pixel weather app.</h3>
</div>
<div align="center">
[Features](https://github.com/PranshulGG/WeatherMaster?tab=readme-ov-file#-features) • [Contact](https://github.com/PranshulGG/WeatherMaster?tab=readme-ov-file#%EF%B8%8F-contact) • [License](https://github.com/PranshulGG/WeatherMaster?tab=readme-ov-file#%EF%B8%8F-license) • [Translate](https://github.com/PranshulGG/WeatherMaster?tab=readme-ov-file#-translate-the-app-on-crowdin)
</div>
[Features](https://github.com/PranshulGG/WeatherMaster?tab=readme-ov-file#-features) • [Contact](https://github.com/PranshulGG/WeatherMaster?tab=readme-ov-file#contact) • [License](https://github.com/PranshulGG/WeatherMaster?tab=readme-ov-file#license)
</div>
<div align="center">
<a href="https://github.com/PranshulGG/WeatherMaster/releases"><img alt="GitHub" src="preview/get_on_github_btn.png" height="80"/></a>
<a href="https://apt.izzysoft.de/fdroid/index/apk/com.pranshulgg.weather_master_app"><img alt="GitHub" src="preview/get_on_izzy_btn.png" height="80"/></a>
<a href="https://play.google.com/store/apps/details?id=com.pranshulgg.weather_master"><img alt="GitHub" src="preview/get_on_googleplay_btn.png" height="80"/></a></div>
<a href="https://github.com/PranshulGG/WeatherMaster/releases"><img alt="GitHub" src="https://censorship.no/img/github-badge.png" height="80"/></a>
<a href="https://apt.izzysoft.de/fdroid/index/apk/com.example.weathermaster"><img alt="GitHub" src="preview/download_Btn.png" height="80"/></a></div>
<br>
![app_thumbnail](preview/new_thumbnail.png)
![app_thumbnail](preview/thumbnail.png)
# 👁️ Screenshots
<div align="center">
<img src="preview/preview_1.png" width="250">
<img src="preview/preview_2.png" width="250">
<img src="preview/preview_3.png" width="250">
<img src="preview/preview_4.png" width="250">
<img src="preview/current.png" width="320">
<img src="preview/24hr.png" width="320">
<img src="preview/radar_condi.png" width="320">
<img src="preview/uv_aqi.png" width="320">
<img src="preview/forecast_page.png" width="320">
<img src="preview/gov_alerts.png" width="320">
<img src="preview/settings.png" width="320">
<img src="preview/radar_page.png" width="320">
<img src="preview/condi_forecast.png" width="320">
</div>
<br>
# 🌦️ Supported weather sources
# ✨ Features:
- **Open Meteo**
- **Met Norway**
- **NWS**
- **SMHI**
- **DWD**
- **Meteo-France**
- **FMI**
- **ECCC**
- **BMKG**
- **China**
- **AccuWeather**
- **Meteo AM**
- **IPMA**
- **WeatherApi.com**
- **Gismeteo**
- **Met Office** _(requires your own API key — sign up [here](https://www.metoffice.gov.uk/))_
- **AEMET** _(requires your own API key — sign
up [here](https://opendata.aemet.es/centrodedescargas/altaUsuario))_
- **IMD**
- **WMO Severe Weather Information Centre**
- **FOSS Public Alert Server**
- **CWA**
- **Pirate Weather**
- **JMA**
- **IMET**
- **OpenWeather**
- _**And more to be added**_
- 🌍 **Offline Mode:** Access previously loaded weather data even without an internet connection.
- 🌤️ **Current Weather:** Get real-time updates on weather conditions in your area.
- 📢 **Government Weather Alerts:** Receive official alerts and warnings to stay safe.
- ⏳ **24-Hour Forecast:** Plan your short-term activities with accurate forecasts for the next two days.
- 📅 **14-Day Forecast:** View detailed weather predictions for the upcoming week.
- 🌙 **Moon Phases:** Track the phases of the moon and plan accordingly.
- 🌑 **Moonrise & Moonset:** Know the exact times for moonrise and moonset each day.
- 🌅 **Sunrise & Sunset:** Stay informed about sunrise and sunset times to optimize your day.
- 📏 **Day Length:** Check how long the daylight lasts each day.
- 📝 **Day Description:** Get a brief summary of the day’s weather conditions.
- 🌧️ **Rain Bar:** See a visual representation of expected rainfall.
- 👁️ **Visibility:** Monitor how far you can see clearly based on weather conditions.
- 💧 **Humidity:** Check the current humidity levels to stay comfortable.
- 🧭 **Pressure:** Track atmospheric pressure to understand weather changes.
- 🌬️ **Wind Direction & Speed:** Stay aware of wind patterns and strength.
- ❄️ **Snow Amount:** Know the expected snowfall for winter planning.
- ☁️ **Cloudiness:** See how much of the sky is covered by clouds.
- 🌡️ **Min-Max Temperature:** View the range of temperatures for the day.
- 🌬️ **Feels Like Temperature:** Understand how the temperature feels based on wind and humidity.
- 🌧️ **Precipitation Type & Area Coverage:** Get details on what kind of precipitation is expected and its coverage area.
- 🌞 **UV Index:** Stay protected from harmful UV rays with UV index updates.
- 🌿 **Air Quality:** Monitor air quality to stay informed about pollution levels.
- 🗺️ **Live Map:** Access a real-time map to track weather conditions in different areas.
- 📍 **Location Picker:** Easily select and view weather information for different locations.
- ⭐ **Save Favorite Locations:** Save your preferred locations for quick access to their weather updates.
- 👗 **Clothing Recommendations:** Get suggestions on what to wear based on the current weather conditions.
- 🌾 **Pollen Data (Europe Only):** View pollen levels for grass, trees, and weeds in your area.
Some sources need a free API key from the provider before you can select them — add yours from a
location's weather source picker, or from **Settings → Weather Sources → API key config**.
# 🌞 Weather providers:
- [**open-meteo**](https://open-meteo.com)
- [**Met norway**](https://www.met.no/en)
- [**WeatherApi**](https://www.weatherapi.com/)
- [**OpenWeatherMap**](https://openweathermap.org/api)
- [**accuweather**](https://www.accuweather.com/)
# 🌐 Translate the app on [Crowdin](https://crowdin.com/project/weathermaster)
# ⚙️ Other:
_**Feel free to open an issue if you want to request a language**_
- 📱<strong>Native Android Experience: </stronge>Enjoy a user interface and interaction that closely resemble a native Android Weather app.
<a href="https://crowdin.com/project/weathermaster" style="background-color: red"></a>
[![ar-SA translation](https://img.shields.io/badge/dynamic/json?color=blue&label=ar-SA&style=flat&logo=crowdin&query=%24.progress.0.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![az translation](https://img.shields.io/badge/dynamic/json?color=blue&label=az&style=flat&logo=crowdin&query=%24.progress.1.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![bg translation](https://img.shields.io/badge/dynamic/json?color=blue&label=bg&style=flat&logo=crowdin&query=%24.progress.2.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![ca translation](https://img.shields.io/badge/dynamic/json?color=blue&label=ca&style=flat&logo=crowdin&query=%24.progress.3.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![cs translation](https://img.shields.io/badge/dynamic/json?color=blue&label=cs&style=flat&logo=crowdin&query=%24.progress.4.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![de translation](https://img.shields.io/badge/dynamic/json?color=blue&label=de&style=flat&logo=crowdin&query=%24.progress.5.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![el translation](https://img.shields.io/badge/dynamic/json?color=blue&label=el&style=flat&logo=crowdin&query=%24.progress.6.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![es-ES translation](https://img.shields.io/badge/dynamic/json?color=blue&label=es-ES&style=flat&logo=crowdin&query=%24.progress.7.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![fa translation](https://img.shields.io/badge/dynamic/json?color=blue&label=fa&style=flat&logo=crowdin&query=%24.progress.8.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![fi translation](https://img.shields.io/badge/dynamic/json?color=blue&label=fi&style=flat&logo=crowdin&query=%24.progress.9.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![fil translation](https://img.shields.io/badge/dynamic/json?color=blue&label=fil&style=flat&logo=crowdin&query=%24.progress.10.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![fr translation](https://img.shields.io/badge/dynamic/json?color=blue&label=fr&style=flat&logo=crowdin&query=%24.progress.11.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![hu translation](https://img.shields.io/badge/dynamic/json?color=blue&label=hu&style=flat&logo=crowdin&query=%24.progress.12.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![id translation](https://img.shields.io/badge/dynamic/json?color=blue&label=id&style=flat&logo=crowdin&query=%24.progress.13.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![it translation](https://img.shields.io/badge/dynamic/json?color=blue&label=it&style=flat&logo=crowdin&query=%24.progress.14.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![ja translation](https://img.shields.io/badge/dynamic/json?color=blue&label=ja&style=flat&logo=crowdin&query=%24.progress.15.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![ko translation](https://img.shields.io/badge/dynamic/json?color=blue&label=ko&style=flat&logo=crowdin&query=%24.progress.16.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![lt translation](https://img.shields.io/badge/dynamic/json?color=blue&label=lt&style=flat&logo=crowdin&query=%24.progress.17.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![nl translation](https://img.shields.io/badge/dynamic/json?color=blue&label=nl&style=flat&logo=crowdin&query=%24.progress.18.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![pl translation](https://img.shields.io/badge/dynamic/json?color=blue&label=pl&style=flat&logo=crowdin&query=%24.progress.19.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![pt-BR translation](https://img.shields.io/badge/dynamic/json?color=blue&label=pt-BR&style=flat&logo=crowdin&query=%24.progress.20.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![pt-PT translation](https://img.shields.io/badge/dynamic/json?color=blue&label=pt-PT&style=flat&logo=crowdin&query=%24.progress.21.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![ro translation](https://img.shields.io/badge/dynamic/json?color=blue&label=ro&style=flat&logo=crowdin&query=%24.progress.22.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![ru translation](https://img.shields.io/badge/dynamic/json?color=blue&label=ru&style=flat&logo=crowdin&query=%24.progress.23.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![sl translation](https://img.shields.io/badge/dynamic/json?color=blue&label=sl&style=flat&logo=crowdin&query=%24.progress.24.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![sr translation](https://img.shields.io/badge/dynamic/json?color=blue&label=sr&style=flat&logo=crowdin&query=%24.progress.25.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![sr-CS translation](https://img.shields.io/badge/dynamic/json?color=blue&label=sr-CS&style=flat&logo=crowdin&query=%24.progress.26.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![sv-SE translation](https://img.shields.io/badge/dynamic/json?color=blue&label=sv-SE&style=flat&logo=crowdin&query=%24.progress.27.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![th translation](https://img.shields.io/badge/dynamic/json?color=blue&label=th&style=flat&logo=crowdin&query=%24.progress.28.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![tr translation](https://img.shields.io/badge/dynamic/json?color=blue&label=tr&style=flat&logo=crowdin&query=%24.progress.29.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![uk translation](https://img.shields.io/badge/dynamic/json?color=blue&label=uk&style=flat&logo=crowdin&query=%24.progress.30.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![vi translation](https://img.shields.io/badge/dynamic/json?color=blue&label=vi&style=flat&logo=crowdin&query=%24.progress.31.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![zh-CN translation](https://img.shields.io/badge/dynamic/json?color=blue&label=zh-CN&style=flat&logo=crowdin&query=%24.progress.32.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![zh-TW translation](https://img.shields.io/badge/dynamic/json?color=blue&label=zh-TW&style=flat&logo=crowdin&query=%24.progress.33.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![ar-SA translation](https://img.shields.io/badge/dynamic/json?color=blue&label=ar-SA&style=flat&logo=crowdin&query=%24.progress.0.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![lt translation](https://img.shields.io/badge/dynamic/json?color=blue&label=lt&style=flat&logo=crowdin&query=%24.progress.18.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
[![he translation](https://img.shields.io/badge/dynamic/json?color=blue&label=he&style=flat&logo=crowdin&query=%24.progress.12.data.translationProgress&url=https%3A%2F%2Fbadges.awesome-crowdin.com%2Fstats-16727791-741419.json)](https://crowdin.com/project/weathermaster)
- 🎨<strong>Material Design: </stronge>The app is built using Material Web Components, ensuring a clean, consistent, and visually appealing design.
# ✉️ Contact
- ⚙️<strong>Customization Options: </stronge>Enjoy a ton of customization options. Adjust themes, Units.
For any questions or feedback, feel free to open an issue on GitHub or contact
pranshul.devmain@gmail.com
- 📐<strong>Responsive Design: </stronge>WeatherMaster is fully responsive for all mobile devices.
# ©️ License
- 🧩<strong>User-Friendly Interface: </stronge>The app's interface is designed to be straightforward and user-friendly.
# 🛠️ Built With:
- <strong>HTML & CSS: </stronge> For the basic structure and styling of the app.
- <strong>JavaScript: </stronge>To handle the app's logic and interactivity.
- <strong>Java: </stronge>Mainly used for JavaScript interface and permissions, allowing the app to run on Android devices.
- <strong>Material Web Components: </stronge>Utilized to create a consistent and attractive Material Design look and feel.
- <strong>Weather icons</strong>: <a href="https://gitlab.com/bignutty/google-weather-icons">Google weather icons
# 📝 Todos:
- ✅ Adding cache to reduce api requests
- ✅ Translations
- ✅ Notifications
- ✅ Make it lightweight
- ✅ Allows you to add multiple locations
- ✅ Customization
- ✅ More detailed weather
- ✅ Live weather map
- ✅ Pick locations using map
- ✅ Change app colors according to the weather
- Any user suggestions :)
<br>
<br>
> [!NOTE]
> The app is designed to run on Android devices and does not support web browsers. Attempting to open the app in a browser will not work.
<br>
# Contact
For any questions or feedback, feel free to open an issue on GitHub or contact pranshul.devmain@gmail.com
<br>
# License
This project is licensed under the GPL-3.0 license. See the `LICENSE` file for details.
+10
View File
@@ -0,0 +1,10 @@
# The code is a little messy
### Why is the package `com.example.weathermaster`?
- Well, when I made this, I didn’t know a whole lot about Android development, and I didn’t realize you had to change the package name. So I made it with com.example, and now I can’t really change it because that would make it a whole new app. People who installed it from F-Droid may not get updates. I might change the package name if I publish the app on the Google Play Store.
### Why is it made with JS?
- I was more familiar with it, and it works much smoother and is easier to maintain. Even without optimization, it still runs like butter. But I do have plans to convert it to Kotlin, though it's likely to happen. 🫠
+45
View File
@@ -0,0 +1,45 @@
plugins {
id 'com.android.application'
}
android {
namespace 'com.example.weathermaster'
compileSdk 34
defaultConfig {
applicationId "com.example.weathermaster"
minSdk 22
targetSdk 33
versionCode 71
versionName "1.7.9 (W)"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}
-202
View File
@@ -1,202 +0,0 @@
import java.util.Properties
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.compose)
id("com.google.devtools.ksp") version "2.3.6"
id("com.google.dagger.hilt.android")
id("androidx.room")
kotlin("plugin.serialization") version "2.3.21"
}
val localProps = Properties().apply {
val f = rootProject.file("local.properties")
if (f.exists()) f.inputStream().use { load(it) }
}
val geoNamesUserNameKey =
providers.gradleProperty("GEO_NAMES_USERNAME").orNull
?: System.getenv("GEO_NAMES_USERNAME")
?: ""
val mfKey = providers.gradleProperty("MF_KEY").orNull ?: System.getenv("MF_KEY")
?: ""
val accuKey = providers.gradleProperty("ACCU_KEY").orNull ?: System.getenv("ACCU_KEY")
?: ""
val weatherapiKey =
providers.gradleProperty("WEATHERAPI_KEY").orNull ?: System.getenv("WEATHERAPI_KEY")
?: ""
val keystoreFile = file("../keystore/release.jks")
val hasKeystore = keystoreFile.exists()
val versionNameString = "3.11.0"
val playStore = false
android {
namespace = "com.pranshulgg.weather_master_app"
compileSdk {
version = release(37)
}
android.buildFeatures.buildConfig = true
defaultConfig {
applicationId = if (playStore) {
"com.pranshulgg.weather_master"
} else {
"com.pranshulgg.weather_master_app"
}
minSdk = 26
targetSdk = 36
versionCode = 68
versionName = versionNameString
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField(
"String",
"GEO_NAMES_USERNAME",
"\"$geoNamesUserNameKey\""
)
buildConfigField(
"String",
"MF_KEY",
"\"$mfKey\""
)
buildConfigField(
"String",
"ACCU_KEY",
"\"$accuKey\""
)
buildConfigField(
"String",
"WEATHERAPI_KEY",
"\"$weatherapiKey\""
)
buildConfigField(
"String",
"APP_VERSION",
"\"v${versionNameString}\""
)
buildConfigField(
"boolean",
"IS_PLAYSTORE_BUILD",
playStore.toString()
)
}
signingConfigs {
if (hasKeystore) {
create("release") {
storeFile = keystoreFile
storePassword = System.getenv("KEYSTORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
}
}
}
buildTypes {
release {
isMinifyEnabled = false
if (hasKeystore) {
signingConfig = signingConfigs.getByName("release")
}
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
// isCoreLibraryDesugaringEnabled = true
}
buildFeatures {
compose = true
buildConfig = true
}
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
bundle {
language {
enableSplit = false
}
}
}
room {
schemaDirectory("$projectDir/schemas")
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.process)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.navigation.compose)
implementation(libs.materialKolor)
implementation(libs.androidx.foundation.layout)
implementation(libs.coil.compose)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.room.runtime)
implementation(libs.room.ktx)
implementation(libs.retrofit)
implementation(libs.converter.gson)
implementation(libs.okhttp.logging)
implementation(libs.common.suncalc)
implementation(libs.androidx.appcompat)
implementation(libs.jts.core)
implementation(libs.jts.io.common)
implementation(libs.jackson.module.kotlin)
// coreLibraryDesugaring(libs.desugar.jdk.libs) // Not sure but it causes timezone crashes on some devices
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.converter.jaxb)
ksp(libs.room.compiler)
implementation(libs.hilt.android)
ksp(libs.hilt.android.compiler)
ksp(libs.hilt.compiler)
implementation(libs.reorderable)
implementation(libs.androidx.foundation.layout)
implementation(libs.androidx.animation.core)
implementation(libs.core.splashscreen)
implementation(libs.androidx.work.runtime)
implementation(libs.hilt.work)
ksp(libs.hilt.metadata.jvm)
implementation(libs.androidx.glance)
implementation(libs.androidx.glance.appwidget)
implementation(libs.kotlinx.serialization.json)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
debugImplementation(libs.androidx.compose.ui.tooling)
debugImplementation(libs.androidx.compose.ui.test.manifest)
}
+20
View File
@@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.example.weathermaster",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 71,
"versionName": "1.7.9 (W)",
"outputFile": "app-release.apk"
}
],
"elementType": "File"
}
@@ -1,682 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 38,
"identityHash": "1d015719e48d11dded7be8a0fee6370b",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL NOT NULL, `temperatureMax` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1d015719e48d11dded7be8a0fee6370b')"
]
}
}
@@ -1,679 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 39,
"identityHash": "e3d653d51d672c892c51978003671201",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e3d653d51d672c892c51978003671201')"
]
}
}
@@ -1,699 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 40,
"identityHash": "c8326e15b737f950704fa3027bd58b06",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c8326e15b737f950704fa3027bd58b06')"
]
}
}
@@ -1,711 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 41,
"identityHash": "f8a4e91742c3f170c10c2703904ec2b9",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f8a4e91742c3f170c10c2703904ec2b9')"
]
}
}
@@ -1,711 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 42,
"identityHash": "f8a4e91742c3f170c10c2703904ec2b9",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f8a4e91742c3f170c10c2703904ec2b9')"
]
}
}
@@ -1,747 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 43,
"identityHash": "3498b6cf93a31e50cf1bef443490315f",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "github",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `currentTag` TEXT NOT NULL, `lastFetchedTag` TEXT NOT NULL, `lastFetchedTime` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "currentTag",
"columnName": "currentTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTag",
"columnName": "lastFetchedTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTime",
"columnName": "lastFetchedTime",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3498b6cf93a31e50cf1bef443490315f')"
]
}
}
@@ -1,767 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 44,
"identityHash": "80da71ec25bcf07ba0d22811005aa37f",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "github",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `currentTag` TEXT NOT NULL, `lastFetchedTag` TEXT NOT NULL, `lastFetchedTime` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "currentTag",
"columnName": "currentTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTag",
"columnName": "lastFetchedTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTime",
"columnName": "lastFetchedTime",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '80da71ec25bcf07ba0d22811005aa37f')"
]
}
}
@@ -1,851 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 45,
"identityHash": "b2ca5c75db987a1d27628fc45eac72bf",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "github",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `currentTag` TEXT NOT NULL, `lastFetchedTag` TEXT NOT NULL, `lastFetchedTime` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "currentTag",
"columnName": "currentTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTag",
"columnName": "lastFetchedTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTime",
"columnName": "lastFetchedTime",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `locationId` TEXT NOT NULL, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `time` INTEGER NOT NULL, FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_air_quality_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b2ca5c75db987a1d27628fc45eac72bf')"
]
}
}
@@ -1,863 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 46,
"identityHash": "fd66b7531bfe72f6bcac04b8fe26dc9e",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, `alertSource` TEXT NOT NULL, `airQualitySource` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alertSource",
"columnName": "alertSource",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "airQualitySource",
"columnName": "airQualitySource",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "github",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `currentTag` TEXT NOT NULL, `lastFetchedTag` TEXT NOT NULL, `lastFetchedTime` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "currentTag",
"columnName": "currentTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTag",
"columnName": "lastFetchedTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTime",
"columnName": "lastFetchedTime",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `locationId` TEXT NOT NULL, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `time` INTEGER NOT NULL, FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_air_quality_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'fd66b7531bfe72f6bcac04b8fe26dc9e')"
]
}
}
@@ -1,863 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 47,
"identityHash": "fd66b7531bfe72f6bcac04b8fe26dc9e",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, `alertSource` TEXT NOT NULL, `airQualitySource` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alertSource",
"columnName": "alertSource",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "airQualitySource",
"columnName": "airQualitySource",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "github",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `currentTag` TEXT NOT NULL, `lastFetchedTag` TEXT NOT NULL, `lastFetchedTime` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "currentTag",
"columnName": "currentTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTag",
"columnName": "lastFetchedTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTime",
"columnName": "lastFetchedTime",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `locationId` TEXT NOT NULL, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `time` INTEGER NOT NULL, FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_air_quality_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'fd66b7531bfe72f6bcac04b8fe26dc9e')"
]
}
}
@@ -1,868 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 48,
"identityHash": "5ca7c9b34ef5941f3d7515379d9646f9",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, `alertSource` TEXT NOT NULL, `airQualitySource` TEXT NOT NULL, `customName` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alertSource",
"columnName": "alertSource",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "airQualitySource",
"columnName": "airQualitySource",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "customName",
"columnName": "customName",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "github",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `currentTag` TEXT NOT NULL, `lastFetchedTag` TEXT NOT NULL, `lastFetchedTime` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "currentTag",
"columnName": "currentTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTag",
"columnName": "lastFetchedTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTime",
"columnName": "lastFetchedTime",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `locationId` TEXT NOT NULL, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `time` INTEGER NOT NULL, FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_air_quality_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5ca7c9b34ef5941f3d7515379d9646f9')"
]
}
}
@@ -1,916 +0,0 @@
{
"formatVersion": 1,
"database": {
"version": 49,
"identityHash": "41f3af0cd4a758a20290098071993b9c",
"entities": [
{
"tableName": "weather_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `lat` REAL NOT NULL, `lon` REAL NOT NULL, `timezone` TEXT NOT NULL, `source` TEXT NOT NULL, `state` TEXT, `isFavorite` INTEGER NOT NULL, `isPinned` INTEGER NOT NULL, `countryCode` TEXT, `isDefault` INTEGER NOT NULL, `isDeviceLocation` INTEGER NOT NULL, `alertSource` TEXT NOT NULL, `airQualitySource` TEXT NOT NULL, `customName` TEXT, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "country",
"columnName": "country",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "timezone",
"columnName": "timezone",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "source",
"columnName": "source",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "state",
"columnName": "state",
"affinity": "TEXT"
},
{
"fieldPath": "isFavorite",
"columnName": "isFavorite",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isPinned",
"columnName": "isPinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDeviceLocation",
"columnName": "isDeviceLocation",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alertSource",
"columnName": "alertSource",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "airQualitySource",
"columnName": "airQualitySource",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "customName",
"columnName": "customName",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `humidity` REAL NOT NULL, `windSpeed` REAL, `windDirection` TEXT, `pressureMsl` REAL, `visibility` INTEGER, `cloudCover` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `feelsLike` REAL, `time` INTEGER NOT NULL, `dewPoint` REAL, `utcOffsetSeconds` INTEGER, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "cloudCover",
"columnName": "cloudCover",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feelsLike",
"columnName": "feelsLike",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "utcOffsetSeconds",
"columnName": "utcOffsetSeconds",
"affinity": "INTEGER"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_weather_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperature` REAL, `windSpeed` REAL, `windDirection` TEXT, `rain` REAL NOT NULL, `snowfall` REAL, `uvIndex` REAL, `weatherCondition` TEXT NOT NULL, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `time` INTEGER NOT NULL, `precipitationProbability` INTEGER, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperature",
"columnName": "temperature",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rain",
"columnName": "rain",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfall",
"columnName": "snowfall",
"affinity": "REAL"
},
{
"fieldPath": "uvIndex",
"columnName": "uvIndex",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbability",
"columnName": "precipitationProbability",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_daily",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `temperatureMin` REAL, `temperatureMax` REAL, `windSpeed` REAL, `windDirection` TEXT, `rainSum` REAL NOT NULL, `snowfallSum` REAL, `uvIndexMax` REAL, `weatherCondition` TEXT NOT NULL, `time` INTEGER NOT NULL, `precipitationProbabilityMax` INTEGER, `pressureMsl` REAL, `visibility` INTEGER, `humidity` REAL, `dewPoint` REAL, `sunrise` INTEGER NOT NULL, `sunset` INTEGER NOT NULL, `moonrise` INTEGER NOT NULL, `moonset` INTEGER NOT NULL, `moonPhase` TEXT NOT NULL, `dawn` INTEGER NOT NULL, `dusk` INTEGER NOT NULL, PRIMARY KEY(`locationId`, `time`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "temperatureMin",
"columnName": "temperatureMin",
"affinity": "REAL"
},
{
"fieldPath": "temperatureMax",
"columnName": "temperatureMax",
"affinity": "REAL"
},
{
"fieldPath": "windSpeed",
"columnName": "windSpeed",
"affinity": "REAL"
},
{
"fieldPath": "windDirection",
"columnName": "windDirection",
"affinity": "TEXT"
},
{
"fieldPath": "rainSum",
"columnName": "rainSum",
"affinity": "REAL",
"notNull": true
},
{
"fieldPath": "snowfallSum",
"columnName": "snowfallSum",
"affinity": "REAL"
},
{
"fieldPath": "uvIndexMax",
"columnName": "uvIndexMax",
"affinity": "REAL"
},
{
"fieldPath": "weatherCondition",
"columnName": "weatherCondition",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "precipitationProbabilityMax",
"columnName": "precipitationProbabilityMax",
"affinity": "INTEGER"
},
{
"fieldPath": "pressureMsl",
"columnName": "pressureMsl",
"affinity": "REAL"
},
{
"fieldPath": "visibility",
"columnName": "visibility",
"affinity": "INTEGER"
},
{
"fieldPath": "humidity",
"columnName": "humidity",
"affinity": "REAL"
},
{
"fieldPath": "dewPoint",
"columnName": "dewPoint",
"affinity": "REAL"
},
{
"fieldPath": "sunrise",
"columnName": "sunrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sunset",
"columnName": "sunset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonrise",
"columnName": "moonrise",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonset",
"columnName": "moonset",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "moonPhase",
"columnName": "moonPhase",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "dawn",
"columnName": "dawn",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "dusk",
"columnName": "dusk",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId",
"time"
]
},
"indices": [
{
"name": "index_weather_daily_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_weather_daily_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "weather_units",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `tempUnit` TEXT NOT NULL, `windUnit` TEXT NOT NULL, `distanceUnit` TEXT NOT NULL, `pressureUnit` TEXT NOT NULL, `precipitationUnit` TEXT NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "tempUnit",
"columnName": "tempUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "windUnit",
"columnName": "windUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "distanceUnit",
"columnName": "distanceUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pressureUnit",
"columnName": "pressureUnit",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "precipitationUnit",
"columnName": "precipitationUnit",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "weather_blocks",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `isDaily` INTEGER NOT NULL, `type` TEXT NOT NULL, `isHidden` INTEGER NOT NULL, `position` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isDaily",
"columnName": "isDaily",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "isHidden",
"columnName": "isHidden",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "position",
"columnName": "position",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_current",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `usAqi` INTEGER, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `lastUpdatedInMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "usAqi",
"columnName": "usAqi",
"affinity": "INTEGER"
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "lastUpdatedInMilli",
"columnName": "lastUpdatedInMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_air_quality_current_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_current_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "nws_location_gridpoints",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `officeId` TEXT NOT NULL, `gridX` INTEGER NOT NULL, `gridY` INTEGER NOT NULL, `stationIdentifier` TEXT NOT NULL, `lastUpdatedMilli` INTEGER NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "officeId",
"columnName": "officeId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "gridX",
"columnName": "gridX",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "gridY",
"columnName": "gridY",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "stationIdentifier",
"columnName": "stationIdentifier",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastUpdatedMilli",
"columnName": "lastUpdatedMilli",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_nws_location_gridpoints_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_nws_location_gridpoints_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "github",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `currentTag` TEXT NOT NULL, `lastFetchedTag` TEXT NOT NULL, `lastFetchedTime` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "currentTag",
"columnName": "currentTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTag",
"columnName": "lastFetchedTag",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastFetchedTime",
"columnName": "lastFetchedTime",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
}
},
{
"tableName": "air_quality_hourly",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `locationId` TEXT NOT NULL, `pm10` REAL, `pm25` REAL, `carbonMonoxide` REAL, `nitrogenDioxide` REAL, `sulphurDioxide` REAL, `ozone` REAL, `time` INTEGER NOT NULL, FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "pm10",
"columnName": "pm10",
"affinity": "REAL"
},
{
"fieldPath": "pm25",
"columnName": "pm25",
"affinity": "REAL"
},
{
"fieldPath": "carbonMonoxide",
"columnName": "carbonMonoxide",
"affinity": "REAL"
},
{
"fieldPath": "nitrogenDioxide",
"columnName": "nitrogenDioxide",
"affinity": "REAL"
},
{
"fieldPath": "sulphurDioxide",
"columnName": "sulphurDioxide",
"affinity": "REAL"
},
{
"fieldPath": "ozone",
"columnName": "ozone",
"affinity": "REAL"
},
{
"fieldPath": "time",
"columnName": "time",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_air_quality_hourly_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_air_quality_hourly_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "accu_locations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`locationId` TEXT NOT NULL, `cityKey` TEXT NOT NULL, PRIMARY KEY(`locationId`), FOREIGN KEY(`locationId`) REFERENCES `weather_locations`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "locationId",
"columnName": "locationId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "cityKey",
"columnName": "cityKey",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"locationId"
]
},
"indices": [
{
"name": "index_accu_locations_locationId",
"unique": false,
"columnNames": [
"locationId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_accu_locations_locationId` ON `${TABLE_NAME}` (`locationId`)"
}
],
"foreignKeys": [
{
"table": "weather_locations",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"locationId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '41f3af0cd4a758a20290098071993b9c')"
]
}
}
@@ -0,0 +1,26 @@
package com.example.weathermaster;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.example.weathermaster", appContext.getPackageName());
}
}
@@ -1,24 +0,0 @@
package com.pranshulgg.weather_master_app
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.pranshulgg.weathermaster", appContext.packageName)
}
}
+106 -205
View File
@@ -1,230 +1,131 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<application
android:name=".WeatherMasterApplication"
android:hardwareAccelerated="true"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_app_launcher"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_app_launcher_round"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.SplashScreen.OnStart">
android:theme="@style/Base.Theme.WeatherMaster"
tools:targetApi="33">
<activity
android:name=".SettingsActivity"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreensAll"
/>
<activity
android:name=".AboutPage"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/aboutMainPage"
/>
<activity
android:name=".Terms_Conditions"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreensAll"
/>
<activity
android:name=".PrivacyPolicy"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreensAll"
/>
<activity
android:name=".ThirdParty"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreensAll"
/>
<activity
android:name=".ForecastPage"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreenForecastPage"
/>
<activity
android:name=".AlertPage"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreensAll"
/>
<activity
android:name=".LiveRadar"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreenLiveRadar"
/>
<activity
android:name=".LanguagePage"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ScreensAll"
/>
<activity
android:name=".humidityCondition"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/conditionMainPage"
/>
<activity
android:name=".pressureCondition"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/conditionMainPage"
/>
<activity
android:name=".sunCondition"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/conditionMainPage"
/>
<activity
android:name=".UVIndexCondition"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/conditionMainPage"
/>
<activity
android:name=".visibilityCondition"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/conditionMainPage"
/>
<activity
android:name=".WindCondition"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/conditionMainPage"
/>
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize"
android:exported="true"
android:label="@string/app_launcher_name"
android:theme="@style/Theme.SplashScreen.OnStart">
android:theme="@style/app_theme"
android:screenOrientation="portrait"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".widgets.config.WidgetConfigActivity"
android:theme="@style/Theme.WeatherMaster"
android:exported="true" />
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
<receiver
android:name=".feature.notifications.scheduled.ScheduledNotification"
android:enabled="true" />
<!--WIDGETS-->
<receiver
android:name=".widgets.weather.WeatherWidgetReceiver"
android:label="Weather 1"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/weather_widget_info" />
</receiver>
<receiver
android:name=".widgets.pill.WidgetPillReceiver"
android:label="Pill"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_pill_info" />
</receiver>
<receiver
android:name=".widgets.summary.SummaryWidgetReceiver"
android:label="Day Summary"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/summary_widget_info" />
</receiver>
<receiver
android:name=".widgets.weatherhorizontal.WeatherHorizontalWidgetReceiver"
android:label="Weather 2"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/weather_widget_horizontal_info" />
</receiver>
<receiver
android:name=".widgets.glance.GlanceWidgetReceiver"
android:label="Glance"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/glance_widget_info" />
</receiver>
<receiver
android:name=".widgets.weather3.Weather3WidgetReceiver"
android:label="Weather 3"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/weather3_widget_info" />
</receiver>
<receiver
android:name=".widgets.weather4.Weather4WidgerReceiver"
android:label="Weather 4"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/weather4_widget_info" />
</receiver>
<receiver
android:name=".widgets.hourly.WidgetHourlyReceiver"
android:label="Hourly"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/hourly_widget_info" />
</receiver>
<receiver
android:name=".widgets.uvindex.UvIndexWidgetReceiver"
android:label="UV index"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/uv_index_widget_info" />
</receiver>
<receiver
android:name=".widgets.weather5.Weather5WidgetReceiver"
android:label="Weather 5"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/weather5_widget_info" />
</receiver>
<receiver
android:name=".widgets.froggy.FroggyWidgetReceiver"
android:label="Froggy"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/froggy_widget_info" />
</receiver>
android:name=".ForegroundService"
android:enabled="true"
android:exported="false" />
</application>
<queries>
<intent>
<action android:name="nodomain.freeyourgadget.gadgetbridge.ACTION_GENERIC_WEATHER" />
</intent>
</queries>
</manifest>
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

@@ -0,0 +1 @@
//STORE ALL KEYS
+880
View File
@@ -0,0 +1,880 @@
const DefaultLocation = JSON.parse(localStorage.getItem('DefaultLocation'));
let currentApiKeyIndex = 0;
let currentKeyMoonIndex = 0;
let currentAstronomyKeyIndex = 0;
function handleStorageChange(event) {
if (event.key === 'SelectedTempUnit' ||
event.key === 'SelectedWindUnit' ||
event.key === 'selectedVisibilityUnit' ||
event.key === 'selectedTimeMode'||
event.key === 'selectedPrecipitationUnit' ||
event.key === 'DefaultLocation'||
event.key === 'UseBackgroundAnimations'||
event.key === 'selectedMainWeatherProvider' ||
event.key === 'ApiForAccu' ||
event.key === 'selectedPressureUnit') {
setTimeout(()=>{
window.location.reload();
sendThemeToAndroid('overcast')
}, 1500);
}
}
window.addEventListener('storage', handleStorageChange);
let anim = null;
function ShowError() {
document.querySelector('.no_internet_error').hidden = false;
if (anim) {
return;
}
var animationContainer = document.getElementById('error_img_cat');
var animationData = 'icons/error-cat.json';
anim = bodymovin.loadAnimation({
container: animationContainer,
renderer: 'svg',
loop: true,
autoplay: true,
path: animationData
});
}
let currentLocation = null;
function useAutoCurrentLocation(){
showLoader();
if ("geolocation" in navigator) {
navigator.geolocation.getCurrentPosition((position) => {
currentLocation = {
latitude: position.coords.latitude,
longitude: position.coords.longitude
};
DecodeWeather(currentLocation.latitude, currentLocation.longitude);
document.getElementById('city-name').innerHTML = 'Current location';
document.getElementById('SelectedLocationText').innerHTML = 'Current location';
localStorage.setItem('CurrentLocationName', 'Current location')
document.getElementById('currentLocationName').textContent = 'Current location';
if( !DefaultLocation || DefaultLocation.name === 'CurrentDeviceLocation' ){
localStorage.setItem('DefaultLocation', JSON.stringify({ lat: currentLocation.latitude, lon: currentLocation.longitude, name: 'CurrentDeviceLocation' }));
}
});
}
}
if(navigator.onLine){
localStorage.setItem('DeviceOnline', 'Yes');
if(DefaultLocation){
if(DefaultLocation.name === 'CurrentDeviceLocation'){
useAutoCurrentLocation()
sendThemeToAndroid("ReqLocation")
document.querySelector('.currentLocationdiv').hidden = false;
} else if(DefaultLocation.lat && DefaultLocation.lon){
DecodeWeather(DefaultLocation.lat, DefaultLocation.lon)
document.getElementById('city-name').innerHTML = DefaultLocation.name;
document.getElementById('SelectedLocationText').innerHTML = DefaultLocation.name;
localStorage.setItem('CurrentLocationName', DefaultLocation.name)
document.getElementById('currentLocationName').textContent = DefaultLocation.name
}
}
else{
useAutoCurrentLocation()
sendThemeToAndroid("ReqLocation")
document.querySelector('.currentLocationdiv').hidden = false;
}
} else{
localStorage.setItem('DeviceOnline', 'No');
document.addEventListener('DOMContentLoaded', function () {
renderOfflineData();
});
}
function handleGeolocationError(error) {
console.error('Error getting geolocation:', error);
displayErrorMessage('Error getting geolocation. Please enable location services.');
}
document.addEventListener('DOMContentLoaded', () => {
const cityInput = document.getElementById('city-input');
const cityList = document.getElementById('city-list');
const cityopen = document.getElementById('city-open');
const searchContainer = document.getElementById('search-container');
const closeButton = document.querySelector('.close_search');
const openMapPicker = document.getElementById('openMapPicker');
cityopen.addEventListener("click", () => {
if(navigator.onLine){
let savedLocations = JSON.parse(localStorage.getItem('savedLocations')) || [];
localStorage.setItem('DeviceOnline', 'Yes');
searchContainer.style.display = 'block';
window.history.pushState({ SearchContainerOpen: true }, "");
document.querySelector('.header_hold').style.transform = 'scale(1.1)';
document.querySelector('.header_hold').style.opacity = '0';
setTimeout(() => {
document.querySelector('.header_hold').style.transform = '';
document.querySelector('.header_hold').style.opacity = '';
if (savedLocations.length === 0) {
cityInput.focus()
} else {
}
}, 400);
} else{
ToastAndroidShow.ShowToast('No internet', 'long');
return;
}
});
closeButton.addEventListener('click', () => {
window.history.back()
});
openMapPicker.addEventListener('click', () => {
document.querySelector('.map_picker').hidden = false;
window.history.pushState({ MapPickerContainerOpen: true }, "");
removeMap()
setTimeout(() => {
RenderSearhMap()
}, 400);
});
let debounceTimeout;
cityInput.addEventListener('input', () => {
const searchTerm = cityInput.value.trim();
document.querySelector('.currentLocationdiv').hidden = true;
document.querySelector('.savedLocations').hidden = true;
clearTimeout(debounceTimeout);
if (searchTerm && searchTerm.length > 2) {
document.getElementById('cityLoader').hidden = false;
debounceTimeout = setTimeout(() => {
getCitySuggestions(cityInput.value);
}, 500);
} else {
cityList.innerHTML = '';
document.getElementById('cityLoader').hidden = true;
document.querySelector('.currentLocationdiv').hidden = false;
document.querySelector('.savedLocations').hidden = false;
setTimeout(()=>{
cityList.innerHTML = '';
}, 200)
setTimeout(()=>{
cityList.innerHTML = '';
}, 400)
setTimeout(()=>{
cityList.innerHTML = '';
}, 600)
let savedLocations = JSON.parse(localStorage.getItem('savedLocations')) || [];
if (savedLocations.length === 0) {
document.querySelector('.savedLocations').hidden = true;
} else {
document.querySelector('.savedLocations').hidden = false;
}
}
});
cityInput.addEventListener('keypress', (event) => {
const searchTerm = cityInput.value.trim();
document.querySelector('.currentLocationdiv').hidden = true;
if (event.key === 'Enter') {
if (searchTerm) {
document.getElementById('cityLoader').hidden = false;
setTimeout(()=>{
getCitySuggestions(cityInput.value);
}, 500);
} else {
cityList.innerHTML = '';
document.getElementById('cityLoader').hidden = true;
document.querySelector('.currentLocationdiv').hidden = false;
}
}
});
async function getCitySuggestions(query) {
const url = `https://geocoding-api.open-meteo.com/v1/search?name=${query}&count=5`;
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
displaySuggestions(data.results);
} catch (error) {
console.error('Error fetching city suggestions:', error);
}
}
function displaySuggestions(results) {
const suggestionsContainer = document.getElementById('city-list');
clearSuggestions();
const displayedSuggestions = new Set();
const savedLocations = JSON.parse(localStorage.getItem('savedLocations')) || [];
const savedLocationsSet = new Set(savedLocations.map(location => location.locationName));
results.forEach(result => {
const city = result.name;
const state = result.admin1 || result.admin2 || result.admin3;
const country = result.country;
const countryCode = result.country_code.toLowerCase();
const uniqueComponents = [city, state, country].filter((value, index, self) => value && self.indexOf(value) === index);
const suggestionText = uniqueComponents.join(', ');
if (!displayedSuggestions.has(suggestionText)) {
displayedSuggestions.add(suggestionText);
const suggestionItem = document.createElement('div');
const clickLocation = document.createElement('savelocationtouch');
const saveBtnLocation = document.createElement('md-text-button');
saveBtnLocation.textContent = 'Save';
if (!savedLocationsSet.has(suggestionText)) {
saveBtnLocation.hidden = false;
} else {
saveBtnLocation.hidden = true;
}
const createGap = document.createElement('flex');
const countryIcon = document.createElement('span');
countryIcon.classList.add('fi', 'fis', `fi-${countryCode}`);
suggestionItem.classList.add('suggestion-item');
const suggestRipple = document.createElement('md-ripple');
suggestRipple.style = '--md-ripple-pressed-opacity: 0.1;';
suggestionItem.textContent = suggestionText;
clickLocation.appendChild(suggestRipple);
suggestionItem.setAttribute('data-lat', result.latitude);
suggestionItem.setAttribute('data-lon', result.longitude);
clickLocation.addEventListener('click', function () {
DecodeWeather(result.latitude, result.longitude);
cityList.innerHTML = '';
cityInput.value = '';
document.getElementById('city-name').innerHTML = suggestionText;
document.querySelector('.focus-input').blur();
document.getElementById('forecast').scrollLeft = 0;
document.getElementById('weather_wrap').scrollTop = 0;
window.history.back();
setTimeout(() => {
cityInput.dispatchEvent(new Event('input'));
}, 200);
});
saveBtnLocation.addEventListener('click', () => {
saveLocationToContainer(suggestionText, result.latitude, result.longitude);
cityList.innerHTML = '';
cityInput.value = '';
setTimeout(() => {
cityInput.dispatchEvent(new Event('input'));
}, 200);
});
suggestionItem.appendChild(countryIcon);
suggestionItem.appendChild(clickLocation);
suggestionItem.appendChild(createGap);
suggestionItem.appendChild(saveBtnLocation);
suggestionsContainer.appendChild(suggestionItem);
setTimeout(() => {
document.getElementById('cityLoader').hidden = true;
}, 400);
}
});
}
function clearSuggestions() {
const suggestionsContainer = document.getElementById('city-list');
while (suggestionsContainer.firstChild) {
suggestionsContainer.removeChild(suggestionsContainer.firstChild);
}
}
});
function saveLocationToContainer(locationName, lat, lon) {
let savedLocations = JSON.parse(localStorage.getItem('savedLocations')) || [];
savedLocations.push({ locationName, lat, lon });
localStorage.setItem('savedLocations', JSON.stringify(savedLocations));
const savedLocationsHolder = document.querySelector('savedLocationsHolder');
savedLocationsHolder.innerHTML = ''
setTimeout(() => {
loadSavedLocations()
}, 200)
}
function loadSavedLocations() {
const savedLocationsHolder = document.querySelector('savedLocationsHolder');
const savedLocations = JSON.parse(localStorage.getItem('savedLocations')) || [];
if (savedLocations.length === 0) {
document.querySelector('.savedLocations').hidden = true;
} else {
document.querySelector('.savedLocations').hidden = false;
}
const currentTime = new Date().getTime();
savedLocations.forEach(location => {
const savedLocationItem = document.createElement('savedLocationItem');
savedLocationItem.setAttribute('lat', location.lat);
savedLocationItem.setAttribute('lon', location.lon);
const savedLocationItemLat = savedLocationItem.getAttribute('lat');
const savedLocationItemLon = savedLocationItem.getAttribute('lon');
let tempSaved, conditionSaved, tempSavedMet, conditionSavedMet;
const cacheKey = `weatherData_${location.locationName}`;
const cachedData = JSON.parse(localStorage.getItem(cacheKey));
const cacheTime = localStorage.getItem(`${cacheKey}_timestamp`);
if (cachedData && cacheTime && (currentTime - cacheTime) < 1800000) { // 30 minutes in milliseconds
// Use cached data
displayWeatherData(cachedData, savedLocationItem, location.locationName);
} else {
// Fetch new data
if (localStorage.getItem('selectedMainWeatherProvider') === 'Met norway') {
fetch(`https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=${savedLocationItemLat}&lon=${savedLocationItemLon}`)
.then(response => response.json())
.then(data => {
const mainTempMet = data.properties.timeseries[0].data.instant.details;
tempSavedMet = SelectedTempUnit === 'fahrenheit'
? Math.round(celsiusToFahrenheit(mainTempMet.air_temperature))
: Math.round(mainTempMet.air_temperature);
conditionSavedMet = getMetNorwayWeatherLabelInLang(data.properties.timeseries[0].data.next_1_hours.summary.symbol_code, 'en');
const weatherData = {
temp: tempSavedMet,
condition: conditionSavedMet,
icon: getMetNorwayIcons(data.properties.timeseries[0].data.next_1_hours.summary.symbol_code)
};
// Cache data
localStorage.setItem(cacheKey, JSON.stringify(weatherData));
localStorage.setItem(`${cacheKey}_timestamp`, currentTime);
displayWeatherData(weatherData, savedLocationItem, location.locationName);
});
} else {
fetch(`https://api.open-meteo.com/v1/forecast?latitude=${savedLocationItemLat}&longitude=${savedLocationItemLon}&current=temperature_2m,is_day,weather_code`)
.then(response => response.json())
.then(data => {
tempSaved = SelectedTempUnit === 'fahrenheit'
? Math.round(celsiusToFahrenheit(data.current.temperature_2m))
: Math.round(data.current.temperature_2m);
conditionSaved = getWeatherLabelInLangNoAnim(data.current.weather_code, data.current.is_day, localStorage.getItem('AppLanguageCode'));
const weatherData = {
temp: tempSaved,
condition: conditionSaved,
icon: GetWeatherIcon(data.current.weather_code, data.current.is_day)
};
// Cache data
localStorage.setItem(cacheKey, JSON.stringify(weatherData));
localStorage.setItem(`${cacheKey}_timestamp`, currentTime);
displayWeatherData(weatherData, savedLocationItem, location.locationName);
});
}
}
savedLocationsHolder.append(savedLocationItem);
});
}
function displayWeatherData(weatherData, savedLocationItem, locationName) {
savedLocationItem.innerHTML = `
<savedlocationimg>
<img src="${weatherData.icon}" alt="">
</savedlocationimg>
<div>
<p>${locationName}</p>
<span>${weatherData.condition}</span>
<mainCurrenttempSaved>${weatherData.temp}°</mainCurrenttempSaved>
</div>
<flex></flex>
<md-icon-button class="delete-btn">
<md-icon icon-filled>delete</md-icon>
</md-icon-button>`;
savedLocationItem.querySelector('.delete-btn').addEventListener('click', () => {
deleteLocation(locationName);
savedLocationItem.remove();
});
const savelocationtouch = document.createElement('savelocationtouch');
const md_rippleSaveLocationTouch = document.createElement('md-ripple');
savelocationtouch.appendChild(md_rippleSaveLocationTouch);
savelocationtouch.addEventListener('click', () => {
DecodeWeather(savedLocationItem.getAttribute('lat'), savedLocationItem.getAttribute('lon'));
document.getElementById('city-name').innerHTML = locationName;
document.getElementById('forecast').scrollLeft = 0;
document.getElementById('weather_wrap').scrollTop = 0;
window.history.back();
});
savedLocationItem.appendChild(savelocationtouch);
}
document.addEventListener('DOMContentLoaded', (event) => {
loadSavedLocations();
});
function deleteLocation(locationName) {
let savedLocations = JSON.parse(localStorage.getItem('savedLocations')) || [];
savedLocations = savedLocations.filter(location => location.locationName !== locationName);
localStorage.setItem('savedLocations', JSON.stringify(savedLocations));
if (savedLocations.length === 0) {
document.querySelector('.savedLocations').hidden = true;
document.getElementById('edit_saved_locations').selected = false;
} else {
document.querySelector('.savedLocations').hidden = false;
}
}
window.addEventListener('popstate', function (event) {
if (!document.querySelector('.map_picker').hidden) {
document.querySelector('.map_picker').style.opacity = '0';
document.querySelector('.map_picker').style.transform = 'scale(0.8)';
setTimeout(() => {
document.querySelector('.map_picker').hidden = true;
document.querySelector('.map_picker').style.opacity = '';
document.querySelector('.map_picker').style.transform = '';
}, 300);
} else {
document.getElementById('search-container').style.opacity = '0'
setTimeout(() => {
document.getElementById('modal-content').scrollTop = 0;
document.getElementById('city-input').value = ''
document.getElementById('city-input').dispatchEvent(new Event('input'));
document.getElementById('search-container').style.display = 'none'
document.getElementById('search-container').style.opacity = '1'
}, 300);
}
});
function getCountryName(code) {
return countryNames[code] || "Unknown Country";
}
function getCurrentLocationWeather() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(position => {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
DecodeWeather(latitude, longitude); // Call getWeatherByCoordinates with coordinates
}, handleGeolocationError);
} else {
console.error('Geolocation is not supported by this browser.');
}
}
function showLoader() {
const loaderContainer = document.getElementById('loader-container');
loaderContainer.style.display = 'flex';
loaderContainer.style.opacity = '1';
document.querySelector('rainmeterbar').scrollLeft = 0
}
// Hide the loader
function hideLoader() {
const loaderContainer = document.getElementById('loader-container');
loaderContainer.style.opacity = '0';
setTimeout(() => {
loaderContainer.style.display = 'none';
}, 300);
let savedLocations = JSON.parse(localStorage.getItem('savedLocations')) || [];
if (savedLocations.length === 0) {
document.querySelector('.savedLocations').hidden = true;
} else {
document.querySelector('.savedLocations').hidden = false;
}
}
function refreshWeather(){
if(navigator.onLine){
const latSend = localStorage.getItem('currentLat')
const longSend = localStorage.getItem('currentLong')
DecodeWeather(latSend, longSend)
setTimeout(()=>{
document.querySelector('.refresh_weat').disabled = true;
}, 200);
setTimeout(()=>{
document.querySelector('.refresh_weat').disabled = false;
}, 300000);
} else{
ToastAndroidShow.ShowToast('Cache refreshed', 'long');
return
}
}
function sendThemeToAndroid(theme) {
AndroidInterface.updateStatusBarColor(theme);
};
function Toast(toastText, time){
ToastAndroidShow.ShowToast(toastText, time);
}
// map
var map;
function darkModeTileLayer(urlTemplate) {
const filterStyle = 'invert(100%) hue-rotate(180deg) brightness(95%) contrast(90%)';
return window.L.tileLayer(urlTemplate, {
}).addTo(map).getContainer().style.filter = filterStyle;
}
function RenderSearhMap() {
const latDif = localStorage.getItem('currentLat');
const longDif = localStorage.getItem('currentLong');
map = window.L.map('map', {
center: [latDif, longDif],
zoom: 8,
zoomControl: false
});
darkModeTileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png');
var marker = window.L.marker([latDif, longDif]).addTo(map);
map.on('click', function(e) {
var lat = e.latlng.lat;
var lon = e.latlng.lng;
marker.setLatLng([lat, lon]);
window.history.back();
document.getElementById('search-container').style.opacity = '0';
setTimeout(() => {
window.history.back();
}, 500);
DecodeWeather(lat, lon);
document.getElementById('forecast').scrollLeft = 0;
document.getElementById('weather_wrap').scrollTop = 0;
});
}
function removeMap() {
if (map) {
map.remove();
map = null;
}
}
function checkNoInternet() {
if (navigator.onLine) {
localStorage.setItem('DeviceOnline', 'Yes');
} else {
const offlineData = JSON.parse(localStorage.getItem('OfflineData'));
if (!offlineData) {
ShowError();
}
}
}
checkNoInternet()
document.addEventListener('DOMContentLoaded', async function() {
const currentVersion = 'v1.7.9';
const githubRepo = 'PranshulGG/WeatherMaster';
const releasesUrl = `https://api.github.com/repos/${githubRepo}/releases/latest`;
try {
const response = await fetch(releasesUrl);
if (!response.ok) throw new Error('Network response was not ok.');
const data = await response.json();
const latestVersion = data.tag_name;
if (latestVersion !== currentVersion) {
if(localStorage.getItem('HideNewUpdateToast') === 'true'){
document.querySelector('.new_ver_download').hidden = false;
setTimeout(()=>{
document.querySelector('.new_ver_download').hidden = true;
}, 5000);
} else{
document.querySelector('.new_ver_download').hidden = false;
}
} else {
document.querySelector('.new_ver_download').hidden = true;
return
}
}catch (error) {
}
});
const scrollView = document.querySelector('.insights');
const scrollIndicators = document.getElementById('scroll-indicators');
function saveScrollPosition() {
const scrollPosition = scrollView.scrollLeft;
localStorage.setItem('scrollPosition', scrollPosition);
}
function restoreScrollPosition() {
const savedScrollPosition = localStorage.getItem('scrollPosition');
if (savedScrollPosition) {
scrollView.scrollLeft = savedScrollPosition;
}
}
function createScrollDots(){
const sections = document.querySelectorAll('.insights_item');
sections.forEach((section, index) => {
const dot = document.createElement('span');
const dotValue = document.createElement('div');
dot.classList.add('dot');
dotValue.classList.add('dotValue')
dot.onclick = () => {
section.scrollIntoView({ behavior: 'smooth' });
};
scrollIndicators.appendChild(dot);
dot.appendChild(dotValue)
});
}
const updateActiveIndicator = () => {
const scrollPosition = Math.round(scrollView.scrollLeft / scrollView.offsetWidth);
const dotsValue = document.querySelectorAll('.dotValue');
dotsValue.forEach((dotValue, index) => {
if (index === scrollPosition) {
dotValue.style.transform = 'scale(1)';
} else {
dotValue.style.transform = 'scale(0)';
}
});
};
function debounce(func, delay) {
let inDebounce;
return function() {
const context = this, args = arguments;
clearTimeout(inDebounce);
inDebounce = setTimeout(() => func.apply(context, args), delay);
};
}
scrollView.addEventListener('scroll', debounce(saveScrollPosition, 200));
scrollView.addEventListener('scroll', updateActiveIndicator);
document.addEventListener('DOMContentLoaded', ()=>{
createScrollDots()
updateActiveIndicator();
restoreScrollPosition();
});
document.getElementById('edit_saved_locations').addEventListener('click', ()=>{
const allDeleteBtns = document.querySelectorAll('.delete-btn');
const allTempsSaved = document.querySelectorAll('maincurrenttempsaved');
if(document.getElementById('edit_saved_locations').selected){
allDeleteBtns.forEach((deletebtns)=>{
deletebtns.style.display = 'flex'
})
allTempsSaved.forEach((TempsSaved)=>{
TempsSaved.style.display = 'none'
})
} else{
allDeleteBtns.forEach((deletebtns)=>{
deletebtns.style.display = 'none'
})
allTempsSaved.forEach((TempsSaved)=>{
TempsSaved.style.display = 'block'
})
}
});
function ReturnHomeLocation(){
const Locations = JSON.parse(localStorage.getItem('DefaultLocation'));
DecodeWeather(Locations.lat, Locations.lon)
document.getElementById('city-name').innerHTML = Locations.name;
document.getElementById('SelectedLocationText').innerHTML = Locations.name;
localStorage.setItem('CurrentLocationName', Locations.name)
}
if(localStorage.getItem('removedOldSavedLocations') && localStorage.getItem('removedOldSavedLocations') === 'removed'){
localStorage.removeItem('savedLocations');
setTimeout(()=>{
localStorage.getItem('removedOldSavedLocations', 'removed')
}, 300);
} else{
localStorage.getItem('removedOldSavedLocations', 'removed')
}
+3
View File
@@ -0,0 +1,3 @@
const themeStyle = localStorage.getItem('weatherTHEME')
document.documentElement.setAttribute('iconCodeTheme', themeStyle);
File diff suppressed because it is too large. Load diff
+252
View File
@@ -0,0 +1,252 @@
const countryNames = {
"BD": "Bangladesh",
"BE": "Belgium",
"BF": "Burkina Faso",
"BG": "Bulgaria",
"BA": "Bosnia and Herzegovina",
"BB": "Barbados",
"WF": "Wallis and Futuna",
"BL": "Saint Barthelemy",
"BM": "Bermuda",
"BN": "Brunei",
"BO": "Bolivia",
"BH": "Bahrain",
"BI": "Burundi",
"BJ": "Benin",
"BT": "Bhutan",
"JM": "Jamaica",
"BV": "Bouvet Island",
"BW": "Botswana",
"WS": "Samoa",
"BQ": "Bonaire, Saint Eustatius and Saba ",
"BR": "Brazil",
"BS": "Bahamas",
"JE": "Jersey",
"BY": "Belarus",
"BZ": "Belize",
"RU": "Russia",
"RW": "Rwanda",
"RS": "Serbia",
"TL": "East Timor",
"RE": "Reunion",
"TM": "Turkmenistan",
"TJ": "Tajikistan",
"RO": "Romania",
"TK": "Tokelau",
"GW": "Guinea-Bissau",
"GU": "Guam",
"GT": "Guatemala",
"GS": "South Georgia and the South Sandwich Islands",
"GR": "Greece",
"GQ": "Equatorial Guinea",
"GP": "Guadeloupe",
"JP": "Japan",
"GY": "Guyana",
"GG": "Guernsey",
"GF": "French Guiana",
"GE": "Georgia",
"GD": "Grenada",
"GB": "United Kingdom",
"GA": "Gabon",
"SV": "El Salvador",
"GN": "Guinea",
"GM": "Gambia",
"GL": "Greenland",
"GI": "Gibraltar",
"GH": "Ghana",
"OM": "Oman",
"TN": "Tunisia",
"JO": "Jordan",
"HR": "Croatia",
"HT": "Haiti",
"HU": "Hungary",
"HK": "Hong Kong",
"HN": "Honduras",
"HM": "Heard Island and McDonald Islands",
"VE": "Venezuela",
"PR": "Puerto Rico",
"PS": "Palestinian Territory",
"PW": "Palau",
"PT": "Portugal",
"SJ": "Svalbard and Jan Mayen",
"PY": "Paraguay",
"IQ": "Iraq",
"PA": "Panama",
"PF": "French Polynesia",
"PG": "Papua New Guinea",
"PE": "Peru",
"PK": "Pakistan",
"PH": "Philippines",
"PN": "Pitcairn",
"PL": "Poland",
"PM": "Saint Pierre and Miquelon",
"ZM": "Zambia",
"EH": "Western Sahara",
"EE": "Estonia",
"EG": "Egypt",
"ZA": "South Africa",
"EC": "Ecuador",
"IT": "Italy",
"VN": "Vietnam",
"SB": "Solomon Islands",
"ET": "Ethiopia",
"SO": "Somalia",
"ZW": "Zimbabwe",
"SA": "Saudi Arabia",
"ES": "Spain",
"ER": "Eritrea",
"ME": "Montenegro",
"MD": "Moldova",
"MG": "Madagascar",
"MF": "Saint Martin",
"MA": "Morocco",
"MC": "Monaco",
"UZ": "Uzbekistan",
"MM": "Myanmar",
"ML": "Mali",
"MO": "Macao",
"MN": "Mongolia",
"MH": "Marshall Islands",
"MK": "Macedonia",
"MU": "Mauritius",
"MT": "Malta",
"MW": "Malawi",
"MV": "Maldives",
"MQ": "Martinique",
"MP": "Northern Mariana Islands",
"MS": "Montserrat",
"MR": "Mauritania",
"IM": "Isle of Man",
"UG": "Uganda",
"TZ": "Tanzania",
"MY": "Malaysia",
"MX": "Mexico",
"IL": "Israel",
"FR": "France",
"IO": "British Indian Ocean Territory",
"SH": "Saint Helena",
"FI": "Finland",
"FJ": "Fiji",
"FK": "Falkland Islands",
"FM": "Micronesia",
"FO": "Faroe Islands",
"NI": "Nicaragua",
"NL": "Netherlands",
"NO": "Norway",
"NA": "Namibia",
"VU": "Vanuatu",
"NC": "New Caledonia",
"NE": "Niger",
"NF": "Norfolk Island",
"NG": "Nigeria",
"NZ": "New Zealand",
"NP": "Nepal",
"NR": "Nauru",
"NU": "Niue",
"CK": "Cook Islands",
"XK": "Kosovo",
"CI": "Ivory Coast",
"CH": "Switzerland",
"CO": "Colombia",
"CN": "China",
"CM": "Cameroon",
"CL": "Chile",
"CC": "Cocos Islands",
"CA": "Canada",
"CG": "Republic of the Congo",
"CF": "Central African Republic",
"CD": "Democratic Republic of the Congo",
"CZ": "Czech Republic",
"CY": "Cyprus",
"CX": "Christmas Island",
"CR": "Costa Rica",
"CW": "Curacao",
"CV": "Cape Verde",
"CU": "Cuba",
"SZ": "Swaziland",
"SY": "Syria",
"SX": "Sint Maarten",
"KG": "Kyrgyzstan",
"KE": "Kenya",
"SS": "South Sudan",
"SR": "Suriname",
"KI": "Kiribati",
"KH": "Cambodia",
"KN": "Saint Kitts and Nevis",
"KM": "Comoros",
"ST": "Sao Tome and Principe",
"SK": "Slovakia",
"KR": "South Korea",
"SI": "Slovenia",
"KP": "North Korea",
"KW": "Kuwait",
"SN": "Senegal",
"SM": "San Marino",
"SL": "Sierra Leone",
"SC": "Seychelles",
"KZ": "Kazakhstan",
"KY": "Cayman Islands",
"SG": "Singapore",
"SE": "Sweden",
"SD": "Sudan",
"DO": "Dominican Republic",
"DM": "Dominica",
"DJ": "Djibouti",
"DK": "Denmark",
"VG": "British Virgin Islands",
"DE": "Germany",
"YE": "Yemen",
"DZ": "Algeria",
"US": "United States",
"UY": "Uruguay",
"YT": "Mayotte",
"UM": "United States Minor Outlying Islands",
"LB": "Lebanon",
"LC": "Saint Lucia",
"LA": "Laos",
"TV": "Tuvalu",
"TW": "Taiwan",
"TT": "Trinidad and Tobago",
"TR": "Turkey",
"LK": "Sri Lanka",
"LI": "Liechtenstein",
"LV": "Latvia",
"TO": "Tonga",
"LT": "Lithuania",
"LU": "Luxembourg",
"LR": "Liberia",
"LS": "Lesotho",
"TH": "Thailand",
"TF": "French Southern Territories",
"TG": "Togo",
"TD": "Chad",
"TC": "Turks and Caicos Islands",
"LY": "Libya",
"VA": "Vatican",
"VC": "Saint Vincent and the Grenadines",
"AE": "United Arab Emirates",
"AD": "Andorra",
"AG": "Antigua and Barbuda",
"AF": "Afghanistan",
"AI": "Anguilla",
"VI": "U.S. Virgin Islands",
"IS": "Iceland",
"IR": "Iran",
"AM": "Armenia",
"AL": "Albania",
"AO": "Angola",
"AQ": "Antarctica",
"AS": "American Samoa",
"AR": "Argentina",
"AU": "Australia",
"AT": "Austria",
"AW": "Aruba",
"IN": "India",
"AX": "Aland Islands",
"AZ": "Azerbaijan",
"IE": "Ireland",
"ID": "Indonesia",
"UA": "Ukraine",
"QA": "Qatar",
"MZ": "Mozambique"
}
+35
View File
@@ -0,0 +1,35 @@
let combinedData = {
hourlyData: null,
dailyData: null
};
function ReportFromhourly(data) {
combinedData.hourlyData = data;
GenerateSummary(combinedData);
}
function ReportFromdaily(data) {
combinedData.dailyData = data;
GenerateSummary(combinedData);
}
function GenerateSummary(data) {
let hourlyWeather = getWeatherLabelInLangNoAnimText(data.hourlyData, 1, 'en');
let dailyWeather = getWeatherLabelInLangNoAnim(data.dailyData, 1, 'en');
let weatherComment = '';
if (hourlyWeather === dailyWeather) {
weatherComment = `Looks ${hourlyWeather} throughout the day.`;
} else {
weatherComment = `Looks ${hourlyWeather} and ${dailyWeather} throughout the day.`;
}
document.getElementById('weatherComments').innerHTML = `
${weatherComment}
<space></space>
<md-icon icon-outlined id="arrow_up_toggle">keyboard_arrow_down</md-icon>
`;
}
+729
View File
@@ -0,0 +1,729 @@
function getCountryName(code) {
return countryNames[code] || "Unknown Country";
}
async function DecodeWeather(lat, lon) {
const apiKey = 'KEYS';
const url = `https://api.timezonedb.com/v2.1/get-time-zone?key=${apiKey}&format=json&by=position&lat=${lat}&lng=${lon}`;
try {
const response = await fetch(url);
const data = await response.json();
if (data.status === 'OK') {
FetchWeather(lat, lon, data.zoneName)
} else {
console.error('Error fetching timezone:', data);
DecodeWeather(lat, lon)
return null;
}
} catch (error) {
console.error('Error:', error);
DecodeWeather(lat, lon)
return null;
}
}
function FetchWeather(lat, lon, timezone) {
showLoader();
localStorage.setItem('currentLong', lon)
localStorage.setItem('currentLat', lat)
fetch(`https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lon}&current=temperature_2m,is_day,apparent_temperature,pressure_msl,relative_humidity_2m,precipitation,weather_code,cloud_cover,wind_speed_10m,wind_direction_10m,wind_gusts_10m&hourly=wind_speed_10m,wind_direction_10m,relative_humidity_2m,pressure_msl,cloud_cover,temperature_2m,dew_point_2m,apparent_temperature,precipitation_probability,precipitation,weather_code,visibility,uv_index&daily=weather_code,temperature_2m_max,temperature_2m_min,sunrise,sunset,daylight_duration,uv_index_max,precipitation_sum,daylight_duration,precipitation_probability_max,precipitation_hours,wind_speed_10m_max,wind_gusts_10m_max&timezone=${timezone}&forecast_days=14&forecast_hours=24`)
.then(response => response.json())
.then(data => {
// send hour
if (localStorage.getItem('selectedMainWeatherProvider') === 'Met norway') {
FetchWeatherMetNorway(lat, lon)
CurrentWeather(data.current, data.daily.sunrise[0], data.daily.sunset[0])
localStorage.setItem('DailyWeatherCache', JSON.stringify(data.daily));
UvIndex(data.hourly.uv_index[0])
DailyWeather(data.daily)
saveCache(lat, lon, timezone)
localStorage.setItem('CurrentHourlyCache', JSON.stringify(data.hourly))
document.querySelector('.data_provider_name_import').innerHTML = 'Data by Met norway';
} else if(localStorage.getItem('ApiForAccu') && localStorage.getItem('selectedMainWeatherProvider') === 'Accuweather') {
FetchWeatherAccuweather(lat, lon)
CurrentWeather(data.current, data.daily.sunrise[0], data.daily.sunset[0])
localStorage.setItem('DailyWeatherCache', JSON.stringify(data.daily));
UvIndex(data.hourly.uv_index[0])
DailyWeather(data.daily)
saveCache(lat, lon, timezone)
localStorage.setItem('CurrentHourlyCache', JSON.stringify(data.hourly))
document.querySelector('.data_provider_name_import').innerHTML = 'Data by Accuweather';
}
else {
DailyWeather(data.daily)
HourlyWeather(data);
localStorage.setItem('DailyWeatherCache', JSON.stringify(data.daily));
localStorage.setItem('CurrentHourlyCache', JSON.stringify(data.hourly))
saveCache(lat, lon, timezone)
CurrentWeather(data.current, data.daily.sunrise[0], data.daily.sunset[0])
document.querySelector('.data_provider_name_import').innerHTML = 'Data by Open-Meteo';
}
const checkIFitsSavedLocation = JSON.parse(localStorage.getItem('DefaultLocation'));
function isApproxEqual(val1, val2, epsilon = 0.0001) {
return Math.abs(val1 - val2) < epsilon;
}
if (checkIFitsSavedLocation) {
const savedLat = parseFloat(checkIFitsSavedLocation.lat);
const savedLon = parseFloat(checkIFitsSavedLocation.lon);
const savedName = checkIFitsSavedLocation.name;
if ((savedLat !== undefined && savedLon !== undefined && isApproxEqual(lat, savedLat) && isApproxEqual(lon, savedLon))) {
cacheOfflineCurrentData(data, data.daily, data.current, data.daily.sunrise[0], data.daily.sunset[0], new Date().toISOString());
}
}
FetchAirQuality(lat, lon, timezone)
MoreDetails(lat, lon)
function MoreDetails(latSum, lonSum) {
fetch(`https://api.weatherapi.com/v1/forecast.json?key=KEYS&q=${latSum},${lonSum}`)
.then(response => response.json())
.then(data => {
MoreDetailsRender(data)
const checkIFitsSavedLocation = JSON.parse(localStorage.getItem('DefaultLocation'));
function isApproxEqual(val1, val2, epsilon = 0.0001) {
return Math.abs(val1 - val2) < epsilon;
}
if (checkIFitsSavedLocation) {
const savedLat = parseFloat(checkIFitsSavedLocation.lat);
const savedLon = parseFloat(checkIFitsSavedLocation.lon);
const savedName = checkIFitsSavedLocation.name;
if ((savedLat !== undefined && savedLon !== undefined && isApproxEqual(lat, savedLat) && isApproxEqual(lon, savedLon))) {
localStorage.setItem('OfflineMoreDetailsSummaryData', JSON.stringify(data));
}
}
});
}
astronomyData(lat, lon)
function astronomyData(latSum, lonSum) {
fetch(`https://api.weatherapi.com/v1/astronomy.json?key=KEYS&q=${latSum},${lonSum}`)
.then(response => response.json())
.then(data => {
astronomyDataRender(data)
const checkIFitsSavedLocation = JSON.parse(localStorage.getItem('DefaultLocation'));
function isApproxEqual(val1, val2, epsilon = 0.0001) {
return Math.abs(val1 - val2) < epsilon;
}
if (checkIFitsSavedLocation) {
const savedLat = parseFloat(checkIFitsSavedLocation.lat);
const savedLon = parseFloat(checkIFitsSavedLocation.lon);
const savedName = checkIFitsSavedLocation.name;
if ((savedLat !== undefined && savedLon !== undefined && isApproxEqual(lat, savedLat) && isApproxEqual(lon, savedLon))) {
localStorage.setItem('OfflineastronomyData', JSON.stringify(data));
}
}
});
}
FetchAlert(lat, lon)
const weatherCodeGroups = {
"0": [0],
"1": [1],
"2": [2],
"3": [3],
"45": [45],
"48": [48],
"51": [51],
"53": [53],
"55": [55],
"56": [56],
"57": [57],
"61": [61],
"63": [63],
"65": [65],
"66": [66],
"67": [67],
"71": [71],
"73": [73],
"75": [75],
"77": [77],
"80": [80],
"81": [81],
"82": [82],
"85": [85],
"86": [86],
"95": [95],
"96": [96],
"99": [99]
};
let groupCounts = {};
Object.keys(weatherCodeGroups).forEach(group => {
groupCounts[group] = 0;
});
data.hourly.weather_code.forEach((code) => {
if (groupCounts[code] !== undefined) {
groupCounts[code]++;
}
});
const mostFrequentGroup = Object.keys(groupCounts).reduce((a, b) => groupCounts[a] > groupCounts[b] ? a : b);
const selectedWeatherCode = mostFrequentGroup;
ReportFromhourly(selectedWeatherCode);
let Visibility;
let VisibilityUnit;
if (SelectedVisibiltyUnit === 'mileV') {
Visibility = Math.round(data.hourly.visibility[0] / 1609.34);
VisibilityUnit = 'miles'
} else {
Visibility = Math.round(data.hourly.visibility[0] / 1000);
VisibilityUnit = 'km'
}
document.getElementById('unit_visibility').innerHTML = VisibilityUnit
document.getElementById('min-temp').innerHTML = Visibility
let DewPointTemp
if (SelectedTempUnit === 'fahrenheit') {
DewPointTemp = Math.round(celsiusToFahrenheit(data.hourly.dew_point_2m[0]))
} else {
DewPointTemp = Math.round(data.hourly.dew_point_2m[0])
}
document.getElementById('dew_percentage').innerHTML = DewPointTemp + '°'
hideLoader()
}).catch(error =>{
ShowError()
document.getElementById('error_text_content').innerHTML = error
})
}
// get airquality
function FetchAirQuality(lat, lon, timezone) {
fetch(`https://air-quality-api.open-meteo.com/v1/air-quality?latitude=${lat}&longitude=${lon}&current=us_aqi,pm10,pm2_5,carbon_monoxide,nitrogen_dioxide,sulphur_dioxide,ozone,alder_pollen,birch_pollen,grass_pollen,mugwort_pollen,olive_pollen,ragweed_pollen&timezone=${timezone}&forecast_hours=1`)
.then(response => response.json())
.then(data => {
AirQuaility(data)
const checkIFitsSavedLocation = JSON.parse(localStorage.getItem('DefaultLocation'));
function isApproxEqual(val1, val2, epsilon = 0.0001) {
return Math.abs(val1 - val2) < epsilon;
}
if (checkIFitsSavedLocation) {
const savedLat = parseFloat(checkIFitsSavedLocation.lat);
const savedLon = parseFloat(checkIFitsSavedLocation.lon);
const savedName = checkIFitsSavedLocation.name;
if ((savedLat !== undefined && savedLon !== undefined && isApproxEqual(lat, savedLat) && isApproxEqual(lon, savedLon))) {
localStorage.setItem('airQualityData', JSON.stringify(data));
}
}
});
}
// selected location toggle
function seeSelectedLocation(){
document.querySelector('selectLocationText').hidden = false;
document.querySelector('selectLocationTextOverlay').hidden = false;
document.querySelector('.header_hold').style.transform = 'scale(1.1)';
document.querySelector('.header_hold').style.opacity = '0';
}
function seeSelectedLocationClose(){
document.querySelector('selectLocationTextOverlay').hidden = true;
document.querySelector('selectLocationText').hidden = true;
document.querySelector('.header_hold').style.transform = '';
document.querySelector('.header_hold').style.opacity = '';
}
document.querySelector('selectLocationTextOverlay').addEventListener('click', ()=>{
seeSelectedLocationClose()
});
function saveCache(lat, lon, timezone) {
fetch(`https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lon}&hourly=relative_humidity_2m,pressure_msl,cloud_cover,temperature_2m,dew_point_2m,apparent_temperature,precipitation_probability,precipitation,weather_code,visibility,uv_index&timezone=${timezone}&forecast_days=14`)
.then(response => response.json())
.then(data => {
localStorage.setItem('HourlyWeatherCache', JSON.stringify(data.hourly));
const checkIFitsSavedLocation = JSON.parse(localStorage.getItem('DefaultLocation'));
function isApproxEqual(val1, val2, epsilon = 0.0001) {
return Math.abs(val1 - val2) < epsilon;
}
if (checkIFitsSavedLocation) {
const savedLat = parseFloat(checkIFitsSavedLocation.lat);
const savedLon = parseFloat(checkIFitsSavedLocation.lon);
const savedName = checkIFitsSavedLocation.name;
if ((savedLat !== undefined && savedLon !== undefined && isApproxEqual(lat, savedLat) && isApproxEqual(lon, savedLon))) {
localStorage.setItem('OfflinesaveCache', JSON.stringify(data.hourly));
}
}
});
}
// fetch using met-norway
function FetchWeatherMetNorway(lat, lon) {
fetch(`https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=${lat}&lon=${lon}`)
.then(response => response.json())
.then(data => {
const currentData = data.properties.timeseries[0];
const hourlyData = data.properties.timeseries.slice(0, 24);
const dailyData = data.properties.timeseries.filter((entry, index) => index % 24 === 0);
renderCurrentDataMetNorway(currentData);
renderHourlyDataMetNorway(hourlyData);
});
}
// fetch ussing accuweather
function FetchWeatherAccuweather(lat, lon) {
const apiKey = localStorage.getItem('ApiForAccu');
const geoPositionUrl = `https://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=${apiKey}&q=${lat},${lon}`;
fetch(geoPositionUrl)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(locationData => {
const locationKey = locationData.Key;
FetchWeatherAccuweatherCurrent(locationKey)
const hourlyForecastUrl = `https://dataservice.accuweather.com/forecasts/v1/hourly/12hour/${locationKey}?apikey=${apiKey}&metric=true`;
return fetch(hourlyForecastUrl);
})
.then(response => response.json())
.then(forecastData => {
DisplayHourlyAccuweatherData(forecastData)
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
}
function FetchWeatherAccuweatherCurrent(location_key) {
const locationKey = location_key;
const apiKey = localStorage.getItem('ApiForAccu');
const weatherUrl = `https://dataservice.accuweather.com/currentconditions/v1/${locationKey}?apikey=${apiKey}`;
fetch(weatherUrl)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
DisplayCurrentAccuweatherData(data)
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
ToastAndroidShow.ShowToast('API Error, switching to open-meteo', 'long');
localStorage.setItem('selectedMainWeatherProvider', 'open-meteo');
setTimeout(()=>{
DecodeWeather(lat, lon)
}, 200);
});
}
// offline caching
function cacheOfflineCurrentData(hourlyOffline, dailyOffline, dailyCurrent, dailySunrise, dailySunset, timestamp){
localStorage.setItem('OfflineData', JSON.stringify({ hourlyOffline: hourlyOffline, dailyOffline: dailyOffline, dailyCurrent: dailyCurrent, dailySunrise: dailySunrise, dailySunset: dailySunset, timestamp: timestamp }));
// create notification for current location
setTimeout(()=>{
sendNotificationData()
}, 670);
function sendNotificationData() {
const SelectedTempUnit = localStorage.getItem('SelectedTempUnit');
const NotificationlocationName = JSON.parse(localStorage.getItem('DefaultLocation'));
const AirQuailityDataNotification = JSON.parse(localStorage.getItem('airQualityData'))
let NotificationTemp;
if (SelectedTempUnit === 'fahrenheit') {
NotificationTemp = Math.round(celsiusToFahrenheit(dailyCurrent.temperature_2m))
} else {
NotificationTemp = Math.round(dailyCurrent.temperature_2m)
}
let location
if (NotificationlocationName.name === 'CurrentDeviceLocation') {
location = 'Device';
} else {
location = NotificationlocationName.name;
}
let TempMinNoti
if (SelectedTempUnit === 'fahrenheit') {
TempMinNoti = Math.round(celsiusToFahrenheit(dailyOffline.temperature_2m_min[0]))
} else {
TempMinNoti = Math.round(dailyOffline.temperature_2m_min[0])
}
let TempMaxNoti
if (SelectedTempUnit === 'fahrenheit') {
TempMaxNoti = Math.round(celsiusToFahrenheit(dailyOffline.temperature_2m_max[0]))
} else {
TempMaxNoti = Math.round(dailyOffline.temperature_2m_max[0])
}
const aqi = AirQuailityDataNotification.current.us_aqi
let aqiCategoryLevel;
if (aqi <= 50) {
aqiCategoryLevel = 'Good';
} else if (aqi <= 100) {
aqiCategoryLevel = 'Fair';
} else if (aqi <= 150) {
aqiCategoryLevel = 'Moderate';
} else if (aqi <= 200) {
aqiCategoryLevel = 'Poor';
} else {
aqiCategoryLevel = 'Very poor';
}
createNotification(NotificationTemp, getWeatherLabelInLangNoAnim(dailyCurrent.weather_code, 1, 'en'), location, `Max: ${TempMaxNoti}° Min: ${TempMinNoti}°`, aqiCategoryLevel, dailyCurrent.weather_code, dailyCurrent.is_day)
}
}
function renderOfflineData(){
const OfflineDataTotal = JSON.parse(localStorage.getItem('OfflineData'))
const AirQuailityDataOffline = JSON.parse(localStorage.getItem('airQualityData'))
const OfflineMoreDetailsSummaryData = JSON.parse(localStorage.getItem('OfflineMoreDetailsSummaryData'));
const OfflineastronomyData = JSON.parse(localStorage.getItem('OfflineastronomyData'));
const OfflinesaveCache = JSON.parse(localStorage.getItem('OfflinesaveCache'));
const offlineDatalocationName = JSON.parse(localStorage.getItem('DefaultLocation'));
localStorage.setItem('DailyWeatherCache', JSON.stringify(OfflineDataTotal.dailyOffline));
localStorage.setItem('CurrentHourlyCache', JSON.stringify(OfflineDataTotal.hourlyOffline.hourly));
localStorage.setItem('HourlyWeatherCache', JSON.stringify(OfflinesaveCache));
if(offlineDatalocationName.lon && offlineDatalocationName.lat){
localStorage.setItem('currentLong', offlineDatalocationName.lon)
localStorage.setItem('currentLat', offlineDatalocationName.lat)
}
function timeAgo(timestamp) {
const now = new Date();
const updatedTime = new Date(timestamp);
const diffInSeconds = Math.floor((now - updatedTime) / 1000);
const units = [
{ name: "day", seconds: 86400 },
{ name: "hour", seconds: 3600 },
{ name: "minute", seconds: 60 },
{ name: "second", seconds: 1 }
];
for (let unit of units) {
const amount = Math.floor(diffInSeconds / unit.seconds);
if (amount >= 1) {
return `${amount} ${unit.name}${amount > 1 ? 's' : ''} ago`;
}
}
return "just now";
}
setTimeout(()=>{
document.getElementById('last_updated').innerHTML = `Updated, ${timeAgo(timestamp)}`;
}, 500);
if (offlineDatalocationName.name === 'CurrentDeviceLocation') {
document.getElementById('city-name').innerHTML = 'Current location';
document.getElementById('SelectedLocationText').innerHTML = 'Current location';
document.getElementById('currentLocationName').textContent = 'Current location';
} else {
document.getElementById('city-name').innerHTML = offlineDatalocationName.name;
document.getElementById('SelectedLocationText').innerHTML = offlineDatalocationName.name;
document.getElementById('currentLocationName').textContent = offlineDatalocationName.name;
}
HourlyWeather(OfflineDataTotal.hourlyOffline)
DailyWeather(OfflineDataTotal.dailyOffline)
CurrentWeather(OfflineDataTotal.dailyCurrent, OfflineDataTotal.dailySunrise, OfflineDataTotal.dailySunset)
AirQuaility(AirQuailityDataOffline)
MoreDetailsRender(OfflineMoreDetailsSummaryData)
astronomyDataRender(OfflineastronomyData)
let DewPointTemp
if (SelectedTempUnit === 'fahrenheit') {
DewPointTemp = Math.round(celsiusToFahrenheit(OfflineDataTotal.hourlyOffline.hourly.dew_point_2m[0]))
} else {
DewPointTemp = Math.round(OfflineDataTotal.hourlyOffline.hourly.dew_point_2m[0])
}
document.getElementById('dew_percentage').innerHTML = DewPointTemp + '°'
const weatherCodeGroups = {
"0": [0],
"1": [1],
"2": [2],
"3": [3],
"45": [45],
"48": [48],
"51": [51],
"53": [53],
"55": [55],
"56": [56],
"57": [57],
"61": [61],
"63": [63],
"65": [65],
"66": [66],
"67": [67],
"71": [71],
"73": [73],
"75": [75],
"77": [77],
"80": [80],
"81": [81],
"82": [82],
"85": [85],
"86": [86],
"95": [95],
"96": [96],
"99": [99]
};
let groupCounts = {};
Object.keys(weatherCodeGroups).forEach(group => {
groupCounts[group] = 0;
});
OfflineDataTotal.hourlyOffline.hourly.weather_code.forEach((code) => {
if (groupCounts[code] !== undefined) {
groupCounts[code]++;
}
});
const mostFrequentGroup = Object.keys(groupCounts).reduce((a, b) => groupCounts[a] > groupCounts[b] ? a : b);
const selectedWeatherCode = mostFrequentGroup;
ReportFromhourly(selectedWeatherCode);
let Visibility;
let VisibilityUnit;
if (SelectedVisibiltyUnit === 'mileV') {
Visibility = Math.round(OfflineDataTotal.hourlyOffline.hourly.visibility[0] / 1609.34);
VisibilityUnit = 'miles'
} else {
Visibility = Math.round(OfflineDataTotal.hourlyOffline.hourly.visibility[0] / 1000);
VisibilityUnit = 'km'
}
document.getElementById('unit_visibility').innerHTML = VisibilityUnit
document.getElementById('min-temp').innerHTML = Visibility
// notification
sendNotificationData()
function sendNotificationData() {
const SelectedTempUnit = localStorage.getItem('SelectedTempUnit');
const NotificationlocationName = JSON.parse(localStorage.getItem('DefaultLocation'));
const AirQuailityDataNotification = JSON.parse(localStorage.getItem('airQualityData'))
let NotificationTemp;
if (SelectedTempUnit === 'fahrenheit') {
NotificationTemp = Math.round(celsiusToFahrenheit(OfflineDataTotal.dailyCurrent.temperature_2m))
} else {
NotificationTemp = Math.round(OfflineDataTotal.dailyCurrent.temperature_2m)
}
let location
if (NotificationlocationName.name === 'CurrentDeviceLocation') {
location = 'Device';
} else {
location = NotificationlocationName.name;
}
let TempMinNoti
if (SelectedTempUnit === 'fahrenheit') {
TempMinNoti = Math.round(celsiusToFahrenheit(OfflineDataTotal.dailyOffline.temperature_2m_min[0]))
} else {
TempMinNoti = Math.round(OfflineDataTotal.dailyOffline.temperature_2m_min[0])
}
let TempMaxNoti
if (SelectedTempUnit === 'fahrenheit') {
TempMaxNoti = Math.round(celsiusToFahrenheit(OfflineDataTotal.dailyOffline.temperature_2m_max[0]))
} else {
TempMaxNoti = Math.round(OfflineDataTotal.dailyOffline.temperature_2m_max[0])
}
const aqi = AirQuailityDataNotification.current.us_aqi
let aqiCategoryLevel;
if (aqi <= 50) {
aqiCategoryLevel = 'Good';
} else if (aqi <= 100) {
aqiCategoryLevel = 'Fair';
} else if (aqi <= 150) {
aqiCategoryLevel = 'Moderate';
} else if (aqi <= 200) {
aqiCategoryLevel = 'Poor';
} else {
aqiCategoryLevel = 'Very poor';
}
createNotification(NotificationTemp, getWeatherLabelInLangNoAnim(OfflineDataTotal.dailyCurrent.weather_code, 1, 'en'), location, `Max: ${TempMaxNoti}° Min: ${TempMinNoti}°`, aqiCategoryLevel, OfflineDataTotal.dailyCurrent.weather_code, OfflineDataTotal.dailyCurrent.is_day)
}
hideLoader()
}
+26
View File
@@ -0,0 +1,26 @@
window.transitionToPage = function(href) {
document.querySelector('body').style.opacity = '0';
setTimeout(function() {
window.location.href = href
}, 500);
}
document.addEventListener('DOMContentLoaded', function(event) {
document.querySelector('body').style.opacity = '1';
});
@@ -0,0 +1,664 @@
const SelectedTempUnit = localStorage.getItem('SelectedTempUnit');
const SelectedWindUnit = localStorage.getItem('SelectedWindUnit');
const SelectedPrecipitationUnit = localStorage.getItem('selectedPrecipitationUnit');
const SelectedPressureUnit = localStorage.getItem('selectedPressureUnit');
const cachedData = JSON.parse(localStorage.getItem('DailyWeatherCache'));
const cachedDataHourly = JSON.parse(localStorage.getItem('HourlyWeatherCache'));
const timeFormat = localStorage.getItem('selectedTimeMode');
// icons
function GetWeatherIcon(iconCode, isDay) {
if (isDay === 1) {
if (iconCode === 0) {
return '../weather-icons/clear_day.svg';
} else if (iconCode === 1) {
return '../weather-icons/mostly_clear_day.svg';
} else if (iconCode === 2) {
return '../weather-icons/partly_cloudy_day.svg';
} else if (iconCode === 3) {
return '../weather-icons/cloudy.svg';
} else if (iconCode === 45 || iconCode === 48) {
return '../weather-icons/haze_fog_dust_smoke.svg';
} else if (iconCode === 51 || iconCode === 53 || iconCode === 55) {
return '../weather-icons/drizzle.svg';
} else if (iconCode === 56 || iconCode === 57) {
return '../weather-icons/mixed_rain_hail_sleet.svg';
} else if (iconCode === 61 || iconCode === 63) {
return '../weather-icons/showers_rain.svg';
} else if (iconCode === 65) {
return '../weather-icons/heavy_rain.svg';
} else if (iconCode === 66 || iconCode === 67) {
return '../weather-icons/sleet_hail.svg';
} else if (iconCode === 71) {
return '../weather-icons/scattered_snow_showers_day.svg';
} else if (iconCode === 73) {
return '../weather-icons/showers_snow.svg';
} else if (iconCode === 75) {
return '../weather-icons/heavy_snow.svg';
} else if (iconCode === 77) {
return '../weather-icons/flurries.svg';
} else if (iconCode === 80 || iconCode === 81) {
return '../weather-icons/showers_rain.svg';
} else if (iconCode === 82) {
return '../weather-icons/heavy_rain.svg';
} else if (iconCode === 85) {
return '../weather-icons/showers_snow.svg';
} else if (iconCode === 86) {
return '../weather-icons/heavy_snow.svg';
} else if (iconCode === 95) {
return '../weather-icons/isolated_thunderstorms.svg'
} else if (iconCode === 96 || iconCode === 99) {
return '../weather-icons/strong_thunderstorms.svg'
}
}
return iconCode
}
// weather label
function GetWeatherLabel(iconCode, isDay) {
if (isDay === 1) {
if (iconCode === 0) {
return 'clear_sky'
} else if (iconCode === 1) {
return 'mostly_clear'
} else if (iconCode === 2) {
return 'partly_cloudy'
} else if (iconCode === 3) {
return 'overcast'
} else if (iconCode === 45 || iconCode === 48) {
return 'fog'
} else if (iconCode === 51 || iconCode === 53 || iconCode === 55) {
return 'drizzle'
} else if (iconCode === 56 || iconCode === 57) {
return 'freezing_drizzle'
} else if (iconCode === 61 || iconCode === 63) {
return 'moderate_rain'
} else if (iconCode === 65) {
return 'heavy_intensity_rain'
} else if (iconCode === 66 || iconCode === 67) {
return 'freezing_rain'
} else if (iconCode === 71) {
return 'slight_snow'
} else if (iconCode === 73) {
return 'moderate_snow'
} else if (iconCode === 75) {
return 'heavy_intensity_snow'
} else if (iconCode === 77) {
return 'snow_grains'
} else if (iconCode === 80 || iconCode === 81) {
return 'rain_showers'
} else if (iconCode === 82) {
return 'heavy_rain_showers'
} else if (iconCode === 85) {
return 'slight_snow_showers'
} else if (iconCode === 86) {
return 'heavy_snow_showers'
} else if (iconCode === 95) {
return 'thunderstorm'
} else if (iconCode === 96 || iconCode === 99) {
return 'strong_thunderstorm'
}
}
}
function getWeatherLabelInLang(iconCode, isDay, langCode) {
const translationKey = GetWeatherLabel(iconCode, isDay);
const translatedLabel = getTranslationByLang(langCode, translationKey);
return translatedLabel || 'Unknown weather';
}
// change ids same
const ConditionIcons = {
WindSockIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <symbol id="Winda" viewBox="0 0 342 234"> <!-- blow-1 --> <path d="M264.16,21.29A40,40,0,1,1,293,89H9" fill="none" stroke-dasharray="148" stroke="#e2e8f0" stroke-linecap="round" stroke-miterlimit="10" stroke-width="18"> <animate attributeName="stroke-dashoffset" values="0; 2960" dur="6s" repeatCount="indefinite"/> </path> <!-- blow-2 --> <path d="M148.16,212.71A40,40,0,1,0,177,145H9" fill="none" stroke-dasharray="110" stroke="#e2e8f0" stroke-linecap="round" stroke-miterlimit="10" stroke-width="18"> <animate attributeName="stroke-dashoffset" values="0; 1540" dur="6s" repeatCount="indefinite"/> </path> </symbol> </defs> <use width="342" height="234" transform="translate(85 139)" xlink:href="#Winda"/> </svg>',
PrecipitationAmountIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <linearGradient id="PrecipitationAmountIcona" x1="310.54" y1="152.47" x2="425.46" y2="351.53" gradientUnits="userSpaceOnUse"> <stop offset="0" stop-color="#d4d7dd"/> <stop offset="0.45" stop-color="#d4d7dd"/> <stop offset="1" stop-color="#bec1c6"/> </linearGradient> <clipPath id="PrecipitationAmountIconb"> <path fill="none"> <animate attributeName="d" values=" M168,252H344V380H168Z; M168,220H376V380H168Z; M168,252H344V380H168Z " dur="3s" calcMode="spline" keySplines=".42, 0, .58, 1; .42, 0, .58, 1" repeatCount="indefinite"/> </path> </clipPath> <symbol id="PrecipitationAmountIconc" viewBox="0 0 175 260.88"> <path d="M87.5,13.38c-48.7,72-80,117-80,160.75s35.79,79.25,80,79.25,80-35.47,80-79.25S136.2,85.35,87.5,13.38Z" fill="none" stroke="#2885c7" stroke-miterlimit="10" stroke-width="15"/> </symbol> </defs> <path d="M256,132c-48.7,72-80,117-80,160.75S211.79,372,256,372s80-35.47,80-79.25S304.7,204,256,132Z" fill="none" stroke="#e2e8f0" stroke-miterlimit="10" stroke-width="15"/> <path d="M352,132h32V372H352m8-120h24m-16,56h16M368,188h16" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="6" stroke="url(#PrecipitationAmountIcona)"/> <g clip-path="url(#PrecipitationAmountIconb)"> <use width="175" height="260.88" transform="translate(168.61 119.2)" xlink:href="#PrecipitationAmountIconc"/> </g> </svg>',
PrecipitationChancesIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <clipPath id="PrecipitationChancesIcona"> <path d="M302,137c-48.7,72-80,117-80,160.75S257.79,377,302,377V512H0V0H302Z" fill="none"> <animateTransform attributeName="transform" additive="sum" type="scale" values="1 1; 1 .95; 1 1" dur="6s" calcMode="spline" keySplines=".42, 0, .58, 1; .42, 0, .58, 1" repeatCount="indefinite"/> </path> </clipPath> <symbol id="PrecipitationChancesIconb" viewBox="0 0 175 260.88"> <path d="M87.5,13.38c-48.7,72-80,117-80,160.75s35.79,79.25,80,79.25,80-35.47,80-79.25S136.2,85.35,87.5,13.38Z" fill="none" stroke="#2885c7" stroke-miterlimit="10" stroke-width="15"/> </symbol> </defs> <use width="175" height="260.88" transform="translate(214.5 123.62)" xlink:href="#PrecipitationChancesIconb"> <animateTransform attributeName="transform" additive="sum" type="scale" values="1 1; 1 .9; 1 1" dur="6s" calcMode="spline" keySplines=".42, 0, .58, 1; .42, 0, .58, 1" repeatCount="indefinite"/> </use> <g clip-path="url(#PrecipitationChancesIcona)"> <use width="175" height="260.88" transform="translate(122.5 123.62)" xlink:href="#PrecipitationChancesIconb"> <animateTransform attributeName="transform" additive="sum" type="scale" values="1 .9; 1 1; 1 .9" dur="6s" calcMode="spline" keySplines=".42, 0, .58, 1; .42, 0, .58, 1" repeatCount="indefinite"/> </use> </g> </svg>',
PressureIcon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <!-- barometer --> <circle cx="256" cy="256" r="144" fill="none" stroke="#475569" stroke-miterlimit="10" stroke-width="12"/> <!-- values --> <path d="M256,200V152M364,256H316m-116,0H152m180-68-24,24m-104,0-24-24M308,300l24,24m-152,0,24-24" fill="none" stroke="#475569" stroke-linecap="round" stroke-linejoin="round" stroke-width="6"/> <!-- pointer-mount --> <circle cx="256" cy="256" r="24" fill="#ef4444"/> <!-- pointer --> <line x1="256" y1="284" x2="256" y2="164" fill="none" stroke="#ef4444" stroke-linecap="round" stroke-miterlimit="10" stroke-width="12"> <animateTransform attributeName="transform" dur="6s" values="-54 256 256; -15 256 256; -36 256 256; 36 256 256; 10 256 256; 115 256 256; -54 256 256" repeatCount="indefinite" type="rotate" calcMode="spline" keySplines=".42, 0, .58, 1; .42, 0, .58, 1; .42, 0, .58, 1; .42, 0, .58, 1; .42, 0, .58, 1; .42, 0, .58, 1" keyTimes="0; .17; .25; .42; .5; .67; 1"/> </line> </svg>',
CloudCoverIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <symbol id="a" viewBox="0 0 359 231"> <path d="M295.5,223.5a56,56,0,0,0,0-112c-.85,0-1.68.09-2.53.13A83.9,83.9,0,0,0,140.1,47.42,55.91,55.91,0,0,0,55.5,95.5a56.56,56.56,0,0,0,.8,9.08A60,60,0,0,0,67.5,223.5" fill="none" stroke="#e2e8f0" stroke-linecap="round" stroke-linejoin="round" stroke-width="15"/> </symbol> </defs> <use width="359" height="231" transform="translate(76.5 140.5)" xlink:href="#a"> <animateTransform attributeName="transform" additive="sum" type="translate" values="-18 0; 18 0; -18 0" dur="6s" repeatCount="indefinite"/> </use> </svg>',
HumidityIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <symbol id="HumidityIcona" viewBox="0 0 175 260.88"> <path d="M87.5,13.38c-48.7,72-80,117-80,160.75s35.79,79.25,80,79.25,80-35.47,80-79.25S136.2,85.35,87.5,13.38Z" fill="none" stroke="#2885c7" stroke-miterlimit="10" stroke-width="15"> <animateTransform attributeName="transform" additive="sum" type="scale" values="1 1; 1 .9; 1 1" dur="6s" calcMode="spline" keySplines=".42, 0, .58, 1; .42, 0, .58, 1" repeatCount="indefinite"/> </path> </symbol> </defs> <use width="175" height="260.88" transform="translate(168.4 123.18)" xlink:href="#HumidityIcona"/> <path d="M218.78,250.47q4.78-4.47,13.69-4.47t13.68,4.47q4.78,4.47,4.79,12.4v8q0,7.8-4.79,12.22t-13.68,4.41q-8.9,0-13.69-4.41T214,270.91v-8Q214,254.95,218.78,250.47ZM290,248.94a2.79,2.79,0,0,1-.55,2.61l-53,73.24a9.43,9.43,0,0,1-2.84,2.83,12.29,12.29,0,0,1-4.62.56h-4.34c-1.33,0-2.16-.37-2.5-1.13a2.76,2.76,0,0,1,.61-2.72l53-73.35a7,7,0,0,1,2.67-2.66,12.7,12.7,0,0,1,4.34-.51h4.89C288.91,247.81,289.69,248.18,290,248.94Zm-57.52,7.59q-7.68,0-7.68,6.9v6.79q0,6.9,7.68,6.91t7.68-6.91v-6.79Q240.15,256.53,232.47,256.53Zm33.38,36.39q4.78-4.47,13.69-4.47t13.68,4.47q4.78,4.47,4.78,12.4v8q0,7.81-4.78,12.23T279.54,330q-8.91,0-13.69-4.42t-4.79-12.23v-8Q261.06,297.39,265.85,292.92ZM279.54,299q-7.68,0-7.69,6.92v6.67q0,7,7.69,7t7.67-7v-6.67Q287.21,299,279.54,299Z" fill="var(--On-Surface)"/> </svg>',
DewPointIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <clipPath id="a"> <path d="M333.92,392c-30.93,0-56-25.45-56-56.84a57,57,0,0,1,24-46.6V152.46a32.23,32.23,0,0,1,32-32.47H167.4V392Zm4-192h28m-28-32h28m-28,64h28" fill="none"/> </clipPath> <symbol id="b" viewBox="0 0 175 260.88"> <path d="M87.5,13.38c-48.7,72-80,117-80,160.75s35.79,79.25,80,79.25,80-35.47,80-79.25S136.2,85.35,87.5,13.38Z" fill="none" stroke="#2885c7" stroke-miterlimit="10" stroke-width="15"/> </symbol> <symbol id="d" viewBox="0 0 72 168"> <circle cx="36" cy="132" r="36" fill="#ef4444"/> <path d="M36,12V132" fill="none" stroke="#ef4444" stroke-linecap="round" stroke-miterlimit="10" stroke-width="24"> <animateTransform attributeName="transform" type="translate" values="0 0; 0 18; 0 0" dur="1s" calcMode="spline" keySplines=".42, 0, .58, 1; .42, 0, .58, 1" repeatCount="indefinite"/> </path> </symbol> <symbol id="e" viewBox="0 0 118 278"> <path d="M115,218.16C115,249.55,89.93,275,59,275S3,249.55,3,218.16a57,57,0,0,1,24-46.6V35.48a32,32,0,1,1,64,0V171.56A57,57,0,0,1,115,218.16ZM63,83H91M63,51H91M63,115H91" fill="none" stroke="#cbd5e1" stroke-linecap="round" stroke-linejoin="round" stroke-width="6"/> </symbol> <symbol id="c" viewBox="0 0 118 278"> <use width="72" height="168" transform="translate(23 87)" xlink:href="#d"/> <use width="118" height="278" xlink:href="#e"/> </symbol> </defs> <g clip-path="url(#a)"> <use width="175" height="260.88" transform="translate(168.43 123.18)" xlink:href="#b"/> </g> <use width="118" height="278" transform="translate(275 117)" xlink:href="#c"/> </svg>',
SunriseIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <clipPath id="Sunrisea"> <path d="M512,306H304l-35.86-31.38a18.44,18.44,0,0,0-24.28,0L208,306H0V0H512Z" fill="none"/> </clipPath> <symbol id="Sunriseb" viewBox="0 0 375 375"> <!-- sun-core --> <circle cx="187.5" cy="187.5" r="84" fill="none" stroke="#fbbf24" stroke-miterlimit="10" stroke-width="15"/> <!-- sun-rays --> <path d="M187.5,57.16V7.5m0,360V317.84M279.67,95.33l35.11-35.11M60.22,314.78l35.11-35.11m0-184.34L60.22,60.22M314.78,314.78l-35.11-35.11M57.16,187.5H7.5m360,0H317.84" fill="none" stroke="#fbbf24" stroke-linecap="round" stroke-miterlimit="10" stroke-width="15"> <animateTransform attributeName="transform" additive="sum" type="rotate" values="0 187.5 187.5; 45 187.5 187.5" dur="6s" repeatCount="indefinite"/> </path> </symbol> </defs> <g clip-path="url(#Sunrisea)"> <use width="375" height="375" transform="translate(68.5 104.5)" xlink:href="#Sunriseb"/> </g> <polyline points="128 332 216 332 256 296 296 332 384 332" fill="none" stroke="var(--On-Surface-Variant)" stroke-linecap="round" stroke-linejoin="round" stroke-width="18"/> </svg>',
SunsetIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <clipPath id="Sunseta"> <path d="M512,306H296.08a21.5,21.5,0,0,0-14.16,5.32L256,334l-25.92-22.68A21.5,21.5,0,0,0,215.92,306H0V0H512Z" fill="none"/> </clipPath> <symbol id="Sunsetb" viewBox="0 0 375 375"> <!-- sun-core --> <circle cx="187.5" cy="187.5" r="84" fill="none" stroke="#fbbf24" stroke-miterlimit="10" stroke-width="15"/> <!-- sun-rays --> <path d="M187.5,57.16V7.5m0,360V317.84M279.67,95.33l35.11-35.11M60.22,314.78l35.11-35.11m0-184.34L60.22,60.22M314.78,314.78l-35.11-35.11M57.16,187.5H7.5m360,0H317.84" fill="none" stroke="#fbbf24" stroke-linecap="round" stroke-miterlimit="10" stroke-width="15"> <animateTransform attributeName="transform" additive="sum" type="rotate" values="0 187.5 187.5; 45 187.5 187.5" dur="6s" repeatCount="indefinite"/> </path> </symbol> </defs> <g clip-path="url(#Sunseta)"> <use width="375" height="375" transform="translate(68.5 104.5)" xlink:href="#Sunsetb"/> </g> <polyline points="128 332 216 332 256 368 296 332 384 332" fill="none" stroke="var(--On-Surface-Variant)" stroke-linecap="round" stroke-linejoin="round" stroke-width="18"/> </svg>',
UVindexIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <clipPath id="UVindexa"> <path d="M64,64H448V256H328a72,72,0,0,0-72,72V448H64Z" fill="none"/> </clipPath> <symbol id="UVindexb" viewBox="0 0 375 375"> <!-- sun-core --> <circle cx="187.5" cy="187.5" r="84" fill="none" stroke="#fbbf24" stroke-miterlimit="10" stroke-width="15"/> <!-- sun-rays --> <path d="M187.5,57.16V7.5m0,360V317.84M279.67,95.33l35.11-35.11M60.22,314.78l35.11-35.11m0-184.34L60.22,60.22M314.78,314.78l-35.11-35.11M57.16,187.5H7.5m360,0H317.84" fill="none" stroke="#fbbf24" stroke-linecap="round" stroke-miterlimit="10" stroke-width="15"> <animateTransform attributeName="transform" additive="sum" type="rotate" values="0 192 192; 45 192 192" dur="6s" repeatCount="indefinite"/> </path> </symbol> </defs> <g clip-path="url(#UVindexa)"> <use width="375" height="375" transform="translate(68.5 68.5)" xlink:href="#UVindexb"/> <path d="M254,338V328a74,74,0,0,1,74-74h10" fill="none" stroke="#fbbf24" stroke-miterlimit="10" stroke-width="15"/> </g> <path d="M337.71,388q-14.4,0-22.14-6.76t-7.74-19.39V316h18.32v45.94q0,11.07,11.65,11.07t11.56-11.07V316h18.32v45.85q0,12.73-7.74,19.44T337.71,388Z" fill="var(--On-Surface)"/> <path d="M413.43,344.51,421.56,316h18.61l-22.53,69.75H398.25L375.71,316h18.81l8.23,28.41,5.39,21.94Z" fill="var(--On-Surface)"/> </svg>',
MoonRiseIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <clipPath id="Moonrisea"> <path d="M512,306H304l-35.86-31.38a18.44,18.44,0,0,0-24.28,0L208,306H0V0H512Z" fill="none"/> </clipPath> <symbol id="Moonriseb" viewBox="0 0 279 279"> <!-- moon --> <path d="M256.75,173.13c-74.12,0-134.21-59.28-134.21-132.42A130.48,130.48,0,0,1,127,7.5C59.79,14.75,7.5,70.87,7.5,139.08c0,73.13,60.09,132.42,134.21,132.42,62.48,0,114.83-42.18,129.79-99.21A135.56,135.56,0,0,1,256.75,173.13Z" fill="none" stroke="#72b9d5" stroke-linecap="round" stroke-linejoin="round" stroke-width="15"> <animateTransform attributeName="transform" additive="sum" type="rotate" values="-15 135 135; 9 135 135; -15 135 135" dur="6s" repeatCount="indefinite"/> </path> </symbol> </defs> <polyline points="128 332 216 332 256 296 296 332 384 332" fill="none" stroke="var(--On-Surface-Variant)" stroke-linecap="round" stroke-linejoin="round" stroke-width="18"/> <g clip-path="url(#Moonrisea)"> <use width="279" height="279" transform="translate(116.5 116.5)" xlink:href="#Moonriseb"/> </g> </svg>',
MoonSetIcon: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512"> <defs> <clipPath id="Moonseta"> <path d="M512,306H296.08a21.5,21.5,0,0,0-14.16,5.32L256,334l-25.92-22.68A21.5,21.5,0,0,0,215.92,306H0V0H512Z" fill="none"/> </clipPath> <symbol id="Moonsetb" viewBox="0 0 279 279" overflow="visible"> <!-- moon --> <path d="M256.75,173.13c-74.12,0-134.21-59.28-134.21-132.42A130.48,130.48,0,0,1,127,7.5C59.79,14.75,7.5,70.87,7.5,139.08c0,73.13,60.09,132.42,134.21,132.42,62.48,0,114.83-42.18,129.79-99.21A135.56,135.56,0,0,1,256.75,173.13Z" fill="none" stroke="#72b9d5" stroke-linecap="round" stroke-linejoin="round" stroke-width="15"> <animateTransform attributeName="transform" additive="sum" type="rotate" values="-15 135 135; 9 135 135; -15 135 135" dur="6s" repeatCount="indefinite"/> </path> </symbol> </defs> <polyline points="128 332 216 332 256 368 296 332 384 332" fill="none" stroke="var(--On-Surface-Variant)" stroke-linecap="round" stroke-linejoin="round" stroke-width="18"/> <g clip-path="url(#Moonseta)"> <use width="279" height="279" transform="translate(116.5 116.5)" xlink:href="#Moonsetb"/> </g> </svg>',
}
function getDailyForecast() {
if (cachedDataHourly && cachedDataHourly.time && cachedDataHourly.time.length > 0) {
const dailyForecast = aggregateHourlyData(cachedDataHourly);
displayDailyForecast(cachedData, dailyForecast);
} else {
console.error('Hourly data is not available.');
}
}
function aggregateHourlyData(hourlyData) {
const dailyData = {};
hourlyData.time.forEach((time, index) => {
const date = new Date(time).toISOString().split('T')[0];
if (hourlyData.temperature_2m && hourlyData.temperature_2m[index] !== undefined) {
if (!dailyData[date]) {
dailyData[date] = {
humidity: 0,
cloudCover: 0,
dewPoint: 0,
pressure: 0,
count: 0
};
}
}
const dayData = dailyData[date];
dayData.humidity += hourlyData.relative_humidity_2m[index];
dayData.cloudCover += hourlyData.cloud_cover[index];
dayData.dewPoint += hourlyData.dew_point_2m[index];
dayData.pressure += hourlyData.pressure_msl[index];
dayData.count++;
});
for (const date in dailyData) {
dailyData[date].humidity = Math.round(dailyData[date].humidity / dailyData[date].count);
dailyData[date].cloudCover = Math.round(dailyData[date].cloudCover / dailyData[date].count);
dailyData[date].dewPoint = Math.round(dailyData[date].dewPoint / dailyData[date].count);
dailyData[date].pressure = Math.round(dailyData[date].pressure / dailyData[date].count);
}
return dailyData;
}
function displayDailyForecast(forecast, forecastDaily) {
const forecastContainer = document.getElementById('foreCastList');
const forecastDateHeader = document.createElement('forecastDateHeader');
const forecastMainDetails = document.createElement('forecastMainDetails');
forecastContainer.innerHTML = '';
const today = new Date();
const todayString = today.toISOString().split('T')[0];
const sortedDates = Object.keys(forecastDaily)
.filter(date => date >= todayString)
.sort();
if (sortedDates.length === 0) {
forecastContainer.innerHTML = '<p>No upcoming forecast data available.</p>';
return;
}
sortedDates.forEach((date, index) => {
const dateObj = new Date(date + 'T00:00:00');
const isToday = date === todayString;
const weekday = isToday ? 'today' : dateObj.toLocaleDateString('en-US', { weekday: 'short' }).toLowerCase();
const weekdayLang = getTranslationByLang(localStorage.getItem('AppLanguageCode'), weekday);
const dailyData = forecastDaily[date];
const formattedDate = new Intl.DateTimeFormat('en-US', { day: 'numeric', month: 'short' }).format(dateObj);
const rainPercentage = Math.round(forecast.precipitation_probability_max[index]) || '0';
const convertTo12Hour = (time) => {
const date = new Date(time);
return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: true });
};
const convertTo24Hour = (time) => {
const date = new Date(time);
return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });
};
let SunriseTime
let SunsetTime
if (timeFormat === '24 hour') {
SunriseTime = convertTo24Hour(forecast.sunrise[index])
SunsetTime = convertTo24Hour(forecast.sunset[index])
} else {
SunriseTime = convertTo12Hour(forecast.sunrise[index])
SunsetTime = convertTo12Hour(forecast.sunset[index])
}
const DailyWeatherCode = forecast.weather_code[index];
const cloudCover = dailyData.cloudCover
const humidity = dailyData.humidity;
let WindSpeed;
if (SelectedWindUnit === 'mile') {
WindSpeed = Math.round(forecast.wind_speed_10m_max[index] / 1.60934) + ' mph';
} else if (SelectedWindUnit === 'M/s') {
WindSpeed = (forecast.wind_speed_10m_max[index] / 3.6).toFixed(2) + ' m/s';
} else {
WindSpeed = Math.round(forecast.wind_speed_10m_max[index]) + ' km/h';
}
let TemperatureMax;
if (SelectedTempUnit === 'fahrenheit') {
TemperatureMax = Math.round(forecast.temperature_2m_max[index] * 9 / 5 + 32);
} else {
TemperatureMax = Math.round(forecast.temperature_2m_max[index]);
}
let TemperatureMin;
if (SelectedTempUnit === 'fahrenheit') {
TemperatureMin = Math.round(forecast.temperature_2m_min[index] * 9 / 5 + 32);
} else {
TemperatureMin = Math.round(forecast.temperature_2m_min[index]);
}
let dewPointTemp;
if (SelectedTempUnit === 'fahrenheit') {
dewPointTemp = Math.round(dailyData.dewPoint * 9 / 5 + 32);
} else {
dewPointTemp = Math.round(dailyData.dewPoint);
}
let rainAmount;
if (SelectedPrecipitationUnit === 'in') {
rainAmount = forecast.precipitation_sum[index] ? (forecast.precipitation_sum[index] * 0.0393701).toFixed(2) + 'in' : '0.00in';
} else {
rainAmount = forecast.precipitation_sum[index] ? forecast.precipitation_sum[index] + ' mm' : '0.0mm';
}
let pressureMain;
let pressureMainUnit;
if (SelectedPressureUnit === 'inHg') {
pressureMain = (dailyData.pressure * 0.02953).toFixed(2);
pressureMainUnit = 'inHg';
} else if (SelectedPressureUnit === 'mmHg') {
pressureMain = (dailyData.pressure * 0.750062).toFixed(2);
pressureMainUnit = 'mmHg';
} else {
pressureMain = dailyData.pressure;
pressureMainUnit = 'hPa';
}
const uvIndex = Math.round(forecast.uv_index_max[index])
let UVindexText;
if (uvIndex >= 0 && uvIndex <= 1) {
UVindexText = 'Minimal';
} else if (uvIndex > 1 && uvIndex <= 2) {
UVindexText = 'Low';
} else if (uvIndex > 2 && uvIndex <= 3) {
UVindexText = 'Low';
} else if (uvIndex > 3 && uvIndex <= 4) {
UVindexText = 'Moderate';
} else if (uvIndex > 4 && uvIndex <= 5) {
UVindexText = 'Moderate';
} else if (uvIndex > 5 && uvIndex <= 6) {
UVindexText = 'Moderate';
} else if (uvIndex > 6 && uvIndex <= 7) {
UVindexText = 'High';
} else if (uvIndex > 7 && uvIndex <= 8) {
UVindexText = 'High';
} else if (uvIndex > 8 && uvIndex <= 9) {
UVindexText = 'Very high';
} else if (uvIndex > 9 && uvIndex <= 10) {
UVindexText = 'Very high';
} else if (uvIndex > 10 && uvIndex <= 11) {
UVindexText = 'Very high';
} else if (uvIndex > 11 && uvIndex <= 12) {
UVindexText = 'Extreme';
} else if (uvIndex > 12 && uvIndex <= 13) {
UVindexText = 'Extreme';
} else if (uvIndex > 13) {
UVindexText = 'Extreme';
}
const forecastDateHeaderContent = document.createElement('div');
forecastDateHeaderContent.classList.add('forecastDateHeaderContent')
forecastDateHeaderContent.dataset.index = index;
forecastDateHeaderContent.innerHTML = `
<span>${weekdayLang}</span>
<img src="${GetWeatherIcon(DailyWeatherCode, 1)}">
<div>
<p>${TemperatureMax}°<span>/${TemperatureMin}°</span></p>
</div>
<md-ripple style="--md-ripple-pressed-opacity: 0.1;"></md-ripple>
`
// ------------------------------------------------------
forecastDateHeader.appendChild(forecastDateHeaderContent);
forecastContainer.appendChild(forecastDateHeader)
forecastContainer.appendChild(forecastMainDetails)
function handleSelection(event) {
document.querySelectorAll('.forecastDateHeaderContent').forEach(item => {
item.classList.remove('selected');
});
event.currentTarget.classList.add('selected');
forecastMainDetails.innerHTML = '';
const forecastTempConditionMainContent = document.createElement('div');
forecastTempConditionMainContent.classList.add('forecastTempConditionMainContent')
const selectedIndex = event.currentTarget.dataset.index;
const selectedForecast = forecast[selectedIndex];
forecastTempConditionMainContent.innerHTML = `
<div class="top-details">
<p>${weekdayLang}, ${formattedDate}</p>
<div>
<tempLarge><p>${TemperatureMax}° </p> <span>/${TemperatureMin}°</span></tempLarge>
<img src="${GetWeatherIcon(DailyWeatherCode, 1)}">
</div>
<weatherConditionText>${getWeatherLabelInLang(DailyWeatherCode, 1, localStorage.getItem('AppLanguageCode'))}</weatherConditionText>
</div>
<p class="daily-conditions-title" data-translate="daily_conditions">Daily conditions</p>
<div class="daily-conditions">
<div class="daily-conditions-wrap">
<div>
<p data-translate="wind_speed">Wind speed</p>
<conditionIcon>
${ConditionIcons.WindSockIcon}
</conditionIcon>
<span>${WindSpeed}</span>
</div>
<div>
<p data-translate="humidity">Humidity</p>
<conditionIcon>
${ConditionIcons.HumidityIcon}
</conditionIcon>
<span>${humidity}%</span>
</div>
<div>
<p data-translate="precipitation_chances">Precipitation chances</p>
<conditionIcon>
${ConditionIcons.PrecipitationChancesIcon}
</conditionIcon>
<span>${rainPercentage}%</span>
</div>
<div>
<p data-translate="precipitation_amount">Precipitation amount</p>
<conditionIcon>
${ConditionIcons.PrecipitationAmountIcon}
</conditionIcon>
<span>${rainAmount}</span>
</div>
<div>
<p data-translate="cloudiness">Cloud cover</p>
<conditionIcon>
${ConditionIcons.CloudCoverIcon}
</conditionIcon>
<span>${cloudCover}%</span>
</div>
<div>
<p data-translate="pressure">Pressure</p>
<conditionIcon>
${ConditionIcons.PressureIcon}
</conditionIcon>
<span>${pressureMain} ${pressureMainUnit}</span>
</div>
<div>
<p data-translate="dew_point">Dew point</p>
<conditionIcon>
${ConditionIcons.DewPointIcon}
</conditionIcon>
<span>${dewPointTemp}°</span>
</div>
<div>
<p data-translate="uv_index">UV index</p>
<conditionIcon>
${ConditionIcons.UVindexIcon}
</conditionIcon>
<span style="align-items: center; gap: 5px;">${uvIndex} <text style="color: var(--On-Surface-Variant);font-size: 13px;"> ${UVindexText}</text></span>
</div>
</div>
</div>
<p class="daily-conditions-title" style="margin-top:10px;"><span data-translate="sunrise">Sunrise</span> & <span data-translate="sunset">sunset</span></p>
<div class="sunrise-sunset-forecast">
<div class="sunrise-sunset-item">
<p data-translate="sunrise">Sunrise</p>
<div class="sunrise-sunset-img">
${ConditionIcons.SunriseIcon}
</div>
<span>${SunriseTime}</span>
</div>
<div class="sunrise-sunset-item">
<p data-translate="sunset">Sunset</p>
<div class="sunrise-sunset-img">
${ConditionIcons.SunsetIcon}
</div>
<span>${SunsetTime}</span>
</div>
</div>
`
if (!forecastMainDetails.contains(forecastTempConditionMainContent)) {
forecastMainDetails.appendChild(forecastTempConditionMainContent);
}
const AppLanguageCodeValue = localStorage.getItem('AppLanguageCode');
if (AppLanguageCodeValue) {
applyTranslations(AppLanguageCodeValue);
}
}
forecastDateHeaderContent.addEventListener('click', handleSelection);
const clickedForecastItem = localStorage.getItem('ClickedForecastItem') || '0';
const selectedForecastIndex = parseInt(clickedForecastItem, 10);
if (selectedForecastIndex >= 0 && selectedForecastIndex <= 13 || index === 0) {
if (index === selectedForecastIndex || index === 0) {
forecastDateHeaderContent.classList.add('selected');
handleSelection({ currentTarget: forecastDateHeaderContent });
firstForecastIndex = index;
setTimeout(() => {
forecastDateHeaderContent.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
setTimeout(() => {
if (clickedForecastItem >= 4) {
const forecastDateHeader = document.querySelector('forecastDateHeader');
forecastDateHeader.scrollBy({
top: 0,
left: 50,
behavior: 'smooth'
});
}
}, 600);
}, 500);
}
}
});
}
setTimeout(() => {
getDailyForecast()
}, 1500);
function convertTo12HourFormat(unixTimestamp) {
const date = new Date(unixTimestamp * 1000);
let hours = date.getHours();
const minutes = date.getMinutes();
const ampm = hours >= 12 ? 'PM' : 'AM';
hours = hours % 12;
hours = hours ? hours : 12;
const minutesStr = minutes < 10 ? '0' + minutes : minutes;
return `${hours}:${minutesStr} ${ampm}`;
}
setTimeout(() => {
document.querySelector('.loader_holder').style.opacity = '0'
}, 2000);
setTimeout(() => {
document.querySelector('.loader_holder').hidden = true
}, 2300);
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
-1
View File
@@ -1 +0,0 @@
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"featurecla":"Admin-0 country","scalerank":1,"labelrank":2,"sovereignt":"China","sov_a3":"CH1","adm0_dif":1,"level":2,"type":"Country","tlc":"1","admin":"China","adm0_a3":"CHN","geou_dif":0,"geounit":"China","gu_a3":"CHN","su_dif":0,"subunit":"China","su_a3":"CHN","brk_diff":0,"name":"China","name_long":"China","brk_a3":"CHN","brk_name":"China","brk_group":null,"abbrev":"China","postal":"CN","formal_en":"People's Republic of China","formal_fr":null,"name_ciawf":"China","note_adm0":null,"note_brk":null,"name_sort":"China","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":4,"mapcolor13":3,"pop_est":1397715000,"pop_rank":18,"pop_year":2019,"gdp_md":14342903,"gdp_year":2019,"economy":"3. Emerging region: BRIC","income_grp":"3. Upper middle income","fips_10":"CH","iso_a2":"CN","iso_a2_eh":"CN","iso_a3":"CHN","iso_a3_eh":"CHN","iso_n3":"156","iso_n3_eh":"156","un_a3":"156","wb_a2":"CN","wb_a3":"CHN","woe_id":23424781,"woe_id_eh":23424781,"woe_note":"Exact WOE match as country","adm0_iso":"CHN","adm0_diff":null,"adm0_tlc":"CHN","adm0_a3_us":"CHN","adm0_a3_fr":"CHN","adm0_a3_ru":"CHN","adm0_a3_es":"CHN","adm0_a3_cn":"CHN","adm0_a3_tw":"TWN","adm0_a3_in":"CHN","adm0_a3_np":"CHN","adm0_a3_pk":"CHN","adm0_a3_de":"CHN","adm0_a3_gb":"CHN","adm0_a3_br":"CHN","adm0_a3_il":"CHN","adm0_a3_ps":"CHN","adm0_a3_sa":"CHN","adm0_a3_eg":"CHN","adm0_a3_ma":"CHN","adm0_a3_pt":"CHN","adm0_a3_ar":"CHN","adm0_a3_jp":"CHN","adm0_a3_ko":"CHN","adm0_a3_vn":"CHN","adm0_a3_tr":"CHN","adm0_a3_id":"CHN","adm0_a3_pl":"CHN","adm0_a3_gr":"CHN","adm0_a3_it":"CHN","adm0_a3_nl":"CHN","adm0_a3_se":"CHN","adm0_a3_bd":"CHN","adm0_a3_ua":"CHN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1,"min_zoom":0,"min_label":1.7,"max_label":5.7,"label_x":106.337289,"label_y":32.498178,"ne_id":1159320471,"wikidataid":"Q148","name_ar":"الصين","name_bn":"গণচীন","name_de":"Volksrepublik China","name_en":"People's Republic of China","name_es":"China","name_fa":"جمهوری خلق چین","name_fr":"République populaire de Chine","name_el":"Λαϊκή Δημοκρατία της Κίνας","name_he":"הרפובליקה העממית של סין","name_hi":"चीनी जनवादी गणराज्य","name_hu":"Kína","name_id":"Republik Rakyat Tiongkok","name_it":"Cina","name_ja":"中華人民共和国","name_ko":"중화인민공화국","name_nl":"Volksrepubliek China","name_pl":"Chińska Republika Ludowa","name_pt":"China","name_ru":"Китайская Народная Республика","name_sv":"Kina","name_tr":"Çin Halk Cumhuriyeti","name_uk":"Китайська Народна Республіка","name_ur":"عوامی جمہوریہ چین","name_vi":"Trung Quốc","name_zh":"中华人民共和国","name_zht":"中華人民共和國","fclass_iso":"Admin-0 country","tlc_diff":null,"fclass_tlc":"Admin-0 country","fclass_us":null,"fclass_fr":null,"fclass_ru":null,"fclass_es":null,"fclass_cn":null,"fclass_tw":"Unrecognized","fclass_in":null,"fclass_np":null,"fclass_pk":null,"fclass_de":null,"fclass_gb":null,"fclass_br":null,"fclass_il":null,"fclass_ps":null,"fclass_sa":null,"fclass_eg":null,"fclass_ma":null,"fclass_pt":null,"fclass_ar":null,"fclass_jp":null,"fclass_ko":null,"fclass_vn":null,"fclass_tr":null,"fclass_id":null,"fclass_pl":null,"fclass_gr":null,"fclass_it":null,"fclass_nl":null,"fclass_se":null,"fclass_bd":null,"fclass_ua":null,"filename":"CHN.geojson"},"geometry":{"type":"MultiPolygon","coordinates":[[[[109.47520958866365,18.197700913968575],[108.65520796105616,18.507681993071387],[108.62621748254044,19.367887885001906],[109.11905561730804,19.821038519769345],[110.21159874882281,20.101253973872033],[110.78655073450221,20.077534491450052],[111.01005130416458,19.69592987719072],[110.57064660038677,19.25587921800927],[110.33918786015147,18.678395087147592],[109.47520958866365,18.197700913968575]]],[[[80.2599902688853,42.34999929459906],[80.1801501809943,42.92006785742694],[80.86620649610126,43.18036204688101],[79.96610639844141,44.91751699480463],[81.9470707539181,45.31702749285312],[82.45892581576906,45.539649563166506],[83.18048383986047,47.33003123635086],[85.16429039911324,47.0009557155161],[85.72048383987067,47.452969468773105],[85.7682328633083,48.45575063739699],[86.59877648310336,48.549181626980626],[87.35997033076265,49.21498078062912],[87.75126427607671,49.297197984405486],[88.01383222855173,48.599462795600616],[88.85429772334676,48.069081732772965],[90.28082563676392,47.69354909930793],[90.97080936072501,46.88814606382293],[90.58576826371828,45.71971609148753],[90.9455395853343,45.28607330991028],[92.13389082231822,45.11507599545646],[93.4807336771413,44.975472113619965],[94.68892866412533,44.35233185482842],[95.30687544147153,44.24133087826547],[95.76245486855669,43.319449164394605],[96.Line truncated
@@ -0,0 +1,21 @@
// tabs-nav
let currentTab = 0;
showTab(currentTab);
function showTab(tabIndex) {
document.getElementById(`tab-content-${currentTab}`).style.display = 'none';
const previousTab = document.querySelector('.tab.active');
const previousname = document.querySelector('.label.active-name');
if (previousTab) {
previousTab.classList.remove('active');
previousname.classList.remove('active-name');
}
document.getElementById(`tab-content-${tabIndex}`).style.display = 'block';
document.querySelectorAll('.tab')[tabIndex].classList.add('active');
document.querySelectorAll('.label')[tabIndex].classList.add('active-name');
currentTab = tabIndex;
}
@@ -0,0 +1,398 @@
// 3dot- menu
// const Menu = document.getElementById('menu');
// function toggleMenu(){
// Menu.style.display = 'block';
// Menu.style.transition = 'none';
// Menu.style.opacity = '1';
// }
// window.addEventListener("click", function(event) {
// if (event.target == Menu) {
// Menu.style.opacity = '0';
// Menu.style.transition = 'opacity 0.2s';
// setTimeout(() =>{
// Menu.style.display = "none";
// }, 200);
// }
// });
// const eq = document.querySelectorAll('.menu-btn');
// eq.forEach(function(eq) {
// eq.addEventListener('click', () => {
// Menu.style.opacity = '0';
// Menu.style.transition = 'opacity 0.2s';
// setTimeout(() =>{
// Menu.style.display = "none";
// }, 200);
// });
// });
// border-change
const changeBorderButtons = document.querySelectorAll('.change-border');
changeBorderButtons.forEach(function(changeBorderButton) {
changeBorderButton.addEventListener('touchstart', () => {
const borderRadiusStart = changeBorderButton.dataset.borderStart;
changeBorderButton.style.borderRadius = `${borderRadiusStart}px`;
});
changeBorderButton.addEventListener('touchend', () => {
const borderRadiusEnd = changeBorderButton.dataset.borderEnd;
changeBorderButton.style.borderRadius = `${borderRadiusEnd}px`;
});
});
changeBorderButtons.forEach(function(changeBorderButtons) {
changeBorderButtons.style.transition = 'all 0.25s ease-out';
});
// dialog
function openModal(modalId) {
var modal = document.querySelector('[data-modal-id="' + modalId + '"]');
modal.style.display = "flex";
modal.style.opacity = "1";
}
function closeModal(modalId) {
var modal = document.querySelector('[data-modal-id="' + modalId + '"]');
modal.style.opacity = '0';
setTimeout(() =>{
modal.style.display = "none";
}, 200);
}
window.onclick = function(event) {
var modals = document.getElementsByClassName('modalRegular');
for (var i = 0; i < modals.length; i++) {
if (event.target === modals[i]) {
modals[i].style.opacity = '0';
(function(index) {
setTimeout(function() {
modals[index].style.display = "none";
}, 200);
})(i);
}
}
};
document.addEventListener('click', function(event) {
if (event.target.hasAttribute('data-modal-open')) {
var modalId = event.target.getAttribute('data-modal-open');
openModal(modalId);
}
if (event.target.hasAttribute('data-modal-close')) {
var modalId = event.target.getAttribute('data-modal-close');
closeModal(modalId);
}
});
//snack-bar
function ShowSnack(message, timeout, bottom, type, inside, useValue) {
var snackbarDiv = document.createElement("div");
snackbarDiv.id = "snackbar";
snackbarDiv.style.opacity = '0';
snackbarDiv.style.display = 'flex';
snackbarDiv.classList.add(type)
if(useValue){
snackbarDiv.setAttribute('value', useValue)
}
snackbarDiv.style.setProperty('--snackbar-bottom', bottom + '%');
var snackbarDivP = document.createElement("p");
snackbarDivP.innerHTML = message;
snackbarDiv.appendChild(snackbarDivP);
var existingSnackbar = document.getElementById("snackbar");
if (existingSnackbar) {
existingSnackbar.parentNode.removeChild(existingSnackbar);
}
var AppendinsideElement = document.getElementById(inside);
if (AppendinsideElement) {
AppendinsideElement.appendChild(snackbarDiv);
if(snackbarDiv.getAttribute('value') === 'no-up'){
} else{
document.querySelector('.fab_container').classList.add('adjust');
}
} else {
document.body.appendChild(snackbarDiv);
console.log('body')
}
// document.getElementById(inside).appendChild(snackbarDiv);
setTimeout(() => {
snackbarDiv.style.transition = 'opacity 0.2s, bottom 0.3s ease-in';
snackbarDiv.style.opacity = '1';
}, 10);
setTimeout(() => {
snackbarDiv.style.bottom = bottom + '3%';
snackbarDiv.style.opacity = '0';
setTimeout(() => {
snackbarDiv.parentNode.removeChild(snackbarDiv);
if(snackbarDiv.getAttribute('value') === 'no-up'){
} else{
document.querySelector('.fab_container').classList.remove('adjust');
}
}, 200);
}, timeout);
}
function showSnackbarAction(options) {
const existingSnackbar = document.querySelector('.snackbar');
if (existingSnackbar) {
existingSnackbar.remove();
}
const snackbar = document.createElement('div');
snackbar.classList.add('snackbar');
snackbar.style.setProperty('--snackbaraction-bottom', options.bottomPosition + '%');
const snackbarContent = document.createElement('div');
snackbarContent.classList.add('snackbar-content');
const snackbarText = document.createElement('span');
snackbarText.textContent = options.text || '';
const actionButton = document.createElement('md-text-button');
actionButton.style.zIndex = '999'
actionButton.classList.add('snackbar-action' );
actionButton.setAttribute('style', '--md-text-button-label-text-color: var(--Inverse-Primary); --md-text-button-pressed-state-layer-color: var(--Inverse-Primary); --md-text-button-hover-label-text-color: var(--Inverse-Primary); --md-text-button-pressed-label-text-color: var(--Inverse-Primary); --md-text-button-focus-label-text-color: var(--Inverse-Primary);')
actionButton.textContent = options.actionText || 'Action';
actionButton.setAttribute('data-modal-open', options.modalId || '');
if (options.onActionClick) {
if (typeof options.onActionClick === 'function') {
actionButton.onclick = () => {
options.onActionClick(snackbar);
dismissSnackbar(snackbar);
};
} else if (typeof options.onActionClick === 'string') {
actionButton.setAttribute('onclick', `${options.onActionClick}; dismissSnackbar(this.parentNode.parentNode)`);
}
}
snackbarContent.appendChild(actionButton);
snackbarContent.appendChild(snackbarText);
snackbar.appendChild(snackbarContent);
document.body.appendChild(snackbar);
snackbar.style.display = 'flex';
if (options.manualDismiss) {
snackbar.addEventListener('click', () =>{snackbar.remove();})
snackbar.dataset.manualDismiss = true;
} else {
setTimeout(() => {
snackbar.style.opacity = 0;
setTimeout(() => {
snackbar.remove();
}, 300);
}, options.timeout || 3000);
}
}
function dismissSnackbar(snackbar) {
if (snackbar.dataset.manualDismiss === 'true') {
snackbar.style.opacity = 0;
setTimeout(() => {
snackbar.remove();
}, 300);
}
}
// full-activity-large-header
const LargeActivityContents = document.querySelectorAll('.activity-large-content');
const HiddenLabels = document.querySelectorAll('.label-hidden-large');
const LargeLabelsMain = document.querySelectorAll('.label-large-main');
const LargeActivityLabels = document.querySelectorAll('.header-activity-large');
const speedFactor = 2;
LargeActivityContents.forEach((LargeActivityContent, index) => {
let opacity = 0;
const triggerHeight = 100;
const triggerHeight2 = 100;
let hasTriggered = false;
let hasTriggered2 = false;
LargeActivityContent.addEventListener('scroll', () => {
const scrollPosition = LargeActivityContent.scrollTop;
const t = Math.min(1, scrollPosition / triggerHeight);
const lerp = (start, end, t) => (1 - t) * start + t * end;
opacity = lerp(0, 1, t);
const redOpacity = lerp(0, 1, opacity);
const redOpacity2 = lerp(0, 0.6, opacity);
HiddenLabels[index].style.opacity = opacity.toString();
LargeLabelsMain[index].style.opacity = (1 - opacity).toString();
LargeLabelsMain[index].style.backgroundColor = `rgba(var(--Top-bar), ${redOpacity2})`;
});
});
// openActivity
const BackgroundApp = document.getElementById('App');
function openActivity(activityNumber, activityContent) {
closeAllModals();
const OpenModal = document.querySelector(`[data-modal-${activityNumber}]`);
const OpenedContent = document.querySelector(`[activity-content-${activityContent}]`);
BackgroundApp.style.transform = 'translateX(-30%)';
BackgroundApp.style.opacity = '0';
OpenModal.style.display = 'block';
OpenModal.style.opacity = '1';
OpenModal.style.transform = 'none';
OpenedContent.scrollTop = 0;
}
function closeActivity(activityNumber) {
const modal = document.querySelector(`[data-modal-${activityNumber}]`);
modal.style.transform = 'translateX(30%)';
modal.style.opacity = '0';
BackgroundApp.style.transform = 'none';
BackgroundApp.style.opacity = '1';
setTimeout(() => {
modal.style.display = 'none';
}, 400);
}
function closeAllModals() {
document.querySelectorAll('.full-activity-large').forEach(modal => {
modal.style.display = 'none';
});
}
// buttons
const ripplebuttonclass = document.querySelectorAll('button-filled, button-outlined, button-tonal, text-button, fab, fab-small, fab-large, button-filled-i, button-outlined-i, button-tonal-i, text-button-i');
ripplebuttonclass.forEach(function(ripplebuttonclass) {
ripplebuttonclass.classList.add('md-ripples');
});
// loader
const circleLoaders = document.querySelectorAll('circle-loader');
circleLoaders.forEach(circleLoader => {
const size = circleLoader.getAttribute('data-size');
const Swidth = circleLoader.getAttribute('data-thick');
const svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svgElement.setAttribute('viewBox', '0 0 32 32');
svgElement.setAttribute('height', size);
svgElement.setAttribute('width', size);
const circleElement = document.createElementNS("http://www.w3.org/2000/svg", "circle");
circleElement.setAttribute('id', 'spinner');
circleElement.setAttribute('cx', '16');
circleElement.setAttribute('cy', '16');
circleElement.setAttribute('r', '14');
circleElement.setAttribute('fill', 'none');
circleElement.setAttribute('stroke-width', Swidth)
svgElement.appendChild(circleElement);
circleLoader.appendChild(svgElement);
});
// Border-change usage ---
/**
* Data-attributes
* data-border-start="20" data-border-end="50"
*/
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,303 @@
button-filled {
color: var(--On-Primary);
background-color: var(--Primary);
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
button-outlined {
color: var(--Primary);
background-color: transparent;
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
border: 1px solid var(--Outline);
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
button-tonal {
color: var(--On-Secondary-Container);
background-color: var(--Secondary-Container);
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
text-button {
color: var(--Primary);
background-color: transparent;
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
/* disabled-form */
button-filled[disabled],
button-tonal[disabled] {
opacity: 0.12;
background-color: var(--On-Surface);
color: var(--Surface);
pointer-events: none;
}
button-outlined[disabled] {
opacity: 0.32;
border-color: var(--On-Surface);
color: var(--On-Surface);
pointer-events: none;
}
/* Fab */
fab {
width: 56px;
height: 56px;
padding: 10px;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Material icons outlined';
background-color: var(--Primary-Container);
color: var(--On-Primary-Container);
font-size: 30px;
border-radius: 18px;
}
fab-small {
width: 40px;
height: 40px;
padding: 10px;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Material icons outlined';
background-color: var(--Primary-Container);
color: var(--On-Primary-Container);
font-size: 24px;
border-radius: 16px;
}
fab-large {
width: 76px;
height: 76px;
padding: 10px;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Material icons outlined';
background-color: var(--Primary-Container);
color: var(--On-Primary-Container);
font-size: 34px;
border-radius: 24px;
}
/* icon-btn */
button-filled-i {
color: var(--On-Primary);
background-color: var(--Primary);
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
button-filled-i i,
button-outlined-i i,
button-tonal-i i,
text-button-i i {
font-family: 'Material icons outlined';
margin-right: 8px;
font-style: normal !important;
font-size: 22px;
}
button-outlined-i {
color: var(--Primary);
background-color: transparent;
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
border: 1px solid var(--Outline);
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
button-tonal-i {
color: var(--On-Secondary-Container);
background-color: var(--Secondary-Container);
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
text-button-i {
color: var(--Primary);
background-color: transparent;
height: 45px;
align-items: center;
justify-content: center;
font-size: 18px;
width: max-content;
border-radius: 50px;
display: flex;
font-family: var(--google-normal);
min-width: 40px;
padding-left: 20px;
padding-right: 20px;
}
/* buttons-usage */
/* filled--
<button-filled>Filled Button</button-filled>
--FILLED With ICON--
<button-filled-i><i>add</i>Add task</button-filled-i>
*/
/* Outlined ---
<button-outlined>Outlined Button</button-outlined>
--OUTLINED With ICON--
<button-outlined-i><i>add</i>Add task</button-outlined-i>
*/
/* Tonal ---
<button-tonal>Tonal Button</button-tonal>
--TONAL With ICON--
<button-tonal-i><i>add</i>Add task</button-tonal-i>
*/
/* Text Btn ---
<text-button>Text Button</text-button>
--TextBtn With ICON--
<text-button-i><i>add</i>Text Button</text-button-i>
*/
/* fab Btn ---
<fab>edit</fab>
--fab-small--
<fab-small>check</fab-small>
--fab-large
<fab-large>add</fab-large>
*/
@@ -0,0 +1,270 @@
/* settings-template */
.title{
color: var(--Primary);
font-family: 'Google';
margin: 0;
margin-top: 20px;
font-weight: 900;
margin-left: 10px;
padding-bottom: 5px;
}
.text_content_options{
display: flex;
flex-direction: column;
margin-left: 40px;
}
.text_content_options p{
margin: 0;
color: var(--On-Surface) ;
font-family: 'Google';
font-size: 18px;
}
.text_content_options span{
margin: 0;
font-size: 14.5px;
color: var(--Outline) ;
margin-top: 3px !important;
max-width: 200px;
font-family: var(--google-normal);
}
.settings_options{
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 0px;
padding: 10px;
position: relative;
margin-bottom: 10px;
padding-right: 15px;
}
.settings_options.radio{
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 0px;
padding: 10px;
position: relative;
margin-bottom: 10px;
padding-right: 15px;
padding-bottom: 55px;
position: relative !important;
}
.icon-options{
position: absolute;
left: 10px;
font-size: 23px;
font-style: normal;
color: var(--On-Surface) ;
}
/* about-app-template */
.about-div{
padding: 10px;
align-items: center;
color: var(--On-Surface);
}
.about-div li{
margin-bottom: 10px;
font-family: var(--google-normal);
font-size: 18px;
line-height: 1.5;
}
.version-area{
background-color: rgba(255, 0, 0, 0);
padding-bottom: 1px;
padding-top: 1px;
font-weight: 700;
}
.made-by{
text-align: right;
margin-right: 20px;
font-family: var(--google-normal);
font-size: 20px;
color: var(--Primary);
}
.title-about{
color: var(--Primary);
font-family: 'Google';
margin: 0;
margin-top: 20px;
font-weight: 500;
font-size: 20px;
padding-left: 10px;
padding-bottom: 5px;
display: flex;
align-items: center;
border-bottom: 1px solid var(--Outline);
}
.title-about span{
font-weight: normal;
margin-right: 10px;
}
/* license */
.licenses-div{
border: 1.5px solid var(--Outline-Variant);
margin: 10px;
padding: 10px;
border-radius: 10px;
}
.licenses-div .name-main{
margin: 0;
margin-top: 10px !important;
margin-bottom: 10px;
font-weight: 300;
font-family: var(--outfit);
color: var(--On-Surface);
}
.licenses-div .name-label{
font-size: 16px;
font-family: var(--outfit);
color: var(--On-Surface);
}
.licenses-div .main-license{
line-height: 1.5;
font-size: 14px;
font-family: var(--outfit);
color: var(--On-Surface-Variant);
}
.licenses-div .license-label{
align-items: center;
justify-content: flex-end;
color: var(--Primary);
opacity: 0.7;
display: flex;
font-weight: 600;
font-family: var(--outfit);
width: 100%;
}
/* settings-template_usage ----
switch-option
<div class="settings_options" >
<i class="icon-class-filled icon-options">dark_mode</i>
<div class="text_content_options">
<p>Dark theme</p>
<span>Enables the dark theme for the app</span>
</div>
<label class="md3 switch theme-switch">
<input type="checkbox" name="darkmode" id="toggledark">
<span class="slider">
<span class="icon-class-outlined icon"></span>
</span>
</label>
</div>
---LABEL---
<p class="title" >General</p>
---OPENS-Other-Screen ----
<div class="settings_options md-ripples ripples-bounded show-time" id="show_time_toast" onclick="openLicenses()">
<i class="icon-class-filled icon-options">verified</i>
<div class="text_content_options">
<p>Third party licenses</p>
<span>Used in the app</span>
</div>
<i class="icon-class-filled" style="font-size: 24px; color: var(--On-Surface);">chevron_right</i>
</div>
---SHOW-version
<div class="settings_options md-ripples ripples-bounded show-time" id="show_time_toast">
<i class="icon-class-filled icon-options">info</i>
<div class="text_content_options">
<p id="themeName"></p>
<span>Lollipop (6-14)</span>
</div>
</div>
*/
/* about-temp
<div class="about-div" >
<li>The app is mainly coded in Java, JavaScript, C++.</li>
<li>The UI of this app is created using GDK, Material You, and Material 3 components, which are open source and
developed by @Google.</li>
</div>
---LABle---
<p class="title-about"><span class="icon-class-outlined">info</span>Language used</p>
*/
/* license
<div class="licenses-div">
<h2 class="name-main">Open Sans</h2>
<span class="name-label">Steve Matteson</span>
<p class="main-license">Open Sans is a humanist sans serif typeface designed by Steve Matteson, Type Director of
Ascender Corp. This version contains the complete 897 character set, which includes the standard ISO Latin 1,
Latin CE, Greek and Cyrillic character sets. Open Sans was designed with an upright stress, open forms and a
neutral, yet friendly appearance. It was optimized for print, web, and mobile interfaces, and has excellent
legibility characteristics in its letterforms.</p>
<span class="license-label">Open Font License</span>
</div>
*/
@@ -0,0 +1,413 @@
.radio-div-set{
display: flex;
align-items: center;
}
.radio-div-set div input{
display: none;
}
.radio-div-set div label{
color: var(--On-Surface);
background-color: rgba(0, 0, 255, 0);
border: 1.4px solid var(--Outline);
display: flex;
height: 38px;
font-family: var(--google-mid);
font-size: 16px;
position: relative;
justify-content: center;
align-items: center;
width: max-content;
padding-left: 20px;
padding-right: 20px;
transition: background-color 0.1s, padding 0.2s;
}
.radio-div-set div:first-child > label{
border-bottom-left-radius: 50px;
border-top-left-radius: 50px;
width: max-content;
display: flex;
align-items: center;
justify-content: center;
border-right: 1px solid var(--Outline) !important;
}
.radio-div-set div:last-child label{
border-bottom-right-radius: 50px;
border-top-right-radius: 50px;
width: max-content;
display: flex;
align-items: center;
justify-content: center;
border-left: 1px solid var(--Outline);
}
.radio-div-set div:last-child input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
padding-left: 40px;
padding-right: 20px !important;
}
.radio-div-set div:first-child input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
padding-left: 40px;
padding-right: 10px !important;
}
.radio-div-set div input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
padding-left: 35px;
padding-right: 10px !important;
}
.radio-div-set div:first-child input:checked + label::before {
content: 'done';
position: absolute;
font-family: 'Material symbols' !important;
left: 13px;
color: var(--On-Surface);
font-size: 24px;
}
.radio-div-set div:last-child input:checked + label::before {
content: 'done';
position: absolute;
font-family: 'Material symbols' !important;
left: 10px;
color: var(--On-Surface);
font-size: 24px;
}
.radio-div-set div input:checked + label::before {
content: 'done';
position: absolute;
font-family: 'Material symbols' !important;
left: 7px;
color: var(--On-Surface);
font-size: 24px;
}
/* icon-one */
.radio-div-set-icon{
display: flex;
align-items: center;
}
.radio-div-set-icon div input{
display: none;
}
.radio-div-set-icon div label{
color: var(--On-Surface);
background-color: rgba(0, 0, 255, 0);
border: 1.4px solid var(--Outline);
cursor: pointer;
display: flex;
height: 38px;
font-family: var(--google-mid);
font-size: 15px;
position: relative;
justify-content: space-around;
gap: 5px;
align-items: center;
width: max-content;
padding-left: 10px;
padding-right: 10px;
transition: background-color 0.1s, padding 0.2s;
}
.radio-div-set-icon div:first-child > label{
border-bottom-left-radius: 50px;
/* padding-left: 45px; */
border-top-left-radius: 50px;
width: max-content;
display: flex;
align-items: center;
justify-content: center;
border-right: 1px solid var(--Outline) !important;
}
.radio-div-set-icon div:last-child label{
border-bottom-right-radius: 50px;
border-top-right-radius: 50px;
width: max-content;
display: flex;
/* padding-left: 40px; */
align-items: center;
justify-content: center;
border-left: 1px solid var(--Outline);
}
.radio-div-set-icon div:last-child input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
}
.radio-div-set-icon div:first-child input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
}
.radio-div-set-icon div input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
}
.radio-div-set-icon div label::before {
content: attr(data-icon);
/* position: absolute; */
font-family: 'Material symbols' !important;
left: 15px;
color: var(--On-Surface);
font-size: 20px;
}
.radio-div-set-icon div:last-child label::before {
content: attr(data-icon);
/* position: absolute; */
font-family: 'Material symbols' !important;
color: var(--On-Surface);
font-size: 20px;
}
.radio-div-set-icon div:first-child label::before {
content: attr(data-icon);
/* position: absolute; */
font-family: 'Material symbols' !important;
color: var(--On-Surface);
font-size: 20px;
}
.radio-div-set-icon div:first-child input:checked + label::before {
content: 'done';
/* position: absolute; */
font-family: 'Material symbols' !important;
color: var(--On-Secondary-Container);
font-size: 22px;
width: 20px;
height: 24px;
}
.radio-div-set-icon div:last-child input:checked + label::before {
content: 'done';
/* position: absolute; */
font-family: 'Material symbols' !important;
color: var(--On-Secondary-Container);
font-size: 22px;
width: 20px;
height: 24px;
}
.radio-div-set-icon div input:checked + label::before {
content: 'done';
/* position: absolute; */
font-family: 'Material symbols' !important;
color: var(--On-Secondary-Container);
font-size: 22px;
width: 20px;
height: 24px;
}
/* regular */
.radio-div-set-regular{
display: flex;
align-items: center;
}
.radio-div-set-regular div input{
display: none;
}
.radio-div-set-regular div label{
color: var(--On-Surface);
background-color: rgba(0, 0, 255, 0);
border: 1px solid var(--Outline);
border-left: none;
/* border-right: none; */
cursor: pointer;
display: flex;
height: 38px;
font-family: var(--google-mid);
font-size: 15px;
position: relative;
justify-content: center;
align-items: center;
width: max-content;
padding-left: 15px;
padding-right: 15px;
transition: background-color 0.1s, padding 0.2s;
}
.radio-div-set-regular div:first-child > label{
border-bottom-left-radius: 50px;
border-top-left-radius: 50px;
width: max-content;
display: flex;
align-items: center;
justify-content: center;
border-right: 1px solid var(--Outline) !important;
border-left: 1px solid var(--Outline) !important;
}
.radio-div-set-regular div:last-child label{
border-bottom-right-radius: 50px;
border-top-right-radius: 50px;
width: max-content;
display: flex;
align-items: center;
justify-content: center;
/* border-left: 1px solid var(--Outline); */
border-right: 1px solid var(--Outline) !important;
}
.radio-div-set-regular div:last-child input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
pointer-events: none;
}
.radio-div-set-regular div:first-child input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
pointer-events: none;
}
.radio-div-set-regular div input:checked + label {
background-color: var(--Secondary-Container);
color: var(--On-Secondary-Container);
pointer-events: none;
}
/* usage */
/* Selected icon only
<!-- <div class="radio-div-set">
<div class="radio-option-settings">
<input type="radio" name="options-1" id="radio1">
<label for="radio1" class="md-ripples ripples-bounded">Day</label>
</div>
<div class="radio-option-settings">
<input type="radio" name="options-1" id="radio2">
<label for="radio2" class="md-ripples ripples-bounded">Month</label>
</div>
<div class="radio-option-settings">
<input type="radio" name="options-1" id="radio3">
<label for="radio3" class="md-ripples ripples-bounded">Week</label>
</div>
</div> -->
*/
/* Icon Ones
<!-- <div class="radio-div-set-icon">
<div class="radio-option-settings-icon">
<input type="radio" name="options-1" id="radio1">
<label for="radio1" class="md-ripples ripples-bounded" data-icon="event">Day</label>
</div>
<div class="radio-option-settings-icon">
<input type="radio" name="options-1" id="radio3">
<label for="radio3" class="md-ripples ripples-bounded" data-icon="date_range">Week</label>
</div>
</div> -->
*/
/* Regular no icons
<div class="radio-div-set-regular">
<div class="radio-option-settings-regular">
<input type="radio" name="options-1" id="radio1">
<label for="radio1" class="ripple_btn_low">Day</label>
</div>
<div class="radio-option-settings-regular">
<input type="radio" name="options-1" id="radio3">
<label for="radio3" class="ripple_btn_low">Week</label>
</div>
</div>
*/
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

+1
View File
@@ -0,0 +1 @@
{"v":"5.7.3","fr":25,"ip":0,"op":50,"w":610,"h":495,"nm":"error","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"onda contornos","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[290.23,391.787,0],"ix":2},"a":{"a":0,"k":[215.177,7.452,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[98,98,100]},{"t":50,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.019,-3.444],[11.925,3.71],[15.246,-5.628],[13.16,-1.326],[6.095,1.06],[18.549,-4.579],[20.669,-11.401],[0,0]],"o":[[-18.019,3.445],[-11.924,-3.71],[-15.247,5.627],[-13.16,1.325],[-6.094,-1.06],[-18.549,4.579],[0,0],[0,0]],"v":[[172.782,-2.665],[120.58,-2.135],[64.933,1.575],[-12.001,-5.314],[-55.9,2.105],[-108.102,-0.619],[-214.927,4.199],[214.927,4.171]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.795999983245,0.917999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[215.177,7.452],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1750,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"mascara contornos","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306.5,443.092,0],"ix":2},"a":{"a":0,"k":[236.75,48.666,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[236.5,48.416],[-236.5,48.416],[-236.5,-48.416],[236.5,-48.416]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236.75,48.666],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1750,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"barco contornos","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[1]},{"t":50,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[298.895,340.028,0],"to":[0,0.995,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":25,"s":[298.895,346,0],"to":[0,0,0],"ti":[0,0.995,0]},{"t":50,"s":[298.895,340.028,0]}],"ix":2},"a":{"a":0,"k":[238.525,103.168,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[34.934,18.014],[0.174,0.101],[0,0],[-20.846,-10.75],[-11.059,-3.23],[0,0]],"o":[[-8.314,-1.72],[-20.869,-10.761],[0,0],[0.173,0.102],[27.561,14.213],[0,0],[0,0]],"v":[[50.064,23.648],[-12.12,-2.247],[-50.064,-23.648],[-48.52,-23.283],[-11.623,-3.201],[48.425,22.504],[48.994,22.88]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.169000004787,0.161000001197,0.368999974868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.595,73.639],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Grupo 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.734,-5.533],[2.44,-4.275],[0,0],[-0.479,3.608],[0.983,3.414],[0,0]],"o":[[-0.688,5.183],[0,0],[1.73,-2.956],[0.497,-3.745],[0,0],[1.453,5.042]],"v":[[7.355,0.862],[2.555,15.132],[-8.089,9.167],[-4.699,-0.739],[-5.492,-11.566],[6.178,-15.132]],"c":true},"ix":2},"nm":"Caminho 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.426999978458,0.187999994615,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Preenchimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.743,122.502],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"Line truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Loaded 100 of 1205 files, more files were not shown because too many files have changed in this diff. Show more