From 6a0eb051e69ffbbe32b2615f0023c15402a4ada8 Mon Sep 17 00:00:00 2001 From: Shawn Date: Wed, 11 Oct 2023 13:40:26 -0600 Subject: [PATCH 01/24] Add placeholder widget --- ios/Podfile.lock | 22 +- ios/Runner.xcodeproj/project.pbxproj | 232 +++++++++++++++++- .../Wonderous_Widget.intentdefinition | 59 +++++ ios/Wonderous Widget/Wonderous_Widget.swift | 20 +- .../Wonderous_WidgetBundle.swift | 2 +- pubspec.lock | 8 + pubspec.yaml | 1 + 7 files changed, 325 insertions(+), 19 deletions(-) create mode 100644 ios/Wonderous Widget/Wonderous_Widget.intentdefinition diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d16b2f4a..3fc2c971 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 + home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57 + image_gallery_saver: cb43cc43141711190510e92c460eb1655cd343cb package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e - path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 - shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca - url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de - webview_flutter_wkwebview: b7e70ef1ddded7e69c796c7390ee74180182971f + 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..f47fa968 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 297F6FC72AD06E0D00FF159E /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 297F6FC62AD06E0D00FF159E /* WidgetKit.framework */; }; + 297F6FC92AD06E0D00FF159E /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 297F6FC82AD06E0D00FF159E /* SwiftUI.framework */; }; + 297F6FCC2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCB2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift */; }; + 297F6FCE2AD06E0D00FF159E /* Wonderous_Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCD2AD06E0D00FF159E /* Wonderous_Widget.swift */; }; + 297F6FD12AD06E0F00FF159E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 297F6FD02AD06E0F00FF159E /* Assets.xcassets */; }; + 297F6FD32AD06E0F00FF159E /* Wonderous_Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */; }; + 297F6FD42AD06E0F00FF159E /* Wonderous_Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */; }; + 297F6FD72AD06E0F00FF159E /* Wonderous WidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 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 +25,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 297F6FD52AD06E0F00FF159E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 297F6FC42AD06E0D00FF159E; + remoteInfo = "Wonderous WidgetExtension"; + }; E214FC8827C5A18E005F78FB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 97C146E61CF9000F007C117D /* Project object */; @@ -27,6 +42,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 +69,14 @@ 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 = ""; }; + 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Wonderous WidgetExtension.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 /* Wonderous_WidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wonderous_WidgetBundle.swift; sourceTree = ""; }; + 297F6FCD2AD06E0D00FF159E /* Wonderous_Widget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wonderous_Widget.swift; sourceTree = ""; }; + 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = Wonderous_Widget.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 = ""; }; 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 +96,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 +123,24 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297F6FCA2AD06E0D00FF159E /* Wonderous Widget */ = { + isa = PBXGroup; + children = ( + 297F6FCB2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift */, + 297F6FCD2AD06E0D00FF159E /* Wonderous_Widget.swift */, + 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */, + 297F6FD02AD06E0F00FF159E /* Assets.xcassets */, + 297F6FD22AD06E0F00FF159E /* Info.plist */, + ); + path = "Wonderous Widget"; + sourceTree = ""; + }; 5073AC1D92C10773F20D12A2 /* Frameworks */ = { isa = PBXGroup; children = ( 4A44ACC5DE81A9C3E5BDA151 /* Pods_Runner.framework */, + 297F6FC62AD06E0D00FF159E /* WidgetKit.framework */, + 297F6FC82AD06E0D00FF159E /* SwiftUI.framework */, ); name = Frameworks; sourceTree = ""; @@ -104,6 +161,7 @@ children = ( 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, + 297F6FCA2AD06E0D00FF159E /* Wonderous Widget */, 97C146EF1CF9000F007C117D /* Products */, 5073AC1D92C10773F20D12A2 /* Frameworks */, E090BB04291350D10AF9DE4E /* Pods */, @@ -115,6 +173,7 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, E214FC8227C5A18D005F78FB /* wondersUITests.xctest */, + 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */, ); name = Products; sourceTree = ""; @@ -148,6 +207,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 297F6FC42AD06E0D00FF159E /* Wonderous WidgetExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "Wonderous WidgetExtension" */; + buildPhases = ( + 297F6FC12AD06E0D00FF159E /* Sources */, + 297F6FC22AD06E0D00FF159E /* Frameworks */, + 297F6FC32AD06E0D00FF159E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Wonderous WidgetExtension"; + productName = "Wonderous WidgetExtension"; + productReference = 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; 97C146ED1CF9000F007C117D /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; @@ -161,10 +237,12 @@ 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 9DAF500633B345EE15CA82E0 /* [CP] Embed Pods Frameworks */, B727DC94BF66FDBF036EDFA6 /* [CP] Copy Pods Resources */, + 297F6FD82AD06E0F00FF159E /* Embed Foundation Extensions */, ); buildRules = ( ); dependencies = ( + 297F6FD62AD06E0F00FF159E /* PBXTargetDependency */, ); name = Runner; productName = Runner; @@ -198,10 +276,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 +308,20 @@ targets = ( 97C146ED1CF9000F007C117D /* Runner */, E214FC8127C5A18D005F78FB /* wondersUITests */, + 297F6FC42AD06E0D00FF159E /* Wonderous WidgetExtension */, ); }; /* 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 +433,21 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 297F6FC12AD06E0D00FF159E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 297F6FD32AD06E0F00FF159E /* Wonderous_Widget.intentdefinition in Sources */, + 297F6FCE2AD06E0D00FF159E /* Wonderous_Widget.swift in Sources */, + 297F6FCC2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EA1CF9000F007C117D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 297F6FD42AD06E0F00FF159E /* Wonderous_Widget.intentdefinition in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); @@ -362,6 +463,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 297F6FD62AD06E0F00FF159E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 297F6FC42AD06E0D00FF159E /* Wonderous WidgetExtension */; + targetProxy = 297F6FD52AD06E0F00FF159E /* PBXContainerItemProxy */; + }; E214FC8927C5A18E005F78FB /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 97C146ED1CF9000F007C117D /* Runner */; @@ -445,6 +551,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 +576,117 @@ }; 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_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_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_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 = 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_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 +802,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 +832,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 +941,16 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "Wonderous WidgetExtension" */ = { + 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/Wonderous Widget/Wonderous_Widget.intentdefinition b/ios/Wonderous Widget/Wonderous_Widget.intentdefinition new file mode 100644 index 00000000..bdb40455 --- /dev/null +++ b/ios/Wonderous Widget/Wonderous_Widget.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/Wonderous Widget/Wonderous_Widget.swift b/ios/Wonderous Widget/Wonderous_Widget.swift index a24f98f5..0c71aad5 100644 --- a/ios/Wonderous Widget/Wonderous_Widget.swift +++ b/ios/Wonderous Widget/Wonderous_Widget.swift @@ -2,30 +2,31 @@ // Wonderous_Widget.swift // Wonderous Widget // -// Created by Shawn on 2023-06-08. +// Created by Shawn on 2023-10-06. // import WidgetKit import SwiftUI +import Intents -struct Provider: TimelineProvider { +struct Provider: IntentTimelineProvider { func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(date: Date()) + SimpleEntry(date: Date(), configuration: ConfigurationIntent()) } - func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry = SimpleEntry(date: Date()) + func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { + let entry = SimpleEntry(date: Date(), configuration: configuration) completion(entry) } - func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + func getTimeline(for configuration: ConfigurationIntent, 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) + let entry = SimpleEntry(date: entryDate, configuration: configuration) entries.append(entry) } @@ -36,6 +37,7 @@ struct Provider: TimelineProvider { struct SimpleEntry: TimelineEntry { let date: Date + let configuration: ConfigurationIntent } struct Wonderous_WidgetEntryView : View { @@ -50,7 +52,7 @@ struct Wonderous_Widget: Widget { let kind: String = "Wonderous_Widget" var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { entry in + IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in Wonderous_WidgetEntryView(entry: entry) } .configurationDisplayName("My Widget") @@ -60,7 +62,7 @@ struct Wonderous_Widget: Widget { struct Wonderous_Widget_Previews: PreviewProvider { static var previews: some View { - Wonderous_WidgetEntryView(entry: SimpleEntry(date: Date())) + Wonderous_WidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } diff --git a/ios/Wonderous Widget/Wonderous_WidgetBundle.swift b/ios/Wonderous Widget/Wonderous_WidgetBundle.swift index 19af92f9..0e519485 100644 --- a/ios/Wonderous Widget/Wonderous_WidgetBundle.swift +++ b/ios/Wonderous Widget/Wonderous_WidgetBundle.swift @@ -2,7 +2,7 @@ // Wonderous_WidgetBundle.swift // Wonderous Widget // -// Created by Shawn on 2023-06-08. +// Created by Shawn on 2023-10-06. // import WidgetKit diff --git a/pubspec.lock b/pubspec.lock index 936dc540..1cee8742 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -344,6 +344,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.4+2" + home_widget: + dependency: "direct main" + description: + name: home_widget + sha256: "9a0ed6094823b07025727a39d3dc2d3e02c5281372af22d72e611137e0b3c10d" + url: "https://pub.dev" + source: hosted + version: "0.3.0" html: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index acde04f1..74896ace 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,6 +31,7 @@ dependencies: google_maps_flutter: ^2.5.0 google_maps_flutter_web: ^0.5.4+2 go_router: ^6.5.5 + home_widget: ^0.3.0 http: ^0.13.5 image: ^4.1.3 image_fade: ^0.6.2 From 2185a02c4660fac2e54efc1e4603af8d882d93b7 Mon Sep 17 00:00:00 2001 From: Shawn Date: Fri, 13 Oct 2023 11:55:51 -0600 Subject: [PATCH 02/24] Add placeholder bg image widget --- assets/images/widget/background-empty.jpg | Bin 0 -> 222086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/widget/background-empty.jpg diff --git a/assets/images/widget/background-empty.jpg b/assets/images/widget/background-empty.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fc3b679aec940274efaf349c859c906b0be52cb GIT binary patch literal 222086 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�*x`6}pHpOvO#=&oTnv`qM&pJMEeFJE9@B>aBclYs z@W$DL7Y}*3dq+&md2(il2{{D1pnL3pyg41BJMp!S&C)p z6fmMg#r3K|oA+3W^%@b17&4hA%NfO2z>8BD77Y7+9v)5)=SJPmB1IwAe?T0ZnmP5b z25D6<@{h8qXtzoA+uws?v1l`sbNnyP87w~@V@UOyHn;& z*hrW=CNw`lE!U+NZ8-|Fvm&m#PKh@C!cZ=^&9eqxGCFR&Y4@zaS)10lVny}+)A_No z-N)-B;Al{`8+xlOg5jsdw4u2!)?Tyn{kUP&WS|9M-CB%yG&cv8JQ(%|9p|ZV&D6=r zvm>9;bWW)H=vnhEpe7DP!u#ngi~f|WUGz2d%W7Pb0&g2&`ge;)@(pZLHU06f_ijUU z9+$hvNNgcA$<{)|8g0aXTtsu%FtG!(Ffgvtqe-c25>y)KRyH%>RDSo=(VFl_9r(bS z9{xj4h&{=zajNU%B)b>2tq8YSQzr$q6iUytSvOdxSgisgQv#iO0Z+xgew{D*+)Y>4 zGCAsTB^*?jD_XB1ChwKd37Ybz<`Pk@BpxEVJ=|%2wjtCfzq7E%IrLen?R~+quH<4j zyc8&ZGZ3fkGu?G3ZG8EN>{(FGK!=a1w^FxuM7*`JKaPdXabNFV7Vd)6#bYA1Z;&m3 zr7V;jXRln{7}VGXy!T=E>6tsy z-4RGUOlkE;l`6hw#(PbqrK&-(lp*kfN!uqe_F1~GO~5fUx>x9^#CJyw9!dK%?{&%J zynX}>h4z{y{!keZ4bq)rGWIxClAj~*?$cJ)y8+8A?YzGPm?8jXZKi;L2D6<2Cx72y z(oV-C9euVDxeO+ZRs;O0T@Cc)C>@rVra{JhX}ZJD9j$ZJHU7P z4Y-fW>R#Fg%$*(Yvh^{JGceP&q

sIZc{|@ONFeU}u~Jp$Bu&$4!PN129_{BoVa< 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

-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

?r`5YF5D{w|ch-qHq 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 aJHvn@I~j0C*5$%0XM-kUiG8Quz5G8@H=beu literal 0 HcmV?d00001 From 505b0a205408860342c17684b8c08e4e14df57a0 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 19 Oct 2023 11:28:54 -0600 Subject: [PATCH 03/24] Add wonderous icon --- assets/images/widget/wonderous-icon.png | Bin 0 -> 1783 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/widget/wonderous-icon.png diff --git a/assets/images/widget/wonderous-icon.png b/assets/images/widget/wonderous-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..41d92298fa9929babffcdebc707a12d2811bfb1c GIT binary patch literal 1783 zcmV@~0drDELIAGL9O(c600d`2O+f$vv5yPBWK~#7F?VbNs z<2VqGjW@>e4@uT9 z@AK!qc}eV8R=yc&Bt=qAAOjF_K@TgkPh?9nB?h&}ijwSI>{VWWodd?DLmI(B52Ff~ND0`sB3 zDF}(WsO~Udc4P`X;5CS#4i0OwD{!NPLu6%pm&ZDM4<)t~TYww46l~Uz10>!O?Taf1 zlP%e$i0^uDg}SGky`0_?)CZY5z@lmknm4P~5E4W2xX0lf7(#*O-nfPkaKZ*R zcWuT*19g2IS40ExI8aQc?}@rd58)>|qi*N*QDEx!lmqg)_5)6#U<|11jUwnx5`wzx z*~bfv0f*aClOHm|;o^J)F3^SN0|^HU7^ppeDIQW;u*i!qE1V6Wbf{awJFZDM_HU7!bV;50I2MNdKsMuPea@;SU; zpa&tbzuGeMLhSdxEsOy5x4gq}Y;k1i7|7qsB!QwQ0R@hr+qj_%#mId2HEni77x%fa zv-ja}qt!PBjuUa$llH3b!oJS70tYa@cooHnJokCwrt6|b&qYq&hr>OY&=lxcCt|l3 z?)m&5E!XsQp6|g87G6O*6q#F30^n=Madx!T(NXL!z6CgdW+NW4Sb-&|OJrBovuX3d zu9p2X*xy`%`!^o~>ncblEWLJ|UVab|b+<@$y!jsN@i}qG2V57sG_)T(j<1>?sGyr~ zU{8)C(_g@zr>+xC0lR(xvYvY<^^Jo3;HJqZn+xc(m!M}!9MKf8tNts&o}4G~xD3;` z)`Lv}yV^?6U{B72tic3S&`t>!;9&-8uDIl_Y&&S`fwpsxb06YgpncEed)vWZ0uChj z9ezLl0y_qSNS}avutP!qD6qpQ3eQ+F3pkQlz>&-Xj${^aB(s1cnFSolR0OQnj%3H5 zkUu5ag*@kJW?4-e&fNpK_5Yd2<77$>AV&d9vRi}qT|fqrIX3}I&_QEx09We9&tN~;>y_LDyr>6_ zA>_UPKtgg7@R|g%uGi=q{?U64iO5C3)`)A01e~vsfE)yT?2EV-TtkA$oLayVJk?&QW) z7s<;bcqF8N&pC-#g9BL!o(Lr%uWIrZana+BAQH&D4a5fdU6?ZYKlp_g$RMTr1|IMk z(55moK|!XoUZ)};FN{%;Ayb&z!6?X-S-_D@r3fz|vq?o2Q}IAvxYH?MwZqWEjq4K^l+L&JSH0frR}(BX*5^M#*UU}$$QV}+9yavZgn7!m~0y&)$Wk2G%~@w5&myCA~dEE0%?*~uOb^+kc) zrCWnu%>6l4z1Irr&2hT0S|aZ$Kh<_A^({yCm}sM0?AXO98xNFvuUe?hUdONB;bR@h z&r7mP)Ej)i$$MT?d1EvIMWCuZSM_b{W(vRex+Q&n;F0g@FErTR|HZ zb7x#PN6z2TCTh)-&5SBY1nPZN_l*o!&#xg7*w|yWd7@7ANLS0twTQ*uxT)po3ialY z`~g;w2&`>TSwC18Fxi$(c-SIT$?N*=Z>P1qzF^uCa?>SXvfbA3@DDVL+OhMtQh|q! zY!xJe?tKr93_U<1V zxPMd##8ig#tHyD5%q!MMG8F+!m<1d~3A2Es;N9c$89c2qm7g`a4z%4tZl)q-Z(}Af ZKLGg4K>Rf(-s%7V002ovPDHLkV1h7BNkISr literal 0 HcmV?d00001 From 0cff2e5ecc5e448f0479a0960b5a840171096bc9 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 19 Oct 2023 11:29:48 -0600 Subject: [PATCH 04/24] Add home widget to xcode project (WIP) --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 45 +++++++---- ios/Runner/Runner.entitlements | 4 + .../AccentColor.colorset/Contents.json | 9 +++ .../GreyMediumColor.colorset/Contents.json | 20 +++++ ios/Wonderous Widget/FlutterUtils.swift | 20 +++++ .../WonderWidgetViewComponents.swift | 64 ++++++++++++++++ ...ition => WonderousWidget.intentdefinition} | 0 ios/Wonderous Widget/WonderousWidget.swift | 76 +++++++++++++++++++ ...ndle.swift => WonderousWidgetBundle.swift} | 6 +- .../WonderousWidgetView.swift | 66 ++++++++++++++++ ios/Wonderous Widget/Wonderous_Widget.swift | 68 ----------------- ios/Wonderous WidgetExtension.entitlements | 10 +++ pubspec.yaml | 1 + 14 files changed, 306 insertions(+), 87 deletions(-) create mode 100644 ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json create mode 100644 ios/Wonderous Widget/FlutterUtils.swift create mode 100644 ios/Wonderous Widget/WonderWidgetViewComponents.swift rename ios/Wonderous Widget/{Wonderous_Widget.intentdefinition => WonderousWidget.intentdefinition} (100%) create mode 100644 ios/Wonderous Widget/WonderousWidget.swift rename ios/Wonderous Widget/{Wonderous_WidgetBundle.swift => WonderousWidgetBundle.swift} (57%) create mode 100644 ios/Wonderous Widget/WonderousWidgetView.swift delete mode 100644 ios/Wonderous Widget/Wonderous_Widget.swift create mode 100644 ios/Wonderous WidgetExtension.entitlements diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 3fc2c971..7662fb4a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -77,9 +77,9 @@ SPEC CHECKSUMS: GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4 home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57 image_gallery_saver: cb43cc43141711190510e92c460eb1655cd343cb - package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 + share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f47fa968..7454c11b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,15 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 297F6FC72AD06E0D00FF159E /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 297F6FC62AD06E0D00FF159E /* WidgetKit.framework */; }; 297F6FC92AD06E0D00FF159E /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 297F6FC82AD06E0D00FF159E /* SwiftUI.framework */; }; - 297F6FCC2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCB2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift */; }; - 297F6FCE2AD06E0D00FF159E /* Wonderous_Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCD2AD06E0D00FF159E /* Wonderous_Widget.swift */; }; + 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 /* Wonderous_Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */; }; - 297F6FD42AD06E0F00FF159E /* Wonderous_Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */; }; + 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 */; }; + 297FD5782AE19C25008D8BFE /* FlutterUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297FD5772AE19C25008D8BFE /* FlutterUtils.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 */; }; @@ -72,11 +75,15 @@ 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Wonderous WidgetExtension.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 /* Wonderous_WidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wonderous_WidgetBundle.swift; sourceTree = ""; }; - 297F6FCD2AD06E0D00FF159E /* Wonderous_Widget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wonderous_Widget.swift; sourceTree = ""; }; - 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = Wonderous_Widget.intentdefinition; sourceTree = ""; }; + 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 /* Wonderous WidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Wonderous WidgetExtension.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 = ""; }; + 297FD5772AE19C25008D8BFE /* FlutterUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlutterUtils.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 = ""; }; @@ -126,11 +133,14 @@ 297F6FCA2AD06E0D00FF159E /* Wonderous Widget */ = { isa = PBXGroup; children = ( - 297F6FCB2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift */, - 297F6FCD2AD06E0D00FF159E /* Wonderous_Widget.swift */, - 297F6FCF2AD06E0D00FF159E /* Wonderous_Widget.intentdefinition */, + 297F6FCB2AD06E0D00FF159E /* WonderousWidgetBundle.swift */, + 297F6FCD2AD06E0D00FF159E /* WonderousWidget.swift */, + 297F6FCF2AD06E0D00FF159E /* WonderousWidget.intentdefinition */, 297F6FD02AD06E0F00FF159E /* Assets.xcassets */, 297F6FD22AD06E0F00FF159E /* Info.plist */, + 297FD5732AE18011008D8BFE /* WonderousWidgetView.swift */, + 297FD5752AE19BD9008D8BFE /* WonderWidgetViewComponents.swift */, + 297FD5772AE19C25008D8BFE /* FlutterUtils.swift */, ); path = "Wonderous Widget"; sourceTree = ""; @@ -159,6 +169,7 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( + 297FD56C2ADF0DAB008D8BFE /* Wonderous WidgetExtension.entitlements */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 297F6FCA2AD06E0D00FF159E /* Wonderous Widget */, @@ -437,9 +448,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 297F6FD32AD06E0F00FF159E /* Wonderous_Widget.intentdefinition in Sources */, - 297F6FCE2AD06E0D00FF159E /* Wonderous_Widget.swift in Sources */, - 297F6FCC2AD06E0D00FF159E /* Wonderous_WidgetBundle.swift in Sources */, + 297FD5762AE19BD9008D8BFE /* WonderWidgetViewComponents.swift in Sources */, + 297F6FD32AD06E0F00FF159E /* WonderousWidget.intentdefinition in Sources */, + 297FD5742AE18011008D8BFE /* WonderousWidgetView.swift in Sources */, + 297F6FCE2AD06E0D00FF159E /* WonderousWidget.swift in Sources */, + 297FD5782AE19C25008D8BFE /* FlutterUtils.swift in Sources */, + 297F6FCC2AD06E0D00FF159E /* WonderousWidgetBundle.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -447,7 +461,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 297F6FD42AD06E0F00FF159E /* Wonderous_Widget.intentdefinition in Sources */, + 297F6FD42AD06E0F00FF159E /* WonderousWidget.intentdefinition in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); @@ -586,6 +600,7 @@ 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; @@ -625,6 +640,7 @@ 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; @@ -661,6 +677,7 @@ 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; 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/AccentColor.colorset/Contents.json b/ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json index eb878970..2bc2d6bf 100644 --- a/ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json @@ -1,6 +1,15 @@ { "colors" : [ { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.360", + "green" : "0.580", + "red" : "0.890" + } + }, "idiom" : "universal" } ], diff --git a/ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json b/ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json new file mode 100644 index 00000000..574414aa --- /dev/null +++ b/ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.580", + "green" : "0.600", + "red" : "0.620" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Wonderous Widget/FlutterUtils.swift b/ios/Wonderous Widget/FlutterUtils.swift new file mode 100644 index 00000000..ab2011d2 --- /dev/null +++ b/ios/Wonderous Widget/FlutterUtils.swift @@ -0,0 +1,20 @@ +// +// FlutterUtils.swift +// Wonderous WidgetExtension +// +// Created by Shawn on 2023-10-19. +// + +import Foundation + + +var bundle: 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/Wonderous Widget/WonderWidgetViewComponents.swift b/ios/Wonderous Widget/WonderWidgetViewComponents.swift new file mode 100644 index 00000000..6b71368d --- /dev/null +++ b/ios/Wonderous Widget/WonderWidgetViewComponents.swift @@ -0,0 +1,64 @@ +// +// File.swift +// Wonderous WidgetExtension +// +// Created by Shawn on 2023-10-19. +// + +import Foundation +import SwiftUI + + +// TODO: Add support for showing the last-found artifact from the app +// Load an image from the flutter assets bundle +struct BgImage : View { + var entry: WonderousEntry + var body: some View { + let image = bundle.appending(path: "/assets/images/widget/background-empty.jpg").path(); + print(image) + if let uiImage = UIImage(contentsOfFile: image) { + let image = Image(uiImage: uiImage) + .resizable() + .aspectRatio(contentMode: .fill) // Fill the entire view + // .edgesIgnoringSafeArea(.all) // Ignore the safe area + return AnyView(image) + } + print("The image file could not be loaded") + return AnyView(EmptyView()) + } + +} + +// Display a previously loaded remote image +struct NetImage : View { + var imageData: Data? + var body: some View { + if imageData != nil, let uiImage = UIImage(data: imageData!) { + return Image(uiImage: uiImage) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 80, height: 26.0) + } else { + return Image("EmptyChart") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 80, height: 26.0) + } + } +} + +struct GaugeProgressStyle: ProgressViewStyle { + + func makeBody(configuration: Configuration) -> some View { + let fractionCompleted = configuration.fractionCompleted ?? 0 + + return ZStack { + Circle() + .stroke(.gray, style: StrokeStyle(lineWidth: 2)) + Circle() + .trim(from: 0, to: fractionCompleted) + .stroke(.red, style: StrokeStyle(lineWidth: 4, lineCap: .round)) + .rotationEffect(.degrees(90)) + } + } +} diff --git a/ios/Wonderous Widget/Wonderous_Widget.intentdefinition b/ios/Wonderous Widget/WonderousWidget.intentdefinition similarity index 100% rename from ios/Wonderous Widget/Wonderous_Widget.intentdefinition rename to ios/Wonderous Widget/WonderousWidget.intentdefinition diff --git a/ios/Wonderous Widget/WonderousWidget.swift b/ios/Wonderous Widget/WonderousWidget.swift new file mode 100644 index 00000000..843e14ca --- /dev/null +++ b/ios/Wonderous Widget/WonderousWidget.swift @@ -0,0 +1,76 @@ +// +// CounterWidget.swift +// CounterWidget +// +// Created by Shawn on 2023-09-11. +// + +import WidgetKit +import SwiftUI +import Intents + +var netImgData: Data? = nil + + +// Widget, defines the display name and description, and also wraps the View +struct WonderousWidget: Widget { + let kind: String = "WonderousWidget" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: Provider()) { entry in + WonderousWidgetView(entry: entry) + } + .configurationDisplayName("Wonderous Widget") + .description("Track your collected artifacts!") + .supportedFamilies([.systemSmall, .systemMedium, .systemLarge]) + } +} + +// Provider,returns various WonderousEntry configs based on current context +struct Provider: TimelineProvider { + // Provide an entry for a placeholder version of the widget + func placeholder(in context: Context) -> WonderousEntry { + WonderousEntry(date: Date(), count: 0, displaySize: context.displaySize, imageData: netImgData) + } + + // Provide an entry for the current time and state of the widget + func getSnapshot(in context: Context, completion: @escaping (WonderousEntry) -> ()) { + let entry:WonderousEntry + if(context.isPreview){ + // entry = placeholder(in: context) + entry = WonderousEntry(date: Date(), count: 0, displaySize: context.displaySize, imageData: netImgData) + } else { + let userDefaults = UserDefaults(suiteName: "group.com.gskinner.homewidget") + let count = userDefaults?.integer(forKey: "counter") ?? 0; + entry = WonderousEntry(date: Date(), count: count, displaySize: context.displaySize, imageData: netImgData) + } + completion(entry); + } + + // Provide an array of entries for the current time and, optionally, any future times + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + // Load a remote image so it can be shown later + netImgData = try? Data( + contentsOf: URL(string: "https://www.wonderous.info/unsplash/-e0u9SAFeP4-32.jpg")! + ) + + getSnapshot(in: context) { (entry) in + let timeline = Timeline(entries: [entry], policy: .atEnd) + completion(timeline) + } + } +} + + +/// Entry, is passed into the view and defines the data it needs +struct WonderousEntry : TimelineEntry { + let date: Date + let count:Int; + let displaySize: CGSize + let imageData: Data? +} + + + + + diff --git a/ios/Wonderous Widget/Wonderous_WidgetBundle.swift b/ios/Wonderous Widget/WonderousWidgetBundle.swift similarity index 57% rename from ios/Wonderous Widget/Wonderous_WidgetBundle.swift rename to ios/Wonderous Widget/WonderousWidgetBundle.swift index 0e519485..09a92c69 100644 --- a/ios/Wonderous Widget/Wonderous_WidgetBundle.swift +++ b/ios/Wonderous Widget/WonderousWidgetBundle.swift @@ -1,5 +1,5 @@ // -// Wonderous_WidgetBundle.swift +// WonderousWidgetBundle.swift // Wonderous Widget // // Created by Shawn on 2023-10-06. @@ -9,8 +9,8 @@ import WidgetKit import SwiftUI @main -struct Wonderous_WidgetBundle: WidgetBundle { +struct WonderousWidgetBundle: WidgetBundle { var body: some Widget { - Wonderous_Widget() + WonderousWidget() } } diff --git a/ios/Wonderous Widget/WonderousWidgetView.swift b/ios/Wonderous Widget/WonderousWidgetView.swift new file mode 100644 index 00000000..1413320d --- /dev/null +++ b/ios/Wonderous Widget/WonderousWidgetView.swift @@ -0,0 +1,66 @@ +import WidgetKit +import SwiftUI +import Intents + +// Defines the view / layout of the widget +struct WonderousWidgetView : View { + @Environment(\.widgetFamily) var family: WidgetFamily + var entry: Provider.Entry + var body: some View { + let showTitle = family == .systemLarge + let showIcon = family != .systemSmall + let showTitleAndDesc = family != .systemSmall + let textColor:Color = .pink + let progress = 7.0 / 32.0; + let content = VStack{ + HStack { + if(showTitle) { + Text("Collection").foregroundColor(textColor) + } + Spacer(); + if(showIcon) { + Text("1").foregroundColor(textColor) + } + } + Spacer(); + HStack { + if(showTitleAndDesc) { + VStack(alignment: .leading){ + Text("Wonderous") + .font(.system(size: 22)) + .foregroundColor(textColor); + Text("Search for hidden artifacts") + .font(.system(size: 15)) + .foregroundColor(Color("GreyMediumColor")); + } + } + Spacer(); + ZStack{ + ProgressView(value: progress) + .progressViewStyle( + GaugeProgressStyle() + ) + .frame(width: 48, height: 48) + Text("\(Int(progress * 100))%").font(.system(size: 12)).foregroundColor(textColor) + } + } + //NetImage(imageData: netImgData) + }.widgetURL(URL(string: "wonderous://collections")) + + ZStack{ + BgImage(entry: entry) + LinearGradient( + gradient: Gradient(colors: [.black.opacity(0), .black]), + startPoint: .center, + endPoint: .bottom) + switch(family) { + case .systemSmall: + content.padding(16) + default: + content.padding(32) + } + + } + + } +} diff --git a/ios/Wonderous Widget/Wonderous_Widget.swift b/ios/Wonderous Widget/Wonderous_Widget.swift deleted file mode 100644 index 0c71aad5..00000000 --- a/ios/Wonderous Widget/Wonderous_Widget.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// Wonderous_Widget.swift -// Wonderous Widget -// -// Created by Shawn on 2023-10-06. -// - -import WidgetKit -import SwiftUI -import Intents - -struct Provider: IntentTimelineProvider { - func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(date: Date(), configuration: ConfigurationIntent()) - } - - func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry = SimpleEntry(date: Date(), configuration: configuration) - completion(entry) - } - - func getTimeline(for configuration: ConfigurationIntent, 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, configuration: configuration) - entries.append(entry) - } - - let timeline = Timeline(entries: entries, policy: .atEnd) - completion(timeline) - } -} - -struct SimpleEntry: TimelineEntry { - let date: Date - let configuration: ConfigurationIntent -} - -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 { - IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, 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(), configuration: ConfigurationIntent())) - .previewContext(WidgetPreviewContext(family: .systemSmall)) - } -} diff --git a/ios/Wonderous WidgetExtension.entitlements b/ios/Wonderous WidgetExtension.entitlements new file mode 100644 index 00000000..3deb71a4 --- /dev/null +++ b/ios/Wonderous WidgetExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.gskinner.flutter.wonders.widget + + + diff --git a/pubspec.yaml b/pubspec.yaml index eb806358..c866bbe9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -96,6 +96,7 @@ flutter: - assets/images/pyramids/ - assets/images/taj_mahal/ - assets/images/collectibles/ + - assets/images/widget/ fonts: - family: Cinzel From 310dcd918baeb20081d1c24de16848e838b5f96f Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 19 Oct 2023 11:47:10 -0600 Subject: [PATCH 05/24] Add top-right icon image, adjust colors of text and progress gauge --- .../WonderWidgetViewComponents.swift | 8 ++++---- ios/Wonderous Widget/WonderousWidgetView.swift | 16 +++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/ios/Wonderous Widget/WonderWidgetViewComponents.swift b/ios/Wonderous Widget/WonderWidgetViewComponents.swift index 6b71368d..42e09237 100644 --- a/ios/Wonderous Widget/WonderWidgetViewComponents.swift +++ b/ios/Wonderous Widget/WonderWidgetViewComponents.swift @@ -15,12 +15,12 @@ struct BgImage : View { var entry: WonderousEntry var body: some View { let image = bundle.appending(path: "/assets/images/widget/background-empty.jpg").path(); - print(image) + //print(image) if let uiImage = UIImage(contentsOfFile: image) { let image = Image(uiImage: uiImage) .resizable() .aspectRatio(contentMode: .fill) // Fill the entire view - // .edgesIgnoringSafeArea(.all) // Ignore the safe area + .edgesIgnoringSafeArea(.all) // Ignore the safe area return AnyView(image) } print("The image file could not be loaded") @@ -48,7 +48,7 @@ struct NetImage : View { } struct GaugeProgressStyle: ProgressViewStyle { - + let color:Color func makeBody(configuration: Configuration) -> some View { let fractionCompleted = configuration.fractionCompleted ?? 0 @@ -57,7 +57,7 @@ struct GaugeProgressStyle: ProgressViewStyle { .stroke(.gray, style: StrokeStyle(lineWidth: 2)) Circle() .trim(from: 0, to: fractionCompleted) - .stroke(.red, style: StrokeStyle(lineWidth: 4, lineCap: .round)) + .stroke(color, style: StrokeStyle(lineWidth: 4, lineCap: .round)) .rotationEffect(.degrees(90)) } } diff --git a/ios/Wonderous Widget/WonderousWidgetView.swift b/ios/Wonderous Widget/WonderousWidgetView.swift index 1413320d..8f90e15e 100644 --- a/ios/Wonderous Widget/WonderousWidgetView.swift +++ b/ios/Wonderous Widget/WonderousWidgetView.swift @@ -10,16 +10,18 @@ struct WonderousWidgetView : View { let showTitle = family == .systemLarge let showIcon = family != .systemSmall let showTitleAndDesc = family != .systemSmall - let textColor:Color = .pink + let accentColor:Color = Color("AccentColor") let progress = 7.0 / 32.0; + let image = bundle.appending(path: "/assets/images/widget/wonderous-icon.png").path(); let content = VStack{ HStack { if(showTitle) { - Text("Collection").foregroundColor(textColor) + Text("Collection").foregroundColor(accentColor) } Spacer(); - if(showIcon) { - Text("1").foregroundColor(textColor) + if(showIcon || true) { + Image(uiImage: UIImage(contentsOfFile: image)!) + .resizable().scaledToFit().frame(height: 24) } } Spacer(); @@ -28,7 +30,7 @@ struct WonderousWidgetView : View { VStack(alignment: .leading){ Text("Wonderous") .font(.system(size: 22)) - .foregroundColor(textColor); + .foregroundColor(accentColor); Text("Search for hidden artifacts") .font(.system(size: 15)) .foregroundColor(Color("GreyMediumColor")); @@ -38,10 +40,10 @@ struct WonderousWidgetView : View { ZStack{ ProgressView(value: progress) .progressViewStyle( - GaugeProgressStyle() + GaugeProgressStyle(color: accentColor) ) .frame(width: 48, height: 48) - Text("\(Int(progress * 100))%").font(.system(size: 12)).foregroundColor(textColor) + Text("\(Int(progress * 100))%").font(.system(size: 12)).foregroundColor(accentColor) } } //NetImage(imageData: netImgData) From 758a58b93d0606b17627f9ba321772a291e47d83 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 19 Oct 2023 12:12:34 -0600 Subject: [PATCH 06/24] Adjust padding for medium size widget --- ios/Wonderous Widget/WonderousWidgetView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ios/Wonderous Widget/WonderousWidgetView.swift b/ios/Wonderous Widget/WonderousWidgetView.swift index 8f90e15e..14d303bd 100644 --- a/ios/Wonderous Widget/WonderousWidgetView.swift +++ b/ios/Wonderous Widget/WonderousWidgetView.swift @@ -58,6 +58,8 @@ struct WonderousWidgetView : View { switch(family) { case .systemSmall: content.padding(16) + case .systemMedium: + content.padding(24) default: content.padding(32) } From a2a5eef13877cbbf9c760d053760d657adf87296 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 23 Oct 2023 17:43:16 -0600 Subject: [PATCH 07/24] Add ability to see last collected image, title and subtitle --- ios/Runner.xcodeproj/project.pbxproj | 32 ++++----- .../AccentColor.colorset/Contents.json | 20 ------ .../GreyMediumColor.colorset/Contents.json | 20 ------ .../WonderWidgetViewComponents.swift | 64 ----------------- .../WonderousWidgetView.swift | 70 ------------------ .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../WidgetBackground.colorset/Contents.json | 0 .../FlutterUtils.swift | 0 .../Info.plist | 0 .../WonderWidgetViewComponents.swift | 47 ++++++++++++ .../WonderousWidget.intentdefinition | 0 .../WonderousWidget.swift | 58 +++++++++------ .../WonderousWidgetBundle.swift | 0 ios/WonderousWidget/WonderousWidgetView.swift | 72 +++++++++++++++++++ ... => WonderousWidgetExtension.entitlements} | 0 lib/logic/app_logic.dart | 1 + lib/logic/collectibles_logic.dart | 47 ++++++++++++ lib/main.dart | 2 +- .../artifact_details_screen.dart | 2 +- .../ephemeral/Flutter-Generated.xcconfig | 4 +- .../ephemeral/flutter_export_environment.sh | 4 +- 22 files changed, 225 insertions(+), 218 deletions(-) delete mode 100644 ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json delete mode 100644 ios/Wonderous Widget/WonderWidgetViewComponents.swift delete mode 100644 ios/Wonderous Widget/WonderousWidgetView.swift rename ios/{Wonderous Widget => WonderousWidget}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename ios/{Wonderous Widget => WonderousWidget}/Assets.xcassets/Contents.json (100%) rename ios/{Wonderous Widget => WonderousWidget}/Assets.xcassets/WidgetBackground.colorset/Contents.json (100%) rename ios/{Wonderous Widget => WonderousWidget}/FlutterUtils.swift (100%) rename ios/{Wonderous Widget => WonderousWidget}/Info.plist (100%) create mode 100644 ios/WonderousWidget/WonderWidgetViewComponents.swift rename ios/{Wonderous Widget => WonderousWidget}/WonderousWidget.intentdefinition (100%) rename ios/{Wonderous Widget => WonderousWidget}/WonderousWidget.swift (55%) rename ios/{Wonderous Widget => WonderousWidget}/WonderousWidgetBundle.swift (100%) create mode 100644 ios/WonderousWidget/WonderousWidgetView.swift rename ios/{Wonderous WidgetExtension.entitlements => WonderousWidgetExtension.entitlements} (100%) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 7454c11b..56fc73b1 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -33,7 +33,7 @@ containerPortal = 97C146E61CF9000F007C117D /* Project object */; proxyType = 1; remoteGlobalIDString = 297F6FC42AD06E0D00FF159E; - remoteInfo = "Wonderous WidgetExtension"; + remoteInfo = WonderousWidgetExtension; }; E214FC8827C5A18E005F78FB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -72,7 +72,7 @@ 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 = ""; }; - 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Wonderous WidgetExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; @@ -80,7 +80,7 @@ 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 /* Wonderous WidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Wonderous WidgetExtension.entitlements"; 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 = ""; }; 297FD5772AE19C25008D8BFE /* FlutterUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlutterUtils.swift; sourceTree = ""; }; @@ -130,7 +130,7 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 297F6FCA2AD06E0D00FF159E /* Wonderous Widget */ = { + 297F6FCA2AD06E0D00FF159E /* WonderousWidget */ = { isa = PBXGroup; children = ( 297F6FCB2AD06E0D00FF159E /* WonderousWidgetBundle.swift */, @@ -142,7 +142,7 @@ 297FD5752AE19BD9008D8BFE /* WonderWidgetViewComponents.swift */, 297FD5772AE19C25008D8BFE /* FlutterUtils.swift */, ); - path = "Wonderous Widget"; + path = WonderousWidget; sourceTree = ""; }; 5073AC1D92C10773F20D12A2 /* Frameworks */ = { @@ -169,10 +169,10 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( - 297FD56C2ADF0DAB008D8BFE /* Wonderous WidgetExtension.entitlements */, + 297FD56C2ADF0DAB008D8BFE /* WonderousWidgetExtension.entitlements */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, - 297F6FCA2AD06E0D00FF159E /* Wonderous Widget */, + 297F6FCA2AD06E0D00FF159E /* WonderousWidget */, 97C146EF1CF9000F007C117D /* Products */, 5073AC1D92C10773F20D12A2 /* Frameworks */, E090BB04291350D10AF9DE4E /* Pods */, @@ -218,9 +218,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 297F6FC42AD06E0D00FF159E /* Wonderous WidgetExtension */ = { + 297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = 297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "Wonderous WidgetExtension" */; + buildConfigurationList = 297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "WonderousWidgetExtension" */; buildPhases = ( 297F6FC12AD06E0D00FF159E /* Sources */, 297F6FC22AD06E0D00FF159E /* Frameworks */, @@ -230,8 +230,8 @@ ); dependencies = ( ); - name = "Wonderous WidgetExtension"; - productName = "Wonderous WidgetExtension"; + name = WonderousWidgetExtension; + productName = WonderousWidgetExtension; productReference = 297F6FC52AD06E0D00FF159E /* Wonderous WidgetExtension.appex */; productType = "com.apple.product-type.app-extension"; }; @@ -319,7 +319,7 @@ targets = ( 97C146ED1CF9000F007C117D /* Runner */, E214FC8127C5A18D005F78FB /* wondersUITests */, - 297F6FC42AD06E0D00FF159E /* Wonderous WidgetExtension */, + 297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */, ); }; /* End PBXProject section */ @@ -479,7 +479,7 @@ /* Begin PBXTargetDependency section */ 297F6FD62AD06E0F00FF159E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 297F6FC42AD06E0D00FF159E /* Wonderous WidgetExtension */; + target = 297F6FC42AD06E0D00FF159E /* WonderousWidgetExtension */; targetProxy = 297F6FD52AD06E0F00FF159E /* PBXContainerItemProxy */; }; E214FC8927C5A18E005F78FB /* PBXTargetDependency */ = { @@ -600,14 +600,14 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "Wonderous WidgetExtension.entitlements"; + 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 = "Wonderous Widget/Info.plist"; + INFOPLIST_FILE = WonderousWidget/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Wonderous Widget"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 16.4; @@ -958,7 +958,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "Wonderous WidgetExtension" */ = { + 297F6FDC2AD06E0F00FF159E /* Build configuration list for PBXNativeTarget "WonderousWidgetExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( 297F6FD92AD06E0F00FF159E /* Debug */, diff --git a/ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index 2bc2d6bf..00000000 --- a/ios/Wonderous Widget/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.360", - "green" : "0.580", - "red" : "0.890" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json b/ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json deleted file mode 100644 index 574414aa..00000000 --- a/ios/Wonderous Widget/Assets.xcassets/GreyMediumColor.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.580", - "green" : "0.600", - "red" : "0.620" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/Wonderous Widget/WonderWidgetViewComponents.swift b/ios/Wonderous Widget/WonderWidgetViewComponents.swift deleted file mode 100644 index 42e09237..00000000 --- a/ios/Wonderous Widget/WonderWidgetViewComponents.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// File.swift -// Wonderous WidgetExtension -// -// Created by Shawn on 2023-10-19. -// - -import Foundation -import SwiftUI - - -// TODO: Add support for showing the last-found artifact from the app -// Load an image from the flutter assets bundle -struct BgImage : View { - var entry: WonderousEntry - var body: some View { - let image = bundle.appending(path: "/assets/images/widget/background-empty.jpg").path(); - //print(image) - if let uiImage = UIImage(contentsOfFile: image) { - let image = Image(uiImage: uiImage) - .resizable() - .aspectRatio(contentMode: .fill) // Fill the entire view - .edgesIgnoringSafeArea(.all) // Ignore the safe area - return AnyView(image) - } - print("The image file could not be loaded") - return AnyView(EmptyView()) - } - -} - -// Display a previously loaded remote image -struct NetImage : View { - var imageData: Data? - var body: some View { - if imageData != nil, let uiImage = UIImage(data: imageData!) { - return Image(uiImage: uiImage) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 80, height: 26.0) - } else { - return Image("EmptyChart") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 80, height: 26.0) - } - } -} - -struct GaugeProgressStyle: ProgressViewStyle { - let color:Color - func makeBody(configuration: Configuration) -> some View { - let fractionCompleted = configuration.fractionCompleted ?? 0 - - return ZStack { - Circle() - .stroke(.gray, style: StrokeStyle(lineWidth: 2)) - Circle() - .trim(from: 0, to: fractionCompleted) - .stroke(color, style: StrokeStyle(lineWidth: 4, lineCap: .round)) - .rotationEffect(.degrees(90)) - } - } -} diff --git a/ios/Wonderous Widget/WonderousWidgetView.swift b/ios/Wonderous Widget/WonderousWidgetView.swift deleted file mode 100644 index 14d303bd..00000000 --- a/ios/Wonderous Widget/WonderousWidgetView.swift +++ /dev/null @@ -1,70 +0,0 @@ -import WidgetKit -import SwiftUI -import Intents - -// Defines the view / layout of the widget -struct WonderousWidgetView : View { - @Environment(\.widgetFamily) var family: WidgetFamily - var entry: Provider.Entry - var body: some View { - let showTitle = family == .systemLarge - let showIcon = family != .systemSmall - let showTitleAndDesc = family != .systemSmall - let accentColor:Color = Color("AccentColor") - let progress = 7.0 / 32.0; - let image = bundle.appending(path: "/assets/images/widget/wonderous-icon.png").path(); - let content = VStack{ - HStack { - if(showTitle) { - Text("Collection").foregroundColor(accentColor) - } - Spacer(); - if(showIcon || true) { - Image(uiImage: UIImage(contentsOfFile: image)!) - .resizable().scaledToFit().frame(height: 24) - } - } - Spacer(); - HStack { - if(showTitleAndDesc) { - VStack(alignment: .leading){ - Text("Wonderous") - .font(.system(size: 22)) - .foregroundColor(accentColor); - Text("Search for hidden artifacts") - .font(.system(size: 15)) - .foregroundColor(Color("GreyMediumColor")); - } - } - Spacer(); - ZStack{ - ProgressView(value: progress) - .progressViewStyle( - GaugeProgressStyle(color: accentColor) - ) - .frame(width: 48, height: 48) - Text("\(Int(progress * 100))%").font(.system(size: 12)).foregroundColor(accentColor) - } - } - //NetImage(imageData: netImgData) - }.widgetURL(URL(string: "wonderous://collections")) - - ZStack{ - BgImage(entry: entry) - LinearGradient( - gradient: Gradient(colors: [.black.opacity(0), .black]), - startPoint: .center, - endPoint: .bottom) - switch(family) { - case .systemSmall: - content.padding(16) - case .systemMedium: - content.padding(24) - default: - content.padding(32) - } - - } - - } -} 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/WidgetBackground.colorset/Contents.json b/ios/WonderousWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json similarity index 100% rename from ios/Wonderous Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json rename to ios/WonderousWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json diff --git a/ios/Wonderous Widget/FlutterUtils.swift b/ios/WonderousWidget/FlutterUtils.swift similarity index 100% rename from ios/Wonderous Widget/FlutterUtils.swift rename to ios/WonderousWidget/FlutterUtils.swift 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..639974b3 --- /dev/null +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -0,0 +1,47 @@ +import Foundation +import SwiftUI + + +// Loads a default image from the flutter assets bundle, +// or displays a base64 encoded image +struct BgImage : View { + var entry: WonderousEntry + var body: some View { + var uiImage:UIImage?; + if(entry.imageData.isEmpty){ + let defaultImage = bundle.appending(path: "/assets/images/widget/background-empty.jpg").path(); + uiImage = UIImage(contentsOfFile: defaultImage); + } else { + uiImage = UIImage(data: Data(base64Encoded: entry.imageData)!) + } + if(uiImage != nil){ + 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) + } + print("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(Colors.darkGrey, style: StrokeStyle(lineWidth: 2)) + Circle() + .trim(from: 0, to: fractionCompleted) + .stroke(Colors.accentColor, style: StrokeStyle(lineWidth: 4, lineCap: .round)) + .rotationEffect(.degrees(90)) + } + } +} diff --git a/ios/Wonderous Widget/WonderousWidget.intentdefinition b/ios/WonderousWidget/WonderousWidget.intentdefinition similarity index 100% rename from ios/Wonderous Widget/WonderousWidget.intentdefinition rename to ios/WonderousWidget/WonderousWidget.intentdefinition diff --git a/ios/Wonderous Widget/WonderousWidget.swift b/ios/WonderousWidget/WonderousWidget.swift similarity index 55% rename from ios/Wonderous Widget/WonderousWidget.swift rename to ios/WonderousWidget/WonderousWidget.swift index 843e14ca..52c0687c 100644 --- a/ios/Wonderous Widget/WonderousWidget.swift +++ b/ios/WonderousWidget/WonderousWidget.swift @@ -12,6 +12,19 @@ import Intents var netImgData: Data? = nil +/// Entry, is passed into the view and defines the data it needs +struct WonderousEntry : TimelineEntry { + let date: Date + //let displaySize: CGSize + //let imageData: Data? + let discoveredCount:Int; + var title:String = ""; + var subTitle:String = ""; + var imageData:String = ""; + +} + + // Widget, defines the display name and description, and also wraps the View struct WonderousWidget: Widget { let kind: String = "WonderousWidget" @@ -30,30 +43,40 @@ struct WonderousWidget: Widget { struct Provider: TimelineProvider { // Provide an entry for a placeholder version of the widget func placeholder(in context: Context) -> WonderousEntry { - WonderousEntry(date: Date(), count: 0, displaySize: context.displaySize, imageData: netImgData) + WonderousEntry(date: Date(), discoveredCount: 0) } // Provide an entry for the current time and state of the widget func getSnapshot(in context: Context, completion: @escaping (WonderousEntry) -> ()) { let entry:WonderousEntry - if(context.isPreview){ - // entry = placeholder(in: context) - entry = WonderousEntry(date: Date(), count: 0, displaySize: context.displaySize, imageData: netImgData) - } else { - let userDefaults = UserDefaults(suiteName: "group.com.gskinner.homewidget") - let count = userDefaults?.integer(forKey: "counter") ?? 0; - entry = WonderousEntry(date: Date(), count: count, displaySize: context.displaySize, imageData: netImgData) - } + 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") ?? "" +// if(context.isPreview){ +// entry = WonderousEntry(date: Date(), discoveredCount: discoveredCount) +// } + entry = WonderousEntry( + 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) -> ()) { // Load a remote image so it can be shown later - netImgData = try? Data( - contentsOf: URL(string: "https://www.wonderous.info/unsplash/-e0u9SAFeP4-32.jpg")! - ) - +// let userDefaults = UserDefaults(suiteName: "group.com.gskinner.flutter.wonders.widget") +// let url = userDefaults?.string(forKey: "lastDiscoveredImageUrl"); +// if(url != nil){ +// netImgData = try? Data(contentsOf: URL(string: url!)!) +// } else { +// netImgData = nil; +// } getSnapshot(in: context) { (entry) in let timeline = Timeline(entries: [entry], policy: .atEnd) completion(timeline) @@ -62,15 +85,6 @@ struct Provider: TimelineProvider { } -/// Entry, is passed into the view and defines the data it needs -struct WonderousEntry : TimelineEntry { - let date: Date - let count:Int; - let displaySize: CGSize - let imageData: Data? -} - - diff --git a/ios/Wonderous Widget/WonderousWidgetBundle.swift b/ios/WonderousWidget/WonderousWidgetBundle.swift similarity index 100% rename from ios/Wonderous Widget/WonderousWidgetBundle.swift rename to ios/WonderousWidget/WonderousWidgetBundle.swift diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift new file mode 100644 index 00000000..78ef800c --- /dev/null +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -0,0 +1,72 @@ +import WidgetKit +import SwiftUI +import Intents + +struct Colors { + static let accentColor:Color = Color(red: 0.89, green: 0.58, blue: 0.36) + static let offWhiteColor:Color = Color(red: 0.97, green: 0.92, blue: 0.9) + static let mediumGrey:Color = Color(red: 0.62, green: 0.6, blue: 0.58) + static let darkGrey:Color = Color(red: 0.32, green: 0.31, blue: 0.3); +} + +// Defines the view / layout of the widget +struct WonderousWidgetView : View { + @Environment(\.widgetFamily) var family: WidgetFamily + var entry: Provider.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 = bundle.appending(path: "/assets/images/widget/wonderous-icon.png").path() + let title:String = entry.title.isEmpty ? "Wonderous" : entry.title; + let subTitle:String = entry.subTitle.isEmpty ? "Search for hidden artifacts" : entry.subTitle; + let content = VStack{ + HStack { + if(showTitle) { + Text("Collection") + .font(.system(size: 15)) + .foregroundColor(Colors.offWhiteColor) + } + 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(Colors.mediumGrey); + } + } + Spacer(); + ZStack{ + ProgressView(value: progress) + .progressViewStyle(GaugeProgressStyle()) + .frame(width: 48, height: 48) + Text("\(Int(progress * 100))%").font(.system(size: 13)).foregroundColor(.white) + } + } + } + + ZStack{ + BgImage(entry: entry) + LinearGradient( + gradient: Gradient(colors: [.black.opacity(0), .black]), + startPoint: .center, + endPoint: .bottom) + content.padding(16) + }.widgetURL(URL(string: "wonderous://collection")) + + } +} diff --git a/ios/Wonderous WidgetExtension.entitlements b/ios/WonderousWidgetExtension.entitlements similarity index 100% rename from ios/Wonderous WidgetExtension.entitlements rename to ios/WonderousWidgetExtension.entitlements diff --git a/lib/logic/app_logic.dart b/lib/logic/app_logic.dart index f6b87a31..c696caed 100644 --- a/lib/logic/app_logic.dart +++ b/lib/logic/app_logic.dart @@ -59,6 +59,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..e24329b9 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) { @@ -26,6 +38,14 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { void setState(String id, int state) { Map states = Map.of(statesById.value); + if (state == CollectibleState.discovered) { + final data = fromId(id)!; + _updateHomeWidgetTextData( + title: data.title, + id: data.id, + imageUrl: data.imageUrlSmall, + ); + } states[id] = state; statesById.value = states; scheduleSave(); @@ -37,6 +57,9 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { if (state == CollectibleState.discovered) _discoveredCount++; if (state == CollectibleState.explored) _exploredCount++; }); + HomeWidget.saveWidgetData('discoveredCount', _discoveredCount); + HomeWidget.updateWidget(iOSName: _appName); + debugPrint('setting discovered count for home widget $_discoveredCount'); } /// Get a discovered item, sorted by the order of wondersLogic.all @@ -67,11 +90,35 @@ 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(); } + // TODO: Optimize to send both network requests simultaneously + Future _updateHomeWidgetTextData({String title = '', String id = '', String imageUrl = ''}) async { + // Save title + HomeWidget.saveWidgetData('lastDiscoveredTitle', title); + // Subtitle + String subTitle = ''; + if(id.isNotEmpty){ + final artifactData = await artifactLogic.getArtifactByID(id); + subTitle = artifactData?.date ?? ''; + } + 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'); + } + HomeWidget.saveWidgetData('lastDiscoveredImageData', imageBase64); + HomeWidget.updateWidget(iOSName: _appName); + } + @override void copyFromJson(Map value) { Map states = {}; diff --git a/lib/main.dart b/lib/main.dart index fcdb3f77..499218cc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -77,7 +77,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(); WallPaperLogic get wallpaperLogic => GetIt.I.get(); LocaleLogic get localeLogic => GetIt.I.get(); 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/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" From a8f0b43c99ac254f6e0c81005201b6af4b063a53 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 23 Oct 2023 18:06:39 -0600 Subject: [PATCH 08/24] Cleanup --- ios/Runner.xcodeproj/project.pbxproj | 8 +++---- ios/WonderousWidget/Colors.swift | 9 ++++++++ ios/WonderousWidget/FlutterUtils.swift | 11 +-------- .../WonderWidgetViewComponents.swift | 8 +++---- ios/WonderousWidget/WonderousWidget.swift | 23 +------------------ ios/WonderousWidget/WonderousWidgetView.swift | 22 +++++++++++------- 6 files changed, 33 insertions(+), 48 deletions(-) create mode 100644 ios/WonderousWidget/Colors.swift diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 56fc73b1..d716f001 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* 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 */; }; @@ -18,7 +19,6 @@ 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 */; }; - 297FD5782AE19C25008D8BFE /* FlutterUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297FD5772AE19C25008D8BFE /* FlutterUtils.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 */; }; @@ -72,6 +72,7 @@ 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; }; @@ -83,7 +84,6 @@ 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 = ""; }; - 297FD5772AE19C25008D8BFE /* FlutterUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlutterUtils.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 = ""; }; @@ -140,7 +140,7 @@ 297F6FD22AD06E0F00FF159E /* Info.plist */, 297FD5732AE18011008D8BFE /* WonderousWidgetView.swift */, 297FD5752AE19BD9008D8BFE /* WonderWidgetViewComponents.swift */, - 297FD5772AE19C25008D8BFE /* FlutterUtils.swift */, + 296251242AE7410D00D574FF /* Colors.swift */, ); path = WonderousWidget; sourceTree = ""; @@ -449,10 +449,10 @@ 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 */, - 297FD5782AE19C25008D8BFE /* FlutterUtils.swift in Sources */, 297F6FCC2AD06E0D00FF159E /* WonderousWidgetBundle.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ios/WonderousWidget/Colors.swift b/ios/WonderousWidget/Colors.swift new file mode 100644 index 00000000..efc3a826 --- /dev/null +++ b/ios/WonderousWidget/Colors.swift @@ -0,0 +1,9 @@ +import Foundation +import SwiftUI + +struct Colors { + static let accentColor:Color = Color(red: 0.89, green: 0.58, blue: 0.36) + static let offWhiteColor:Color = Color(red: 0.97, green: 0.92, blue: 0.9) + static let mediumGrey:Color = Color(red: 0.62, green: 0.6, blue: 0.58) + static let darkGrey:Color = Color(red: 0.32, green: 0.31, blue: 0.3); +} diff --git a/ios/WonderousWidget/FlutterUtils.swift b/ios/WonderousWidget/FlutterUtils.swift index ab2011d2..bf69dc15 100644 --- a/ios/WonderousWidget/FlutterUtils.swift +++ b/ios/WonderousWidget/FlutterUtils.swift @@ -8,13 +8,4 @@ import Foundation -var bundle: 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/WonderousWidget/WonderWidgetViewComponents.swift b/ios/WonderousWidget/WonderWidgetViewComponents.swift index 639974b3..c41d5616 100644 --- a/ios/WonderousWidget/WonderWidgetViewComponents.swift +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -3,18 +3,19 @@ import SwiftUI // Loads a default image from the flutter assets bundle, -// or displays a base64 encoded image +// or displays a base64 encoded image that has been saved from the flutter application struct BgImage : View { var entry: WonderousEntry var body: some View { var uiImage:UIImage?; if(entry.imageData.isEmpty){ - let defaultImage = bundle.appending(path: "/assets/images/widget/background-empty.jpg").path(); + let defaultImage = flutterAssetBundle.appending(path: "/assets/images/widget/background-empty.jpg").path(); uiImage = UIImage(contentsOfFile: defaultImage); } 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() @@ -24,14 +25,13 @@ struct BgImage : View { } return AnyView(image) } - print("The image file could not be loaded") + 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 diff --git a/ios/WonderousWidget/WonderousWidget.swift b/ios/WonderousWidget/WonderousWidget.swift index 52c0687c..a2bfc5fe 100644 --- a/ios/WonderousWidget/WonderousWidget.swift +++ b/ios/WonderousWidget/WonderousWidget.swift @@ -1,22 +1,10 @@ -// -// CounterWidget.swift -// CounterWidget -// -// Created by Shawn on 2023-09-11. -// - import WidgetKit import SwiftUI import Intents -var netImgData: Data? = nil - - /// Entry, is passed into the view and defines the data it needs struct WonderousEntry : TimelineEntry { let date: Date - //let displaySize: CGSize - //let imageData: Data? let discoveredCount:Int; var title:String = ""; var subTitle:String = ""; @@ -24,8 +12,7 @@ struct WonderousEntry : TimelineEntry { } - -// Widget, defines the display name and description, and also wraps the View +// Widget, defines the display name and description and also declared the main View struct WonderousWidget: Widget { let kind: String = "WonderousWidget" @@ -69,14 +56,6 @@ struct Provider: TimelineProvider { // Provide an array of entries for the current time and, optionally, any future times func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { - // Load a remote image so it can be shown later -// let userDefaults = UserDefaults(suiteName: "group.com.gskinner.flutter.wonders.widget") -// let url = userDefaults?.string(forKey: "lastDiscoveredImageUrl"); -// if(url != nil){ -// netImgData = try? Data(contentsOf: URL(string: url!)!) -// } else { -// netImgData = nil; -// } getSnapshot(in: context) { (entry) in let timeline = Timeline(entries: [entry], policy: .atEnd) completion(timeline) diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift index 78ef800c..5a09e46c 100644 --- a/ios/WonderousWidget/WonderousWidgetView.swift +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -2,13 +2,6 @@ import WidgetKit import SwiftUI import Intents -struct Colors { - static let accentColor:Color = Color(red: 0.89, green: 0.58, blue: 0.36) - static let offWhiteColor:Color = Color(red: 0.97, green: 0.92, blue: 0.9) - static let mediumGrey:Color = Color(red: 0.62, green: 0.6, blue: 0.58) - static let darkGrey:Color = Color(red: 0.32, green: 0.31, blue: 0.3); -} - // Defines the view / layout of the widget struct WonderousWidgetView : View { @Environment(\.widgetFamily) var family: WidgetFamily @@ -19,7 +12,7 @@ struct WonderousWidgetView : View { let showTitleAndDesc = family != .systemSmall let progress = Double(entry.discoveredCount) / 24.0 - let iconImage = bundle.appending(path: "/assets/images/widget/wonderous-icon.png").path() + let iconImage = flutterAssetBundle.appending(path: "/assets/images/widget/wonderous-icon.png").path() let title:String = entry.title.isEmpty ? "Wonderous" : entry.title; let subTitle:String = entry.subTitle.isEmpty ? "Search for hidden artifacts" : entry.subTitle; let content = VStack{ @@ -70,3 +63,16 @@ struct WonderousWidgetView : View { } } + +// 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 +} From b188e7744953364fb28ad0d181eccd94addefcad Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 23 Oct 2023 18:31:07 -0600 Subject: [PATCH 09/24] Cleanup --- ios/WonderousWidget/Colors.swift | 4 ++-- ios/WonderousWidget/WonderWidgetViewComponents.swift | 2 +- ios/WonderousWidget/WonderousWidgetView.swift | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/WonderousWidget/Colors.swift b/ios/WonderousWidget/Colors.swift index efc3a826..e64aac14 100644 --- a/ios/WonderousWidget/Colors.swift +++ b/ios/WonderousWidget/Colors.swift @@ -2,8 +2,8 @@ import Foundation import SwiftUI struct Colors { - static let accentColor:Color = Color(red: 0.89, green: 0.58, blue: 0.36) - static let offWhiteColor:Color = Color(red: 0.97, green: 0.92, blue: 0.9) + static let accent:Color = Color(red: 0.89, green: 0.58, blue: 0.36) + static let offWhite:Color = Color(red: 0.97, green: 0.92, blue: 0.9) static let mediumGrey:Color = Color(red: 0.62, green: 0.6, blue: 0.58) static let darkGrey:Color = Color(red: 0.32, green: 0.31, blue: 0.3); } diff --git a/ios/WonderousWidget/WonderWidgetViewComponents.swift b/ios/WonderousWidget/WonderWidgetViewComponents.swift index c41d5616..4ce3f066 100644 --- a/ios/WonderousWidget/WonderWidgetViewComponents.swift +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -40,7 +40,7 @@ struct GaugeProgressStyle: ProgressViewStyle { .stroke(Colors.darkGrey, style: StrokeStyle(lineWidth: 2)) Circle() .trim(from: 0, to: fractionCompleted) - .stroke(Colors.accentColor, style: StrokeStyle(lineWidth: 4, lineCap: .round)) + .stroke(Colors.accent, style: StrokeStyle(lineWidth: 4, lineCap: .round)) .rotationEffect(.degrees(90)) } } diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift index 5a09e46c..baa58166 100644 --- a/ios/WonderousWidget/WonderousWidgetView.swift +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -20,7 +20,7 @@ struct WonderousWidgetView : View { if(showTitle) { Text("Collection") .font(.system(size: 15)) - .foregroundColor(Colors.offWhiteColor) + .foregroundColor(Colors.offWhite) } Spacer(); if(showIcon) { From d783d706e10f9f6fd7371ce47de6e459e51aa615 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 23 Oct 2023 21:40:55 -0600 Subject: [PATCH 10/24] Cleanup colors implementation --- ios/WonderousWidget/Colors.swift | 11 ++++++----- ios/WonderousWidget/WonderWidgetViewComponents.swift | 4 ++-- ios/WonderousWidget/WonderousWidgetView.swift | 9 +++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/ios/WonderousWidget/Colors.swift b/ios/WonderousWidget/Colors.swift index e64aac14..c362b248 100644 --- a/ios/WonderousWidget/Colors.swift +++ b/ios/WonderousWidget/Colors.swift @@ -1,9 +1,10 @@ import Foundation import SwiftUI -struct Colors { - static let accent:Color = Color(red: 0.89, green: 0.58, blue: 0.36) - static let offWhite:Color = Color(red: 0.97, green: 0.92, blue: 0.9) - static let mediumGrey:Color = Color(red: 0.62, green: 0.6, blue: 0.58) - static let darkGrey:Color = Color(red: 0.32, green: 0.31, blue: 0.3); +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/WonderWidgetViewComponents.swift b/ios/WonderousWidget/WonderWidgetViewComponents.swift index 4ce3f066..d9fc8529 100644 --- a/ios/WonderousWidget/WonderWidgetViewComponents.swift +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -37,10 +37,10 @@ struct GaugeProgressStyle: ProgressViewStyle { return ZStack { Circle() - .stroke(Colors.darkGrey, style: StrokeStyle(lineWidth: 2)) + .stroke(Color.body, style: StrokeStyle(lineWidth: 2)) Circle() .trim(from: 0, to: fractionCompleted) - .stroke(Colors.accent, style: StrokeStyle(lineWidth: 4, lineCap: .round)) + .stroke(Color.accent, style: StrokeStyle(lineWidth: 4, lineCap: .round)) .rotationEffect(.degrees(90)) } } diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift index baa58166..9b5fd7b4 100644 --- a/ios/WonderousWidget/WonderousWidgetView.swift +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -20,7 +20,7 @@ struct WonderousWidgetView : View { if(showTitle) { Text("Collection") .font(.system(size: 15)) - .foregroundColor(Colors.offWhite) + .foregroundColor(.offWhite) } Spacer(); if(showIcon) { @@ -39,7 +39,7 @@ struct WonderousWidgetView : View { .foregroundColor(.white); Text(subTitle) .font(.system(size: 15)) - .foregroundColor(Colors.mediumGrey); + .foregroundColor(.mediumGrey); } } Spacer(); @@ -52,8 +52,9 @@ struct WonderousWidgetView : View { } } - ZStack{ - BgImage(entry: entry) + return ZStack{ + Color.darkGrey + BgImage(entry: entry).opacity(0.8) LinearGradient( gradient: Gradient(colors: [.black.opacity(0), .black]), startPoint: .center, From 8c3ef002a8d01dbbc4f24325978fad3ce967303a Mon Sep 17 00:00:00 2001 From: Shawn Date: Wed, 25 Oct 2023 16:33:57 -0600 Subject: [PATCH 11/24] Cleanup --- ios/WonderousWidget/WonderousWidgetView.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift index 9b5fd7b4..f11c441d 100644 --- a/ios/WonderousWidget/WonderousWidgetView.swift +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -12,9 +12,11 @@ struct WonderousWidgetView : View { 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:String = entry.title.isEmpty ? "Wonderous" : entry.title; - let subTitle:String = entry.subTitle.isEmpty ? "Search for hidden artifacts" : entry.subTitle; + 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) { From 0805da1b37cacee9fe8662bf39025a3284a346b5 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 2 Nov 2023 09:57:01 -0600 Subject: [PATCH 12/24] Add back button fallback to go to /home if the view can not be popped --- lib/ui/common/controls/circle_buttons.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/ui/common/controls/circle_buttons.dart b/lib/ui/common/controls/circle_buttons.dart index 3bddf06d..6f968eb5 100644 --- a/lib/ui/common/controls/circle_buttons.dart +++ b/lib/ui/common/controls/circle_buttons.dart @@ -109,7 +109,14 @@ class BackBtn extends StatelessWidget { icon: icon, bgColor: bgColor, color: iconColor, - onPressed: onPressed ?? () => Navigator.pop(context), + onPressed: onPressed ?? () { + final nav = Navigator.of(context); + if(nav.canPop()){ + Navigator.pop(context); + } else { + context.go(ScreenPaths.home); + } + }, semanticLabel: semanticLabel ?? $strings.circleButtonsSemanticBack, ); } From 76ff50d09a72343d23fab800cf18dd2266a4d400 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 2 Nov 2023 09:57:39 -0600 Subject: [PATCH 13/24] Fix issue with home-screen throwing an error when disposed --- lib/ui/screens/home/_vertical_swipe_controller.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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; From 616f5ace91e2dd0c73992d2c0a430e5b7a806ac2 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 2 Nov 2023 09:58:01 -0600 Subject: [PATCH 14/24] Enable deeplinking --- ios/Runner/Info.plist | 2 ++ 1 file changed, 2 insertions(+) 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 From 94afbb1bcfd52752cb3860b0e971cacd034aeef6 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 2 Nov 2023 09:58:07 -0600 Subject: [PATCH 15/24] Cleanup --- .../WonderWidgetViewComponents.swift | 8 +++++--- ios/WonderousWidget/WonderousWidget.swift | 18 +++++++++--------- ios/WonderousWidget/WonderousWidgetView.swift | 4 ++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/ios/WonderousWidget/WonderWidgetViewComponents.swift b/ios/WonderousWidget/WonderWidgetViewComponents.swift index d9fc8529..5b558a95 100644 --- a/ios/WonderousWidget/WonderWidgetViewComponents.swift +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -5,13 +5,16 @@ 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: WonderousEntry + 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); - } else { + } + // Load a base64 encoded image that has been written by the flutter app + else { uiImage = UIImage(data: Data(base64Encoded: entry.imageData)!) } if(uiImage != nil){ @@ -34,7 +37,6 @@ struct BgImage : View { struct GaugeProgressStyle: ProgressViewStyle { func makeBody(configuration: Configuration) -> some View { let fractionCompleted = configuration.fractionCompleted ?? 0 - return ZStack { Circle() .stroke(Color.body, style: StrokeStyle(lineWidth: 2)) diff --git a/ios/WonderousWidget/WonderousWidget.swift b/ios/WonderousWidget/WonderousWidget.swift index a2bfc5fe..d7d65fd0 100644 --- a/ios/WonderousWidget/WonderousWidget.swift +++ b/ios/WonderousWidget/WonderousWidget.swift @@ -3,7 +3,7 @@ import SwiftUI import Intents /// Entry, is passed into the view and defines the data it needs -struct WonderousEntry : TimelineEntry { +struct WonderousTimelineEntry : TimelineEntry { let date: Date let discoveredCount:Int; var title:String = ""; @@ -17,7 +17,7 @@ struct WonderousWidget: Widget { let kind: String = "WonderousWidget" var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { entry in + StaticConfiguration(kind: kind, provider: WonderousTimelineProvider()) { entry in WonderousWidgetView(entry: entry) } .configurationDisplayName("Wonderous Widget") @@ -27,15 +27,15 @@ struct WonderousWidget: Widget { } // Provider,returns various WonderousEntry configs based on current context -struct Provider: TimelineProvider { +struct WonderousTimelineProvider: TimelineProvider { // Provide an entry for a placeholder version of the widget - func placeholder(in context: Context) -> WonderousEntry { - WonderousEntry(date: Date(), discoveredCount: 0) + 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 (WonderousEntry) -> ()) { - let entry:WonderousEntry + 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") ?? "" @@ -44,7 +44,7 @@ struct Provider: TimelineProvider { // if(context.isPreview){ // entry = WonderousEntry(date: Date(), discoveredCount: discoveredCount) // } - entry = WonderousEntry( + entry = WonderousTimelineEntry( date: Date(), discoveredCount:discoveredCount, title: title, @@ -55,7 +55,7 @@ struct Provider: TimelineProvider { } // Provide an array of entries for the current time and, optionally, any future times - func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + 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/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift index f11c441d..1d23ee3d 100644 --- a/ios/WonderousWidget/WonderousWidgetView.swift +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -5,7 +5,7 @@ import Intents // Defines the view / layout of the widget struct WonderousWidgetView : View { @Environment(\.widgetFamily) var family: WidgetFamily - var entry: Provider.Entry + var entry: WonderousTimelineProvider.Entry var body: some View { let showTitle = family == .systemLarge let showIcon = family != .systemSmall @@ -62,7 +62,7 @@ struct WonderousWidgetView : View { startPoint: .center, endPoint: .bottom) content.padding(16) - }.widgetURL(URL(string: "wonderous://collection")) + }.widgetURL(URL(string: "wonderous:///collection")) } } From c071798b02ac67caf24c6ab47864cd3a2a5e1e50 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 6 Nov 2023 18:31:50 -0700 Subject: [PATCH 16/24] Fixes for iOS 17 / xCode 15 --- ios/Runner.xcodeproj/project.pbxproj | 2 +- ios/WonderousWidget/WonderousWidget.swift | 5 +---- lib/logic/collectibles_logic.dart | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index d716f001..2d5075ca 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -244,11 +244,11 @@ 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, + 297F6FD82AD06E0F00FF159E /* Embed Foundation Extensions */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 9DAF500633B345EE15CA82E0 /* [CP] Embed Pods Frameworks */, B727DC94BF66FDBF036EDFA6 /* [CP] Copy Pods Resources */, - 297F6FD82AD06E0F00FF159E /* Embed Foundation Extensions */, ); buildRules = ( ); diff --git a/ios/WonderousWidget/WonderousWidget.swift b/ios/WonderousWidget/WonderousWidget.swift index d7d65fd0..64bc89f6 100644 --- a/ios/WonderousWidget/WonderousWidget.swift +++ b/ios/WonderousWidget/WonderousWidget.swift @@ -9,7 +9,6 @@ struct WonderousTimelineEntry : TimelineEntry { var title:String = ""; var subTitle:String = ""; var imageData:String = ""; - } // Widget, defines the display name and description and also declared the main View @@ -20,6 +19,7 @@ struct WonderousWidget: Widget { StaticConfiguration(kind: kind, provider: WonderousTimelineProvider()) { entry in WonderousWidgetView(entry: entry) } + .contentMarginsDisabled() .configurationDisplayName("Wonderous Widget") .description("Track your collected artifacts!") .supportedFamilies([.systemSmall, .systemMedium, .systemLarge]) @@ -41,9 +41,6 @@ struct WonderousTimelineProvider: TimelineProvider { let title = userDefaults?.string(forKey: "lastDiscoveredTitle") ?? "" let subTitle = userDefaults?.string(forKey: "lastDiscoveredSubTitle") ?? "" let imageData = userDefaults?.string(forKey: "lastDiscoveredImageData") ?? "" -// if(context.isPreview){ -// entry = WonderousEntry(date: Date(), discoveredCount: discoveredCount) -// } entry = WonderousTimelineEntry( date: Date(), discoveredCount:discoveredCount, diff --git a/lib/logic/collectibles_logic.dart b/lib/logic/collectibles_logic.dart index e24329b9..cc210229 100644 --- a/lib/logic/collectibles_logic.dart +++ b/lib/logic/collectibles_logic.dart @@ -96,7 +96,6 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { scheduleSave(); } - // TODO: Optimize to send both network requests simultaneously Future _updateHomeWidgetTextData({String title = '', String id = '', String imageUrl = ''}) async { // Save title HomeWidget.saveWidgetData('lastDiscoveredTitle', title); From 24d08a69e9341c0c35cd30f9172339e3bcd8f00d Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 7 Nov 2023 11:11:38 -0700 Subject: [PATCH 17/24] Fix race condition when updating discoveredCount --- lib/logic/collectibles_logic.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/logic/collectibles_logic.dart b/lib/logic/collectibles_logic.dart index cc210229..5319f68e 100644 --- a/lib/logic/collectibles_logic.dart +++ b/lib/logic/collectibles_logic.dart @@ -57,8 +57,9 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { if (state == CollectibleState.discovered) _discoveredCount++; if (state == CollectibleState.explored) _exploredCount++; }); - HomeWidget.saveWidgetData('discoveredCount', _discoveredCount); - HomeWidget.updateWidget(iOSName: _appName); + HomeWidget.saveWidgetData('discoveredCount', _discoveredCount).then((value){ + HomeWidget.updateWidget(iOSName: _appName); + }); debugPrint('setting discovered count for home widget $_discoveredCount'); } From e974ce8ca0875c533674cd62d49d20891658a662 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 7 Nov 2023 11:12:05 -0700 Subject: [PATCH 18/24] Add support for new containerBackground API in iOS 17 --- .../WonderWidgetViewComponents.swift | 14 ++++++++++++++ ios/WonderousWidget/WonderousWidgetView.swift | 5 +++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ios/WonderousWidget/WonderWidgetViewComponents.swift b/ios/WonderousWidget/WonderWidgetViewComponents.swift index 5b558a95..88d0cbc9 100644 --- a/ios/WonderousWidget/WonderWidgetViewComponents.swift +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -47,3 +47,17 @@ struct GaugeProgressStyle: ProgressViewStyle { } } } + +// 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, *) { + return containerBackground(for: .widget) { + backgroundView + } + } else { + return background(backgroundView) + } + } +} diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift index 1d23ee3d..775953cf 100644 --- a/ios/WonderousWidget/WonderousWidgetView.swift +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -55,14 +55,15 @@ struct WonderousWidgetView : View { } return ZStack{ - Color.darkGrey BgImage(entry: entry).opacity(0.8) LinearGradient( gradient: Gradient(colors: [.black.opacity(0), .black]), startPoint: .center, endPoint: .bottom) content.padding(16) - }.widgetURL(URL(string: "wonderous:///collection")) + } + .widgetBackground(Color.darkGrey) + .widgetURL(URL(string: "wonderous:///collection")) } } From 00847778f5b9f34968fcf7e92746df37dee6280b Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 7 Nov 2023 17:38:09 -0700 Subject: [PATCH 19/24] Fix deeplink issue where dialogs would render on top of collections view --- ios/WonderousWidget/WonderousWidgetView.swift | 2 +- lib/router.dart | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ios/WonderousWidget/WonderousWidgetView.swift b/ios/WonderousWidget/WonderousWidgetView.swift index 775953cf..b0fa9809 100644 --- a/ios/WonderousWidget/WonderousWidgetView.swift +++ b/ios/WonderousWidget/WonderousWidgetView.swift @@ -63,7 +63,7 @@ struct WonderousWidgetView : View { content.padding(16) } .widgetBackground(Color.darkGrey) - .widgetURL(URL(string: "wonderous:///collection")) + .widgetURL(URL(string: "wonderous:///home/collection")) } } diff --git a/lib/router.dart b/lib/router.dart index f5e4f07c..0f3febde 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -39,7 +39,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; From c4f4c1a05a7dec3987ff718a4be1d9ac56000be6 Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 7 Nov 2023 17:38:44 -0700 Subject: [PATCH 20/24] Attempted fix for macOS preview warning about containerBackgroundApi --- ios/WonderousWidget/WonderWidgetViewComponents.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/WonderousWidget/WonderWidgetViewComponents.swift b/ios/WonderousWidget/WonderWidgetViewComponents.swift index 88d0cbc9..042f599f 100644 --- a/ios/WonderousWidget/WonderWidgetViewComponents.swift +++ b/ios/WonderousWidget/WonderWidgetViewComponents.swift @@ -52,7 +52,7 @@ struct GaugeProgressStyle: ProgressViewStyle { // 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, *) { + if #available(iOSApplicationExtension 17.0, iOS 17.0, macOSApplicationExtension 14.0, *) { return containerBackground(for: .widget) { backgroundView } From 395fa12ad02cc24882bae924f9b7f0ade5d1dca2 Mon Sep 17 00:00:00 2001 From: Shawn Date: Fri, 17 Nov 2023 13:29:08 -0700 Subject: [PATCH 21/24] Version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c866bbe9..4a89bd44 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.0 environment: sdk: ">=2.17.0 <3.0.0" From 97cb83733cebd48a2249e83f0a05944eb2c408d6 Mon Sep 17 00:00:00 2001 From: Shawn Date: Mon, 20 Nov 2023 12:56:38 -0700 Subject: [PATCH 22/24] Tweak collectibles logic to await data writing --- ios/Runner.xcodeproj/project.pbxproj | 4 ++-- lib/logic/collectibles_logic.dart | 12 ++++++------ pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2d5075ca..1e9d1359 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -640,14 +640,14 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "Wonderous WidgetExtension.entitlements"; + 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 = "Wonderous Widget/Info.plist"; + INFOPLIST_FILE = "WonderousWidget/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "Wonderous Widget"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 16.4; diff --git a/lib/logic/collectibles_logic.dart b/lib/logic/collectibles_logic.dart index 5319f68e..cff1bddb 100644 --- a/lib/logic/collectibles_logic.dart +++ b/lib/logic/collectibles_logic.dart @@ -38,6 +38,8 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { void setState(String id, int state) { Map states = Map.of(statesById.value); + states[id] = state; + statesById.value = states; if (state == CollectibleState.discovered) { final data = fromId(id)!; _updateHomeWidgetTextData( @@ -46,8 +48,6 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { imageUrl: data.imageUrlSmall, ); } - states[id] = state; - statesById.value = states; scheduleSave(); } @@ -99,14 +99,14 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { Future _updateHomeWidgetTextData({String title = '', String id = '', String imageUrl = ''}) async { // Save title - HomeWidget.saveWidgetData('lastDiscoveredTitle', title); + await HomeWidget.saveWidgetData('lastDiscoveredTitle', title); // Subtitle String subTitle = ''; if(id.isNotEmpty){ final artifactData = await artifactLogic.getArtifactByID(id); subTitle = artifactData?.date ?? ''; } - HomeWidget.saveWidgetData('lastDiscoveredSubTitle', subTitle); + await HomeWidget.saveWidgetData('lastDiscoveredSubTitle', subTitle); // Image, // Download, convert to base64 string and write to shared widget data String imageBase64 = ''; @@ -115,8 +115,8 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { imageBase64 = base64Encode(bytes); debugPrint('Saving base64 bytes: $imageBase64'); } - HomeWidget.saveWidgetData('lastDiscoveredImageData', imageBase64); - HomeWidget.updateWidget(iOSName: _appName); + await HomeWidget.saveWidgetData('lastDiscoveredImageData', imageBase64); + await HomeWidget.updateWidget(iOSName: _appName); } @override diff --git a/pubspec.yaml b/pubspec.yaml index 4a89bd44..d7aeb2b6 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.1.0 +version: 2.1.1 environment: sdk: ">=2.17.0 <3.0.0" From a6c99352e627d1f42a783dc82c80cd4a8c44c0c6 Mon Sep 17 00:00:00 2001 From: Erisan Olasheni Date: Sun, 10 Dec 2023 19:06:10 +0100 Subject: [PATCH 23/24] Minor fix on the operator check Made minor change on the `==` operator to validate if the compared `Object` `imageProvider` matches the current `Object`. --- lib/logic/common/retry_image.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/logic/common/retry_image.dart b/lib/logic/common/retry_image.dart index 11309527..8fb9d294 100644 --- a/lib/logic/common/retry_image.dart +++ b/lib/logic/common/retry_image.dart @@ -90,7 +90,7 @@ class RetryImage extends ImageProvider { if (other.runtimeType != runtimeType) { return false; } - return other is RetryImage && other.imageProvider == other.imageProvider && other.scale == scale; + return other is RetryImage && other.imageProvider == imageProvider && other.scale == scale; } @override From 590e542b34e86928e9ae26565cbea501d759d7c8 Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 18 Jan 2024 11:22:31 -0700 Subject: [PATCH 24/24] Fix bug where widget would get out of sync w/ app once collected artifacts were explored --- lib/logic/collectibles_logic.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/logic/collectibles_logic.dart b/lib/logic/collectibles_logic.dart index cff1bddb..976be536 100644 --- a/lib/logic/collectibles_logic.dart +++ b/lib/logic/collectibles_logic.dart @@ -57,10 +57,11 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { if (state == CollectibleState.discovered) _discoveredCount++; if (state == CollectibleState.explored) _exploredCount++; }); - HomeWidget.saveWidgetData('discoveredCount', _discoveredCount).then((value){ + final foundCount = discoveredCount + exploredCount; + HomeWidget.saveWidgetData('discoveredCount', foundCount).then((value) { HomeWidget.updateWidget(iOSName: _appName); }); - debugPrint('setting discovered count for home widget $_discoveredCount'); + debugPrint('setting discoveredCount for home widget $foundCount'); } /// Get a discovered item, sorted by the order of wondersLogic.all @@ -102,7 +103,7 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { await HomeWidget.saveWidgetData('lastDiscoveredTitle', title); // Subtitle String subTitle = ''; - if(id.isNotEmpty){ + if (id.isNotEmpty) { final artifactData = await artifactLogic.getArtifactByID(id); subTitle = artifactData?.date ?? ''; } @@ -110,7 +111,7 @@ class CollectiblesLogic with ThrottledSaveLoadMixin { // Image, // Download, convert to base64 string and write to shared widget data String imageBase64 = ''; - if(imageUrl.isNotEmpty){ + if (imageUrl.isNotEmpty) { var bytes = await http.readBytes(Uri.parse(imageUrl)); imageBase64 = base64Encode(bytes); debugPrint('Saving base64 bytes: $imageBase64');