From 9394a80ea259bfd7844db120857d63edcb16d1f9 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Fri, 11 Sep 2026 16:56:26 +0200 Subject: [PATCH] Add the watchOS app and complication targets The companion dropdown in Xcode's target template came up empty, which left both bundle identifiers starting with a bare dot and WKCompanionAppBundleIdentifier as an empty string. Both are set explicitly here, along with the App Group entitlements and watchOS 26 as the floor. The iOS app had no Embed Watch Content phase, so the watch app would have built and never shipped. Added, with the matching target dependency: the product now lands at Calendarr iOS.app/Watch/CalendarrWatch.app with the complications inside it. Folders follow what they contain: CalendarrWatch is the app, CalendarrWatchComplications the extension. Xcode had them the other way round. Package.resolved is now tracked. It pins AppAuth, whose version drift is what produced the two compile errors fixed in 75a6a5b. Co-Authored-By: Claude Opus 5 --- Calendarr iOS.xcodeproj/project.pbxproj | 640 +++++++++++++++++- .../xcshareddata/swiftpm/Package.resolved | 15 + .../xcschemes/xcschememanagement.plist | 22 +- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + CalendarrWatch/Assets.xcassets/Contents.json | 6 + CalendarrWatch/CalendarrWatch.entitlements | 10 + CalendarrWatch/CalendarrWatchApp.swift | 17 + CalendarrWatch/ContentView.swift | 24 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../Assets.xcassets/Contents.json | 6 + .../WidgetBackground.colorset/Contents.json | 11 + .../CalendarrWatch.swift | 86 +++ .../CalendarrWatchBundle.swift | 17 + .../CalendarrWatchComplications.entitlements | 10 + .../CalendarrWatchControl.swift | 54 ++ CalendarrWatchComplications/Info.plist | 11 + .../CalendarrWatch_Watch_AppTests.swift | 19 + .../CalendarrWatch_Watch_AppUITests.swift | 43 ++ 20 files changed, 1019 insertions(+), 20 deletions(-) create mode 100644 Calendarr iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 CalendarrWatch/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 CalendarrWatch/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 CalendarrWatch/Assets.xcassets/Contents.json create mode 100644 CalendarrWatch/CalendarrWatch.entitlements create mode 100644 CalendarrWatch/CalendarrWatchApp.swift create mode 100644 CalendarrWatch/ContentView.swift create mode 100644 CalendarrWatchComplications/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 CalendarrWatchComplications/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 CalendarrWatchComplications/Assets.xcassets/Contents.json create mode 100644 CalendarrWatchComplications/Assets.xcassets/WidgetBackground.colorset/Contents.json create mode 100644 CalendarrWatchComplications/CalendarrWatch.swift create mode 100644 CalendarrWatchComplications/CalendarrWatchBundle.swift create mode 100644 CalendarrWatchComplications/CalendarrWatchComplications.entitlements create mode 100644 CalendarrWatchComplications/CalendarrWatchControl.swift create mode 100644 CalendarrWatchComplications/Info.plist create mode 100644 CalendarrWatchTests/CalendarrWatch_Watch_AppTests.swift create mode 100644 CalendarrWatchUITests/CalendarrWatch_Watch_AppUITests.swift diff --git a/Calendarr iOS.xcodeproj/project.pbxproj b/Calendarr iOS.xcodeproj/project.pbxproj index 1152630..bebfaa5 100644 --- a/Calendarr iOS.xcodeproj/project.pbxproj +++ b/Calendarr iOS.xcodeproj/project.pbxproj @@ -7,10 +7,16 @@ objects = { /* Begin PBXBuildFile section */ - D0001A0CABCDEF0100AB5001 /* CalendarrWidgets.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 3934CF4630544C2E003958B8 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3934CF4530544C2E003958B8 /* WidgetKit.framework */; }; + 3934CF4830544C2E003958B8 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3934CF4730544C2E003958B8 /* SwiftUI.framework */; }; + 3934CF5530544C2E003958B8 /* CalendarrWatchComplications.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + AA9701000001000000000001 /* AppAuth in Frameworks */ = {isa = PBXBuildFile; productRef = AA9701000002000000000001 /* AppAuth */; }; CA1E4D0A0002000000000001 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000001 /* CalendarrCore */; }; CA1E4D0A0002000000000002 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000002 /* CalendarrCore */; }; - AA9701000001000000000001 /* AppAuth in Frameworks */ = {isa = PBXBuildFile; productRef = AA9701000002000000000001 /* AppAuth */; }; + CA1E4D0A0002000000000003 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000003 /* CalendarrCore */; }; + CA1E4D0A0002000000000004 /* CalendarrCore in Frameworks */ = {isa = PBXBuildFile; productRef = CA1E4D0A0001000000000004 /* CalendarrCore */; }; + D0001A0CABCDEF0100AB5001 /* CalendarrWidgets.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 39E1B0010001000000000001 /* CalendarrWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 3934CF1A30544C01003958B8 /* CalendarrWatch.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -21,6 +27,27 @@ remoteGlobalIDString = C0000A01FB4E10100AB5001; remoteInfo = "Calendarr iOS"; }; + 3934CF2730544C02003958B8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C0000301FB4E10100AB5001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3934CF1930544C01003958B8; + remoteInfo = CalendarrWatch; + }; + 3934CF3130544C02003958B8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C0000301FB4E10100AB5001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3934CF1930544C01003958B8; + remoteInfo = CalendarrWatch; + }; + 3934CF5330544C2E003958B8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C0000301FB4E10100AB5001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3934CF4230544C2E003958B8; + remoteInfo = CalendarrWatchComplications; + }; D0001A0DABCDEF0100AB5001 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = C0000301FB4E10100AB5001 /* Project object */; @@ -28,9 +55,27 @@ remoteGlobalIDString = D0001A01ABCDEF0100AB5001; remoteInfo = CalendarrWidgets; }; + 39E1B0010003000000000001 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C0000301FB4E10100AB5001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3934CF1930544C01003958B8; + remoteInfo = CalendarrWatch; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 3934CF5A30544C2E003958B8 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 3934CF5530544C2E003958B8 /* CalendarrWatchComplications.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; D0001A0BABCDEF0100AB5001 /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -42,15 +87,39 @@ name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; + 39E1B0010002000000000001 /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + 39E1B0010001000000000001 /* CalendarrWatch.app in Embed Watch Content */, + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Calendarr iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3934CF1A30544C01003958B8 /* CalendarrWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CalendarrWatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3934CF2630544C02003958B8 /* CalendarrWatchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CalendarrWatchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3934CF3030544C02003958B8 /* CalendarrWatchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CalendarrWatchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CalendarrWatchComplications.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 3934CF4530544C2E003958B8 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + 3934CF4730544C2E003958B8 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; C0000B01FC4E10100AB5001 /* Calendarr iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Calendarr iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CalendarrWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 3934CF5630544C2E003958B8 /* Exceptions for "CalendarrWatchComplications" folder in "CalendarrWatchComplications" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 3934CF4230544C2E003958B8 /* CalendarrWatchComplications */; + }; D0001A0FABCDEF0100AB5001 /* Exceptions for "CalendarrWidgets" folder in "CalendarrWidgets" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( @@ -66,6 +135,29 @@ path = "Calendarr iOSTests"; sourceTree = ""; }; + 3934CF1B30544C01003958B8 /* CalendarrWatch */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = CalendarrWatch; + sourceTree = ""; + }; + 3934CF2930544C02003958B8 /* CalendarrWatchTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = CalendarrWatchTests; + sourceTree = ""; + }; + 3934CF3330544C02003958B8 /* CalendarrWatchUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = CalendarrWatchUITests; + sourceTree = ""; + }; + 3934CF4930544C2E003958B8 /* CalendarrWatchComplications */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 3934CF5630544C2E003958B8 /* Exceptions for "CalendarrWatchComplications" folder in "CalendarrWatchComplications" target */, + ); + path = CalendarrWatchComplications; + sourceTree = ""; + }; C0000D01FC4E10100AB5001 /* Calendarr iOS */ = { isa = PBXFileSystemSynchronizedRootGroup; path = "Calendarr iOS"; @@ -94,6 +186,38 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3934CF1730544C01003958B8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CA1E4D0A0002000000000003 /* CalendarrCore in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF2330544C02003958B8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF2D30544C02003958B8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF4030544C2E003958B8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3934CF4830544C2E003958B8 /* SwiftUI.framework in Frameworks */, + 3934CF4630544C2E003958B8 /* WidgetKit.framework in Frameworks */, + CA1E4D0A0002000000000004 /* CalendarrCore in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C0000801FB4E10100AB5001 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -114,6 +238,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 3934CF4430544C2E003958B8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3934CF4530544C2E003958B8 /* WidgetKit.framework */, + 3934CF4730544C2E003958B8 /* SwiftUI.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; C0000201FB4E10100AB5001 = { isa = PBXGroup; children = ( @@ -121,6 +254,11 @@ D0001A03ABCDEF0100AB5001 /* CalendarrWidgets */, D0001A04ABCDEF0100AB5001 /* Shared */, 3927C7BD2FB99D0F00EAD8ED /* Calendarr iOSTests */, + 3934CF1B30544C01003958B8 /* CalendarrWatch */, + 3934CF2930544C02003958B8 /* CalendarrWatchTests */, + 3934CF3330544C02003958B8 /* CalendarrWatchUITests */, + 3934CF4930544C2E003958B8 /* CalendarrWatchComplications */, + 3934CF4430544C2E003958B8 /* Frameworks */, C0000C01FB4E10100AB5001 /* Products */, ); sourceTree = ""; @@ -131,6 +269,10 @@ C0000B01FC4E10100AB5001 /* Calendarr iOS.app */, 3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */, D0001A02ABCDEF0100AB5001 /* CalendarrWidgets.appex */, + 3934CF1A30544C01003958B8 /* CalendarrWatch.app */, + 3934CF2630544C02003958B8 /* CalendarrWatchTests.xctest */, + 3934CF3030544C02003958B8 /* CalendarrWatchUITests.xctest */, + 3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */, ); name = Products; sourceTree = ""; @@ -161,6 +303,100 @@ productReference = 3927C7BC2FB99D0E00EAD8ED /* Calendarr iOSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 3934CF1930544C01003958B8 /* CalendarrWatch */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3934CF3C30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatch" */; + buildPhases = ( + 3934CF1630544C01003958B8 /* Sources */, + 3934CF1730544C01003958B8 /* Frameworks */, + 3934CF1830544C01003958B8 /* Resources */, + 3934CF5A30544C2E003958B8 /* Embed Foundation Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 3934CF5430544C2E003958B8 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 3934CF1B30544C01003958B8 /* CalendarrWatch */, + ); + name = CalendarrWatch; + packageProductDependencies = ( + CA1E4D0A0001000000000003 /* CalendarrCore */, + ); + productName = CalendarrWatch; + productReference = 3934CF1A30544C01003958B8 /* CalendarrWatch.app */; + productType = "com.apple.product-type.application"; + }; + 3934CF2530544C02003958B8 /* CalendarrWatchTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3934CF3D30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchTests" */; + buildPhases = ( + 3934CF2230544C02003958B8 /* Sources */, + 3934CF2330544C02003958B8 /* Frameworks */, + 3934CF2430544C02003958B8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3934CF2830544C02003958B8 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 3934CF2930544C02003958B8 /* CalendarrWatchTests */, + ); + name = CalendarrWatchTests; + packageProductDependencies = ( + ); + productName = CalendarrWatchTests; + productReference = 3934CF2630544C02003958B8 /* CalendarrWatchTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 3934CF2F30544C02003958B8 /* CalendarrWatchUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3934CF3E30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchUITests" */; + buildPhases = ( + 3934CF2C30544C02003958B8 /* Sources */, + 3934CF2D30544C02003958B8 /* Frameworks */, + 3934CF2E30544C02003958B8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3934CF3230544C02003958B8 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 3934CF3330544C02003958B8 /* CalendarrWatchUITests */, + ); + name = CalendarrWatchUITests; + packageProductDependencies = ( + ); + productName = CalendarrWatchUITests; + productReference = 3934CF3030544C02003958B8 /* CalendarrWatchUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 3934CF4230544C2E003958B8 /* CalendarrWatchComplications */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3934CF5730544C2E003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchComplications" */; + buildPhases = ( + 3934CF3F30544C2E003958B8 /* Sources */, + 3934CF4030544C2E003958B8 /* Frameworks */, + 3934CF4130544C2E003958B8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 3934CF4930544C2E003958B8 /* CalendarrWatchComplications */, + ); + name = CalendarrWatchComplications; + packageProductDependencies = ( + CA1E4D0A0001000000000004 /* CalendarrCore */, + ); + productName = CalendarrWatchComplications; + productReference = 3934CF4330544C2E003958B8 /* CalendarrWatchComplications.appex */; + productType = "com.apple.product-type.app-extension"; + }; C0000A01FB4E10100AB5001 /* Calendarr iOS */ = { isa = PBXNativeTarget; buildConfigurationList = C0001601FB4E10100AB5001 /* Build configuration list for PBXNativeTarget "Calendarr iOS" */; @@ -169,11 +405,13 @@ C0000801FB4E10100AB5001 /* Frameworks */, C0000901FB4E10100AB5001 /* Resources */, D0001A0BABCDEF0100AB5001 /* Embed Foundation Extensions */, + 39E1B0010002000000000001 /* Embed Watch Content */, ); buildRules = ( ); dependencies = ( D0001A0EABCDEF0100AB5001 /* PBXTargetDependency */, + 39E1B0010004000000000001 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( C0000D01FC4E10100AB5001 /* Calendarr iOS */, @@ -219,13 +457,27 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 2650; + LastSwiftUpdateCheck = 2700; LastUpgradeCheck = 2640; TargetAttributes = { 3927C7BB2FB99D0E00EAD8ED = { CreatedOnToolsVersion = 26.5; TestTargetID = C0000A01FB4E10100AB5001; }; + 3934CF1930544C01003958B8 = { + CreatedOnToolsVersion = 27.0; + }; + 3934CF2530544C02003958B8 = { + CreatedOnToolsVersion = 27.0; + TestTargetID = 3934CF1930544C01003958B8; + }; + 3934CF2F30544C02003958B8 = { + CreatedOnToolsVersion = 27.0; + TestTargetID = 3934CF1930544C01003958B8; + }; + 3934CF4230544C2E003958B8 = { + CreatedOnToolsVersion = 27.0; + }; C0000A01FB4E10100AB5001 = { CreatedOnToolsVersion = 26.4.1; }; @@ -256,6 +508,10 @@ C0000A01FB4E10100AB5001 /* Calendarr iOS */, D0001A01ABCDEF0100AB5001 /* CalendarrWidgets */, 3927C7BB2FB99D0E00EAD8ED /* Calendarr iOSTests */, + 3934CF1930544C01003958B8 /* CalendarrWatch */, + 3934CF2530544C02003958B8 /* CalendarrWatchTests */, + 3934CF2F30544C02003958B8 /* CalendarrWatchUITests */, + 3934CF4230544C2E003958B8 /* CalendarrWatchComplications */, ); }; /* End PBXProject section */ @@ -268,6 +524,34 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3934CF1830544C01003958B8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF2430544C02003958B8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF2E30544C02003958B8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF4130544C2E003958B8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; C0000901FB4E10100AB5001 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -292,6 +576,34 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 3934CF1630544C01003958B8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF2230544C02003958B8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF2C30544C02003958B8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3934CF3F30544C2E003958B8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; C0000701FB4E10100AB5001 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -314,11 +626,31 @@ target = C0000A01FB4E10100AB5001 /* Calendarr iOS */; targetProxy = 3927C7C02FB99D0F00EAD8ED /* PBXContainerItemProxy */; }; + 3934CF2830544C02003958B8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3934CF1930544C01003958B8 /* CalendarrWatch */; + targetProxy = 3934CF2730544C02003958B8 /* PBXContainerItemProxy */; + }; + 3934CF3230544C02003958B8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3934CF1930544C01003958B8 /* CalendarrWatch */; + targetProxy = 3934CF3130544C02003958B8 /* PBXContainerItemProxy */; + }; + 3934CF5430544C2E003958B8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3934CF4230544C2E003958B8 /* CalendarrWatchComplications */; + targetProxy = 3934CF5330544C2E003958B8 /* PBXContainerItemProxy */; + }; D0001A0EABCDEF0100AB5001 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D0001A01ABCDEF0100AB5001 /* CalendarrWidgets */; targetProxy = D0001A0DABCDEF0100AB5001 /* PBXContainerItemProxy */; }; + 39E1B0010004000000000001 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3934CF1930544C01003958B8 /* CalendarrWatch */; + targetProxy = 39E1B0010003000000000001 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -372,6 +704,232 @@ }; name = Release; }; + 3934CF3630544C02003958B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.scarriffleservices.calendarr.ios; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + CODE_SIGN_ENTITLEMENTS = CalendarrWatch/CalendarrWatch.entitlements; + PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + 3934CF3730544C02003958B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.scarriffleservices.calendarr.ios; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + CODE_SIGN_ENTITLEMENTS = CalendarrWatch/CalendarrWatch.entitlements; + PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; + 3934CF3830544C02003958B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CalendarrWatch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CalendarrWatch"; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + 3934CF3930544C02003958B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CalendarrWatch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CalendarrWatch"; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; + 3934CF3A30544C02003958B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_TARGET_NAME = CalendarrWatch; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + 3934CF3B30544C02003958B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.scarriffleservices.calendarr.ios.watchkitapp.CalendarrWatch-Watch-AppUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + TEST_TARGET_NAME = CalendarrWatch; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; + 3934CF5830544C2E003958B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CalendarrWatchComplications/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MARKETING_VERSION = 1.0; + CODE_SIGN_ENTITLEMENTS = CalendarrWatchComplications/CalendarrWatchComplications.entitlements; + PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp.complications; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + 3934CF5930544C2E003958B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PP34X97WS3; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CalendarrWatchComplications/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CalendarrWatch; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MARKETING_VERSION = 1.0; + CODE_SIGN_ENTITLEMENTS = CalendarrWatchComplications/CalendarrWatchComplications.entitlements; + PRODUCT_BUNDLE_IDENTIFIER = com.scarriffleservices.calendarr.ios.watchkitapp.complications; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; C0001401FB4E10100AB5001 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -678,6 +1236,42 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 3934CF3C30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3934CF3630544C02003958B8 /* Debug */, + 3934CF3730544C02003958B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3934CF3D30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3934CF3830544C02003958B8 /* Debug */, + 3934CF3930544C02003958B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3934CF3E30544C02003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3934CF3A30544C02003958B8 /* Debug */, + 3934CF3B30544C02003958B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3934CF5730544C2E003958B8 /* Build configuration list for PBXNativeTarget "CalendarrWatchComplications" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3934CF5830544C2E003958B8 /* Debug */, + 3934CF5930544C2E003958B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; C0000601FB4E10100AB5001 /* Build configuration list for PBXProject "Calendarr iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -707,22 +1301,6 @@ }; /* End XCConfigurationList section */ -/* Begin XCSwiftPackageProductDependency section */ - CA1E4D0A0001000000000001 /* CalendarrCore */ = { - isa = XCSwiftPackageProductDependency; - productName = CalendarrCore; - }; - CA1E4D0A0001000000000002 /* CalendarrCore */ = { - isa = XCSwiftPackageProductDependency; - productName = CalendarrCore; - }; - AA9701000002000000000001 /* AppAuth */ = { - isa = XCSwiftPackageProductDependency; - package = AA9701000003000000000001 /* XCRemoteSwiftPackageReference "AppAuth-iOS" */; - productName = AppAuth; - }; -/* End XCSwiftPackageProductDependency section */ - /* Begin XCLocalSwiftPackageReference section */ 39450EFC302A266A0090DDD7 /* XCLocalSwiftPackageReference "../CalendarrKit" */ = { isa = XCLocalSwiftPackageReference; @@ -740,6 +1318,30 @@ }; }; /* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + AA9701000002000000000001 /* AppAuth */ = { + isa = XCSwiftPackageProductDependency; + package = AA9701000003000000000001 /* XCRemoteSwiftPackageReference "AppAuth-iOS" */; + productName = AppAuth; + }; + CA1E4D0A0001000000000001 /* CalendarrCore */ = { + isa = XCSwiftPackageProductDependency; + productName = CalendarrCore; + }; + CA1E4D0A0001000000000003 /* CalendarrCore */ = { + isa = XCSwiftPackageProductDependency; + productName = CalendarrCore; + }; + CA1E4D0A0001000000000004 /* CalendarrCore */ = { + isa = XCSwiftPackageProductDependency; + productName = CalendarrCore; + }; + CA1E4D0A0001000000000002 /* CalendarrCore */ = { + isa = XCSwiftPackageProductDependency; + productName = CalendarrCore; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = C0000301FB4E10100AB5001 /* Project object */; } diff --git a/Calendarr iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Calendarr iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..895da1c --- /dev/null +++ b/Calendarr iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "478d8419d86ca78c1539d3775396b811ce835c77379f2af98e26eefd35ee2311", + "pins" : [ + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "2781038865a80e2c425a1da12cc1327bcd56501f", + "version" : "1.7.6" + } + } + ], + "version" : 3 +} diff --git a/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist b/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist index af12f91..d6bd252 100644 --- a/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,11 +9,31 @@ orderHint 0 - CalendarrWidgets.xcscheme_^#shared#^_ + CalendarrWatch Watch App.xcscheme_^#shared#^_ + + orderHint + 3 + + CalendarrWatch.xcscheme_^#shared#^_ orderHint 2 + CalendarrWatchComplications.xcscheme_^#shared#^_ + + orderHint + 3 + + CalendarrWatchExtension.xcscheme_^#shared#^_ + + orderHint + 4 + + CalendarrWidgets.xcscheme_^#shared#^_ + + orderHint + 4 + SuppressBuildableAutocreation diff --git a/CalendarrWatch/Assets.xcassets/AccentColor.colorset/Contents.json b/CalendarrWatch/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CalendarrWatch/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CalendarrWatch/Assets.xcassets/AppIcon.appiconset/Contents.json b/CalendarrWatch/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..49c81cd --- /dev/null +++ b/CalendarrWatch/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "watchos", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CalendarrWatch/Assets.xcassets/Contents.json b/CalendarrWatch/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CalendarrWatch/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CalendarrWatch/CalendarrWatch.entitlements b/CalendarrWatch/CalendarrWatch.entitlements new file mode 100644 index 0000000..bb88d59 --- /dev/null +++ b/CalendarrWatch/CalendarrWatch.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.scarriffleservices.calendarr + + + diff --git a/CalendarrWatch/CalendarrWatchApp.swift b/CalendarrWatch/CalendarrWatchApp.swift new file mode 100644 index 0000000..d059cc7 --- /dev/null +++ b/CalendarrWatch/CalendarrWatchApp.swift @@ -0,0 +1,17 @@ +// +// CalendarrWatchApp.swift +// CalendarrWatch Watch App +// +// Created by Guido Schmit on 11.09.2026. +// + +import SwiftUI + +@main +struct CalendarrWatch_Watch_AppApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/CalendarrWatch/ContentView.swift b/CalendarrWatch/ContentView.swift new file mode 100644 index 0000000..01101ce --- /dev/null +++ b/CalendarrWatch/ContentView.swift @@ -0,0 +1,24 @@ +// +// ContentView.swift +// CalendarrWatch Watch App +// +// Created by Guido Schmit on 11.09.2026. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/CalendarrWatchComplications/Assets.xcassets/AccentColor.colorset/Contents.json b/CalendarrWatchComplications/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CalendarrWatchComplications/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CalendarrWatchComplications/Assets.xcassets/AppIcon.appiconset/Contents.json b/CalendarrWatchComplications/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..49c81cd --- /dev/null +++ b/CalendarrWatchComplications/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "watchos", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CalendarrWatchComplications/Assets.xcassets/Contents.json b/CalendarrWatchComplications/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CalendarrWatchComplications/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CalendarrWatchComplications/Assets.xcassets/WidgetBackground.colorset/Contents.json b/CalendarrWatchComplications/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CalendarrWatchComplications/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CalendarrWatchComplications/CalendarrWatch.swift b/CalendarrWatchComplications/CalendarrWatch.swift new file mode 100644 index 0000000..ac6c300 --- /dev/null +++ b/CalendarrWatchComplications/CalendarrWatch.swift @@ -0,0 +1,86 @@ +// +// CalendarrWatch.swift +// CalendarrWatch +// +// Created by Guido Schmit on 11.09.2026. +// + +import WidgetKit +import SwiftUI + +struct Provider: TimelineProvider { + func placeholder(in context: Context) -> SimpleEntry { + SimpleEntry(date: Date(), emoji: "πŸ˜€") + } + + func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { + let entry = SimpleEntry(date: Date(), emoji: "πŸ˜€") + completion(entry) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + var entries: [SimpleEntry] = [] + + // Generate a timeline consisting of five entries an hour apart, starting from the current date. + let currentDate = Date() + for hourOffset in 0 ..< 5 { + let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! + let entry = SimpleEntry(date: entryDate, emoji: "πŸ˜€") + entries.append(entry) + } + + let timeline = Timeline(entries: entries, policy: .atEnd) + completion(timeline) + } + +// func relevances() async -> WidgetRelevances { +// // Generate a list containing the contexts this widget is relevant in. +// } +} + +struct SimpleEntry: TimelineEntry { + let date: Date + let emoji: String +} + +struct CalendarrWatchEntryView : View { + var entry: Provider.Entry + + var body: some View { + VStack { + HStack { + Text("Time:") + Text(entry.date, style: .time) + } + + Text("Emoji:") + Text(entry.emoji) + } + } +} + +struct CalendarrWatch: Widget { + let kind: String = "CalendarrWatch" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: Provider()) { entry in + if #available(watchOS 10.0, *) { + CalendarrWatchEntryView(entry: entry) + .containerBackground(.fill.tertiary, for: .widget) + } else { + CalendarrWatchEntryView(entry: entry) + .padding() + .background() + } + } + .configurationDisplayName("My Widget") + .description("This is an example widget.") + } +} + +#Preview(as: .accessoryRectangular) { + CalendarrWatch() +} timeline: { + SimpleEntry(date: .now, emoji: "πŸ˜€") + SimpleEntry(date: .now, emoji: "🀩") +} diff --git a/CalendarrWatchComplications/CalendarrWatchBundle.swift b/CalendarrWatchComplications/CalendarrWatchBundle.swift new file mode 100644 index 0000000..e9dbbf2 --- /dev/null +++ b/CalendarrWatchComplications/CalendarrWatchBundle.swift @@ -0,0 +1,17 @@ +// +// CalendarrWatchBundle.swift +// CalendarrWatch +// +// Created by Guido Schmit on 11.09.2026. +// + +import WidgetKit +import SwiftUI + +@main +struct CalendarrWatchBundle: WidgetBundle { + var body: some Widget { + CalendarrWatch() + CalendarrWatchControl() + } +} diff --git a/CalendarrWatchComplications/CalendarrWatchComplications.entitlements b/CalendarrWatchComplications/CalendarrWatchComplications.entitlements new file mode 100644 index 0000000..bb88d59 --- /dev/null +++ b/CalendarrWatchComplications/CalendarrWatchComplications.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.scarriffleservices.calendarr + + + diff --git a/CalendarrWatchComplications/CalendarrWatchControl.swift b/CalendarrWatchComplications/CalendarrWatchControl.swift new file mode 100644 index 0000000..64e323e --- /dev/null +++ b/CalendarrWatchComplications/CalendarrWatchControl.swift @@ -0,0 +1,54 @@ +// +// CalendarrWatchControl.swift +// CalendarrWatch +// +// Created by Guido Schmit on 11.09.2026. +// + +import AppIntents +import SwiftUI +import WidgetKit + +struct CalendarrWatchControl: ControlWidget { + var body: some ControlWidgetConfiguration { + StaticControlConfiguration( + kind: ".watchkitapp.CalendarrWatch", + provider: Provider() + ) { value in + ControlWidgetToggle( + "Start Timer", + isOn: value, + action: StartTimerIntent() + ) { isRunning in + Label(isRunning ? "On" : "Off", systemImage: "timer") + } + } + .displayName("Timer") + .description("A an example control that runs a timer.") + } +} + +extension CalendarrWatchControl { + struct Provider: ControlValueProvider { + var previewValue: Bool { + false + } + + func currentValue() async throws -> Bool { + let isRunning = true // Check if the timer is running + return isRunning + } + } +} + +struct StartTimerIntent: SetValueIntent { + static let title: LocalizedStringResource = "Start a timer" + + @Parameter(title: "Timer is running") + var value: Bool + + func perform() async throws -> some IntentResult { + // Start / stop the timer based on `value`. + return .result() + } +} diff --git a/CalendarrWatchComplications/Info.plist b/CalendarrWatchComplications/Info.plist new file mode 100644 index 0000000..0f118fb --- /dev/null +++ b/CalendarrWatchComplications/Info.plist @@ -0,0 +1,11 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/CalendarrWatchTests/CalendarrWatch_Watch_AppTests.swift b/CalendarrWatchTests/CalendarrWatch_Watch_AppTests.swift new file mode 100644 index 0000000..0f40448 --- /dev/null +++ b/CalendarrWatchTests/CalendarrWatch_Watch_AppTests.swift @@ -0,0 +1,19 @@ +// +// CalendarrWatch_Watch_AppTests.swift +// CalendarrWatch Watch AppTests +// +// Created by Guido Schmit on 11.09.2026. +// + +import Testing +@testable import CalendarrWatch_Watch_App + +struct CalendarrWatch_Watch_AppTests { + + @Test func example() async throws { + // Write your test here and use APIs like `#expect(...)` to check expected conditions. + // Swift Testing Documentation + // https://developer.apple.com/documentation/testing + } + +} diff --git a/CalendarrWatchUITests/CalendarrWatch_Watch_AppUITests.swift b/CalendarrWatchUITests/CalendarrWatch_Watch_AppUITests.swift new file mode 100644 index 0000000..5c27a48 --- /dev/null +++ b/CalendarrWatchUITests/CalendarrWatch_Watch_AppUITests.swift @@ -0,0 +1,43 @@ +// +// CalendarrWatch_Watch_AppUITests.swift +// CalendarrWatch Watch AppUITests +// +// Created by Guido Schmit on 11.09.2026. +// + +import XCTest + +final class CalendarrWatch_Watch_AppUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + @MainActor + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + // XCUIAutomation Documentation + // https://developer.apple.com/documentation/xcuiautomation + } + + @MainActor + func testLaunchPerformance() throws { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } +}