Compare commits

..

284 Commits

Author SHA1 Message Date
51f01a661a remove dependency: desktop_window 2024-03-01 16:09:17 +01:00
Shawn
0331605e1e
Merge pull request #171 from kevmoo/more_color_silly
Wire up final color details for PWA install
2024-02-21 14:36:17 -07:00
Shawn
11b040ae9e
Merge pull request #170 from kevmoo/cleanup
Set the min SDK to Dart 3.3
2024-02-21 14:28:33 -07:00
Kevin Moore
1f1bc63bc1 Wire up final color details for PWA install 2024-02-21 11:18:46 -08:00
Kevin Moore
e5f1c55993 Set the min SDK to Dart 3.3, bump and fix lints, switch cleanup 2024-02-20 13:56:39 -08:00
Shawn
596abc850c Remove unsused dependencies 2024-02-20 14:32:00 -07:00
Shawn
b6699831d7 Update compileSdkVerison to avoid build warnings on android 2024-02-20 14:32:00 -07:00
Shawn
371421a049 Version update, bump build number to allow macOS distribution 2024-02-20 13:10:20 -07:00
Shawn
1b508f3200 Cleanup 2024-02-20 10:36:34 -07:00
Shawn
dadb6275fc Version bump 2024-02-13 11:55:47 -07:00
Shawn
c00dae0b97 Update flutter_animate version 2024-02-13 11:55:47 -07:00
Shawn
01ba5f624f Remove web pkg, was not in use and causing dependency conflicts 2024-02-13 11:55:43 -07:00
Shawn
e41f2ba530 Remove down-scaling logic for smaller devices. 2024-02-13 09:45:12 -07:00
Shawn
1dfa1574c8
Merge pull request #169 from kevmoo/monifest_color
manifest.json: update background and theme_color
2024-02-12 21:41:16 -07:00
Kevin Moore
095205d047 document that the "black" color should be updated in other places 2024-02-12 15:16:15 -08:00
Kevin Moore
648eac7298 also set the theme-color 2024-02-12 15:10:55 -08:00
Kevin Moore
a1f2a778a2 manifest.json: update background and theme_color 2024-02-12 14:38:57 -08:00
Shawn
7f892df3c8
Merge pull request #166 from kevmoo/patch-1
Update name/short_name in web/manifest.json
2024-02-12 13:36:04 -07:00
Kevin Moore
9c64993cff
Update manifest.json - description 2024-02-08 12:02:59 -08:00
Kevin Moore
097295f393
Update name/short_name in web/manifest.json
So the install experience is prettier
2024-02-08 11:59:19 -08:00
Shawn
bb2564efdd
Merge pull request #163 from kevmoo/tiny_cleanup
Update dependencies, remove unneeded import
2024-02-05 13:30:24 -07:00
Kevin Moore
85379a148a Update dependencies, remove unneeded import 2024-01-31 13:09:08 -08:00
Shawn
8d5daf3edd Cleanup home_widget views, add comments, fix rounding issue 2024-01-25 15:01:16 -07:00
Shawn
45a9a8348f Version bump 2024-01-25 09:39:23 -07:00
Shawn
3ee40b811a
Merge pull request #159 from gskinnerTeam/feature/routing_fixes
Feature/routing fixes
2024-01-22 15:45:05 -07:00
Shawn
b7b9141682 Merge branch 'main' into feature/routing_fixes 2024-01-22 15:36:08 -07:00
Shawn
9194c8a41a Lint warnings 2024-01-22 15:35:37 -07:00
Shawn
2faa7d7aab Block potential bug that can occur during page transitions 2024-01-22 15:35:19 -07:00
Shawn
663ad161fd Expose focusNode for HiddenCollectible to improve keyboard UX in the photo_gallery
Improve readability of _handleKeyDown method
2024-01-22 15:34:51 -07:00
Shawn
9d2409cc9d Cleanup 2024-01-22 15:09:08 -07:00
Shawn
b28c6994f7 Closes #161, fix release builds not working 2024-01-19 10:24:57 -07:00
Shawn
c018fa3dd1 Create NativeWidgetService to seperate view layer from HomeWidget implementation details. 2024-01-18 12:43:03 -07:00
Shawn
be5e4fbdf3 Build files 2024-01-18 12:14:48 -07:00
Shawn
a71de46804 Fix merge conflicts 2024-01-18 12:14:40 -07:00
Shawn
4b34f81555 Merge branch 'main' into feature/routing_fixes 2024-01-18 12:07:04 -07:00
Shawn
2f500a344e Merge branch 'feature/home-widget' 2024-01-18 12:05:35 -07:00
Shawn
fa640e005d Merge branch 'main' into feature/routing_fixes
# Conflicts:
#	lib/router.dart
#	pubspec.lock
#	pubspec.yaml
2024-01-18 12:04:11 -07:00
Shawn
54cfee18c3
Merge pull request #133 from gskinnerTeam/feature/home-widget
Feature/home widget
2024-01-18 12:01:45 -07:00
Shawn
a57a23d4e0 Resolve merge conflicts 2024-01-18 11:53:38 -07:00
Shawn
6f7a69d50d Merge main 2024-01-18 11:36:39 -07:00
Shawn
a40ce7c080
Merge pull request #156 from erisanolasheni/main
Minor fix on the operator check
2024-01-18 11:34:39 -07:00
Shawn
590e542b34 Fix bug where widget would get out of sync w/ app once collected artifacts were explored 2024-01-18 11:22:31 -07:00
Shawn
76eba1e3e9 Localize pageNotFound 2024-01-18 11:13:38 -07:00
Shawn
4913c2fe92 Cleanup warnings, remove some log messages on web 2024-01-18 10:30:02 -07:00
Shawn
5d8da79941 Merge branch 'main' into feature/routing_fixes
# Conflicts:
#	pubspec.yaml
2024-01-18 10:16:06 -07:00
Shawn
68a0f4d2df
Merge pull request #160 from jonahwilliams/update_maps_version
Update google maps dependency.
2024-01-18 10:13:52 -07:00
Shawn
848ae5cbb6 Add custom 404 page 2024-01-18 10:11:27 -07:00
jonahwilliams
4ee616f67c update lock file 2024-01-17 22:39:57 -08:00
jonahwilliams
3da2041963 Update google maps dependency. 2024-01-17 14:51:46 -08:00
Shawn
5fea5fc017 Protect details screen from bad tabIndex params 2024-01-17 11:55:37 -07:00
Shawn
59af5d9e3e Merge branch 'main' into feature/routing_fixes
# Conflicts:
#	lib/logic/app_logic.dart
2024-01-17 11:42:24 -07:00
Shawn
1ffc18d001 Cleanup 2024-01-17 10:53:42 -07:00
Shawn
80a5cbdcca Remove navSpike 2024-01-17 10:52:06 -07:00
Shawn
537d2ed9e4 Hoist tabPress logic to the screen level. Move go() call to onTap from onChange. prevents errors during route changes. 2024-01-17 10:50:43 -07:00
Shawn
c450c71d05 Switch collections to .go() instead of .push() 2024-01-17 10:48:20 -07:00
Shawn
c45e1fc77e Fix bug with missing queryParams, assign unique ids for all pathParams 2024-01-17 10:47:55 -07:00
Shawn
ea47695847 switch from push to go calls 2024-01-16 17:01:37 -07:00
Shawn
cbbd343f71 Prevent deeplinking to / 2024-01-16 16:59:50 -07:00
Shawn
bf2c0b2d04 Fix for #158: Add kIsWeb check to instances where we want android-specific behaviors. 2024-01-11 13:38:56 -07:00
Shawn
90e642f4b2 Update pub deps 2024-01-11 10:16:36 -07:00
Shawn
539b79a20e Add temporary navSpike to sanity check routing solutions 2024-01-11 10:16:05 -07:00
Shawn
2853af8f61 Add support for nested artifacts (probably going to switch back to push() due to an apparent bug in GoRouter) 2024-01-11 10:15:30 -07:00
Shawn
44300dbe23 WonderDetails: Switch wonderButton from pop() to /home, helps to clear the queryParams when going back. 2024-01-11 10:14:48 -07:00
Shawn
c0fae98895 Update go_router version 2024-01-11 10:13:36 -07:00
Shawn
bbab178465 Finish persistent wonderIndex feature 2024-01-11 10:13:03 -07:00
Shawn
28734b7f1f Switch /video and /maps views to be nested within home, better supporting deeplinks. 2024-01-11 10:12:04 -07:00
Shawn
00e3dcc234 Respect the tabIndex param when on WonderDetails screen 2024-01-11 10:11:03 -07:00
Shawn
3ce1d3a68d Add persistent wonderIndex for home page 2024-01-11 10:09:39 -07:00
Shawn
6e3d94eece Have wonders btn go to /home rather than pop(), eliminates the trailing queryString values 2024-01-09 14:58:33 -07:00
Shawn
3d9d15c5a0 switch to context.pop() so we're going through the goRouter pkg as designed 2024-01-09 14:57:11 -07:00
Shawn
824f4a1ff1 Fix deeplinking / refresh on web
Add all nested routes to the routing table
2024-01-09 14:56:29 -07:00
Erisan Olasheni
a6c99352e6
Minor fix on the operator check
Made minor change on the `==` operator to validate if the compared `Object` `imageProvider` matches the current `Object`.
2023-12-10 19:06:10 +01:00
Shawn
74b536b366 Initial changes to routing system 2023-12-08 10:03:26 -07:00
Shawn
91c8cb9760 Fix for #155, App stuck in onboarding 2023-12-08 09:54:26 -07:00
Shawn
3533369066 Fix map marker placement issue on web 2023-12-06 10:36:41 -07:00
Shawn
432becb17a Add escape key support to backBtn by default 2023-12-05 11:42:26 -07:00
Shawn
66840b9300 Scrollbar alwaysOn for desktop/web 2023-12-05 11:39:00 -07:00
Shawn
28ebe79ad2 Cleanup lint warnings 2023-12-05 11:05:46 -07:00
Shawn
cc6e1649d1 Add mouse-wheel support to previousNextNavigation 2023-12-05 11:03:24 -07:00
Shawn
e34479ccd8 Keep backBtn in landscape mode, just align it to the right 2023-12-05 11:03:24 -07:00
Shawn
7c76fc9c09 Cleanup 2023-12-05 11:03:24 -07:00
Shawn
8daa4c112e Fix RTE when entering collections list 2023-12-05 11:03:24 -07:00
Shawn
5b6cd2d8b5 Prevent fullscreen keyboard from reacting when modals are shown 2023-12-05 11:03:23 -07:00
Shawn
cbde677283 Restore default scrollbar behavior 2023-12-05 11:03:23 -07:00
Shawn
d7ac853653 Cleanup lint warnings 2023-12-05 11:03:23 -07:00
Jared Bell
1f27c303e9 Graphic fix: Pyramids
Replace foreground-back graphic with taller, un-cropped version.
2023-12-04 14:30:59 -07:00
Shawn
fc23212912 Enable semantics on startup, closes issue #146 2023-12-04 12:39:55 -07:00
Shawn
9045b5d8fd
Merge pull request #154 from gskinnerTeam/feature/keyboard-scrolling
Add fullscreen keyboard list scroller component
2023-12-04 11:39:35 -07:00
Shawn
d710a9718a Add fullscreen keyboard list scroller component, incorporate into editorial_screen 2023-12-04 11:32:45 -07:00
Shawn
c2d33ac9d3 Cleanup naming 2023-12-04 11:31:22 -07:00
Shawn
9e4d457339 Add prev/next navigation to intro screen 2023-12-04 11:30:11 -07:00
Shawn
a056373207 Cleanup naming 2023-12-04 11:29:59 -07:00
Shawn
de6c18a42d Add print statement for web users directing them to file issues on github 2023-12-04 11:28:19 -07:00
Shawn
07bd69ac77 Tweak styling on prevNextNav widget 2023-11-30 13:11:54 -07:00
Shawn
a3594470cd
Merge pull request #153 from gskinnerTeam/feature/carousel_nav_136
Feature/carousel nav 136
2023-11-30 10:47:51 -07:00
Shawn
93b0ed57cb
Merge pull request #152 from gskinnerTeam/photo_gallery_fixes
Photo gallery fixes
2023-11-30 10:47:38 -07:00
Shawn
d856f91a93 Add physical btn for carousel navigation,
add keyboard support,
add flipIcon property to CircleIconbtn
2023-11-30 10:41:05 -07:00
Shawn
d2062cd2a4 Update min window size 2023-11-30 10:08:15 -07:00
Shawn
7feafe35b8 Fix issue with [Tab] key not working after arrow keys are used (focus gets lost?) 2023-11-30 09:51:30 -07:00
Shawn
eb0534106f Update dart version 2023-11-29 16:01:55 -07:00
Shawn
66ca833c58 Add keyboard support to FullscreenUrlImgViewer 2023-11-29 16:01:38 -07:00
Shawn
2887de4704 Add arrowkey support for navigation
Add workaround for lack of cutout support on web
2023-11-29 16:01:08 -07:00
Shawn
5b595c3f31 Add fullscreen keyboard listener 2023-11-29 16:00:27 -07:00
Shawn
1c853b1c39 Unify shortcuts on desktop/web, remove arrow-press for focus traversal from desktop.
Add focusNode support for btns
2023-11-29 16:00:00 -07:00
Shawn
04be1daf42 Add basic web analytics to html build 2023-11-21 12:23:42 -07:00
Shawn
97cb83733c Tweak collectibles logic to await data writing 2023-11-20 12:56:38 -07:00
Shawn
395fa12ad0 Version bump 2023-11-17 13:29:08 -07:00
Shawn
c4f4c1a05a Attempted fix for macOS preview warning about containerBackgroundApi 2023-11-07 17:38:44 -07:00
Shawn
00847778f5 Fix deeplink issue where dialogs would render on top of collections view 2023-11-07 17:38:09 -07:00
Shawn
e974ce8ca0 Add support for new containerBackground API in iOS 17 2023-11-07 11:12:05 -07:00
Shawn
24d08a69e9 Fix race condition when updating discoveredCount 2023-11-07 11:11:38 -07:00
Shawn
c071798b02 Fixes for iOS 17 / xCode 15 2023-11-06 18:31:50 -07:00
Shawn
5d7f14fd17 Fix centering issue in photo gallery with hidden collectibles 2023-11-03 14:30:05 -06:00
Shawn
7f786610a7 Remove duplicated comment 2023-11-03 14:29:46 -06:00
Shawn
94afbb1bcf Cleanup 2023-11-02 09:58:07 -06:00
Shawn
616f5ace91 Enable deeplinking 2023-11-02 09:58:01 -06:00
Shawn
76ff50d09a Fix issue with home-screen throwing an error when disposed 2023-11-02 09:57:39 -06:00
Shawn
0805da1b37 Add back button fallback to go to /home if the view can not be popped 2023-11-02 09:57:01 -06:00
Shawn
8c3ef002a8 Cleanup 2023-10-25 16:33:57 -06:00
Shawn
d783d706e1 Cleanup colors implementation 2023-10-23 21:40:55 -06:00
Shawn
b188e77449 Cleanup 2023-10-23 18:31:07 -06:00
Shawn
a8f0b43c99 Cleanup 2023-10-23 18:06:39 -06:00
Shawn
a2a5eef138 Add ability to see last collected image, title and subtitle 2023-10-23 17:43:16 -06:00
Shawn
5b37a65f14 Move flutter_native_splash to dependencies from dev_dependencies since it is used in main() to manage splash screen visibility. 2023-10-19 16:26:41 -06:00
Shawn
48e9b5fc25 Remove wallpaperPhoto view and related logic (saved in feature/wallpaper-sharing branch if needed in the future) 2023-10-19 16:25:02 -06:00
Shawn
758a58b93d Adjust padding for medium size widget 2023-10-19 12:12:34 -06:00
Shawn
310dcd918b Add top-right icon image, adjust colors of text and progress gauge 2023-10-19 11:47:10 -06:00
Shawn
0cff2e5ecc Add home widget to xcode project (WIP) 2023-10-19 11:29:54 -06:00
Shawn
505b0a2054 Add wonderous icon 2023-10-19 11:28:54 -06:00
Shawn
170bf6b13b Merge branch 'main' into feature/home-widget 2023-10-13 14:30:45 -06:00
Shawn
1b07243f25 Update web description 2023-10-13 14:27:59 -06:00
Shawn
2185a02c46 Add placeholder bg image widget 2023-10-13 11:55:51 -06:00
Shawn
26e82be9f3 Merge branch 'main' into feature/home-widget
# Conflicts:
#	pubspec.yaml
2023-10-13 11:52:56 -06:00
Shawn
cac0944d32 Update gradle version 2023-10-12 08:54:14 -06:00
Shawn
dff396283f
Merge pull request #130 from kevmoo/latest_deps
Bump a number of packages to their latest versions
2023-10-11 13:59:07 -06:00
Shawn
f10786ed82 Update maps api 2023-10-11 13:57:04 -06:00
Shawn
b0f0b0084e Decode json content as utf8 2023-10-11 13:56:51 -06:00
Kevin Moore
34bdef3db0 Bump a number of packages to their latest versions 2023-10-11 12:48:41 -07:00
Shawn
6a0eb051e6 Add placeholder widget 2023-10-11 13:40:26 -06:00
Shawn
8ac60d46a8 Re-ran native_splash generator 2023-10-05 09:13:02 -06:00
Shawn
4d5347013c Fix issue with menu icon corners not being rounded consistently 2023-10-04 09:44:07 -06:00
Shawn
ef7b99c992 Update settings for web icons 2023-10-04 09:02:50 -06:00
Shawn
105073480a Increase photo gallery image size to large 2023-10-03 14:55:19 -06:00
Shawn
431a17dc1d Increase resolution of fullscreen photo gallery images 2023-10-03 14:20:14 -06:00
Shawn
0fa3a344c9
Merge pull request #127 from gskinnerTeam/fix/selfhosted-met-files
Use self-hosted images for all artifacts, collectibles and youtube thumbnails.
2023-10-03 14:18:50 -06:00
Shawn
bbd6a68731 Cleanup 2023-10-03 14:17:20 -06:00
Shawn
79631cd91d Remove proxy code 2023-10-03 14:16:01 -06:00
Shawn
c4e34edfd2 Use self-hosted youtube thumbs 2023-10-03 14:15:48 -06:00
Shawn
8f2625bc23 Rename MetAPI to ArtifactAPI etc 2023-10-03 14:15:36 -06:00
Shawn
fdaabec9f3 Update search result tile to use smaller image 2023-10-03 14:14:40 -06:00
Shawn
dce9138640 Update helper scripts 2023-10-03 14:13:01 -06:00
Shawn
5065002bce Update artifact related data classes to use the self-hosted url 2023-10-03 14:11:59 -06:00
Shawn
27613c6922 Update search data files with fresh items, remove the imageUrl param 2023-10-03 14:11:01 -06:00
Shawn
a04d8bbb71
Merge pull request #124 from yangsfang/yangsfang-patch-1
Fix throttler calling an action twice
2023-10-02 14:02:12 -06:00
Shawn
31ec04dea9 Add helper class for downloading and resizing MET image and json files 2023-09-27 13:29:46 -06:00
Yang Fang
509487f789
Fix throttler calling an action twice
There is a bug in throttler where an action is called immediately and also again when the Timer expires despite only being scheduled once by call(). This commit resets the action to null once it is completed.
2023-09-22 11:26:41 -07:00
Shawn
8a29d67096
Merge pull request #115 from jonahwilliams/combine_advanced_blends
Reduce SaveLayer count of advanced blends.
2023-09-11 10:01:33 -06:00
Shawn
a38f564411 Initialize google maps sdk for web platform 2023-09-07 10:24:01 -06:00
jonahwilliams
6523ec320b Reduce SaveLayer count of advanced blends. 2023-09-07 08:57:48 -07:00
Shawn
c7f00c8d32 Fix issue with Youtube player blocking clicks on the back btn 2023-09-06 20:26:17 -06:00
Shawn
ab7ce7bcd6 Implement a server proxy for external images to avoid CORS errors on web
Remove ResizeImage component on web platform to avoid UI thread locking
2023-09-06 20:12:36 -06:00
Shawn
e440b29276 Update the title for web builds 2023-09-06 20:12:36 -06:00
Shawn
efc98ee6cc Open urls externally on web and desktop platforms as in-app webviews are not working yet 2023-09-06 20:12:36 -06:00
Shawn
3987d8ea7d
Merge pull request #107 from akmalirfan/remove_duplicate
Remove duplicate sentence
2023-09-06 13:47:43 -06:00
Shawn
5c72a83def
Merge pull request #106 from yangsfang/issue-104-fix
Fixes language switch button being partially unclickable
2023-09-06 13:47:17 -06:00
Shawn
43d463a9b4 Update native splash screen images 2023-09-05 18:03:50 -06:00
Shawn
a132e97916 Add proxy to MET image requests 2023-09-05 17:48:20 -06:00
Shawn
345f73f048 Replace describeEnum with .name 2023-09-05 17:47:45 -06:00
Shawn
bc21f55d62 Fix overflow error on intro screen 2023-09-05 15:40:00 -06:00
Akmal Irfan
b0337152fa Remove duplicate sentence 2023-09-02 19:00:55 +08:00
Shawn
b430fc4f1b Version bump 2023-09-01 15:48:29 -06:00
Shawn
25d468e3eb Version bump 2023-09-01 14:52:25 -06:00
Shawn
c05c92b442 Use media query size to switch between nav rail and bottom tab menu 2023-09-01 14:51:46 -06:00
Shawn
fa1c4bb52e Add internet permission to android manifest file 2023-09-01 14:51:04 -06:00
Shawn
9ff9527b84 Upgrade gradle version 2023-09-01 14:50:33 -06:00
Yang Fang
fc60942b66
Fixes language switch button being partially unclickable
ExpandedScrollingColumn is on top of the AppHeader and blocks presses on the left half of the language switch button. This commit moves the AppHeader to the top of the stack.
2023-09-01 13:40:30 -07:00
Shawn
d369891d1e Remove unused deps and imports, restore intl pkg to avoid linter warnings 2023-08-29 11:24:20 -06:00
Shawn
14afe90485 Set base href for web version to prepare for deployment 2023-08-29 11:23:23 -06:00
Shawn
56d85a87fd
Merge pull request #100 from parlough/misc/dev-dependency-cleanup
Update dev dependencies, remove unused ones
2023-08-29 11:11:35 -06:00
Parker Lougheed
994a454587
Merge branch 'main' into misc/dev-dependency-cleanup 2023-08-29 11:58:16 -05:00
Shawn
f2408b936c
Merge pull request #101 from parlough/fix/replace-deprecated-load-image-methods
Replace deprecated `ImageProvider` load methods in `RetryImage`
2023-08-29 10:56:17 -06:00
Shawn
5c79438bf2 Remove forked version of gap pkg, no longer needed as of 3.0.1 2023-08-29 10:26:57 -06:00
Shawn
aad94222e8 Tweak img paths to avoid cross-domain origin issues on web platform (WIP) 2023-08-29 10:24:58 -06:00
Shawn
43a1e801b8 Remove intl pkg imports, they are no longer needed on stable branch 2023-08-29 10:23:57 -06:00
Shawn
bb580d5d78 Update README to indicate the app can now run on stable branch 2023-08-29 10:23:34 -06:00
Parker Lougheed
472fdd4ced
Replace deprecated ImageProvider load methods 2023-08-27 22:10:54 -05:00
Parker Lougheed
76fb0f7d1a
Remove build_runner too 2023-08-27 15:58:43 -05:00
Parker Lougheed
d77055d340
Update dev dependencies, remove unused ones 2023-08-27 15:51:04 -05:00
Shawn
ce767b7155 Reorder header elements in stack so that the back button can be selected when using screen reader. 2023-08-23 11:04:27 -06:00
Shawn
a9e4e12ee7 Update web runner files 2023-08-23 10:29:04 -06:00
Shawn
ac10dc36f8 Remove unused imports 2023-08-23 10:28:54 -06:00
Shawn
b6e35f6f92 Add scroll wheel support for intro screen 2023-07-31 10:14:04 -06:00
Shawn
7318ce7d9a Version bump 2023-07-28 11:36:06 -06:00
Shawn
1274130ca1 Update macos runner files 2023-07-28 10:05:14 -06:00
Shawn
9b4d7cc226 Enable drag-to-scroll on desktop 2023-07-28 10:04:51 -06:00
Shawn
fe83fc0c5d Fix macos title 2023-07-28 10:04:34 -06:00
Shawn
d3e7e7e606 Hide placeholder for maps plugin on desktop 2023-07-28 10:04:16 -06:00
Shawn
4492f9e4ee Enable impeller for macOS 2023-07-28 10:03:29 -06:00
Shawn
34e49a0808
Merge pull request #86 from martinoyovo/main
Removed yellow lines under the suggestion title and item text
2023-07-20 12:30:38 -06:00
Shawn
8b0ed00787 Collections list maintains its scroll position when changing list orientation 2023-07-18 18:06:38 -06:00
Shawn
35070ad8a0 Allow web platform to try and load locale 2023-07-11 12:07:40 -06:00
Shawn
23a1741722 Show youtube player on web 2023-07-11 12:07:26 -06:00
Shawn
8a09f54d5c Add network permissions for release builds on macOS 2023-06-28 15:41:44 -06:00
Shawn
479e0838e8 Add category for app store 2023-06-28 15:28:55 -06:00
Shawn
46125abf7f Update app icons 2023-06-28 15:28:27 -06:00
Shawn
a387ca18db Update build files 2023-06-27 12:04:43 -06:00
Shawn
e30e2ebf48 Update Gap package to work around build issue with master branch 2023-06-27 09:40:31 -06:00
Shawn
9e4cd6ee7d Update runner files 2023-06-27 09:39:40 -06:00
Shawn
be5b5fc9a6
Merge pull request #88 from drown0315/fix/dispose_swiper_controller
fix: dispose swipeController
2023-06-26 13:07:29 -06:00
drown0315
11ee06f9ef fix: dispose _swipeController 2023-06-25 23:47:36 +08:00
Shawn
eec8c58d88 Update iOS Runner files 2023-06-22 13:01:30 -06:00
Martino Yovo
6ad95e23e0 Removed yellow lines under the suggestion title and item text 2023-05-27 18:07:25 +00:00
Shawn
c2be9688db Fix nav-rail check 2023-05-11 10:55:34 -06:00
Shawn
6c0d9806cc Version bump 2023-05-10 14:37:53 -06:00
Shawn
6ce11de7d4 switch to master branch of flutter 2023-05-10 14:34:31 -06:00
Shawn
ddf5e54089 Add play/pause keyboard handler to FullscreenVideoView 2023-05-10 14:33:30 -06:00
Shawn
38dc787e27 Maintain timeline year when resizing window 2023-05-10 14:26:31 -06:00
Shawn
fbd6bdaa9b Polish 2023-05-10 14:25:56 -06:00
Shawn
57cda296e6 Use new display API to detect device size. 2023-05-10 14:25:49 -06:00
Shawn
18e3cb731e Remove impeller flag and readme text now that it is the default renderer for ios. 2023-05-10 14:22:38 -06:00
Shawn
50240ba0c2 Update release notes 2023-04-27 12:14:54 -06:00
Shawn
5f978091bd Tweak comments 2023-04-27 12:14:44 -06:00
Shawn
f1be3a4a37 Hide top-left home btn when using navrail on editorial view 2023-04-27 11:22:40 -06:00
Shawn
c819bcfdef Simplify layout of tab menu, add comments 2023-04-27 11:22:40 -06:00
Shawn
863afcae4f Simplify layout 2023-04-27 11:22:40 -06:00
Shawn
253c6b2075 Remove deprecated call to .window 2023-04-27 11:22:40 -06:00
Shawn
c50cecded3 Override intl to avoid conflicts with stable branch 2023-04-27 11:22:40 -06:00
Shawn
92c60ce18a Remove unused scroll pos callback 2023-04-27 11:22:40 -06:00
Shawn
c689fd60e7 Update runner files for ios 2023-04-25 09:27:28 -06:00
Shawn
e5a8da9b57
Merge pull request #79 from gskinnerTeam/update-broken-artifacts
Update highlight_data.dart
2023-04-25 09:02:59 -06:00
Shawn
bcd7842e40 Remove intl from pubspec to avoid conflicts with flutter sdk 2023-04-25 09:00:56 -06:00
Jared Bell
f08e3f9cb9 Update highlight_data.dart
swap in new images paths, replace artifact that was no longer available.
2023-04-21 16:57:56 -06:00
Shawn
853d16aa11 Fix intl version solving 2023-04-21 10:36:43 -06:00
Shawn
330206079a Version bump 2023-04-21 09:12:19 -06:00
Shawn
4c3583cf6e Reduce minHeight of app for testing of new nav rail 2023-04-21 09:12:04 -06:00
Shawn
0c255bec9a Add KeyboardArrowListener to experiment with hz arrow key support on lists 2023-04-20 00:01:45 -06:00
Shawn
1a51d2e906 Polish 2023-04-18 13:49:42 -06:00
Shawn
50d4bac794 Inject menu padding into the detail views so they can have their backgrounds overlap with the nav-rail and its curved corner. 2023-04-18 11:47:03 -06:00
Shawn
0f2e2afd9b Cleanup 2023-04-18 11:22:29 -06:00
Shawn
8b55cca3a0 Remove animations from menu orientation changes 2023-04-18 11:22:19 -06:00
Shawn
b90108fa92 Improve scroll persistence on editorial screen 2023-04-18 11:21:53 -06:00
Shawn
c6eec34922 Fix deprecated color warnings by adding a .colorFilter extension method to Color 2023-04-18 11:13:03 -06:00
Shawn
110766d516 Fix missing redirect 2023-04-18 11:11:24 -06:00
Shawn
3080f8d867 Retain scroll position on events view 2023-04-18 11:03:17 -06:00
Shawn
e09aa3d1b8 Initial pass at vertical menu for smaller landscape views 2023-04-18 10:43:21 -06:00
Shawn
f786e3f5dc Disable print statements 2023-04-18 10:41:46 -06:00
Shawn
11aad53f71 Add material3 flag 2023-04-11 14:46:22 -06:00
Shawn
96734a070f Home menu now scrolls when it runs out of min-height 2023-04-11 14:46:02 -06:00
Shawn
3e6df3e8b0 go_router 6.5 2023-04-11 13:16:57 -06:00
Shawn
7a64e91d28 Version bump 2023-03-02 10:26:10 -07:00
Shawn
289edfcde4
Merge pull request #75 from gskinnerTeam/feature/focus_states
Add focus state to AppBtn
2023-03-02 10:22:02 -07:00
Shawn
7906e6ba36 Add focus node 2023-03-01 14:36:39 -07:00
Shawn
068d7daf9d Add focus outlines to btns, add focus nodes to event markers and editorial text content 2023-03-01 14:36:30 -07:00
Shawn
b1084d8542 Increase font size of About Us page 2023-03-01 14:32:43 -07:00
Shawn
4661f6997c Add a FocusTraversalGroup 2023-03-01 14:32:30 -07:00
Shawn
cda6d7cbaa Add 10% white focus state to AppBtn 2023-02-28 10:06:46 -07:00
Shawn
042cb6425a Remember search panel open/close state 2023-02-28 10:05:51 -07:00
Shawn
d0196a458c Version bump 2023-02-18 20:02:35 -07:00
Shawn
70fd472ca1 Fix dep error w/ intl pkg 2023-02-18 19:27:00 -07:00
Shawn
eb6149454c Version bump 2023-02-18 19:23:35 -07:00
Shawn
cb75f13005 Update roller images to be responsive, remove unused black variations 2023-02-18 19:21:05 -07:00
Shawn
384bf83e35 Increase size of img cache 2023-02-18 19:20:11 -07:00
Shawn
567eb38bea Fix version issues with collections pkg and flutter 3.7.3 2023-02-16 10:59:36 -07:00
Shawn
edec65121b Version bump 2023-02-16 10:37:53 -07:00
Shawn
a1af24f7d4 Remove fullscreen mode support, problematic implementation 2023-02-16 10:35:11 -07:00
Shawn
6de8bf931f Add delay to editorial app bar image fade 2023-02-16 10:34:40 -07:00
Shawn
4608eecb30 Add safe area to fullscreen maps view 2023-02-16 10:24:00 -07:00
Shawn
ead7c75beb Remove currentWonder persistence, no longer necessary since app no longer restarts when folded. 2023-02-16 10:07:08 -07:00
Shawn
8050060b7e Formatting fix 2023-02-16 10:02:43 -07:00
Shawn
d4d27751eb Make events page remember scroll position when changing layouts. 2023-02-16 10:02:34 -07:00
Shawn
92038ed12a Upgrade all deps to latest versions 2023-02-16 00:51:42 -07:00
Shawn
92635d88e3 Remove unused packages 2023-02-16 00:44:30 -07:00
Shawn
aacb37575e
Merge pull request #74 from gskinnerTeam/fix/state_loss_on_android
Fix/state loss on android
2023-02-16 00:39:26 -07:00
Shawn
4c09c20b3b cleanup 2023-02-16 00:35:06 -07:00
Shawn
1ff80a1859 Merge branch 'main' into fix/state_loss_on_android 2023-02-16 00:33:33 -07:00
Shawn
493215583c Remove unnecessary stack from appScaffold 2023-02-16 00:33:00 -07:00
Shawn
6e5a715283 Update youtube plugin, and switch to flutter_webview for inline web views 2023-02-16 00:32:07 -07:00
Shawn
24f5f8487d Upgraded youtube iframe package 2023-02-15 11:01:42 -07:00
Shawn
8bd8403840 Cleanup lint warnings 2023-02-13 23:25:15 -07:00
Shawn
9a9ccff85c Refactor supported orientations logic to be more robust. Fixes bug where some Android Tablets could not rotate to landscape. 2023-02-13 23:24:13 -07:00
Shawn
61e93029d7 print extra logs to help debug landscape issues 2023-02-13 10:40:20 -07:00
Shawn
d2b44a4dc6 cleanup 2023-02-13 10:39:07 -07:00
Shawn
e30f5de874 Tweak loading indicator to start with indeterminant spinner until progress has started. 2023-02-13 10:38:55 -07:00
Shawn
77b03a29a5 Fix typo 2023-01-25 13:36:58 -07:00
289 changed files with 7942 additions and 6214 deletions

