From b452b608b88a23a98c43f962978eced31016befa Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Tue, 8 Oct 2024 22:09:36 +0400 Subject: [PATCH] [ios] add OMapsWidgetExtension target to the project Signed-off-by: Kiryl Kaveryn --- iphone/Maps/Maps.xcodeproj/project.pbxproj | 203 ++++++++++++++++++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 +++ .../Assets.xcassets/Contents.json | 6 + .../WidgetBackground.colorset/Contents.json | 11 + .../logo.imageset/Contents.json | 12 ++ .../Assets.xcassets/logo.imageset/logo.png | Bin 0 -> 16386 bytes iphone/Maps/OMapsWidgetExtension/Info.plist | 11 + .../LiveActivity/AppLogo.swift | 9 + .../LiveActivity/LiveActivityManager.swift | 26 +++ .../LiveActivity/StatisticDetailView.swift | 28 +++ .../LiveActivity/StatisticValueView.swift | 17 ++ ...TrackRecordingLiveActivityAttributes.swift | 17 ++ ...ckRecordingLiveActivityConfiguration.swift | 26 +++ .../TrackRecordingLiveActivityView.swift | 71 ++++++ .../OMapsWidgetExtensionBundle.swift | 9 + 16 files changed, 492 insertions(+) create mode 100644 iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 iphone/Maps/OMapsWidgetExtension/Assets.xcassets/Contents.json create mode 100644 iphone/Maps/OMapsWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json create mode 100644 iphone/Maps/OMapsWidgetExtension/Assets.xcassets/logo.imageset/Contents.json create mode 100644 iphone/Maps/OMapsWidgetExtension/Assets.xcassets/logo.imageset/logo.png create mode 100644 iphone/Maps/OMapsWidgetExtension/Info.plist create mode 100644 iphone/Maps/OMapsWidgetExtension/LiveActivity/AppLogo.swift create mode 100644 iphone/Maps/OMapsWidgetExtension/LiveActivity/LiveActivityManager.swift create mode 100644 iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticDetailView.swift create mode 100644 iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticValueView.swift create mode 100644 iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityAttributes.swift create mode 100644 iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityConfiguration.swift create mode 100644 iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityView.swift create mode 100644 iphone/Maps/OMapsWidgetExtension/OMapsWidgetExtensionBundle.swift diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 626c8e6813..ff3387f478 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -475,10 +475,24 @@ ED1080A72B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1080A62B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift */; }; ED1263AB2B6F99F900AD99F3 /* UIView+AddSeparator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1263AA2B6F99F900AD99F3 /* UIView+AddSeparator.swift */; }; ED1ADA332BC6B1B40029209F /* CarPlayServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1ADA322BC6B1B40029209F /* CarPlayServiceTests.swift */; }; + ED2D72382D1315B100660FBF /* TrackRecordingActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D72372D1315B100660FBF /* TrackRecordingActivityManager.swift */; }; + ED2D74382D14337500660FBF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ED2D74342D14337500660FBF /* Assets.xcassets */; }; + ED2D74392D14337500660FBF /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = ED2D74352D14337500660FBF /* Info.plist */; }; + ED2D743A2D14337500660FBF /* AppLogo.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742C2D14337500660FBF /* AppLogo.swift */; }; + ED2D743B2D14337500660FBF /* LiveActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742D2D14337500660FBF /* LiveActivityManager.swift */; }; + ED2D743C2D14337500660FBF /* StatisticDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742E2D14337500660FBF /* StatisticDetailView.swift */; }; + ED2D743D2D14337500660FBF /* StatisticValueView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742F2D14337500660FBF /* StatisticValueView.swift */; }; + ED2D743E2D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74302D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift */; }; + ED2D743F2D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74312D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift */; }; + ED2D74402D14337500660FBF /* TrackRecordingLiveActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74322D14337500660FBF /* TrackRecordingLiveActivityView.swift */; }; + ED2D74412D14337500660FBF /* OMapsWidgetExtensionBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74362D14337500660FBF /* OMapsWidgetExtensionBundle.swift */; }; ED2E328E2D10500900807A08 /* TrackRecordingButtonArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */; }; ED2E32912D10501700807A08 /* TrackRecordingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED49D76F2CF0E3A8004AF27E /* TrackRecordingViewController.swift */; }; ED3EAC202B03C88100220A4A /* BottomTabBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED3EAC1F2B03C88100220A4A /* BottomTabBarButton.swift */; }; ED43B8BD2C12063500D07BAA /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */; }; + ED46DDCE2D098A0B007CACD6 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */; }; + ED46DDD02D098A0B007CACD6 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */; }; + ED46DDE12D098A0C007CACD6 /* OMapsWidgetExtensionExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; ED4DC7772CAEDECC0029B338 /* ProductsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED4DC7752CAEDECC0029B338 /* ProductsViewModel.swift */; }; ED4DC7782CAEDECC0029B338 /* ProductButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED4DC7732CAEDECC0029B338 /* ProductButton.swift */; }; ED4DC7792CAEDECC0029B338 /* ProductsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED4DC7742CAEDECC0029B338 /* ProductsViewController.swift */; }; @@ -694,6 +708,13 @@ remoteGlobalIDString = 6741A93D1BF340DE002C974C; remoteInfo = OMaps; }; + ED46DDDF2D098A0C007CACD6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = ED46DDCB2D098A0B007CACD6; + remoteInfo = OMapsWidgetExtensionExtension; + }; FA456C4626BDCC8E00B83C20 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = FA456C4026BDCC8E00B83C20 /* shaders.xcodeproj */; @@ -738,6 +759,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + ED46DDE22D098A0C007CACD6 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + ED46DDE12D098A0C007CACD6 /* OMapsWidgetExtensionExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; FA456C4E26BDCCC300B83C20 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -1406,9 +1438,23 @@ ED1080A62B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialMediaCollectionViewHeader.swift; sourceTree = ""; }; ED1263AA2B6F99F900AD99F3 /* UIView+AddSeparator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+AddSeparator.swift"; sourceTree = ""; }; ED1ADA322BC6B1B40029209F /* CarPlayServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarPlayServiceTests.swift; sourceTree = ""; }; + ED2D72372D1315B100660FBF /* TrackRecordingActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingActivityManager.swift; sourceTree = ""; }; + ED2D742C2D14337500660FBF /* AppLogo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLogo.swift; sourceTree = ""; }; + ED2D742D2D14337500660FBF /* LiveActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActivityManager.swift; sourceTree = ""; }; + ED2D742E2D14337500660FBF /* StatisticDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatisticDetailView.swift; sourceTree = ""; }; + ED2D742F2D14337500660FBF /* StatisticValueView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatisticValueView.swift; sourceTree = ""; }; + ED2D74302D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingLiveActivityAttributes.swift; sourceTree = ""; }; + ED2D74312D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingLiveActivityConfiguration.swift; sourceTree = ""; }; + ED2D74322D14337500660FBF /* TrackRecordingLiveActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingLiveActivityView.swift; sourceTree = ""; }; + ED2D74342D14337500660FBF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + ED2D74352D14337500660FBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + ED2D74362D14337500660FBF /* OMapsWidgetExtensionBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OMapsWidgetExtensionBundle.swift; sourceTree = ""; }; ED3EAC1F2B03C88100220A4A /* BottomTabBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarButton.swift; sourceTree = ""; }; ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = ""; }; ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingButtonArea.swift; sourceTree = ""; }; + ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OMapsWidgetExtensionExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; ED48BBB817C2B1E2003E7E92 /* CircleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircleView.h; sourceTree = ""; }; ED48BBB917C2B1E2003E7E92 /* CircleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CircleView.m; sourceTree = ""; }; ED49D76F2CF0E3A8004AF27E /* TrackRecordingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingViewController.swift; sourceTree = ""; }; @@ -1823,6 +1869,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + ED46DDC92D098A0B007CACD6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ED46DDD02D098A0B007CACD6 /* SwiftUI.framework in Frameworks */, + ED46DDCE2D098A0B007CACD6 /* WidgetKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1864,6 +1919,7 @@ children = ( 6741AA5D1BF340DE002C974C /* Organic Maps (Debug).app */, ED097E762BB80C320006ED01 /* OMapsTests.xctest */, + ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */, ); name = Products; sourceTree = ""; @@ -1890,6 +1946,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */, F6E2FBFB1E097B9F0083EBEC /* UI */, ED1ADA312BC6B19E0029209F /* Tests */, + ED2D74372D14337500660FBF /* OMapsWidgetExtension */, ); indentWidth = 2; name = Maps; @@ -1958,6 +2015,8 @@ FA853BD026BC3B8A0026D455 /* libsuccinct.a */, FA853BA626BC3ACE0026D455 /* CoreApi.framework */, FA14E683276014C10066E453 /* libz.1.tbd */, + ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */, + ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */, ); name = Frameworks; sourceTree = ""; @@ -3124,6 +3183,31 @@ path = Tests; sourceTree = ""; }; + ED2D74332D14337500660FBF /* LiveActivity */ = { + isa = PBXGroup; + children = ( + ED2D742C2D14337500660FBF /* AppLogo.swift */, + ED2D742D2D14337500660FBF /* LiveActivityManager.swift */, + ED2D742E2D14337500660FBF /* StatisticDetailView.swift */, + ED2D742F2D14337500660FBF /* StatisticValueView.swift */, + ED2D74302D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift */, + ED2D74312D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift */, + ED2D74322D14337500660FBF /* TrackRecordingLiveActivityView.swift */, + ); + path = LiveActivity; + sourceTree = ""; + }; + ED2D74372D14337500660FBF /* OMapsWidgetExtension */ = { + isa = PBXGroup; + children = ( + ED2D74332D14337500660FBF /* LiveActivity */, + ED2D74342D14337500660FBF /* Assets.xcassets */, + ED2D74352D14337500660FBF /* Info.plist */, + ED2D74362D14337500660FBF /* OMapsWidgetExtensionBundle.swift */, + ); + path = OMapsWidgetExtension; + sourceTree = ""; + }; ED43B8B92C12061600D07BAA /* DocumentPicker */ = { isa = PBXGroup; children = ( @@ -3972,11 +4056,13 @@ 6741A9A01BF340DE002C974C /* Sources */, 6741AA311BF340DE002C974C /* Frameworks */, 4740184523F5BDE900A93C81 /* Embed Frameworks */, + ED46DDE22D098A0C007CACD6 /* Embed Foundation Extensions */, ); buildRules = ( ); dependencies = ( FA456C4D26BDCC9400B83C20 /* PBXTargetDependency */, + ED46DDE02D098A0C007CACD6 /* PBXTargetDependency */, ); name = OMaps; productName = Maps; @@ -4001,6 +4087,25 @@ productReference = ED097E762BB80C320006ED01 /* OMapsTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + ED46DDCB2D098A0B007CACD6 /* OMapsWidgetExtensionExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = ED46DDE62D098A0C007CACD6 /* Build configuration list for PBXNativeTarget "OMapsWidgetExtensionExtension" */; + buildPhases = ( + ED46DDC82D098A0B007CACD6 /* Sources */, + ED46DDC92D098A0B007CACD6 /* Frameworks */, + ED46DDCA2D098A0B007CACD6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OMapsWidgetExtensionExtension; + packageProductDependencies = ( + ); + productName = OMapsWidgetExtensionExtension; + productReference = ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -4023,6 +4128,9 @@ }; }; }; + ED46DDCB2D098A0B007CACD6 = { + CreatedOnToolsVersion = 16.0; + }; }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Maps" */; @@ -4089,6 +4197,7 @@ targets = ( 6741A93D1BF340DE002C974C /* OMaps */, ED097E752BB80C320006ED01 /* OMapsTests */, + ED46DDCB2D098A0B007CACD6 /* OMapsWidgetExtensionExtension */, ); }; /* End PBXProject section */ @@ -4294,6 +4403,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + ED46DDCA2D098A0B007CACD6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ED2D74382D14337500660FBF /* Assets.xcassets in Resources */, + ED2D74392D14337500660FBF /* Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -4783,6 +4901,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + ED46DDC82D098A0B007CACD6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ED2D743A2D14337500660FBF /* AppLogo.swift in Sources */, + ED2D743B2D14337500660FBF /* LiveActivityManager.swift in Sources */, + ED2D743C2D14337500660FBF /* StatisticDetailView.swift in Sources */, + ED2D743D2D14337500660FBF /* StatisticValueView.swift in Sources */, + ED2D743E2D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift in Sources */, + ED2D743F2D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift in Sources */, + ED2D74402D14337500660FBF /* TrackRecordingLiveActivityView.swift in Sources */, + ED2D74412D14337500660FBF /* OMapsWidgetExtensionBundle.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -4791,6 +4924,11 @@ target = 6741A93D1BF340DE002C974C /* OMaps */; targetProxy = ED097E7A2BB80C320006ED01 /* PBXContainerItemProxy */; }; + ED46DDE02D098A0C007CACD6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = ED46DDCB2D098A0B007CACD6 /* OMapsWidgetExtensionExtension */; + targetProxy = ED46DDDF2D098A0C007CACD6 /* PBXContainerItemProxy */; + }; FA456C4D26BDCC9400B83C20 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = shaders_metal; @@ -5027,6 +5165,62 @@ }; name = Release; }; + ED46DDE32D098A0C007CACD6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9Z6432XD7L; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = OMapsWidgetExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = OMapsWidgetExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Organic Maps. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + PRODUCT_BUNDLE_IDENTIFIER = app.organicmaps.debug.OMapsWidgetExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + ED46DDE42D098A0C007CACD6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9Z6432XD7L; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = OMapsWidgetExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = OMapsWidgetExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Organic Maps. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = app.organicmaps.debug.OMapsWidgetExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; FAAB411B149BA84700C245B1 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 347526FA1DC0B00F00918CF5 /* common-debug.xcconfig */; @@ -5135,6 +5329,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + ED46DDE62D098A0C007CACD6 /* Build configuration list for PBXNativeTarget "OMapsWidgetExtensionExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ED46DDE32D098A0C007CACD6 /* Debug */, + ED46DDE42D098A0C007CACD6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; diff --git a/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..2305880107 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/Contents.json b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/logo.imageset/Contents.json b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/logo.imageset/Contents.json new file mode 100644 index 0000000000..7c58c478f6 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/logo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "logo.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/logo.imageset/logo.png b/iphone/Maps/OMapsWidgetExtension/Assets.xcassets/logo.imageset/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5c17369efc348895de1ab32487e9aecd399cc6b3 GIT binary patch literal 16386 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 + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/iphone/Maps/OMapsWidgetExtension/LiveActivity/AppLogo.swift b/iphone/Maps/OMapsWidgetExtension/LiveActivity/AppLogo.swift new file mode 100644 index 0000000000..bbd87296d4 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/LiveActivity/AppLogo.swift @@ -0,0 +1,9 @@ +import SwiftUI + +struct AppLogo: View { + var body: some View { + Image(.logo) + .resizable() + .aspectRatio(contentMode: .fit) + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/LiveActivity/LiveActivityManager.swift b/iphone/Maps/OMapsWidgetExtension/LiveActivity/LiveActivityManager.swift new file mode 100644 index 0000000000..85d6e5f925 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/LiveActivity/LiveActivityManager.swift @@ -0,0 +1,26 @@ +import ActivityKit +import SwiftUI + +@available(iOS 16.2, *) +final class LiveActivityManager { + static func startActivity(_ attributes: T, content: ActivityContent) throws -> Activity { + return try Activity.request(attributes: attributes, content: content, pushType: nil) + } + + static func update(_ activity: Activity, content: ActivityContent) { + Task { + await activity.update(content) + } + } + + static func stop(_ activity: Activity) { + // semaphore is used for removing the activity during the app termination + let semaphore = DispatchSemaphore(value: 0) + Task { + await activity.end(nil, dismissalPolicy: .immediate) + semaphore.signal() + } + semaphore.wait() + } +} + diff --git a/iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticDetailView.swift b/iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticDetailView.swift new file mode 100644 index 0000000000..65731c6e00 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticDetailView.swift @@ -0,0 +1,28 @@ +import SwiftUI + +struct StatisticDetailView: View { + private let title: String + private let subtitle: String + + init(title: String, subtitle: String) { + self.title = title + self.subtitle = subtitle + } + + var body: some View { + VStack(alignment: .leading) { + Text(title) + .contentTransition(.numericText()) + .font(.system(size: 14, weight: .bold).monospacedDigit()) + .minimumScaleFactor(0.5) + .lineLimit(1) + .foregroundStyle(.white) + Text(subtitle) + .font(.system(size: 10)) + .minimumScaleFactor(0.5) + .lineLimit(2) + .multilineTextAlignment(.center) + .foregroundStyle(.white) + } + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticValueView.swift b/iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticValueView.swift new file mode 100644 index 0000000000..17ce6c229c --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/LiveActivity/StatisticValueView.swift @@ -0,0 +1,17 @@ +import SwiftUI + +struct StatisticValueView: View { + private let value: String + + init(_ value: String) { + self.value = value + } + + var body: some View { + Text(value) + .contentTransition(.numericText()) + .minimumScaleFactor(0.1) + .font(.title3.bold().monospacedDigit()) + .foregroundStyle(.white) + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityAttributes.swift b/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityAttributes.swift new file mode 100644 index 0000000000..107365a653 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityAttributes.swift @@ -0,0 +1,17 @@ +import ActivityKit +import AppIntents + +struct TrackRecordingLiveActivityAttributes: ActivityAttributes { + struct ContentState: Codable, Hashable { + struct StatisticsViewModel: Codable, Hashable { + let key: String + let value: String + } + let duration: StatisticsViewModel + let distance: StatisticsViewModel + let ascent: StatisticsViewModel + let descent: StatisticsViewModel + let maxElevation: StatisticsViewModel + let minElevation: StatisticsViewModel + } +} diff --git a/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityConfiguration.swift b/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityConfiguration.swift new file mode 100644 index 0000000000..54fda890e1 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityConfiguration.swift @@ -0,0 +1,26 @@ +import WidgetKit +import SwiftUI + +struct TrackRecordingLiveActivityConfiguration: Widget { + @Environment(\.colorScheme) private var colorScheme + + var body: some WidgetConfiguration { + ActivityConfiguration(for: TrackRecordingLiveActivityAttributes.self) { context in + TrackRecordingLiveActivityView(state: context.state) + } dynamicIsland: { context in + DynamicIsland { + DynamicIslandExpandedRegion(.center) { + // TODO: Implement the expanded view + } + } compactLeading: { + AppLogo() + } compactTrailing: { + StatisticValueView(context.state.duration.value) + } minimal: { + // TODO: Implement the minimal view + } + } + } +} + + diff --git a/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityView.swift b/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityView.swift new file mode 100644 index 0000000000..e1d5bbaa08 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/LiveActivity/TrackRecordingLiveActivityView.swift @@ -0,0 +1,71 @@ +import SwiftUI +import WidgetKit + +#if canImport(ActivityKit) + +struct TrackRecordingLiveActivityView: View { + let state: TrackRecordingLiveActivityAttributes.ContentState + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + HStack(alignment: .top, spacing: 24) { + StatisticValueView(state.duration.value) + StatisticValueView(state.distance.value) + Spacer() + AppLogo() + .frame(width: 20, height: 20) + } + .padding([.top, .leading, .trailing], 16) + HStack(alignment: .top, spacing: 20) { + StatisticDetailView(title: state.ascent.value, subtitle: state.ascent.key) + StatisticDetailView(title: state.descent.value, subtitle: state.descent.key) + StatisticDetailView(title: state.maxElevation.value, subtitle: state.maxElevation.key) + StatisticDetailView(title: state.minElevation.value, subtitle: state.minElevation.key) + } + .padding([.leading, .trailing, .bottom], 16) + } + .background(.primary.opacity(0.15)) + } +} + +#if DEBUG +struct TrackRecordingLiveActivityWidget_Previews: PreviewProvider { + static var previews: some View { + Group { + let activityAttributes = TrackRecordingLiveActivityAttributes() + let activityState = TrackRecordingLiveActivityAttributes.ContentState( + duration: .init( + key: "Duration", + value: "1h 12min" + ), + distance: .init( + key: "Distance", + value: "12 km" + ), + ascent: .init( + key: "Ascent", + value: "100 m" + ), + descent: .init( + key: "Descent", + value: "100 m" + ), + maxElevation: .init( + key: "Max Elevation", + value: "100 m" + ), + minElevation: .init( + key: "Min Elevation", + value: "10 m" + ) + ) + + activityAttributes + .previewContext(activityState, viewKind: .content) + .previewDisplayName("Notification") + } + } +} +#endif + +#endif diff --git a/iphone/Maps/OMapsWidgetExtension/OMapsWidgetExtensionBundle.swift b/iphone/Maps/OMapsWidgetExtension/OMapsWidgetExtensionBundle.swift new file mode 100644 index 0000000000..5f85ff1b13 --- /dev/null +++ b/iphone/Maps/OMapsWidgetExtension/OMapsWidgetExtensionBundle.swift @@ -0,0 +1,9 @@ +import WidgetKit +import SwiftUI + +@main +struct OMapsWidgetExtensionBundle: WidgetBundle { + var body: some Widget { + TrackRecordingLiveActivityConfiguration() + } +}