diff --git a/assets/images/widget/background-empty.jpg b/assets/images/widget/background-empty.jpg new file mode 100644 index 00000000..8fc3b679 Binary files /dev/null and b/assets/images/widget/background-empty.jpg differ diff --git a/assets/images/widget/wonderous-icon.png b/assets/images/widget/wonderous-icon.png new file mode 100644 index 00000000..41d92298 Binary files /dev/null and b/assets/images/widget/wonderous-icon.png differ diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d16b2f4a..7662fb4a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -4,13 +4,15 @@ PODS: - Flutter - google_maps_flutter_ios (0.0.1): - Flutter - - GoogleMaps + - GoogleMaps (< 8.0) - GoogleMaps (6.2.1): - GoogleMaps/Maps (= 6.2.1) - GoogleMaps/Base (6.2.1) - GoogleMaps/Maps (6.2.1): - GoogleMaps/Base - - image_gallery_saver (1.5.0): + - home_widget (0.0.1): + - Flutter + - image_gallery_saver (2.0.2): - Flutter - package_info_plus (0.4.5): - Flutter @@ -31,6 +33,7 @@ DEPENDENCIES: - Flutter (from `Flutter`) - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/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`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) @@ -50,6 +53,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_native_splash/ios" google_maps_flutter_ios: :path: ".symlinks/plugins/google_maps_flutter_ios/ios" + home_widget: + :path: ".symlinks/plugins/home_widget/ios" image_gallery_saver: :path: ".symlinks/plugins/image_gallery_saver/ios" package_info_plus: @@ -68,15 +73,16 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef - google_maps_flutter_ios: 66201f392bf62d500f07670a30488a247b9bb5b9 + google_maps_flutter_ios: abdac20d6ce8931f6ebc5f46616df241bfaa2cfd GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4 - image_gallery_saver: 259eab68fb271cfd57d599904f7acdc7832e7ef2 - package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e - path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 - shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca - url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de - webview_flutter_wkwebview: b7e70ef1ddded7e69c796c7390ee74180182971f + home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57 + image_gallery_saver: cb43cc43141711190510e92c460eb1655cd343cb + package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 + webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 60ecffa1..1e9d1359 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,17 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 296251252AE7410D00D574FF /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296251242AE7410D00D574FF /* Colors.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 */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; @@ -17,6 +28,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 297F6FD52AD06E0F00FF159E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 297F6FC42AD06E0D00FF159E; + remoteInfo = WonderousWidgetExtension; + }; E214FC8827C5A18E005F78FB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 97C146E61CF9000F007C117D /* Project object */; @@ -27,6 +45,17 @@ /* End PBXContainerItemProxy 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 */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -43,6 +72,18 @@ 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 = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 296251242AE7410D00D574FF /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; + 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 = ""; }; + 297F6FCD2AD06E0D00FF159E /* WonderousWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WonderousWidget.swift; sourceTree = ""; }; + 297F6FCF2AD06E0D00FF159E /* WonderousWidget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = WonderousWidget.intentdefinition; sourceTree = ""; }; + 297F6FD02AD06E0F00FF159E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 297F6FD22AD06E0F00FF159E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 297FD56C2ADF0DAB008D8BFE /* WonderousWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WonderousWidgetExtension.entitlements; sourceTree = ""; }; + 297FD5732AE18011008D8BFE /* WonderousWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WonderousWidgetView.swift; sourceTree = ""; }; + 297FD5752AE19BD9008D8BFE /* WonderWidgetViewComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WonderWidgetViewComponents.swift; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 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 = ""; }; @@ -62,6 +103,15 @@ /* End PBXFileReference 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 */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -80,10 +130,27 @@ /* End PBXFrameworksBuildPhase 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 */, + ); + path = WonderousWidget; + sourceTree = ""; + }; 5073AC1D92C10773F20D12A2 /* Frameworks */ = { isa = PBXGroup; children = ( 4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */, + 297F6FC62AD06E0D00FF159E /* WidgetKit.framework */, + 297F6FC82AD06E0D00FF159E /* SwiftUI.framework */, ); name = Frameworks; sourceTree = ""; @@ -102,8 +169,10 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( + 297FD56C2ADF0DAB008D8BFE /* WonderousWidgetExtension.entitlements */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, + 297F6FCA2AD06E0D00FF159E /* WonderousWidget */, 97C146EF1CF9000F007C117D /* Products */, 5073AC1D92C10773F20D12A2 /* Frameworks */, E090BB04291350D10AF9DE4E /* Pods */, @@ -115,6 +184,7 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, E214FC8227C5A18D005F78FB /* wondersUITests.xctest */, + 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */, ); name = Products; sourceTree = ""; @@ -148,6 +218,23 @@ /* End PBXGroup 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 */ = { isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; @@ -157,6 +244,7 @@ 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, + 297F6FD82AD06E0F00FF159E /* Embed Foundation Extensions */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 9DAF500633B345EE15CA82E0 /* [CP] Embed Pods Frameworks */, @@ -165,6 +253,7 @@ buildRules = ( ); dependencies = ( + 297F6FD62AD06E0F00FF159E /* PBXTargetDependency */, ); name = Runner; productName = Runner; @@ -198,10 +287,13 @@ KnownAssetTags = ( New, ); - LastSwiftUpdateCheck = 1320; + LastSwiftUpdateCheck = 1430; LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { + 297F6FC42AD06E0D00FF159E = { + CreatedOnToolsVersion = 14.3.1; + }; 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 1100; @@ -227,11 +319,20 @@ targets = ( 97C146ED1CF9000F007C117D /* Runner */, E214FC8127C5A18D005F78FB /* wondersUITests */, + 297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 297F6FC32AD06E0D00FF159E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 297F6FD12AD06E0F00FF159E /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EC1CF9000F007C117D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -343,10 +444,24 @@ /* End PBXShellScriptBuildPhase 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 */, + 297FD5742AE18011008D8BFE /* WonderousWidgetView.swift in Sources */, + 297F6FCE2AD06E0D00FF159E /* WonderousWidget.swift in Sources */, + 297F6FCC2AD06E0D00FF159E /* WonderousWidgetBundle.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EA1CF9000F007C117D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 297F6FD42AD06E0F00FF159E /* WonderousWidget.intentdefinition in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); @@ -362,6 +477,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 297F6FD62AD06E0F00FF159E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */; + targetProxy = 297F6FD52AD06E0F00FF159E /* PBXContainerItemProxy */; + }; E214FC8927C5A18E005F78FB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 97C146ED1CF9000F007C117D /* Runner */; @@ -445,6 +565,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; @@ -469,6 +590,120 @@ }; 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 */ = { isa = XCBuildConfiguration; buildSettings = { @@ -584,6 +819,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; @@ -613,6 +849,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; @@ -721,6 +958,16 @@ /* End XCBuildConfiguration 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" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index edd1910d..05dd3f74 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + FlutterDeepLinkingEnabled + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 903def2a..25cd9eb5 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -4,5 +4,9 @@ aps-environment development + com.apple.security.application-groups + + group.com.gskinner.flutter.wonders.widget + diff --git a/ios/Wonderous Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json b/ios/Wonderous Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json deleted file mode 100644 index eb878970..00000000 --- a/ios/Wonderous Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/Wonderous Widget/Wonderous_Widget.swift b/ios/Wonderous Widget/Wonderous_Widget.swift deleted file mode 100644 index a24f98f5..00000000 --- a/ios/Wonderous Widget/Wonderous_Widget.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// Wonderous_Widget.swift -// Wonderous Widget -// -// Created by Shawn on 2023-06-08. -// - -import WidgetKit -import SwiftUI - -struct Provider: TimelineProvider { - func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(date: Date()) - } - - func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry = SimpleEntry(date: Date()) - completion(entry) - } - - func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - var entries: [SimpleEntry] = [] - - // Generate a timeline consisting of five entries an hour apart, starting from the current date. - let currentDate = Date() - for hourOffset in 0 ..< 5 { - let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! - let entry = SimpleEntry(date: entryDate) - entries.append(entry) - } - - let timeline = Timeline(entries: entries, policy: .atEnd) - completion(timeline) - } -} - -struct SimpleEntry: TimelineEntry { - let date: Date -} - -struct Wonderous_WidgetEntryView : View { - var entry: Provider.Entry - - var body: some View { - Text(entry.date, style: .time) - } -} - -struct Wonderous_Widget: Widget { - let kind: String = "Wonderous_Widget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { entry in - Wonderous_WidgetEntryView(entry: entry) - } - .configurationDisplayName("My Widget") - .description("This is an example widget.") - } -} - -struct Wonderous_Widget_Previews: PreviewProvider { - static var previews: some View { - Wonderous_WidgetEntryView(entry: SimpleEntry(date: Date())) - .previewContext(WidgetPreviewContext(family: .systemSmall)) - } -} diff --git a/ios/Wonderous Widget/Wonderous_WidgetBundle.swift b/ios/Wonderous Widget/Wonderous_WidgetBundle.swift deleted file mode 100644 index 19af92f9..00000000 --- a/ios/Wonderous Widget/Wonderous_WidgetBundle.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Wonderous_WidgetBundle.swift -// Wonderous Widget -// -// Created by Shawn on 2023-06-08. -// - -import WidgetKit -import SwiftUI - -@main -struct Wonderous_WidgetBundle: WidgetBundle { - var body: some Widget { - Wonderous_Widget() - } -} diff --git a/ios/Wonderous Widget/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/WonderousWidget/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from ios/Wonderous Widget/Assets.xcassets/AppIcon.appiconset/Contents.json rename to ios/WonderousWidget/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/ios/Wonderous Widget/Assets.xcassets/Contents.json b/ios/WonderousWidget/Assets.xcassets/Contents.json similarity index 100% rename from ios/Wonderous Widget/Assets.xcassets/Contents.json rename to ios/WonderousWidget/Assets.xcassets/Contents.json diff --git a/ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/WonderousWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json similarity index 100% rename from ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json rename to ios/WonderousWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json diff --git a/ios/WonderousWidget/Colors.swift b/ios/WonderousWidget/Colors.swift new file mode 100644 index 00000000..c362b248 --- /dev/null +++ b/ios/WonderousWidget/Colors.swift @@ -0,0 +1,10 @@ +import Foundation +import SwiftUI + +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); +} diff --git a/ios/WonderousWidget/FlutterUtils.swift b/ios/WonderousWidget/FlutterUtils.swift new file mode 100644 index 00000000..bf69dc15 --- /dev/null +++ b/ios/WonderousWidget/FlutterUtils.swift @@ -0,0 +1,11 @@ +// +// FlutterUtils.swift +// Wonderous WidgetExtension +// +// Created by Shawn on 2023-10-19. +// + +import Foundation + + + diff --git a/ios/Wonderous Widget/Info.plist b/ios/WonderousWidget/Info.plist similarity index 100% rename from ios/Wonderous Widget/Info.plist rename to ios/WonderousWidget/Info.plist diff --git a/ios/WonderousWidget/WonderWidgetViewComponents.swift b/ios/WonderousWidget/WonderWidgetViewComponents.swift new file mode 100644 index 00000000..042f599f --- /dev/null +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -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){ + let defaultImage = flutterAssetBundle.appending(path: "/assets/images/widget/background-empty.jpg").path(); + uiImage = UIImage(contentsOfFile: defaultImage); + } + // 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 the 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()) + } + +} + +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) + } + } +} diff --git a/ios/WonderousWidget/WonderousWidget.intentdefinition b/ios/WonderousWidget/WonderousWidget.intentdefinition new file mode 100644 index 00000000..bdb40455 --- /dev/null +++ b/ios/WonderousWidget/WonderousWidget.intentdefinition @@ -0,0 +1,59 @@ + + + + + INEnums + + INIntentDefinitionModelVersion + 1.2 + INIntentDefinitionNamespace + 88xZPY + INIntentDefinitionSystemVersion + 20A294 + INIntentDefinitionToolsBuildVersion + 12A6144 + INIntentDefinitionToolsVersion + 12.0 + INIntents + + + INIntentCategory + information + INIntentDescriptionID + tVvJ9c + INIntentEligibleForWidgets + + INIntentIneligibleForSuggestions + + INIntentName + Configuration + INIntentResponse + + INIntentResponseCodes + + + INIntentResponseCodeName + success + INIntentResponseCodeSuccess + + + + INIntentResponseCodeName + failure + + + + INIntentTitle + Configuration + INIntentTitleID + gpCwrM + INIntentType + Custom + INIntentVerb + View + + + INTypes + + + diff --git a/ios/WonderousWidget/WonderousWidget.swift b/ios/WonderousWidget/WonderousWidget.swift new file mode 100644 index 00000000..64bc89f6 --- /dev/null +++ b/ios/WonderousWidget/WonderousWidget.swift @@ -0,0 +1,66 @@ +import WidgetKit +import SwiftUI +import Intents + +/// Entry, is passed into the view and defines the data it needs +struct WonderousTimelineEntry : TimelineEntry { + let date: Date + let discoveredCount:Int; + var title:String = ""; + var subTitle:String = ""; + var imageData:String = ""; +} + +// Widget, defines the display name and description and also declared the main View +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]) + } +} + +// Provider,returns various WonderousEntry configs based on current context +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) -> ()) { + getSnapshot(in: context) { (entry) in + let timeline = Timeline(entries: [entry], policy: .atEnd) + completion(timeline) + } + } +} + + + + + diff --git a/ios/WonderousWidget/WonderousWidgetBundle.swift b/ios/WonderousWidget/WonderousWidgetBundle.swift new file mode 100644 index 00000000..09a92c69 --- /dev/null +++ b/ios/WonderousWidget/WonderousWidgetBundle.swift @@ -0,0 +1,16 @@ +// +// WonderousWidgetBundle.swift +// Wonderous Widget +// +// Created by Shawn on 2023-10-06. +// + +import WidgetKit +import SwiftUI + +@main +struct WonderousWidgetBundle: WidgetBundle { + var body: some Widget { + WonderousWidget() + } +} diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift new file mode 100644 index 00000000..b0fa9809 --- /dev/null +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -0,0 +1,82 @@ +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 progress = Double(entry.discoveredCount) / 24.0 + let iconImage = flutterAssetBundle.appending( + path: "/assets/images/widget/wonderous-icon.png" + ).path() + let title = entry.title.isEmpty ? "Wonderous" : entry.title; + let subTitle = entry.subTitle.isEmpty ? "Search for hidden artifacts" : entry.subTitle; + let content = VStack{ + 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(); + 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: progress) + .progressViewStyle(GaugeProgressStyle()) + .frame(width: 48, height: 48) + Text("\(Int(progress * 100))%").font(.system(size: 13)).foregroundColor(.white) + } + } + } + + return ZStack{ + BgImage(entry: entry).opacity(0.8) + LinearGradient( + gradient: Gradient(colors: [.black.opacity(0), .black]), + startPoint: .center, + endPoint: .bottom) + content.padding(16) + } + .widgetBackground(Color.darkGrey) + .widgetURL(URL(string: "wonderous:///home/collection")) + + } +} + +// Todo: Refactor to getFlutterAsset(String path), include /assets, or maybe just getFlutterImage(String path), include assets/images +// Returns a file path to the location of the flutter assetBundle +var flutterAssetBundle: 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 +} diff --git a/ios/WonderousWidgetExtension.entitlements b/ios/WonderousWidgetExtension.entitlements new file mode 100644 index 00000000..3deb71a4 --- /dev/null +++ b/ios/WonderousWidgetExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.gskinner.flutter.wonders.widget + + + diff --git a/lib/logic/app_logic.dart b/lib/logic/app_logic.dart index 810cb6ca..5b0878cd 100644 --- a/lib/logic/app_logic.dart +++ b/lib/logic/app_logic.dart @@ -70,6 +70,7 @@ class AppLogic { timelineLogic.init(); // Collectibles + collectiblesLogic.init(); await collectiblesLogic.load(); // Flag bootStrap as complete diff --git a/lib/logic/collectibles_logic.dart b/lib/logic/collectibles_logic.dart index dc6f2b50..976be536 100644 --- a/lib/logic/collectibles_logic.dart +++ b/lib/logic/collectibles_logic.dart @@ -1,10 +1,16 @@ +import 'dart:convert'; + +import 'package:home_widget/home_widget.dart'; import 'package:wonders/common_libs.dart'; import 'package:wonders/logic/common/save_load_mixin.dart'; import 'package:wonders/logic/data/collectible_data.dart'; +import 'package:http/http.dart' as http; class CollectiblesLogic with ThrottledSaveLoadMixin { @override String get fileName => 'collectibles.dat'; + static const _appGroupId = 'group.com.gskinner.flutter.wonders.widget'; + static const _appName = 'WonderousWidget'; /// Holds all collectibles that the views should care about final List all = collectiblesData; @@ -13,11 +19,17 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { late final statesById = ValueNotifier>({})..addListener(_updateCounts); int _discoveredCount = 0; + int get discoveredCount => _discoveredCount; int _exploredCount = 0; + int get exploredCount => _exploredCount; + void init() { + HomeWidget.setAppGroupId(_appGroupId); + } + CollectibleData? fromId(String? id) => id == null ? null : all.firstWhereOrNull((o) => o.id == id); List forWonder(WonderType wonder) { @@ -28,6 +40,14 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { Map states = Map.of(statesById.value); states[id] = state; statesById.value = states; + if (state == CollectibleState.discovered) { + final data = fromId(id)!; + _updateHomeWidgetTextData( + title: data.title, + id: data.id, + imageUrl: data.imageUrlSmall, + ); + } scheduleSave(); } @@ -37,6 +57,11 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { if (state == CollectibleState.discovered) _discoveredCount++; if (state == CollectibleState.explored) _exploredCount++; }); + final foundCount = discoveredCount + exploredCount; + HomeWidget.saveWidgetData('discoveredCount', foundCount).then((value) { + HomeWidget.updateWidget(iOSName: _appName); + }); + debugPrint('setting discoveredCount for home widget $foundCount'); } /// Get a discovered item, sorted by the order of wondersLogic.all @@ -67,11 +92,34 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { for (int i = 0; i < all.length; i++) { states[all[i].id] = CollectibleState.lost; } + _updateHomeWidgetTextData(); // clear home widget data statesById.value = states; debugPrint('collection reset'); scheduleSave(); } + Future _updateHomeWidgetTextData({String title = '', String id = '', String imageUrl = ''}) async { + // Save title + await HomeWidget.saveWidgetData('lastDiscoveredTitle', title); + // Subtitle + String subTitle = ''; + if (id.isNotEmpty) { + final artifactData = await artifactLogic.getArtifactByID(id); + subTitle = artifactData?.date ?? ''; + } + await HomeWidget.saveWidgetData('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: $imageBase64'); + } + await HomeWidget.saveWidgetData('lastDiscoveredImageData', imageBase64); + await HomeWidget.updateWidget(iOSName: _appName); + } + @override void copyFromJson(Map value) { Map states = {}; diff --git a/lib/main.dart b/lib/main.dart index 45005d5e..f826298b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -78,7 +78,7 @@ WondersLogic get wondersLogic => GetIt.I.get(); TimelineLogic get timelineLogic => GetIt.I.get(); SettingsLogic get settingsLogic => GetIt.I.get(); UnsplashLogic get unsplashLogic => GetIt.I.get(); -ArtifactAPILogic get metAPILogic => GetIt.I.get(); +ArtifactAPILogic get artifactLogic => GetIt.I.get(); CollectiblesLogic get collectiblesLogic => GetIt.I.get(); LocaleLogic get localeLogic => GetIt.I.get(); diff --git a/lib/router.dart b/lib/router.dart index 35ee0d67..bee38ac3 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -38,7 +38,11 @@ final appRouter = GoRouter( }, routes: [ AppRoute(ScreenPaths.splash, (_) => Container(color: $styles.colors.greyStrong)), // This will be hidden - AppRoute(ScreenPaths.home, (_) => HomeScreen()), + AppRoute(ScreenPaths.home, (_) => HomeScreen(), routes: [ + AppRoute('collection', (s) { + return CollectionScreen(fromId: s.queryParams['id'] ?? ''); + }), + ]), AppRoute(ScreenPaths.intro, (_) => IntroScreen()), AppRoute('/wonder/:type', (s) { int tab = int.tryParse(s.queryParams['t'] ?? '') ?? 0; diff --git a/lib/ui/common/controls/circle_buttons.dart b/lib/ui/common/controls/circle_buttons.dart index 99c7384c..b2583c84 100644 --- a/lib/ui/common/controls/circle_buttons.dart +++ b/lib/ui/common/controls/circle_buttons.dart @@ -120,6 +120,21 @@ class BackBtn extends StatelessWidget { @override Widget build(BuildContext context) { +<<<<<<< HEAD + return CircleIconBtn( + icon: icon, + bgColor: bgColor, + color: iconColor, + onPressed: onPressed ?? () { + final nav = Navigator.of(context); + if(nav.canPop()){ + Navigator.pop(context); + } else { + context.go(ScreenPaths.home); + } + }, + semanticLabel: semanticLabel ?? $strings.circleButtonsSemanticBack, +======= return FullscreenKeyboardListener( onKeyDown: (event) => _handleKeyDown(context, event), child: CircleIconBtn( @@ -129,6 +144,7 @@ class BackBtn extends StatelessWidget { onPressed: () => _handleOnPressed(context), semanticLabel: semanticLabel ?? $strings.circleButtonsSemanticBack, ), +>>>>>>> main ); } diff --git a/lib/ui/screens/artifact/artifact_details/artifact_details_screen.dart b/lib/ui/screens/artifact/artifact_details/artifact_details_screen.dart index f9ef8c04..fdde60d6 100644 --- a/lib/ui/screens/artifact/artifact_details/artifact_details_screen.dart +++ b/lib/ui/screens/artifact/artifact_details/artifact_details_screen.dart @@ -18,7 +18,7 @@ class ArtifactDetailsScreen extends StatefulWidget { } class _ArtifactDetailsScreenState extends State { - late final _future = metAPILogic.getArtifactByID(widget.artifactId, selfHosted: true); + late final _future = artifactLogic.getArtifactByID(widget.artifactId, selfHosted: true); @override Widget build(BuildContext context) { diff --git a/lib/ui/screens/home/_vertical_swipe_controller.dart b/lib/ui/screens/home/_vertical_swipe_controller.dart index 2585ad30..1c107905 100644 --- a/lib/ui/screens/home/_vertical_swipe_controller.dart +++ b/lib/ui/screens/home/_vertical_swipe_controller.dart @@ -1,13 +1,15 @@ part of 'wonders_home_screen.dart'; class _VerticalSwipeController { - _VerticalSwipeController(this.ticker, this.onSwipeComplete); + _VerticalSwipeController(this.ticker, this.onSwipeComplete){ + swipeReleaseAnim = AnimationController(vsync: ticker)..addListener(handleSwipeReleaseAnimTick); + } final TickerProvider ticker; final swipeAmt = ValueNotifier(0); final isPointerDown = ValueNotifier(false); - late final swipeReleaseAnim = AnimationController(vsync: ticker)..addListener(handleSwipeReleaseAnimTick); final double _pullToViewDetailsThreshold = 150; final VoidCallback onSwipeComplete; + late final AnimationController swipeReleaseAnim; /// When the _swipeReleaseAnim plays, sync its value to _swipeUpAmt void handleSwipeReleaseAnimTick() => swipeAmt.value = swipeReleaseAnim.value; diff --git a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index 20067ec2..858a4206 100644 --- a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -1,6 +1,6 @@ // This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=C:\_dev\sdks\flutter -FLUTTER_APPLICATION_PATH=C:\_dev\gskinner\flutter_wonders_app +FLUTTER_ROOT=/Users/shawn/Dev/flutter +FLUTTER_APPLICATION_PATH=/Users/shawn/Dev/gskinner/flutter-wonders-app COCOAPODS_PARALLEL_CODE_SIGN=true FLUTTER_BUILD_DIR=build FLUTTER_BUILD_NAME=2.0.19 diff --git a/macos/Flutter/ephemeral/flutter_export_environment.sh b/macos/Flutter/ephemeral/flutter_export_environment.sh index 9337257f..5468a0a4 100755 --- a/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -1,7 +1,7 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=C:\_dev\sdks\flutter" -export "FLUTTER_APPLICATION_PATH=C:\_dev\gskinner\flutter_wonders_app" +export "FLUTTER_ROOT=/Users/shawn/Dev/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/shawn/Dev/gskinner/flutter-wonders-app" export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_NAME=2.0.19" diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index 05780127..00000000 --- a/pubspec.lock +++ /dev/null @@ -1,994 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - archive: - dependency: transitive - description: - name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" - url: "https://pub.dev" - source: hosted - version: "3.4.10" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - build_config: - dependency: transitive - description: - name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" - source: hosted - version: "1.1.1" - characters: - dependency: transitive - description: - name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" - source: hosted - version: "1.3.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" - source: hosted - version: "1.1.1" - collection: - dependency: "direct main" - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" - source: hosted - version: "1.18.0" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" - csslib: - dependency: transitive - description: - name: csslib - sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d - url: "https://pub.dev" - source: hosted - version: "1.0.6" - dependency_validator: - dependency: "direct dev" - description: - name: dependency_validator - sha256: f727a5627aa405965fab4aef4f468e50a9b632ba0737fd2f98c932fec6d712b9 - url: "https://pub.dev" - source: hosted - version: "3.2.3" - desktop_window: - dependency: "direct main" - description: - name: desktop_window - sha256: "6256fb6feb7b5ec1311c76a3503f89202825bfe92c0458ec5fe7a728ffa216d5" - url: "https://pub.dev" - source: hosted - version: "0.4.0" - drop_cap_text: - dependency: "direct main" - description: - name: drop_cap_text - sha256: "9839d788ad6600c6c374fbc995a3cf784bbe9bf1823bcfa7dc49c4c50d918757" - url: "https://pub.dev" - source: hosted - version: "1.1.3" - equatable: - dependency: "direct main" - description: - name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.dev" - source: hosted - version: "2.0.5" - extra_alignments: - dependency: "direct main" - description: - name: extra_alignments - sha256: cc0425d08b3f1b3404439da939593aa3b7931c6f7f251030632e14337bf79e00 - url: "https://pub.dev" - source: hosted - version: "1.0.0+1" - ffi: - dependency: transitive - description: - name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - flextras: - dependency: "direct main" - description: - name: flextras - sha256: e73b5c86dd9419569d2a48db470059b41b496012513e4e1bdc56ba2c661048d9 - url: "https://pub.dev" - source: hosted - version: "1.0.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_animate: - dependency: "direct main" - description: - name: flutter_animate - sha256: "1f6fdee1f63eda3c35e04c07664593c31b7fdae290b6b0dc513d2fdfb2d27c76" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - flutter_circular_text: - dependency: "direct main" - description: - name: flutter_circular_text - sha256: "8b7a090198dc5f8651d97584e02fc121b51e92f4e3141c147a63243401609021" - url: "https://pub.dev" - source: hosted - version: "0.3.1" - flutter_displaymode: - dependency: "direct main" - description: - name: flutter_displaymode - sha256: "42c5e9abd13d28ed74f701b60529d7f8416947e58256e6659c5550db719c57ef" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 - url: "https://pub.dev" - source: hosted - version: "2.0.3" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_native_splash: - dependency: "direct main" - description: - name: flutter_native_splash - sha256: "9cdb5d9665dab5d098dc50feab74301c2c228cd02ca25c9b546ab572cebcd6af" - url: "https://pub.dev" - source: hosted - version: "2.3.9" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da - url: "https://pub.dev" - source: hosted - version: "2.0.17" - flutter_staggered_grid_view: - dependency: "direct main" - description: - name: flutter_staggered_grid_view - sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395" - url: "https://pub.dev" - source: hosted - version: "0.7.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c - url: "https://pub.dev" - source: hosted - version: "2.0.9" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - functional_listener: - dependency: transitive - description: - name: functional_listener - sha256: "026d1bd4f66367f11d9ec9f1f1ddb42b89e4484b356972c76d983266cf82f33f" - url: "https://pub.dev" - source: hosted - version: "2.3.1" - gap: - dependency: "direct main" - description: - name: gap - sha256: f19387d4e32f849394758b91377f9153a1b41d79513ef7668c088c77dbc6955d - url: "https://pub.dev" - source: hosted - version: "3.0.1" - get_it: - dependency: "direct main" - description: - name: get_it - sha256: d0b88dc35a7f97fd91fec0cf8f165abd97a57977968d8fc02ba0bc92e14ba07e - url: "https://pub.dev" - source: hosted - version: "7.6.6" - get_it_mixin: - dependency: "direct main" - description: - name: get_it_mixin - sha256: "0ab5c9f3cdaab813ec396de5d43ee3833c418424b3a99bec0071fcbf693c0bad" - url: "https://pub.dev" - source: hosted - version: "4.2.2" - glob: - dependency: transitive - description: - name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: bd7e671d26fd39c78cba82070fa34ef1f830b0e7ed1aeebccabc6561302a7ee5 - url: "https://pub.dev" - source: hosted - version: "6.5.9" - google_maps: - dependency: transitive - description: - name: google_maps - sha256: "555d5d736339b0478e821167ac521c810d7b51c3b2734e6802a9f046b64ea37a" - url: "https://pub.dev" - source: hosted - version: "6.3.0" - google_maps_flutter: - dependency: "direct main" - description: - name: google_maps_flutter - sha256: ae66fef3e71261d7df2eff29b2a119e190b2884325ecaa55321b1e17b5504066 - url: "https://pub.dev" - source: hosted - version: "2.5.3" - google_maps_flutter_android: - dependency: transitive - description: - name: google_maps_flutter_android - sha256: "714530f865f13bb3b9505c58821c3baed5d247a871724acf5d2ea5808fbed02c" - url: "https://pub.dev" - source: hosted - version: "2.6.2" - google_maps_flutter_ios: - dependency: transitive - description: - name: google_maps_flutter_ios - sha256: b644d205c235f85dc60e22f46172a868b1cd642afd5a52b3808c789e461b025a - url: "https://pub.dev" - source: hosted - version: "2.4.1" - google_maps_flutter_platform_interface: - dependency: transitive - description: - name: google_maps_flutter_platform_interface - sha256: "6060779f020638a8eedeb0fb14234818e5fa32ec45a4653d6428ab436e2bbc64" - url: "https://pub.dev" - source: hosted - version: "2.4.3" - google_maps_flutter_web: - dependency: "direct main" - description: - name: google_maps_flutter_web - sha256: "6245721c160d6f531c1ef568cf9bef8d660cd585a982aa75121269030163785a" - url: "https://pub.dev" - source: hosted - version: "0.5.4+3" - html: - dependency: transitive - description: - name: html - sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" - url: "https://pub.dev" - source: hosted - version: "0.15.4" - http: - dependency: "direct main" - description: - name: http - sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba - url: "https://pub.dev" - source: hosted - version: "1.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" - source: hosted - version: "4.0.2" - icons_launcher: - dependency: "direct dev" - description: - name: icons_launcher - sha256: "9b514ffed6ed69b232fd2bf34c44878c8526be71fc74129a658f35c04c9d4a9d" - url: "https://pub.dev" - source: hosted - version: "2.1.7" - image: - dependency: "direct main" - description: - name: image - sha256: "004a2e90ce080f8627b5a04aecb4cdfac87d2c3f3b520aa291260be5a32c033d" - url: "https://pub.dev" - source: hosted - version: "4.1.4" - image_fade: - dependency: "direct main" - description: - name: image_fade - sha256: "7296c9c53cd5de98e675ef1e27bdaa4035d6c3a45cf5b86094b2e545689b4ea6" - url: "https://pub.dev" - source: hosted - version: "0.6.2" - image_gallery_saver: - dependency: "direct main" - description: - name: image_gallery_saver - sha256: "0aba74216a4d9b0561510cb968015d56b701ba1bd94aace26aacdd8ae5761816" - url: "https://pub.dev" - source: hosted - version: "2.0.3" - internet_connection_checker: - dependency: "direct main" - description: - name: internet_connection_checker - sha256: "1c683e63e89c9ac66a40748b1b20889fd9804980da732bf2b58d6d5456c8e876" - url: "https://pub.dev" - source: hosted - version: "1.0.0+1" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" - url: "https://pub.dev" - source: hosted - version: "0.18.1" - io: - dependency: transitive - description: - name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - js_wrapping: - dependency: transitive - description: - name: js_wrapping - sha256: e385980f7c76a8c1c9a560dfb623b890975841542471eade630b2871d243851c - url: "https://pub.dev" - source: hosted - version: "0.7.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.dev" - source: hosted - version: "4.8.1" - lints: - dependency: transitive - description: - name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" - url: "https://pub.dev" - source: hosted - version: "0.8.0" - meta: - dependency: transitive - description: - name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 - url: "https://pub.dev" - source: hosted - version: "1.11.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - package_info_plus: - dependency: "direct main" - description: - name: package_info_plus - sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" - url: "https://pub.dev" - source: hosted - version: "5.0.1" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" - url: "https://pub.dev" - source: hosted - version: "2.0.1" - particle_field: - dependency: "direct main" - description: - name: particle_field - sha256: "9a5ebdde32751f82aba64198e9bbd46738e789e275bf9e7a88318ed460be560e" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - path: - dependency: transitive - description: - name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" - source: hosted - version: "1.9.0" - path_parsing: - dependency: transitive - description: - name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf - url: "https://pub.dev" - source: hosted - version: "1.0.1" - path_provider: - dependency: "direct main" - description: - name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" - source: hosted - version: "2.2.1" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" - source: hosted - version: "6.0.2" - platform: - dependency: transitive - description: - name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" - url: "https://pub.dev" - source: hosted - version: "3.1.4" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - pointer_interceptor: - dependency: "direct main" - description: - name: pointer_interceptor - sha256: adf7a637f97c077041d36801b43be08559fd4322d2127b3f20bb7be1b9eebc22 - url: "https://pub.dev" - source: hosted - version: "0.9.3+7" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" - url: "https://pub.dev" - source: hosted - version: "3.7.4" - provider: - dependency: "direct main" - description: - name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" - url: "https://pub.dev" - source: hosted - version: "6.1.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 - url: "https://pub.dev" - source: hosted - version: "1.2.3" - rnd: - dependency: "direct main" - description: - name: rnd - sha256: "87799a8c447da2e728096264b2cc13679a11af49f0504331f4d588986a371fcf" - url: "https://pub.dev" - source: hosted - version: "0.2.0" - sanitize_html: - dependency: transitive - description: - name: sanitize_html - sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" - url: "https://pub.dev" - source: hosted - version: "2.3.5" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - sized_context: - dependency: "direct main" - description: - name: sized_context - sha256: "9921e6c09e018132c3e1c6a18e14febbc1cc5c87a200d64ff7578cb49991f6e7" - url: "https://pub.dev" - source: hosted - version: "1.0.0+4" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - smooth_page_indicator: - dependency: "direct main" - description: - name: smooth_page_indicator - sha256: "725bc638d5e79df0c84658e1291449996943f93bacbc2cec49963dbbab48d8ae" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.dev" - source: hosted - version: "1.3.2" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - universal_platform: - dependency: transitive - description: - name: universal_platform - sha256: d315be0f6641898b280ffa34e2ddb14f3d12b1a37882557869646e0cc363d0cc - url: "https://pub.dev" - source: hosted - version: "1.0.0+1" - unsplash_client: - dependency: "direct main" - description: - name: unsplash_client - sha256: "9827f4c1036b7a6ac8cb3f404ac179df7441eee69371d9b17f181817fe502fd7" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - sha256: d25bb0ca00432a5e1ee40e69c36c85863addf7cc45e433769d61bed3fe81fd96 - url: "https://pub.dev" - source: hosted - version: "6.2.3" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" - url: "https://pub.dev" - source: hosted - version: "6.2.2" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" - url: "https://pub.dev" - source: hosted - version: "6.2.4" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 - url: "https://pub.dev" - source: hosted - version: "3.1.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 - url: "https://pub.dev" - source: hosted - version: "3.1.0" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f - url: "https://pub.dev" - source: hosted - version: "2.3.1" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b - url: "https://pub.dev" - source: hosted - version: "2.2.3" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 - url: "https://pub.dev" - source: hosted - version: "3.1.1" - vector_graphics: - dependency: transitive - description: - name: vector_graphics - sha256: "18f6690295af52d081f6808f2f7c69f0eed6d7e23a71539d75f4aeb8f0062172" - url: "https://pub.dev" - source: hosted - version: "1.1.9+2" - vector_graphics_codec: - dependency: transitive - description: - name: vector_graphics_codec - sha256: "531d20465c10dfac7f5cd90b60bbe4dd9921f1ec4ca54c83ebb176dbacb7bb2d" - url: "https://pub.dev" - source: hosted - version: "1.1.9+2" - vector_graphics_compiler: - dependency: transitive - description: - name: vector_graphics_compiler - sha256: "03012b0a33775c5530576b70240308080e1d5050f0faf000118c20e6463bc0ad" - url: "https://pub.dev" - source: hosted - version: "1.1.9+2" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - web: - dependency: transitive - description: - name: web - sha256: "4188706108906f002b3a293509234588823c8c979dc83304e229ff400c996b05" - url: "https://pub.dev" - source: hosted - version: "0.4.2" - webview_flutter: - dependency: "direct main" - description: - name: webview_flutter - sha256: "71e1bfaef41016c8d5954291df5e9f8c6172f1f6ff3af01b5656456ddb11f94c" - url: "https://pub.dev" - source: hosted - version: "4.4.4" - webview_flutter_android: - dependency: transitive - description: - name: webview_flutter_android - sha256: "161af93c2abaf94ef2192bffb53a3658b2d721a3bf99b69aa1e47814ee18cc96" - url: "https://pub.dev" - source: hosted - version: "3.13.2" - webview_flutter_platform_interface: - dependency: transitive - description: - name: webview_flutter_platform_interface - sha256: "80b40ae4fb959957eef9fa8970b6c9accda9f49fc45c2b75154696a8e8996cfe" - url: "https://pub.dev" - source: hosted - version: "2.9.1" - webview_flutter_wkwebview: - dependency: transitive - description: - name: webview_flutter_wkwebview - sha256: e732400c99a86978a8b9a95b485bacb1c94700bcfa17b27c20a8458457d2f47e - url: "https://pub.dev" - source: hosted - version: "3.10.3" - win32: - dependency: transitive - description: - name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" - url: "https://pub.dev" - source: hosted - version: "5.2.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d - url: "https://pub.dev" - source: hosted - version: "1.0.4" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" - youtube_player_iframe: - dependency: "direct main" - description: - name: youtube_player_iframe - sha256: d7aec9083430db4e5da83a3b5d7b7fcbb93cfa027d9f680ce3c7e7cd20724305 - url: "https://pub.dev" - source: hosted - version: "4.0.4" - youtube_player_iframe_web: - dependency: transitive - description: - name: youtube_player_iframe_web - sha256: c7020816031600349b56d2729d4e8be011fcb723ff7dc2dd0cdf72096a0e5ff4 - url: "https://pub.dev" - source: hosted - version: "2.0.2" -sdks: - dart: ">=3.3.0-279.1.beta <4.0.0" - flutter: ">=3.16.6" diff --git a/pubspec.yaml b/pubspec.yaml index e1292763..3054a346 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: wonders description: Explore the famous wonders of the world. publish_to: "none" -version: 2.0.19+8 +version: 2.1.1 environment: sdk: ">=2.17.0 <3.0.0" @@ -32,6 +32,7 @@ dependencies: google_maps_flutter: ^2.5.3 google_maps_flutter_web: ^0.5.4+3 go_router: ^6.5.5 + home_widget: ^0.3.0 http: ^1.1.0 image: ^4.1.3 image_fade: ^0.6.2 @@ -94,6 +95,7 @@ flutter: - assets/images/pyramids/ - assets/images/taj_mahal/ - assets/images/collectibles/ + - assets/images/widget/ fonts: - family: Cinzel