1
.gitignore vendored
View File

@ -33,7 +33,6 @@ desktop.ini
/build/ /build/
# Web related # Web related
lib/generated_plugin_registrant.dart
# Symbolication related # Symbolication related
app.*.symbols app.*.symbols

View File

@ -1,11 +1,11 @@
# This file tracks properties of this Flutter project. # This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc. # Used by Flutter tool to assess capabilities and perform upgrades etc.
# #
# This file should be version controlled. # This file should be version controlled and should not be manually edited.
version: version:
revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292 revision: "efbf63d9c66b9f6ec30e9ad4611189aa80003d31"
channel: beta channel: "stable"
project_type: app project_type: app
@ -13,26 +13,11 @@ project_type: app
migration: migration:
platforms: platforms:
- platform: root - platform: root
create_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292 create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292 base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: android
create_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
base_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
- platform: ios
create_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
base_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
- platform: linux
create_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
base_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
- platform: macos
create_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
base_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
- platform: web - platform: web
create_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292 create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
base_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292 base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
- platform: windows
create_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
base_revision: 75927305ff855f76a9ef704f9b4a86fa2fce7292
# User provided section # User provided section

View File

@ -23,32 +23,17 @@ To try the app you can download it from your favorite app store:
If you're new to Flutter the first thing you'll need is to follow the [setup instructions](https://flutter.dev/docs/get-started/install). If you're new to Flutter the first thing you'll need is to follow the [setup instructions](https://flutter.dev/docs/get-started/install).
Once Flutter is setup, you can use the latest `beta` channel: Once Flutter is setup, you can use the latest `stable` channel:
* `flutter channel beta` * `flutter channel stable`
* `flutter upgrade` * `flutter upgrade`
Once on `beta` you're ready to run the app on your local device or simulator: Once on `stable` you're ready to run the app on your local device or simulator:
* `flutter run -d ios` * `flutter run -d ios`
* `flutter run -d android` * `flutter run -d android`
### Impeller Rendering Layer ### Impeller Rendering
Impeller is Flutter's next-generation rendering layer, that takes full advantage of modern hardware-accelerated graphics APIs. It is currently available as an **early adopter preview**, but is not yet feature-complete or fully optimized. This app uses the new [Impeller Runtime](https://docs.flutter.dev/perf/impeller) by default on iOS.
The version of Wonderous available in the iOS app store uses Impeller, but by default this code base does not. If you'd like to enable Impeller for iOS, follow these steps:
Edit the `Info.plist` file and set `FLTEnableImpeller` to `true`:
```
<key>FLTEnableImpeller</key>
<true/>
```
Then, switch to the `master` channel and build as normal:
* `flutter channel master`
* `flutter upgrade`
* `flutter run -d ios`
**Note:** Currently, when Impeller is enabled testing in Simulator will not work, you will need to test on a physical device.
# About gskinner # About gskinner
We build innovative digital experiences for smart clients, and we love how Flutter unleashes our creativity when building multi-platform apps. Don't hesitate to [stop by our site](https://gskinner.com/) to learn more about what we do, or check out other [innovative Flutter projects](https://flutter.gskinner.com) we've built. We'd love to hear from you! We build innovative digital experiences for smart clients, and we love how Flutter unleashes our creativity when building multi-platform apps. Don't hesitate to [stop by our site](https://gskinner.com/) to learn more about what we do, or check out other [innovative Flutter projects](https://flutter.gskinner.com) we've built. We'd love to hear from you!

View File

@ -9,6 +9,11 @@
# packages, and plugins designed to encourage good coding practices. # packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml include: package:flutter_lints/flutter.yaml
analyzer:
errors:
prefer_const_constructors: ignore
unused_element: ignore # mostly because of super.key
linter: linter:
# The lint rules applied to this project can be customized in the # The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml` # section below to disable rules from the `package:flutter_lints/flutter.yaml`
@ -22,9 +27,8 @@ linter:
# `// ignore_for_file: name_of_lint` syntax on the line or in the file # `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint. # producing the lint.
rules: rules:
always_declare_return_types: true - always_declare_return_types
always_use_package_imports: true - always_use_package_imports
prefer_const_constructors: false - prefer_single_quotes
prefer_single_quotes: true
# Additional information about this file can be found at # Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options # https://dart.dev/guides/language/analysis-options

View File

@ -33,7 +33,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
compileSdkVersion flutter.compileSdkVersion compileSdkVersion 34
defaultConfig { defaultConfig {
configurations.all { configurations.all {
@ -47,17 +47,9 @@ android {
versionName flutterVersionName versionName flutterVersionName
} }
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes { buildTypes {
release { release {
signingConfig signingConfigs.release signingConfig signingConfigs.debug
} }
} }

View File

@ -1,5 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gskinner.flutter.wonders"> package="com.gskinner.flutter.wonders">
<uses-permission android:name="android.permission.INTERNET" />
<application <application
android:label="Wonderous" android:label="Wonderous"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="true"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 B

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 B

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#272625</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -5,6 +5,10 @@
<!-- Show a splash screen on the activity. Automatically removed when <!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame --> Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item> <item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your This theme determines the color of the Android Window while your

View File

@ -4,6 +4,7 @@
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:forceDarkAllowed">false</item> <item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#272625</item> <item name="android:windowSplashScreenBackground">#272625</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item> <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>

View File

@ -7,6 +7,7 @@
<item name="android:windowBackground">@drawable/launch_background</item> <item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item> <item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.

View File

@ -1,5 +1,5 @@
buildscript { buildscript {
ext.kotlin_version = '1.6.10' ext.kotlin_version = '1.9.10'
ext.maps_version = '18.1.0' ext.maps_version = '18.1.0'
repositories { repositories {
@ -8,7 +8,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.1.0' classpath 'com.android.tools.build:gradle:7.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }
@ -28,6 +28,6 @@ subprojects {
project.evaluationDependsOn(':app') project.evaluationDependsOn(':app')
} }
task clean(type: Delete) { tasks.register("clean", Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 795 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 795 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1,95 +1,83 @@
PODS: PODS:
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_inappwebview (0.0.1):
- Flutter
- flutter_inappwebview/Core (= 0.0.1)
- OrderedSet (~> 5.0)
- flutter_inappwebview/Core (0.0.1):
- Flutter
- OrderedSet (~> 5.0)
- flutter_native_splash (0.0.1): - flutter_native_splash (0.0.1):
- Flutter - Flutter
- google_maps_flutter_ios (0.0.1): - google_maps_flutter_ios (0.0.1):
- Flutter - Flutter
- GoogleMaps - GoogleMaps (< 9.0)
- GoogleMaps (6.2.1): - GoogleMaps (6.2.1):
- GoogleMaps/Maps (= 6.2.1) - GoogleMaps/Maps (= 6.2.1)
- GoogleMaps/Base (6.2.1) - GoogleMaps/Base (6.2.1)
- GoogleMaps/Maps (6.2.1): - GoogleMaps/Maps (6.2.1):
- GoogleMaps/Base - GoogleMaps/Base
- image_gallery_saver (1.5.0): - home_widget (0.0.1):
- Flutter - Flutter
- integration_test (0.0.1): - image_gallery_saver (2.0.2):
- Flutter - Flutter
- OrderedSet (5.0.0)
- package_info_plus (0.4.5): - package_info_plus (0.4.5):
- Flutter - Flutter
- path_provider_ios (0.0.1): - path_provider_foundation (0.0.1):
- Flutter - Flutter
- share_plus (0.0.1): - FlutterMacOS
- Flutter - shared_preferences_foundation (0.0.1):
- shared_preferences_ios (0.0.1):
- Flutter - Flutter
- FlutterMacOS
- url_launcher_ios (0.0.1): - url_launcher_ios (0.0.1):
- Flutter - Flutter
- webview_flutter_wkwebview (0.0.1):
- Flutter
DEPENDENCIES: DEPENDENCIES:
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`)
- home_widget (from `.symlinks/plugins/home_widget/ios`)
- image_gallery_saver (from `.symlinks/plugins/image_gallery_saver/ios`) - image_gallery_saver (from `.symlinks/plugins/image_gallery_saver/ios`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- share_plus (from `.symlinks/plugins/share_plus/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- GoogleMaps - GoogleMaps
- OrderedSet
EXTERNAL SOURCES: EXTERNAL SOURCES:
Flutter: Flutter:
:path: Flutter :path: Flutter
flutter_inappwebview:
:path: ".symlinks/plugins/flutter_inappwebview/ios"
flutter_native_splash: flutter_native_splash:
:path: ".symlinks/plugins/flutter_native_splash/ios" :path: ".symlinks/plugins/flutter_native_splash/ios"
google_maps_flutter_ios: google_maps_flutter_ios:
:path: ".symlinks/plugins/google_maps_flutter_ios/ios" :path: ".symlinks/plugins/google_maps_flutter_ios/ios"
home_widget:
:path: ".symlinks/plugins/home_widget/ios"
image_gallery_saver: image_gallery_saver:
:path: ".symlinks/plugins/image_gallery_saver/ios" :path: ".symlinks/plugins/image_gallery_saver/ios"
integration_test:
:path: ".symlinks/plugins/integration_test/ios"
package_info_plus: package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios" :path: ".symlinks/plugins/package_info_plus/ios"
path_provider_ios: path_provider_foundation:
:path: ".symlinks/plugins/path_provider_ios/ios" :path: ".symlinks/plugins/path_provider_foundation/darwin"
share_plus: shared_preferences_foundation:
:path: ".symlinks/plugins/share_plus/ios" :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
shared_preferences_ios:
:path: ".symlinks/plugins/shared_preferences_ios/ios"
url_launcher_ios: url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios" :path: ".symlinks/plugins/url_launcher_ios/ios"
webview_flutter_wkwebview:
:path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
SPEC CHECKSUMS: SPEC CHECKSUMS:
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_inappwebview: bfd58618f49dc62f2676de690fc6dcda1d6c3721
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
google_maps_flutter_ios: 66201f392bf62d500f07670a30488a247b9bb5b9 google_maps_flutter_ios: d1318b4ff711612cab16862d7a87e31a7403d458
GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4 GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4
image_gallery_saver: 259eab68fb271cfd57d599904f7acdc7832e7ef2 home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
integration_test: a1e7d09bd98eca2fc37aefd79d4f41ad37bdbbe5 image_gallery_saver: cb43cc43141711190510e92c460eb1655cd343cb
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad webview_flutter_wkwebview: 4f3e50f7273d31e5500066ed267e3ae4309c5ae4
url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
COCOAPODS: 1.11.3 COCOAPODS: 1.15.0

View File

@ -8,6 +8,18 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
296251252AE7410D00D574FF /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296251242AE7410D00D574FF /* Colors.swift */; };
2978ECDD2B62D00C00E36CE8 /* FlutterAssets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2978ECDC2B62D00C00E36CE8 /* FlutterAssets.swift */; };
297F6FC72AD06E0D00FF159E /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 297F6FC62AD06E0D00FF159E /* WidgetKit.framework */; };
297F6FC92AD06E0D00FF159E /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 297F6FC82AD06E0D00FF159E /* SwiftUI.framework */; };
297F6FCC2AD06E0D00FF159E /* WonderousWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCB2AD06E0D00FF159E /* WonderousWidgetBundle.swift */; };
297F6FCE2AD06E0D00FF159E /* WonderousWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCD2AD06E0D00FF159E /* WonderousWidget.swift */; };
297F6FD12AD06E0F00FF159E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 297F6FD02AD06E0F00FF159E /* Assets.xcassets */; };
297F6FD32AD06E0F00FF159E /* WonderousWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCF2AD06E0D00FF159E /* WonderousWidget.intentdefinition */; };
297F6FD42AD06E0F00FF159E /* WonderousWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCF2AD06E0D00FF159E /* WonderousWidget.intentdefinition */; };
297F6FD72AD06E0F00FF159E /* Wonderous WidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
297FD5742AE18011008D8BFE /* WonderousWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297FD5732AE18011008D8BFE /* WonderousWidgetView.swift */; };
297FD5762AE19BD9008D8BFE /* WonderWidgetViewComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297FD5752AE19BD9008D8BFE /* WonderWidgetViewComponents.swift */; };
323DE3CFA8490EAB3C4E249C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */; }; 323DE3CFA8490EAB3C4E249C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
@ -17,6 +29,13 @@
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
297F6FD52AD06E0F00FF159E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 297F6FC42AD06E0D00FF159E;
remoteInfo = WonderousWidgetExtension;
};
E214FC8827C5A18E005F78FB /* PBXContainerItemProxy */ = { E214FC8827C5A18E005F78FB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy; isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */; containerPortal = 97C146E61CF9000F007C117D /* Project object */;
@ -27,6 +46,17 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
297F6FD82AD06E0F00FF159E /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
297F6FD72AD06E0F00FF159E /* Wonderous WidgetExtension.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
9705A1C41CF9048500538489 /* Embed Frameworks */ = { 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -43,6 +73,19 @@
1475293CB8660AC785DF56AB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; 1475293CB8660AC785DF56AB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
296251242AE7410D00D574FF /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = "<group>"; };
2978ECDC2B62D00C00E36CE8 /* FlutterAssets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlutterAssets.swift; sourceTree = "<group>"; };
297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; name = "Wonderous WidgetExtension.appex"; path = WonderousWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
297F6FC62AD06E0D00FF159E /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
297F6FC82AD06E0D00FF159E /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
297F6FCB2AD06E0D00FF159E /* WonderousWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WonderousWidgetBundle.swift; sourceTree = "<group>"; };
297F6FCD2AD06E0D00FF159E /* WonderousWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WonderousWidget.swift; sourceTree = "<group>"; };
297F6FCF2AD06E0D00FF159E /* WonderousWidget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = WonderousWidget.intentdefinition; sourceTree = "<group>"; };
297F6FD02AD06E0F00FF159E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
297F6FD22AD06E0F00FF159E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
297FD56C2ADF0DAB008D8BFE /* WonderousWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WonderousWidgetExtension.entitlements; sourceTree = "<group>"; };
297FD5732AE18011008D8BFE /* WonderousWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WonderousWidgetView.swift; sourceTree = "<group>"; };
297FD5752AE19BD9008D8BFE /* WonderWidgetViewComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WonderWidgetViewComponents.swift; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
@ -62,6 +105,15 @@
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
297F6FC22AD06E0D00FF159E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
297F6FC92AD06E0D00FF159E /* SwiftUI.framework in Frameworks */,
297F6FC72AD06E0D00FF159E /* WidgetKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EB1CF9000F007C117D /* Frameworks */ = { 97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -80,10 +132,28 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
297F6FCA2AD06E0D00FF159E /* WonderousWidget */ = {
isa = PBXGroup;
children = (
297F6FCB2AD06E0D00FF159E /* WonderousWidgetBundle.swift */,
297F6FCD2AD06E0D00FF159E /* WonderousWidget.swift */,
297F6FCF2AD06E0D00FF159E /* WonderousWidget.intentdefinition */,
297F6FD02AD06E0F00FF159E /* Assets.xcassets */,
297F6FD22AD06E0F00FF159E /* Info.plist */,
297FD5732AE18011008D8BFE /* WonderousWidgetView.swift */,
297FD5752AE19BD9008D8BFE /* WonderWidgetViewComponents.swift */,
296251242AE7410D00D574FF /* Colors.swift */,
2978ECDC2B62D00C00E36CE8 /* FlutterAssets.swift */,
);
path = WonderousWidget;
sourceTree = "<group>";
};
5073AC1D92C10773F20D12A2 /* Frameworks */ = { 5073AC1D92C10773F20D12A2 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */, 4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */,
297F6FC62AD06E0D00FF159E /* WidgetKit.framework */,
297F6FC82AD06E0D00FF159E /* SwiftUI.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
@ -102,8 +172,10 @@
97C146E51CF9000F007C117D = { 97C146E51CF9000F007C117D = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
297FD56C2ADF0DAB008D8BFE /* WonderousWidgetExtension.entitlements */,
9740EEB11CF90186004384FC /* Flutter */, 9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */, 97C146F01CF9000F007C117D /* Runner */,
297F6FCA2AD06E0D00FF159E /* WonderousWidget */,
97C146EF1CF9000F007C117D /* Products */, 97C146EF1CF9000F007C117D /* Products */,
5073AC1D92C10773F20D12A2 /* Frameworks */, 5073AC1D92C10773F20D12A2 /* Frameworks */,
E090BB04291350D10AF9DE4E /* Pods */, E090BB04291350D10AF9DE4E /* Pods */,
@ -115,6 +187,7 @@
children = ( children = (
97C146EE1CF9000F007C117D /* Runner.app */, 97C146EE1CF9000F007C117D /* Runner.app */,
E214FC8227C5A18D005F78FB /* wondersUITests.xctest */, E214FC8227C5A18D005F78FB /* wondersUITests.xctest */,
297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@ -148,6 +221,23 @@
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */ = {
isa = PBXNativeTarget;
buildConfigurationList = 297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "WonderousWidgetExtension" */;
buildPhases = (
297F6FC12AD06E0D00FF159E /* Sources */,
297F6FC22AD06E0D00FF159E /* Frameworks */,
297F6FC32AD06E0D00FF159E /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = WonderousWidgetExtension;
productName = WonderousWidgetExtension;
productReference = 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */;
productType = "com.apple.product-type.app-extension";
};
97C146ED1CF9000F007C117D /* Runner */ = { 97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
@ -157,6 +247,7 @@
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */, 97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
297F6FD82AD06E0F00FF159E /* Embed Foundation Extensions */,
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
9DAF500633B345EE15CA82E0 /* [CP] Embed Pods Frameworks */, 9DAF500633B345EE15CA82E0 /* [CP] Embed Pods Frameworks */,
@ -165,6 +256,7 @@
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
297F6FD62AD06E0F00FF159E /* PBXTargetDependency */,
); );
name = Runner; name = Runner;
productName = Runner; productName = Runner;
@ -198,10 +290,13 @@
KnownAssetTags = ( KnownAssetTags = (
New, New,
); );
LastSwiftUpdateCheck = 1320; LastSwiftUpdateCheck = 1430;
LastUpgradeCheck = 1300; LastUpgradeCheck = 1430;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
297F6FC42AD06E0D00FF159E = {
CreatedOnToolsVersion = 14.3.1;
};
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1; CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100; LastSwiftMigration = 1100;
@ -227,11 +322,20 @@
targets = ( targets = (
97C146ED1CF9000F007C117D /* Runner */, 97C146ED1CF9000F007C117D /* Runner */,
E214FC8127C5A18D005F78FB /* wondersUITests */, E214FC8127C5A18D005F78FB /* wondersUITests */,
297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */ /* Begin PBXResourcesBuildPhase section */
297F6FC32AD06E0D00FF159E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
297F6FD12AD06E0F00FF159E /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = { 97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -282,6 +386,7 @@
files = ( files = (
); );
inputPaths = ( inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
); );
name = "Thin Binary"; name = "Thin Binary";
outputPaths = ( outputPaths = (
@ -342,10 +447,25 @@
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
297F6FC12AD06E0D00FF159E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
297FD5762AE19BD9008D8BFE /* WonderWidgetViewComponents.swift in Sources */,
296251252AE7410D00D574FF /* Colors.swift in Sources */,
297F6FD32AD06E0F00FF159E /* WonderousWidget.intentdefinition in Sources */,
2978ECDD2B62D00C00E36CE8 /* FlutterAssets.swift in Sources */,
297FD5742AE18011008D8BFE /* WonderousWidgetView.swift in Sources */,
297F6FCE2AD06E0D00FF159E /* WonderousWidget.swift in Sources */,
297F6FCC2AD06E0D00FF159E /* WonderousWidgetBundle.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = { 97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
297F6FD42AD06E0F00FF159E /* WonderousWidget.intentdefinition in Sources */,
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
); );
@ -361,6 +481,11 @@
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */ /* Begin PBXTargetDependency section */
297F6FD62AD06E0F00FF159E /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */;
targetProxy = 297F6FD52AD06E0F00FF159E /* PBXContainerItemProxy */;
};
E214FC8927C5A18E005F78FB /* PBXTargetDependency */ = { E214FC8927C5A18E005F78FB /* PBXTargetDependency */ = {
isa = PBXTargetDependency; isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */; target = 97C146ED1CF9000F007C117D /* Runner */;
@ -444,9 +569,12 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = S3TL5AY6Y3; DEVELOPMENT_TEAM = S3TL5AY6Y3;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@ -458,6 +586,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = com.gskinner.flutter.wonders; PRODUCT_BUNDLE_IDENTIFIER = com.gskinner.flutter.wonders;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
@ -465,6 +594,120 @@
}; };
name = Profile; name = Profile;
}; };
297F6FD92AD06E0F00FF159E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = WonderousWidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3TL5AY6Y3;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = WonderousWidget/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Wonderous Widget";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.gskinner.flutter.wonders.Wonderous-Widget";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
297F6FDA2AD06E0F00FF159E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = WonderousWidgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3TL5AY6Y3;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = WonderousWidget/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Wonderous Widget";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.gskinner.flutter.wonders.Wonderous-Widget";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
297F6FDB2AD06E0F00FF159E /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = "Wonderous WidgetExtension.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3TL5AY6Y3;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Wonderous Widget/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Wonderous Widget";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.gskinner.flutter.wonders.Wonderous-Widget";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = { 97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
@ -580,9 +823,12 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = S3TL5AY6Y3; DEVELOPMENT_TEAM = S3TL5AY6Y3;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
@ -594,6 +840,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = com.gskinner.flutter.wonders; PRODUCT_BUNDLE_IDENTIFIER = com.gskinner.flutter.wonders;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -606,6 +853,7 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
@ -714,6 +962,16 @@
/* End XCBuildConfiguration section */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */ /* Begin XCConfigurationList section */
297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "WonderousWidgetExtension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
297F6FD92AD06E0F00FF159E /* Debug */,
297F6FDA2AD06E0F00FF159E /* Release */,
297F6FDB2AD06E0F00FF159E /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1300" LastUpgradeVersion = "1430"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,122 +1,122 @@
{ {
"images": [ "images": [
{ {
"size" : "20x20",
"idiom" : "iphone",
"filename": "Icon-App-20x20@2x.png", "filename": "Icon-App-20x20@2x.png",
"scale" : "2x" "idiom": "iphone",
"scale": "2x",
"size": "20x20"
}, },
{ {
"size" : "20x20",
"idiom" : "iphone",
"filename": "Icon-App-20x20@3x.png", "filename": "Icon-App-20x20@3x.png",
"scale" : "3x" "idiom": "iphone",
"scale": "3x",
"size": "20x20"
}, },
{ {
"size" : "29x29",
"idiom" : "iphone",
"filename": "Icon-App-29x29@1x.png", "filename": "Icon-App-29x29@1x.png",
"scale" : "1x" "idiom": "iphone",
"scale": "1x",
"size": "29x29"
}, },
{ {
"size" : "29x29",
"idiom" : "iphone",
"filename": "Icon-App-29x29@2x.png", "filename": "Icon-App-29x29@2x.png",
"scale" : "2x" "idiom": "iphone",
"scale": "2x",
"size": "29x29"
}, },
{ {
"size" : "29x29",
"idiom" : "iphone",
"filename": "Icon-App-29x29@3x.png", "filename": "Icon-App-29x29@3x.png",
"scale" : "3x" "idiom": "iphone",
"scale": "3x",
"size": "29x29"
}, },
{ {
"size" : "40x40",
"idiom" : "iphone",
"filename": "Icon-App-40x40@2x.png", "filename": "Icon-App-40x40@2x.png",
"scale" : "2x" "idiom": "iphone",
"scale": "2x",
"size": "40x40"
}, },
{ {
"size" : "40x40",
"idiom" : "iphone",
"filename": "Icon-App-40x40@3x.png", "filename": "Icon-App-40x40@3x.png",
"scale" : "3x" "idiom": "iphone",
"scale": "3x",
"size": "40x40"
}, },
{ {
"size" : "60x60",
"idiom" : "iphone",
"filename": "Icon-App-60x60@2x.png", "filename": "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom": "iphone", "idiom": "iphone",
"scale": "2x",
"size": "60x60"
},
{
"filename": "Icon-App-60x60@3x.png", "filename": "Icon-App-60x60@3x.png",
"scale" : "3x" "idiom": "iphone",
"scale": "3x",
"size": "60x60"
}, },
{ {
"size" : "20x20",
"idiom" : "ipad",
"filename": "Icon-App-20x20@1x.png", "filename": "Icon-App-20x20@1x.png",
"scale" : "1x" "idiom": "ipad",
"scale": "1x",
"size": "20x20"
}, },
{ {
"size" : "20x20",
"idiom" : "ipad",
"filename": "Icon-App-20x20@2x.png", "filename": "Icon-App-20x20@2x.png",
"scale" : "2x" "idiom": "ipad",
"scale": "2x",
"size": "20x20"
}, },
{ {
"size" : "29x29",
"idiom" : "ipad",
"filename": "Icon-App-29x29@1x.png", "filename": "Icon-App-29x29@1x.png",
"scale" : "1x" "idiom": "ipad",
"scale": "1x",
"size": "29x29"
}, },
{ {
"size" : "29x29",
"idiom" : "ipad",
"filename": "Icon-App-29x29@2x.png", "filename": "Icon-App-29x29@2x.png",
"scale" : "2x" "idiom": "ipad",
"scale": "2x",
"size": "29x29"
}, },
{ {
"size" : "40x40",
"idiom" : "ipad",
"filename": "Icon-App-40x40@1x.png", "filename": "Icon-App-40x40@1x.png",
"scale" : "1x" "idiom": "ipad",
"scale": "1x",
"size": "40x40"
}, },
{ {
"size" : "40x40",
"idiom" : "ipad",
"filename": "Icon-App-40x40@2x.png", "filename": "Icon-App-40x40@2x.png",
"scale" : "2x" "idiom": "ipad",
"scale": "2x",
"size": "40x40"
}, },
{ {
"size" : "76x76",
"idiom" : "ipad",
"filename": "Icon-App-76x76@1x.png", "filename": "Icon-App-76x76@1x.png",
"scale" : "1x" "idiom": "ipad",
"scale": "1x",
"size": "76x76"
}, },
{ {
"size" : "76x76",
"idiom" : "ipad",
"filename": "Icon-App-76x76@2x.png", "filename": "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom": "ipad", "idiom": "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png", "scale": "2x",
"scale" : "2x" "size": "76x76"
},
{
"filename": "Icon-App-83.5x83.5@2x.png",
"idiom": "ipad",
"scale": "2x",
"size": "83.5x83.5"
}, },
{ {
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename": "Icon-App-1024x1024@1x.png", "filename": "Icon-App-1024x1024@1x.png",
"scale" : "1x" "idiom": "ios-marketing",
"scale": "1x",
"size": "1024x1024"
} }
], ],
"info": { "info": {
"version" : 1, "author": "icons_launcher",
"author" : "xcode" "version": 1
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 700 B

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 973 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 B

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>FlutterDeepLinkingEnabled</key>
<true/>
<key>CADisableMinimumFrameDurationOnPhone</key> <key>CADisableMinimumFrameDurationOnPhone</key>
<true/> <true/>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
@ -29,8 +31,6 @@
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string> <string>$(FLUTTER_BUILD_NUMBER)</string>
<key>FLTEnableImpeller</key>
<false/>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>

View File

@ -4,5 +4,9 @@
<dict> <dict>
<key>aps-environment</key> <key>aps-environment</key>
<string>development</string> <string>development</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.gskinner.flutter.wonders.widget</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@ -0,0 +1,13 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,11 @@
import Foundation
import SwiftUI
/// Define some custom extensions on the Color class, so we can use the shorthand syntax `..myColor`
extension Color {
public static let accent = Color(red: 0.89, green: 0.58, blue: 0.36)
public static let offWhite = Color(red: 0.97, green: 0.92, blue: 0.9)
public static let mediumGrey = Color(red: 0.62, green: 0.6, blue: 0.58)
public static let darkGrey = Color(red: 0.15, green: 0.15, blue: 0.15)
public static let body = Color(red: 0.32, green: 0.31, blue: 0.3);
}

View File

@ -0,0 +1,22 @@
import Foundation
struct FlutterImages {
static let bgEmpty = getAssetPath("/assets/images/widget/background-empty.jpg")
static let icon = getAssetPath("/assets/images/widget/wonderous-icon.png")
}
func getAssetPath(_ path : String) -> String {
return assetBundleUrl.appending(path: path).path()
}
// Returns a file path to the location of the flutter assetBundle
var assetBundleUrl: URL {
let bundle = Bundle.main
if bundle.bundleURL.pathExtension == "appex" {
// Peel off two directory levels - MY_APP.app/PlugIns/MY_APP_EXTENSION.appex
var url = bundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent()
url.append(component: "Frameworks/App.framework/flutter_assets")
return url
}
return bundle.bundleURL
}

View File

@ -0,0 +1,11 @@
//
// FlutterUtils.swift
// Wonderous WidgetExtension
//
// Created by Shawn on 2023-10-19.
//
import Foundation

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widgetkit-extension</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,63 @@
import Foundation
import SwiftUI
// Loads a default image from the flutter assets bundle,
// or displays a base64 encoded image that has been saved from the flutter application
struct BgImage : View {
var entry: WonderousTimelineEntry
var body: some View {
var uiImage:UIImage?;
// If there is no saved imageData, use the default bg image
if(entry.imageData.isEmpty){
uiImage = UIImage(contentsOfFile: FlutterImages.bgEmpty);
}
// Load a base64 encoded image that has been written by the flutter app
else {
uiImage = UIImage(data: Data(base64Encoded: entry.imageData)!)
}
if(uiImage != nil){
// Use geometry reader to prevent an oversized bg image from pushing the other content out of the widgets bounds (https://stackoverflow.com/questions/57593552/swiftui-prevent-image-from-expanding-view-rect-outside-of-screen-bounds)
let image = GeometryReader { geometry in
Image(uiImage: uiImage!)
.resizable()
.aspectRatio(contentMode: .fill)
.edgesIgnoringSafeArea(.all) // Ignore the safe area
.frame(maxWidth: geometry.size.width, maxHeight: geometry.size.height)
}
return AnyView(image)
}
debugPrint("The image file could not be loaded")
return AnyView(EmptyView())
}
}
// Declares a restyled version of the native ProgressView
struct GaugeProgressStyle: ProgressViewStyle {
func makeBody(configuration: Configuration) -> some View {
let fractionCompleted = configuration.fractionCompleted ?? 0
return ZStack {
Circle()
.stroke(Color.body, style: StrokeStyle(lineWidth: 2))
Circle()
.trim(from: 0, to: fractionCompleted)
.stroke(Color.accent, style: StrokeStyle(lineWidth: 4, lineCap: .round))
.rotationEffect(.degrees(90))
}
}
}
// Create an extension to support new containerBackground API on
// iOS 17 while still supporting iOS 16 and less (https://nemecek.be/blog/192/hotfixing-widgets-for-ios-17-containerbackground-padding)
extension View {
func widgetBackground(_ backgroundView: some View) -> some View {
if #available(iOSApplicationExtension 17.0, iOS 17.0, macOSApplicationExtension 14.0, *) {
return containerBackground(for: .widget) {
backgroundView
}
} else {
return background(backgroundView)
}
}
}

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>INEnums</key>
<array/>
<key>INIntentDefinitionModelVersion</key>
<string>1.2</string>
<key>INIntentDefinitionNamespace</key>
<string>88xZPY</string>
<key>INIntentDefinitionSystemVersion</key>
<string>20A294</string>
<key>INIntentDefinitionToolsBuildVersion</key>
<string>12A6144</string>
<key>INIntentDefinitionToolsVersion</key>
<string>12.0</string>
<key>INIntents</key>
<array>
<dict>
<key>INIntentCategory</key>
<string>information</string>
<key>INIntentDescriptionID</key>
<string>tVvJ9c</string>
<key>INIntentEligibleForWidgets</key>
<true/>
<key>INIntentIneligibleForSuggestions</key>
<true/>
<key>INIntentName</key>
<string>Configuration</string>
<key>INIntentResponse</key>
<dict>
<key>INIntentResponseCodes</key>
<array>
<dict>
<key>INIntentResponseCodeName</key>
<string>success</string>
<key>INIntentResponseCodeSuccess</key>
<true/>
</dict>
<dict>
<key>INIntentResponseCodeName</key>
<string>failure</string>
</dict>
</array>
</dict>
<key>INIntentTitle</key>
<string>Configuration</string>
<key>INIntentTitleID</key>
<string>gpCwrM</string>
<key>INIntentType</key>
<string>Custom</string>
<key>INIntentVerb</key>
<string>View</string>
</dict>
</array>
<key>INTypes</key>
<array/>
</dict>
</plist>

View File

@ -0,0 +1,72 @@
import WidgetKit
import SwiftUI
import Intents
/// Every home-widget requires a TimelineEntry. This is passed into the view and propvides any data it needs
struct WonderousTimelineEntry : TimelineEntry {
// Date is a mandatory field for all TimelineEntries
let date: Date
// Custom field for the wonderous view
let discoveredCount:Int;
var title:String = "";
var subTitle:String = "";
var imageData:String = "";
}
/// Widget, defines some high level configuration options as well as the primary view that will display the widget.
struct WonderousWidget: Widget {
let kind: String = "WonderousWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: WonderousTimelineProvider()) { entry in
WonderousWidgetView(entry: entry)
}
.contentMarginsDisabled()
.configurationDisplayName("Wonderous Widget")
.description("Track your collected artifacts!")
.supportedFamilies([.systemSmall, .systemMedium, .systemLarge])
}
}
struct WonderousConfig {
let iosKey = "group.com.gskinner.flutter.wonders.widget"
let discoveredCountKey = "dicoveredCount"
}
/// TimelineProvider, returns various WonderousTimelineEntry configurations for different contexts
struct WonderousTimelineProvider: TimelineProvider {
// Provide an entry for a placeholder version of the widget
func placeholder(in context: Context) -> WonderousTimelineEntry {
WonderousTimelineEntry(date: Date(), discoveredCount: 0)
}
// Provide an entry for the current time and state of the widget
func getSnapshot(in context: Context, completion: @escaping (WonderousTimelineEntry) -> ()) {
let entry:WonderousTimelineEntry
let userDefaults = UserDefaults(suiteName: "group.com.gskinner.flutter.wonders.widget")
let discoveredCount = userDefaults?.integer(forKey: "discoveredCount") ?? 0
let title = userDefaults?.string(forKey: "lastDiscoveredTitle") ?? ""
let subTitle = userDefaults?.string(forKey: "lastDiscoveredSubTitle") ?? ""
let imageData = userDefaults?.string(forKey: "lastDiscoveredImageData") ?? ""
entry = WonderousTimelineEntry(
date: Date(),
discoveredCount:discoveredCount,
title: title,
subTitle: subTitle.prefix(1).capitalized + subTitle.dropFirst(),
imageData: imageData
)
completion(entry);
}
// Provide an array of entries for the current time and, optionally, any future times
func getTimeline(in context: Context, completion: @escaping (Timeline<WonderousTimelineEntry>) -> ()) {
getSnapshot(in: context) { (entry) in
let timeline = Timeline(entries: [entry], policy: .atEnd)
completion(timeline)
}
}
}

View File

@ -0,0 +1,12 @@
import WidgetKit
import SwiftUI
// WonderousWidgetBundle
// -> WonderousWidgetView
// -> WonderousWidgetViewComponents
@main
struct WonderousWidgetBundle: WidgetBundle {
var body: some Widget {
WonderousWidget()
}
}

View File

@ -0,0 +1,76 @@
import WidgetKit
import SwiftUI
import Intents
/// Defines the view / layout of the widget
struct WonderousWidgetView : View {
@Environment(\.widgetFamily) var family: WidgetFamily
var entry: WonderousTimelineProvider.Entry
var body: some View {
let showTitle = family == .systemLarge
let showIcon = family != .systemSmall
let showTitleAndDesc = family != .systemSmall
let progressPct = Double(entry.discoveredCount) / 24.0
let iconImage = FlutterImages.icon;
let title = entry.title.isEmpty ? "Wonderous" : entry.title;
let subTitle = entry.subTitle.isEmpty ? "Search for hidden artifacts" : entry.subTitle;
let content = VStack{
// Top row with optional Title and Icon
HStack {
if(showTitle) {
Text("Collection")
.font(.system(size: 15))
.foregroundColor(.offWhite)
}
Spacer();
if(showIcon) {
Image(uiImage: UIImage(contentsOfFile: iconImage)!)
.resizable()
.scaledToFit()
.frame(height: 24)
}
}
Spacer();
// Bottom hz row with title, desc and progress gauge
HStack {
if(showTitleAndDesc) {
VStack(alignment: .leading){
Text(title)
.font(.system(size: 22))
.foregroundColor(.white);
Text(subTitle)
.font(.system(size: 15))
.foregroundColor(.mediumGrey);
}
}
Spacer();
ZStack{
ProgressView(value: progressPct)
.progressViewStyle(GaugeProgressStyle())
.frame(width: 48, height: 48)
Text("\(Int((progressPct * 100).rounded()))%").font(.system(size: 13)).foregroundColor(.white)
}
}
}
// Stack content on top of the background image and a gradient
return ZStack{
BgImage(entry: entry).opacity(0.8)
LinearGradient(
gradient: Gradient(colors: [.black.opacity(0), .black]),
startPoint: .center,
endPoint: .bottom)
content.padding(16)
}
// Ios requires that widgets have a background color
.widgetBackground(Color.darkGrey)
// Deeplink into collections view when tapped
.widgetURL(URL(string: "wonderous:///home/collection"))
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.gskinner.flutter.wonders.widget</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,174 @@
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart';
import 'package:image/image.dart';
import 'package:path_provider/path_provider.dart';
import 'package:wonders/logic/data/collectible_data.dart';
import 'package:wonders/logic/data/highlight_data.dart';
import 'package:wonders/logic/data/wonders_data/chichen_itza_data.dart';
import 'package:wonders/logic/data/wonders_data/christ_redeemer_data.dart';
import 'package:wonders/logic/data/wonders_data/great_wall_data.dart';
import 'package:wonders/logic/data/wonders_data/machu_picchu_data.dart';
import 'package:wonders/logic/data/wonders_data/petra_data.dart';
import 'package:wonders/logic/data/wonders_data/pyramids_giza_data.dart';
import 'package:wonders/logic/data/wonders_data/taj_mahal_data.dart';
import 'package:wonders/logic/data/wonders_data/colosseum_data.dart';
import 'package:wonders/common_libs.dart';
class ArtifactDownloadHelper extends StatefulWidget {
const ArtifactDownloadHelper({super.key});
@override
State<ArtifactDownloadHelper> createState() => _ArtifactDownloadHelperState();
}
/// Using collectiblesData fetch the data for each artifact and download the image.
/// Resize all images to have multiple sizes (small, medium, large)
/// Save images using format [ID].jpg and [ID].json
/// OR modify CollectibleData_helper.html to include all data in the collectiblesData list so no JSON is required.
class _ArtifactDownloadHelperState extends State<ArtifactDownloadHelper> {
late String imagesDir;
final http = Client();
final List<String> missingIds = [];
@override
void initState() {
super.initState();
createDirectory();
}
Future<void> createDirectory() async {
final rootDir = await getApplicationDocumentsDirectory();
imagesDir = '${rootDir.path}/met_collectibles';
await Directory(imagesDir).create(recursive: true);
}
@override
Widget build(BuildContext context) {
return Center(
child: TextButton(
onPressed: downloadArtifacts,
child: Text('Download Artifacts'),
),
);
}
void downloadArtifacts() async {
missingIds.clear();
/// Download collectibles
for (var c in collectiblesData) {
if (await downloadImageAndJson(c.artifactId) == false) {
missingIds.add(c.artifactId);
}
}
/// Download Highights
for (var h in HighlightData.all) {
if (await downloadImageAndJson(h.artifactId) == false) {
missingIds.add(h.artifactId);
}
}
/// Download search artifacts
final searchData = ChichenItzaData().searchData +
ChristRedeemerData().searchData +
ColosseumData().searchData +
GreatWallData().searchData +
MachuPicchuData().searchData +
PetraData().searchData +
PyramidsGizaData().searchData +
TajMahalData().searchData;
for (var a in searchData) {
final id = a.id.toString();
if (await downloadImageAndJson(id) == false) {
missingIds.add(id);
}
final index = searchData.indexOf(a) + 1;
if (index % 100 == 0) {
debugPrint('$index/${searchData.length}');
}
}
debugPrint('Download complete :) Missing IDs: $missingIds');
}
Future<bool> downloadImageAndJson(String id) async {
File jsonFile = File('$imagesDir/$id.json');
late Map json;
if (jsonFile.existsSync()) {
json = jsonDecode(jsonFile.readAsStringSync()) as Map;
} else {
debugPrint('Downloading $id');
// Fetch JSON for id
Uri uri = Uri.parse('https://collectionapi.metmuseum.org/public/collection/v1/objects/$id');
final response = await http.get(uri);
json = jsonDecode(response.body) as Map;
}
// Check if primaryImage field is valid
if (!json.containsKey('primaryImage') || json['primaryImage'].isEmpty) {
return false;
}
// Download image
final url = json['primaryImage'] as String;
//bool isPublicDomain = json['isPublicDomain'] as bool;
File imgFile = File('$imagesDir/$id.jpg');
// If image does not already exist, download it
if (!imgFile.existsSync()) {
await downloadImage(id, url);
if (!imgFile.existsSync()) return false;
}
// Try to resize image
if (await resizeImage(id, [600, 2000]) == false) {
debugPrint('Failed to resize $id');
imgFile.deleteSync();
return false;
}
// Write JSON to file
if (!jsonFile.existsSync()) {
jsonFile.writeAsStringSync(jsonEncode(json));
debugPrint('json saved @ ${jsonFile.path}');
}
return true;
}
Future<bool> downloadImage(String id, String url) async {
//final sizes = [400, 800, 1600, 3000];
debugPrint('Downloading $url to $imagesDir');
final imgResponse = await get(Uri.parse(url));
// If the image is less than a KB, it's probably a 404 image.
if (imgResponse.bodyBytes.lengthInBytes < 2000) {
return false;
}
File file = File('$imagesDir/$id.jpg');
file.writeAsBytesSync(imgResponse.bodyBytes);
debugPrint('img saved @ ${file.path}');
return true;
}
Future<bool> resizeImage(String id, List<int> sizes) async {
final srcFile = File('$imagesDir/$id.jpg');
//debugPrint('Resizing $id...');
try {
final img = decodeJpg(srcFile.readAsBytesSync());
if (img != null) {
// Write various sizes to disk
for (var size in sizes) {
final resizedFile = File('$imagesDir/${id}_$size.jpg');
if (await resizedFile.exists()) continue;
final resizedImg = copyResize(img, width: size);
await resizedFile.writeAsBytes(encodeJpg(resizedImg, quality: 90));
debugPrint('Resized ${id}_$size');
}
return true;
}
} catch (e) {
debugPrint('Failed to resize $id');
debugPrint(e.toString());
}
return false;
}
}

View File

@ -16,7 +16,7 @@ final int maxYear = wondersLogic.timelineEndYear;
const int maxRequests = 32; const int maxRequests = 32;
class ArtifactSearchHelper extends StatefulWidget { class ArtifactSearchHelper extends StatefulWidget {
const ArtifactSearchHelper({Key? key}) : super(key: key); const ArtifactSearchHelper({super.key});
@override @override
State<ArtifactSearchHelper> createState() => _ArtifactSearchHelperState(); State<ArtifactSearchHelper> createState() => _ArtifactSearchHelperState();
@ -161,15 +161,19 @@ class _ArtifactSearchHelperState extends State<ArtifactSearchHelper> {
//if (!json.containsKey('isPublicDomain') || !json['isPublicDomain']) return _logError(id, 'not public domain') //if (!json.containsKey('isPublicDomain') || !json['isPublicDomain']) return _logError(id, 'not public domain')
final int year = ((json['objectBeginDate'] as int) + (json['objectEndDate'] as int)) ~/ 2; final int year = ((json['objectBeginDate'] as int) + (json['objectEndDate'] as int)) ~/ 2;
if (year < minYear || year > maxYear) return _logError(id, 'year is out of range'); if (year < minYear || year > maxYear) {
return _logError(id, 'year is out of range');
}
String? imageUrlSmall = json['primaryImageSmall']; String? imageUrlSmall = json['primaryImageSmall'];
if (imageUrlSmall == null) return _logError(id, 'no small image url'); if (imageUrlSmall == null || imageUrlSmall.isEmpty) {
if (!imageUrlSmall.startsWith(SearchData.baseImagePath)) { return _logError(id, 'no small image url');
return _logError(id, 'unexpected image uri: "$imageUrlSmall"');
} }
String imagePath = imageUrlSmall.substring(SearchData.baseImagePath.length); // if (!imageUrlSmall.startsWith(SearchData.baseImagePath)) {
imagePath = imagePath.replaceFirst('/web-large/', '/mobile-large/'); // return _logError(id, 'unexpected image uri: "$imageUrlSmall"');
// }
// String imageUrl = imageUrlSmall.substring(SearchData.baseImagePath.length);
// imageUrl = imageUrl.replaceFirst('/web-large/', '/mobile-large/');
double? aspectRatio = 0; double? aspectRatio = 0;
if (checkImages) aspectRatio = await _getAspectRatio(imageUrlSmall); if (checkImages) aspectRatio = await _getAspectRatio(imageUrlSmall);
@ -180,7 +184,6 @@ class _ArtifactSearchHelperState extends State<ArtifactSearchHelper> {
id, id,
_escape(json['title']), _escape(json['title']),
_getKeywords(json), _getKeywords(json),
imagePath,
aspectRatio, aspectRatio,
); );
@ -229,12 +232,22 @@ class _ArtifactSearchHelperState extends State<ArtifactSearchHelper> {
String suggestions = _getSuggestions(entries); String suggestions = _getSuggestions(entries);
const fileNames = {
WonderType.chichenItza: 'chichen_itza',
WonderType.christRedeemer: 'christ_redeemer',
WonderType.colosseum: 'colosseum',
WonderType.greatWall: 'great_wall',
WonderType.machuPicchu: 'machu_picchu',
WonderType.petra: 'petra',
WonderType.pyramidsGiza: 'pyramids_giza',
WonderType.tajMahal: 'taj_mahal',
};
Directory dir = await getApplicationDocumentsDirectory(); Directory dir = await getApplicationDocumentsDirectory();
String type = wonder!.type.toString().split('.').last; String name = '${fileNames[wonder!.type]}_search_data.dart';
String path = '${dir.path}/$type.dart'; String path = '${dir.path}/$name';
File file = File(path); File file = File(path);
await file.writeAsString('$suggestions\n\n$output'); await file.writeAsString('$suggestions\n\n$output');
_log('- Wrote file: $type.dart'); _log('- Wrote file: $name');
debugPrint(path); debugPrint(path);
_nextWonder(); _nextWonder();
} }

View File

@ -26,9 +26,9 @@ class ImagePaths {
static String textures = '$common/texture'; static String textures = '$common/texture';
static String icons = '$common/icons'; static String icons = '$common/icons';
static String speckles = '$textures/speckles-white.png';
static String roller1 = '$textures/roller-1-white.png'; static String roller1 = '$textures/roller-1-white.gif';
static String roller2 = '$textures/roller-2-white.png'; static String roller2 = '$textures/roller-2-white.gif';
static String appLogo = '$common/app-logo.png'; static String appLogo = '$common/app-logo.png';
static String appLogoPlain = '$common/app-logo-plain.png'; static String appLogoPlain = '$common/app-logo-plain.png';
@ -43,24 +43,16 @@ class SvgPaths {
/// For wonder specific assets, add an extension to [WonderType] for easy lookup /// For wonder specific assets, add an extension to [WonderType] for easy lookup
extension WonderAssetExtensions on WonderType { extension WonderAssetExtensions on WonderType {
String get assetPath { String get assetPath {
switch (this) { return switch (this) {
case WonderType.pyramidsGiza: WonderType.pyramidsGiza => '${ImagePaths.root}/pyramids',
return '${ImagePaths.root}/pyramids'; WonderType.greatWall => '${ImagePaths.root}/great_wall_of_china',
case WonderType.greatWall: WonderType.petra => '${ImagePaths.root}/petra',
return '${ImagePaths.root}/great_wall_of_china'; WonderType.colosseum => '${ImagePaths.root}/colosseum',
case WonderType.petra: WonderType.chichenItza => '${ImagePaths.root}/chichen_itza',
return '${ImagePaths.root}/petra'; WonderType.machuPicchu => '${ImagePaths.root}/machu_picchu',
case WonderType.colosseum: WonderType.tajMahal => '${ImagePaths.root}/taj_mahal',
return '${ImagePaths.root}/colosseum'; WonderType.christRedeemer => '${ImagePaths.root}/christ_the_redeemer'
case WonderType.chichenItza: };
return '${ImagePaths.root}/chichen_itza';
case WonderType.machuPicchu:
return '${ImagePaths.root}/machu_picchu';
case WonderType.tajMahal:
return '${ImagePaths.root}/taj_mahal';
case WonderType.christRedeemer:
return '${ImagePaths.root}/christ_the_redeemer';
}
} }
String get homeBtn => '$assetPath/wonder-button.png'; String get homeBtn => '$assetPath/wonder-button.png';

View File

@ -1,4 +1,5 @@
/// Consolidate imports that are common across the app. /// Consolidate imports that are common across the app.
library;
export 'dart:math'; export 'dart:math';
@ -14,7 +15,6 @@ export 'package:get_it_mixin/get_it_mixin.dart';
export 'package:go_router/go_router.dart'; export 'package:go_router/go_router.dart';
export 'package:provider/provider.dart'; export 'package:provider/provider.dart';
export 'package:rnd/rnd.dart'; export 'package:rnd/rnd.dart';
export 'package:simple_rich_text/simple_rich_text.dart';
export 'package:sized_context/sized_context.dart'; export 'package:sized_context/sized_context.dart';
export 'package:wonders/assets.dart'; export 'package:wonders/assets.dart';
export 'package:wonders/logic/app_logic.dart'; export 'package:wonders/logic/app_logic.dart';

View File

@ -145,7 +145,7 @@
"chichenItzaCallout2": "The city comprised an area of at least 1.9 sq miles (5 sq km) of densely clustered architecture.", "chichenItzaCallout2": "The city comprised an area of at least 1.9 sq miles (5 sq km) of densely clustered architecture.",
"chichenItzaVideoCaption": "“Ancient Maya 101 | National Geographic.” Youtube, uploaded by National Geographic.", "chichenItzaVideoCaption": "“Ancient Maya 101 | National Geographic.” Youtube, uploaded by National Geographic.",
"chichenItzaMapCaption": "Map showing location of Chichen Itza in Yucatán State, Mexico.", "chichenItzaMapCaption": "Map showing location of Chichen Itza in Yucatán State, Mexico.",
"chichenItzaHistoryInfo1": "Chichen Itza was a powerful regional capital controlling north and central Yucatán. The earliest hieroglyphic date discovered at Chichen Itza is equivalent to 832 CE, while the last known date was recorded in the Osario temple in 998 CE.\nDominating the North Platform of Chichen Itza is the famous Temple of Kukulcán. The temple was identified by the first Spaniards to see it, as El Castillo (\"the castle\"), and it regularly is referred to as such. The temple was identified by the first Spaniards to see it, as El Castillo (\"the castle\"), and it regularly is referred to as such.", "chichenItzaHistoryInfo1": "Chichen Itza was a powerful regional capital controlling north and central Yucatán. The earliest hieroglyphic date discovered at Chichen Itza is equivalent to 832 CE, while the last known date was recorded in the Osario temple in 998 CE.\nDominating the North Platform of Chichen Itza is the famous Temple of Kukulcán. The temple was identified by the first Spaniards to see it, as El Castillo (\"the castle\"), and it regularly is referred to as such.",
"chichenItzaHistoryInfo2": "The city was thought to have the most diverse population in the Maya world, a factor that could have contributed to this architectural variety.", "chichenItzaHistoryInfo2": "The city was thought to have the most diverse population in the Maya world, a factor that could have contributed to this architectural variety.",
"chichenItzaConstructionInfo1": "The structures of Chichen Itza were built from precisely chiseled limestone blocks that fit together perfectly without the mortar. Many of these stone buildings were originally painted in red, green, blue and purple colors depending on the availability of the pigments.\nThe stepped pyramid El Castillo stands about 98 feet (30 m) high and consists of a series of nine square terraces, each approximately 8.4 feet (2.57 m) high, with a 20 foot (6 m) high temple upon the summit.", "chichenItzaConstructionInfo1": "The structures of Chichen Itza were built from precisely chiseled limestone blocks that fit together perfectly without the mortar. Many of these stone buildings were originally painted in red, green, blue and purple colors depending on the availability of the pigments.\nThe stepped pyramid El Castillo stands about 98 feet (30 m) high and consists of a series of nine square terraces, each approximately 8.4 feet (2.57 m) high, with a 20 foot (6 m) high temple upon the summit.",
"chichenItzaConstructionInfo2": "It was built upon broken terrain, which was artificially leveled to support structures such as the Castillo pyramid. Important buildings within the center were connected by a dense network of paved roads called sacbeob.", "chichenItzaConstructionInfo2": "It was built upon broken terrain, which was artificially leveled to support structures such as the Castillo pyramid. Important buildings within the center were connected by a dense network of paved roads called sacbeob.",
@ -427,5 +427,7 @@
"timelineEvent1969ce": "Apollo 11 mission lands on the moon", "timelineEvent1969ce": "Apollo 11 mission lands on the moon",
"privacyPolicy": "Privacy Policy", "privacyPolicy": "Privacy Policy",
"privacyStatement": "As explained in our {privacyUrl} we do not collect any personal information.", "privacyStatement": "As explained in our {privacyUrl} we do not collect any personal information.",
"@privacyStatement": {"placeholders": {"privacyUrl": {}}} "@privacyStatement": {"placeholders": {"privacyUrl": {}}},
"pageNotFoundBackButton": "Back to civilization",
"pageNotFoundMessage": "The page you are looking for does not exist."
} }

View File

@ -405,5 +405,7 @@
"timelineEvent1957ce": "苏联发射斯普特尼克1号", "timelineEvent1957ce": "苏联发射斯普特尼克1号",
"timelineEvent1969ce": "阿波罗11号在月球着陆", "timelineEvent1969ce": "阿波罗11号在月球着陆",
"privacyPolicy": "隐私政策", "privacyPolicy": "隐私政策",
"privacyStatement": "gskinner 非常重视对用户隐私的保护,正如{privacyUrl}里所诉gskinner 不会收集您的个人信息。" "privacyStatement": "gskinner 非常重视对用户隐私的保护,正如{privacyUrl}里所诉gskinner 不会收集您的个人信息。",
"pageNotFoundBackButton": "回到文明",
"pageNotFoundMessage": "您正在寻找的页面不存在"
} }

View File

@ -1,45 +1,54 @@
import 'dart:async'; import 'dart:async';
import 'dart:ui';
import 'package:desktop_window/desktop_window.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:wonders/common_libs.dart'; import 'package:wonders/common_libs.dart';
import 'package:wonders/logic/common/platform_info.dart'; import 'package:wonders/logic/common/platform_info.dart';
import 'package:wonders/ui/common/modals/fullscreen_video_viewer.dart';
import 'package:wonders/ui/common/utils/page_routes.dart'; import 'package:wonders/ui/common/utils/page_routes.dart';
class AppLogic { class AppLogic {
Size _appSize = Size.zero;
/// Indicates to the rest of the app that bootstrap has not completed. /// Indicates to the rest of the app that bootstrap has not completed.
/// The router will use this to prevent redirects while bootstrapping. /// The router will use this to prevent redirects while bootstrapping.
bool isBootstrapComplete = false; bool isBootstrapComplete = false;
bool get isLandscapeEnabled => PlatformInfo.isDesktopOrWeb || deviceSize.shortestSide > 500; /// Indicates which orientations the app will allow be default. Affects Android/iOS devices only.
/// Defaults to both landscape (hz) and portrait (vt)
List<Axis> supportedOrientations = [Axis.vertical, Axis.horizontal];
/// Support portrait and landscape on desktop, web and tablets. Stick to portrait for phones. /// Allow a view to override the currently supported orientations. For example, [FullscreenVideoViewer] always wants to enable both landscape and portrait.
/// A return value of null indicated both orientations are supported. /// If a view sets this override, they are responsible for setting it back to null when finished.
Axis? get supportedOrientations => isLandscapeEnabled ? null : Axis.vertical; List<Axis>? _supportedOrientationsOverride;
set supportedOrientationsOverride(List<Axis>? value) {
Size get deviceSize { if (_supportedOrientationsOverride != value) {
final w = WidgetsBinding.instance.platformDispatcher.views.first; _supportedOrientationsOverride = value;
return w.physicalSize / w.devicePixelRatio; _updateSystemOrientation();
}
} }
/// Initialize the app and all main actors. /// Initialize the app and all main actors.
/// Loads settings, sets up services etc. /// Loads settings, sets up services etc.
Future<void> bootstrap() async { Future<void> bootstrap() async {
debugPrint('bootstrap app, deviceSize: $deviceSize, isTablet: $isLandscapeEnabled'); debugPrint('bootstrap start...');
// Set min-sizes for desktop apps if (kIsWeb) {
if (PlatformInfo.isDesktop) { // SB: This is intentionally not a debugPrint, as it's a message for users who open the console on web.
await DesktopWindow.setMinWindowSize($styles.sizes.minAppSize); print(
'''Thanks for checking out Wonderous on the web!
If you encounter any issues please report them at https://github.com/gskinnerTeam/flutter-wonderous-app/issues.''',
);
// Required on web to automatically enable accessibility features
WidgetsFlutterBinding.ensureInitialized().ensureSemantics();
} }
// Load any bitmaps the views might need // Load any bitmaps the views might need
await AppBitmaps.init(); await AppBitmaps.init();
// Set the initial supported orientations
setDeviceOrientation(supportedOrientations);
// Set preferred refresh rate to the max possible (the OS may ignore this) // Set preferred refresh rate to the max possible (the OS may ignore this)
if (PlatformInfo.isAndroid) { if (!kIsWeb && PlatformInfo.isAndroid) {
await FlutterDisplayMode.setHighRefreshRate(); await FlutterDisplayMode.setHighRefreshRate();
} }
@ -56,6 +65,7 @@ class AppLogic {
timelineLogic.init(); timelineLogic.init();
// Collectibles // Collectibles
collectiblesLogic.init();
await collectiblesLogic.load(); await collectiblesLogic.load();
// Flag bootStrap as complete // Flag bootStrap as complete
@ -66,30 +76,53 @@ class AppLogic {
if (showIntro) { if (showIntro) {
appRouter.go(ScreenPaths.intro); appRouter.go(ScreenPaths.intro);
} else { } else {
appRouter.go(ScreenPaths.home); appRouter.go(initialDeeplink ?? ScreenPaths.home);
} }
} }
void setDeviceOrientation(Axis? axis) {
final orientations = <DeviceOrientation>[];
if (axis == null || axis == Axis.vertical) {
orientations.addAll([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
}
if (axis == null || axis == Axis.horizontal) {
orientations.addAll([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
}
SystemChrome.setPreferredOrientations(orientations);
}
Future<T?> showFullscreenDialogRoute<T>(BuildContext context, Widget child, {bool transparent = false}) async { Future<T?> showFullscreenDialogRoute<T>(BuildContext context, Widget child, {bool transparent = false}) async {
return await Navigator.of(context).push<T>( return await Navigator.of(context).push<T>(
PageRoutes.dialog<T>(child, duration: $styles.times.pageTransition), PageRoutes.dialog<T>(child, duration: $styles.times.pageTransition),
); );
} }
/// Called from the UI layer once a MediaQuery has been obtained
void handleAppSizeChanged(Size appSize) {
/// Disable landscape layout on smaller form factors
bool isSmall = display.size.shortestSide / display.devicePixelRatio < 600;
supportedOrientations = isSmall ? [Axis.vertical] : [Axis.vertical, Axis.horizontal];
_updateSystemOrientation();
_appSize = appSize;
}
Display get display => PlatformDispatcher.instance.displays.first;
bool shouldUseNavRail() => _appSize.width > _appSize.height && _appSize.height > 250;
void _updateSystemOrientation() {
final axisList = _supportedOrientationsOverride ?? supportedOrientations;
//debugPrint('updateDeviceOrientation, supportedAxis: $axisList');
final orientations = <DeviceOrientation>[];
if (axisList.contains(Axis.vertical)) {
orientations.addAll([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
}
if (axisList.contains(Axis.horizontal)) {
orientations.addAll([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
}
SystemChrome.setPreferredOrientations(orientations);
}
}
class AppImageCache extends WidgetsFlutterBinding {
@override
ImageCache createImageCache() {
this.imageCache.maximumSizeBytes = 250 << 20; // 250mb
return super.createImageCache();
}
} }

View File

@ -3,17 +3,18 @@ import 'dart:collection';
import 'package:wonders/common_libs.dart'; import 'package:wonders/common_libs.dart';
import 'package:wonders/logic/common/http_client.dart'; import 'package:wonders/logic/common/http_client.dart';
import 'package:wonders/logic/data/artifact_data.dart'; import 'package:wonders/logic/data/artifact_data.dart';
import 'package:wonders/logic/met_api_service.dart'; import 'package:wonders/logic/artifact_api_service.dart';
class MetAPILogic { class ArtifactAPILogic {
final HashMap<String, ArtifactData?> _artifactCache = HashMap(); final HashMap<String, ArtifactData?> _artifactCache = HashMap();
MetAPIService get service => GetIt.I.get<MetAPIService>(); ArtifactAPIService get service => GetIt.I.get<ArtifactAPIService>();
/// Returns artifact data by ID. Returns null if artifact cannot be found. */ /// Returns artifact data by ID. Returns null if artifact cannot be found. */
Future<ArtifactData?> getArtifactByID(String id) async { Future<ArtifactData?> getArtifactByID(String id, {bool selfHosted = false}) async {
if (_artifactCache.containsKey(id)) return _artifactCache[id]; if (_artifactCache.containsKey(id)) return _artifactCache[id];
ServiceResult<ArtifactData?> result = (await service.getObjectByID(id)); ServiceResult<ArtifactData?> result =
(await (selfHosted ? service.getSelfHostedObjectByID(id) : service.getMetObjectByID(id)));
if (!result.success) throw $strings.artifactDetailsErrorNotFound(id); if (!result.success) throw $strings.artifactDetailsErrorNotFound(id);
ArtifactData? artifact = result.content; ArtifactData? artifact = result.content;
return _artifactCache[id] = artifact; return _artifactCache[id] = artifact;

View File

@ -1,14 +1,20 @@
import 'package:wonders/logic/common/http_client.dart'; import 'package:wonders/logic/common/http_client.dart';
import 'package:wonders/logic/data/artifact_data.dart'; import 'package:wonders/logic/data/artifact_data.dart';
class MetAPIService { class ArtifactAPIService {
final String _baseMETUrl = 'https://collectionapi.metmuseum.org/public/collection/v1'; final String _baseMETUrl = 'https://collectionapi.metmuseum.org/public/collection/v1';
final String _baseSelfHostedUrl = 'https://www.wonderous.info/met';
Future<ServiceResult<ArtifactData?>> getObjectByID(String id) async { Future<ServiceResult<ArtifactData?>> getMetObjectByID(String id) async {
HttpResponse? response = await HttpClient.send('$_baseMETUrl/objects/$id'); HttpResponse? response = await HttpClient.send('$_baseMETUrl/objects/$id');
return ServiceResult<ArtifactData?>(response, _parseArtifactData); return ServiceResult<ArtifactData?>(response, _parseArtifactData);
} }
Future<ServiceResult<ArtifactData?>> getSelfHostedObjectByID(String id) async {
HttpResponse? response = await HttpClient.send('$_baseSelfHostedUrl/$id.json');
return ServiceResult<ArtifactData?>(response, _parseArtifactData);
}
ArtifactData? _parseArtifactData(Map<String, dynamic> content) { ArtifactData? _parseArtifactData(Map<String, dynamic> content) {
// Source: https://metmuseum.github.io/ // Source: https://metmuseum.github.io/
return ArtifactData( return ArtifactData(

View File

@ -1,6 +1,10 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:wonders/common_libs.dart'; import 'package:wonders/common_libs.dart';
import 'package:wonders/logic/common/save_load_mixin.dart'; import 'package:wonders/logic/common/save_load_mixin.dart';
import 'package:wonders/logic/data/collectible_data.dart'; import 'package:wonders/logic/data/collectible_data.dart';
import 'package:wonders/logic/native_widget_service.dart';
class CollectiblesLogic with ThrottledSaveLoadMixin { class CollectiblesLogic with ThrottledSaveLoadMixin {
@override @override
@ -13,11 +17,17 @@ class CollectiblesLogic with ThrottledSaveLoadMixin {
late final statesById = ValueNotifier<Map<String, int>>({})..addListener(_updateCounts); late final statesById = ValueNotifier<Map<String, int>>({})..addListener(_updateCounts);
int _discoveredCount = 0; int _discoveredCount = 0;
int get discoveredCount => _discoveredCount; int get discoveredCount => _discoveredCount;
int _exploredCount = 0; int _exploredCount = 0;
int get exploredCount => _exploredCount; int get exploredCount => _exploredCount;
late final _nativeWidget = GetIt.I<NativeWidgetService>();
void init() => _nativeWidget.init();
CollectibleData? fromId(String? id) => id == null ? null : all.firstWhereOrNull((o) => o.id == id); CollectibleData? fromId(String? id) => id == null ? null : all.firstWhereOrNull((o) => o.id == id);
List<CollectibleData> forWonder(WonderType wonder) { List<CollectibleData> forWonder(WonderType wonder) {
@ -28,6 +38,14 @@ class CollectiblesLogic with ThrottledSaveLoadMixin {
Map<String, int> states = Map.of(statesById.value); Map<String, int> states = Map.of(statesById.value);
states[id] = state; states[id] = state;
statesById.value = states; statesById.value = states;
if (state == CollectibleState.discovered) {
final data = fromId(id)!;
_updateNativeHomeWidgetData(
title: data.title,
id: data.id,
imageUrl: data.imageUrlSmall,
);
}
scheduleSave(); scheduleSave();
} }
@ -37,6 +55,12 @@ class CollectiblesLogic with ThrottledSaveLoadMixin {
if (state == CollectibleState.discovered) _discoveredCount++; if (state == CollectibleState.discovered) _discoveredCount++;
if (state == CollectibleState.explored) _exploredCount++; if (state == CollectibleState.explored) _exploredCount++;
}); });
final foundCount = discoveredCount + exploredCount;
_nativeWidget.save<int>('discoveredCount', foundCount).then((value) {
_nativeWidget.markDirty();
});
debugPrint('setting discoveredCount for home widget $foundCount');
} }
/// Get a discovered item, sorted by the order of wondersLogic.all /// Get a discovered item, sorted by the order of wondersLogic.all
@ -67,11 +91,35 @@ class CollectiblesLogic with ThrottledSaveLoadMixin {
for (int i = 0; i < all.length; i++) { for (int i = 0; i < all.length; i++) {
states[all[i].id] = CollectibleState.lost; states[all[i].id] = CollectibleState.lost;
} }
_updateNativeHomeWidgetData(); // clear home widget data
statesById.value = states; statesById.value = states;
debugPrint('collection reset'); debugPrint('collection reset');
scheduleSave(); scheduleSave();
} }
Future<void> _updateNativeHomeWidgetData({String title = '', String id = '', String imageUrl = ''}) async {
if (!_nativeWidget.isSupported) return;
// Save title
await _nativeWidget.save<String>('lastDiscoveredTitle', title);
// Subtitle
String subTitle = '';
if (id.isNotEmpty) {
final artifactData = await artifactLogic.getArtifactByID(id);
subTitle = artifactData?.date ?? '';
}
await _nativeWidget.save<String>('lastDiscoveredSubTitle', subTitle);
// Image,
// Download, convert to base64 string and write to shared widget data
String imageBase64 = '';
if (imageUrl.isNotEmpty) {
var bytes = await http.readBytes(Uri.parse(imageUrl));
imageBase64 = base64Encode(bytes);
debugPrint('Saving base64 bytes for homeWidget');
}
await _nativeWidget.save<String>('lastDiscoveredImageData', imageBase64);
await _nativeWidget.markDirty();
}
@override @override
void copyFromJson(Map<String, dynamic> value) { void copyFromJson(Map<String, dynamic> value) {
Map<String, int> states = {}; Map<String, int> states = {};

View File

@ -94,7 +94,7 @@ class ServiceResult<R> {
ServiceResult(this.response, R Function(Map<String, dynamic>) parser) { ServiceResult(this.response, R Function(Map<String, dynamic>) parser) {
if (StringUtils.isNotEmpty(response.body) && response.success) { if (StringUtils.isNotEmpty(response.body) && response.success) {
try { try {
content = parser.call(jsonDecode(response.body!)); content = parser.call(jsonDecode(utf8.decode(response.raw!.bodyBytes)));
} on FormatException catch (e) { } on FormatException catch (e) {
dev.log('ParseError: ${e.message}'); dev.log('ParseError: ${e.message}');
} }

View File

@ -12,7 +12,7 @@ class PlatformInfo {
static bool get isDesktopOrWeb => isDesktop || kIsWeb; static bool get isDesktopOrWeb => isDesktop || kIsWeb;
static bool get isMobile => _mobilePlatforms.contains(defaultTargetPlatform) && !kIsWeb; static bool get isMobile => _mobilePlatforms.contains(defaultTargetPlatform) && !kIsWeb;
static double get pixelRatio => WidgetsBinding.instance.window.devicePixelRatio; static double get pixelRatio => WidgetsBinding.instance.platformDispatcher.views.first.devicePixelRatio;
static bool get isWindows => defaultTargetPlatform == TargetPlatform.windows; static bool get isWindows => defaultTargetPlatform == TargetPlatform.windows;
static bool get isLinux => defaultTargetPlatform == TargetPlatform.linux; static bool get isLinux => defaultTargetPlatform == TargetPlatform.linux;

View File

@ -49,9 +49,10 @@ class RetryImage extends ImageProvider<Object> {
return completer.future; return completer.future;
} }
ImageStreamCompleter _commonLoad(ImageStreamCompleter Function() loader) { @override
ImageStreamCompleter loadImage(Object key, ImageDecoderCallback decode) {
final _DelegatingImageStreamCompleter completer = _DelegatingImageStreamCompleter(); final _DelegatingImageStreamCompleter completer = _DelegatingImageStreamCompleter();
ImageStreamCompleter completerToWrap = loader(); ImageStreamCompleter completerToWrap = imageProvider.loadImage(key, decode);
late ImageStreamListener listener; late ImageStreamListener listener;
Duration duration = const Duration(milliseconds: 250); Duration duration = const Duration(milliseconds: 250);
@ -69,7 +70,7 @@ class RetryImage extends ImageProvider<Object> {
} }
Future<void>.delayed(duration).then((void v) { Future<void>.delayed(duration).then((void v) {
duration *= 2; duration *= 2;
completerToWrap = loader(); completerToWrap = imageProvider.loadImage(key, decode);
count += 1; count += 1;
completerToWrap.addListener(listener); completerToWrap.addListener(listener);
}); });
@ -84,24 +85,12 @@ class RetryImage extends ImageProvider<Object> {
return completer; return completer;
} }
@override
// ignore: deprecated_member_use
ImageStreamCompleter load(Object key, DecoderCallback decode) {
// ignore: deprecated_member_use
return _commonLoad(() => imageProvider.load(key, decode));
}
@override
ImageStreamCompleter loadBuffer(Object key, DecoderBufferCallback decode) {
return _commonLoad(() => imageProvider.loadBuffer(key, decode));
}
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (other.runtimeType != runtimeType) { if (other.runtimeType != runtimeType) {
return false; return false;
} }
return other is RetryImage && other.imageProvider == other.imageProvider && other.scale == scale; return other is RetryImage && other.imageProvider == imageProvider && other.scale == scale;
} }
@override @override

View File

@ -16,7 +16,7 @@ mixin ThrottledSaveLoadMixin {
} }
Future<void> save() async { Future<void> save() async {
debugPrint('Saving...'); if (!kIsWeb) debugPrint('Saving...');
try { try {
await _file.save(toJson()); await _file.save(toJson());
} on Exception catch (e) { } on Exception catch (e) {

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