From 57dd08c4409284e6960f671e4cffd8ff0a6a3255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schmidt?= Date: Mon, 22 Jan 2024 14:30:51 +0100 Subject: [PATCH 1/2] Add initializers for AppIntents Including DisplayRepresentation and DisplayRepresentation.Image --- CHANGELOG.md | 2 +- SFSafeSymbols.xcodeproj/project.pbxproj | 28 ++++++++++++++++ .../DisplayRepresentation.Image.swift | 8 +++++ .../AppIntents/DisplayRepresentation.swift | 22 +++++++++++++ .../DisplayRepresentationTests.swift | 32 +++++++++++++++++++ 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.Image.swift create mode 100644 Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.swift create mode 100644 Tests/SFSafeSymbolsTests/AppIntents/DisplayRepresentationTests.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index ef20dc3..0a7a46f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a ### Added -- None +- Added initializers for AppIntents (`DisplayRepresentation` and `DisplayRepresentation.Image`) (By [andschdk](https://github.com/andschdk)) ### Changed diff --git a/SFSafeSymbols.xcodeproj/project.pbxproj b/SFSafeSymbols.xcodeproj/project.pbxproj index c5a7dbb..afdb07b 100644 --- a/SFSafeSymbols.xcodeproj/project.pbxproj +++ b/SFSafeSymbols.xcodeproj/project.pbxproj @@ -24,6 +24,9 @@ 636A46C928002819007E6028 /* SFSymbol+AllSymbols+2.1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A46B928002819007E6028 /* SFSymbol+AllSymbols+2.1.swift */; }; 636A46CA28002819007E6028 /* SFSymbol+AllSymbols+2.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A46BA28002819007E6028 /* SFSymbol+AllSymbols+2.0.swift */; }; 636EBFD427EB2ABC005CFF4C /* SymbolWithLocalizations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636EBFD327EB2ABC005CFF4C /* SymbolWithLocalizations.swift */; }; + 8AD97FE02B5E9AC20058C050 /* DisplayRepresentation.Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentation.Image.swift */; }; + 8AD97FE22B5E9B790058C050 /* DisplayRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FE12B5E9B790058C050 /* DisplayRepresentation.swift */; }; + 8AD97FE62B5EA17D0058C050 /* DisplayRepresentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FE42B5EA0B70058C050 /* DisplayRepresentationTests.swift */; }; B00FBD8E285E146400A7878B /* LocalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B00FBD8D285E146400A7878B /* LocalizationTests.swift */; }; B01C186D2B55D9B300AC4288 /* SFSymbol+5.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = B01C18652B55D9B300AC4288 /* SFSymbol+5.0.swift */; }; B01C186E2B55D9B300AC4288 /* SFSymbol+5.2.swift in Sources */ = {isa = PBXBuildFile; fileRef = B01C18662B55D9B300AC4288 /* SFSymbol+5.2.swift */; }; @@ -85,6 +88,9 @@ 636A46B928002819007E6028 /* SFSymbol+AllSymbols+2.1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SFSymbol+AllSymbols+2.1.swift"; sourceTree = ""; }; 636A46BA28002819007E6028 /* SFSymbol+AllSymbols+2.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SFSymbol+AllSymbols+2.0.swift"; sourceTree = ""; }; 636EBFD327EB2ABC005CFF4C /* SymbolWithLocalizations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolWithLocalizations.swift; sourceTree = ""; }; + 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentation.Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentation.Image.swift; sourceTree = ""; }; + 8AD97FE12B5E9B790058C050 /* DisplayRepresentation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentation.swift; sourceTree = ""; }; + 8AD97FE42B5EA0B70058C050 /* DisplayRepresentationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentationTests.swift; sourceTree = ""; }; B00FBD8D285E146400A7878B /* LocalizationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationTests.swift; sourceTree = ""; }; B01C18652B55D9B300AC4288 /* SFSymbol+5.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SFSymbol+5.0.swift"; sourceTree = ""; }; B01C18662B55D9B300AC4288 /* SFSymbol+5.2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SFSymbol+5.2.swift"; sourceTree = ""; }; @@ -146,6 +152,23 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 8AD97FDE2B5E9A830058C050 /* AppIntents */ = { + isa = PBXGroup; + children = ( + 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentation.Image.swift */, + 8AD97FE12B5E9B790058C050 /* DisplayRepresentation.swift */, + ); + path = AppIntents; + sourceTree = ""; + }; + 8AD97FE32B5EA07C0058C050 /* AppIntents */ = { + isa = PBXGroup; + children = ( + 8AD97FE42B5EA0B70058C050 /* DisplayRepresentationTests.swift */, + ); + path = AppIntents; + sourceTree = ""; + }; 96244F11253F15B700253B88 /* SFSafeSymbols */ = { isa = PBXGroup; children = ( @@ -177,6 +200,7 @@ children = ( CC1D813027F758D900CACDC7 /* Helpers */, B0DDAE102637BF0700081F1C /* Core */, + 8AD97FE32B5EA07C0058C050 /* AppIntents */, CCCCD05B252F7F8300C7CE9F /* AppKit */, CCCCD034252F62D400C7CE9F /* SwiftUI */, CCCCD039252F62DB00C7CE9F /* UIKit */, @@ -236,6 +260,7 @@ CCCCCFE6252F61E700C7CE9F /* Initializers */ = { isa = PBXGroup; children = ( + 8AD97FDE2B5E9A830058C050 /* AppIntents */, CCCCD04C252F632900C7CE9F /* AppKit */, CCCCCFFE252F620400C7CE9F /* SwiftUI */, CCCCD003252F620B00C7CE9F /* UIKit */, @@ -438,6 +463,7 @@ B01C186E2B55D9B300AC4288 /* SFSymbol+5.2.swift in Sources */, 636A46BD28002819007E6028 /* SFSymbol+2.0.swift in Sources */, CCCCCFEF252F61E700C7CE9F /* UIApplicationShortcutIconExtension.swift in Sources */, + 8AD97FE02B5E9AC20058C050 /* DisplayRepresentation.Image.swift in Sources */, 636A46BE28002819007E6028 /* SFSymbol+AllSymbols+3.2.swift in Sources */, B01C186D2B55D9B300AC4288 /* SFSymbol+5.0.swift in Sources */, CCA29C3D285B4E9400133245 /* SFSymbol+AllSymbols+4.0.swift in Sources */, @@ -446,6 +472,7 @@ 636A46C528002819007E6028 /* SFSymbol+AllSymbols.swift in Sources */, CCCCCFF1252F61E700C7CE9F /* UIImageExtension.swift in Sources */, B01C18712B55D9B300AC4288 /* SFSymbol+5.1.swift in Sources */, + 8AD97FE22B5E9B790058C050 /* DisplayRepresentation.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -453,6 +480,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( + 8AD97FE62B5EA17D0058C050 /* DisplayRepresentationTests.swift in Sources */, CCCCD019252F622B00C7CE9F /* SwiftUILabelExtensionTests.swift in Sources */, B0DDAE152637C11400081F1C /* CodableTests.swift in Sources */, CCCCD016252F622B00C7CE9F /* SwiftUIImageExtensionTests.swift in Sources */, diff --git a/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.Image.swift b/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.Image.swift new file mode 100644 index 0000000..d2a50c8 --- /dev/null +++ b/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.Image.swift @@ -0,0 +1,8 @@ +import AppIntents + +@available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) +public extension DisplayRepresentation.Image { + init(systemSymbol: SFSymbol) { + self.init(systemName: systemSymbol.rawValue) + } +} diff --git a/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.swift b/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.swift new file mode 100644 index 0000000..e313990 --- /dev/null +++ b/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.swift @@ -0,0 +1,22 @@ +import AppIntents + +@available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) +public extension DisplayRepresentation { + init(title: LocalizedStringResource, subtitle: LocalizedStringResource? = nil, systemSymbol: SFSymbol? = nil) { + self.init( + title: title, + subtitle: subtitle, + image: systemSymbol.map { DisplayRepresentation.Image(systemSymbol: $0) } + ) + } + + @available(macOS 14.0, iOS 17.0, watchOS 10.0, tvOS 17.0, *) + init(title: LocalizedStringResource, subtitle: LocalizedStringResource? = nil, systemSymbol: SFSymbol? = nil, synonyms: [LocalizedStringResource] = []) { + self.init( + title: title, + subtitle: subtitle, + image: systemSymbol.map { DisplayRepresentation.Image(systemSymbol: $0) }, + synonyms: synonyms + ) + } +} diff --git a/Tests/SFSafeSymbolsTests/AppIntents/DisplayRepresentationTests.swift b/Tests/SFSafeSymbolsTests/AppIntents/DisplayRepresentationTests.swift new file mode 100644 index 0000000..60d6944 --- /dev/null +++ b/Tests/SFSafeSymbolsTests/AppIntents/DisplayRepresentationTests.swift @@ -0,0 +1,32 @@ +@testable import SFSafeSymbols + +import XCTest +import AppIntents + +class DisplayRepresentationTests: XCTestCase { + /// Tests, whether the `DisplayRepresentation.Image` retrieved via SFSafeSymbols is equal to the one retrieved via the `String` initializer + @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) + func testDisplayRepresentationImage() { + for symbol in TestHelper.allSymbolsWithVariants { + print("Testing validity of \"\(symbol.rawValue)\" via DisplayRepresentation.Image init") + + let expected = DisplayRepresentation.Image(systemName: symbol.rawValue) + let actual = DisplayRepresentation.Image(systemSymbol: symbol) + + XCTAssertEqual(actual, expected) + } + } + + /// Tests, whether the `DisplayRepresentation` retrieved via SFSafeSymbols is equal to the one retrieved via the `String` initializer + @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *) + func testDisplayRepresentation() { + for symbol in TestHelper.allSymbolsWithVariants { + print("Testing validity of \"\(symbol.rawValue)\" via DisplayRepresentation init") + + let expected = DisplayRepresentation(title: "", image: DisplayRepresentation.Image(systemName: symbol.rawValue)) + let actual = DisplayRepresentation(title: "", systemSymbol: symbol) + + XCTAssertEqual(actual.image, expected.image) + } + } +} From 7d20717dcda6f23b35283c0a0ac11cd25ff36481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Schmidt?= Date: Mon, 22 Jan 2024 14:40:32 +0100 Subject: [PATCH 2/2] Rename files --- SFSafeSymbols.xcodeproj/project.pbxproj | 15 ++++++++------- ...swift => DisplayRepresentationExtension.swift} | 0 ... => DisplayRepresentationImageExtension.swift} | 0 3 files changed, 8 insertions(+), 7 deletions(-) rename Sources/SFSafeSymbols/Initializers/AppIntents/{DisplayRepresentation.swift => DisplayRepresentationExtension.swift} (100%) rename Sources/SFSafeSymbols/Initializers/AppIntents/{DisplayRepresentation.Image.swift => DisplayRepresentationImageExtension.swift} (100%) diff --git a/SFSafeSymbols.xcodeproj/project.pbxproj b/SFSafeSymbols.xcodeproj/project.pbxproj index afdb07b..4df527d 100644 --- a/SFSafeSymbols.xcodeproj/project.pbxproj +++ b/SFSafeSymbols.xcodeproj/project.pbxproj @@ -24,8 +24,8 @@ 636A46C928002819007E6028 /* SFSymbol+AllSymbols+2.1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A46B928002819007E6028 /* SFSymbol+AllSymbols+2.1.swift */; }; 636A46CA28002819007E6028 /* SFSymbol+AllSymbols+2.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A46BA28002819007E6028 /* SFSymbol+AllSymbols+2.0.swift */; }; 636EBFD427EB2ABC005CFF4C /* SymbolWithLocalizations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636EBFD327EB2ABC005CFF4C /* SymbolWithLocalizations.swift */; }; - 8AD97FE02B5E9AC20058C050 /* DisplayRepresentation.Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentation.Image.swift */; }; - 8AD97FE22B5E9B790058C050 /* DisplayRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FE12B5E9B790058C050 /* DisplayRepresentation.swift */; }; + 8AD97FE02B5E9AC20058C050 /* DisplayRepresentationImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentationImageExtension.swift */; }; + 8AD97FE22B5E9B790058C050 /* DisplayRepresentationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FE12B5E9B790058C050 /* DisplayRepresentationExtension.swift */; }; 8AD97FE62B5EA17D0058C050 /* DisplayRepresentationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD97FE42B5EA0B70058C050 /* DisplayRepresentationTests.swift */; }; B00FBD8E285E146400A7878B /* LocalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B00FBD8D285E146400A7878B /* LocalizationTests.swift */; }; B01C186D2B55D9B300AC4288 /* SFSymbol+5.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = B01C18652B55D9B300AC4288 /* SFSymbol+5.0.swift */; }; @@ -88,8 +88,8 @@ 636A46B928002819007E6028 /* SFSymbol+AllSymbols+2.1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SFSymbol+AllSymbols+2.1.swift"; sourceTree = ""; }; 636A46BA28002819007E6028 /* SFSymbol+AllSymbols+2.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SFSymbol+AllSymbols+2.0.swift"; sourceTree = ""; }; 636EBFD327EB2ABC005CFF4C /* SymbolWithLocalizations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolWithLocalizations.swift; sourceTree = ""; }; - 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentation.Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentation.Image.swift; sourceTree = ""; }; - 8AD97FE12B5E9B790058C050 /* DisplayRepresentation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentation.swift; sourceTree = ""; }; + 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentationImageExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentationImageExtension.swift; sourceTree = ""; }; + 8AD97FE12B5E9B790058C050 /* DisplayRepresentationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentationExtension.swift; sourceTree = ""; }; 8AD97FE42B5EA0B70058C050 /* DisplayRepresentationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayRepresentationTests.swift; sourceTree = ""; }; B00FBD8D285E146400A7878B /* LocalizationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationTests.swift; sourceTree = ""; }; B01C18652B55D9B300AC4288 /* SFSymbol+5.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SFSymbol+5.0.swift"; sourceTree = ""; }; @@ -155,8 +155,8 @@ 8AD97FDE2B5E9A830058C050 /* AppIntents */ = { isa = PBXGroup; children = ( - 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentation.Image.swift */, - 8AD97FE12B5E9B790058C050 /* DisplayRepresentation.swift */, + 8AD97FDF2B5E9AC20058C050 /* DisplayRepresentationImageExtension.swift */, + 8AD97FE12B5E9B790058C050 /* DisplayRepresentationExtension.swift */, ); path = AppIntents; sourceTree = ""; @@ -463,7 +463,7 @@ B01C186E2B55D9B300AC4288 /* SFSymbol+5.2.swift in Sources */, 636A46BD28002819007E6028 /* SFSymbol+2.0.swift in Sources */, CCCCCFEF252F61E700C7CE9F /* UIApplicationShortcutIconExtension.swift in Sources */, - 8AD97FE02B5E9AC20058C050 /* DisplayRepresentation.Image.swift in Sources */, + 8AD97FE02B5E9AC20058C050 /* DisplayRepresentationImageExtension.swift in Sources */, 636A46BE28002819007E6028 /* SFSymbol+AllSymbols+3.2.swift in Sources */, B01C186D2B55D9B300AC4288 /* SFSymbol+5.0.swift in Sources */, CCA29C3D285B4E9400133245 /* SFSymbol+AllSymbols+4.0.swift in Sources */, @@ -473,6 +473,7 @@ CCCCCFF1252F61E700C7CE9F /* UIImageExtension.swift in Sources */, B01C18712B55D9B300AC4288 /* SFSymbol+5.1.swift in Sources */, 8AD97FE22B5E9B790058C050 /* DisplayRepresentation.swift in Sources */, + 8AD97FE22B5E9B790058C050 /* DisplayRepresentationExtension.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.swift b/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentationExtension.swift similarity index 100% rename from Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.swift rename to Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentationExtension.swift diff --git a/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.Image.swift b/Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentationImageExtension.swift similarity index 100% rename from Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentation.Image.swift rename to Sources/SFSafeSymbols/Initializers/AppIntents/DisplayRepresentationImageExtension.swift