diff --git a/FollowActionExtension/ActionRequestHandler.swift b/FollowActionExtension/ActionRequestHandler.swift deleted file mode 100644 index bcfc2a66b..000000000 --- a/FollowActionExtension/ActionRequestHandler.swift +++ /dev/null @@ -1,91 +0,0 @@ -// -// ActionRequestHandler.swift -// FollowActionExtension -// -// Created by Marcus Kida on 03.01.23. -// - -import UIKit -import MobileCoreServices -import UniformTypeIdentifiers - -class ActionRequestHandler: NSObject, NSExtensionRequestHandling { - - var extensionContext: NSExtensionContext? - - func beginRequest(with context: NSExtensionContext) { - // Do not call super in an Action extension with no user interface - self.extensionContext = context - - var found = false - - // Find the item containing the results from the JavaScript preprocessing. - outer: - for item in context.inputItems as! [NSExtensionItem] { - if let attachments = item.attachments { - for itemProvider in attachments { - if itemProvider.hasItemConformingToTypeIdentifier(UTType.propertyList.identifier) { - itemProvider.loadItem(forTypeIdentifier: UTType.propertyList.identifier, options: nil, completionHandler: { (item, error) in - guard - let dictionary = item as? [String: Any], - let res = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as? [String: Any]? ?? [:] - else { - - self.doneWithResults( - ["error": "Failed to find username. Are you sure this is a Mastodon Profile page?"] - ) - return - } - - OperationQueue.main.addOperation { - self.itemLoadCompletedWithPreprocessingResults(res) - } - }) - found = true - break outer - } - } - } - } - - if !found { - self.doneWithResults(nil) - } - } - - func itemLoadCompletedWithPreprocessingResults(_ javaScriptPreprocessingResults: [String: Any]) { - guard let username = javaScriptPreprocessingResults["username"] as? String else { return } - - doneWithResults([ - "openURL": "mastodon://profile/\(username)" - ]) - } - - func doneWithResults(_ resultsForJavaScriptFinalizeArg: [String: Any]?) { - if let resultsForJavaScriptFinalize = resultsForJavaScriptFinalizeArg { - // Construct an NSExtensionItem of the appropriate type to return our - // results dictionary in. - - // These will be used as the arguments to the JavaScript finalize() - // method. - - let resultsDictionary = [NSExtensionJavaScriptFinalizeArgumentKey: resultsForJavaScriptFinalize] - - let resultsProvider = NSItemProvider(item: resultsDictionary as NSDictionary, typeIdentifier: UTType.propertyList.identifier) - - let resultsItem = NSExtensionItem() - resultsItem.attachments = [resultsProvider] - - // Signal that we're complete, returning our results. - self.extensionContext!.completeRequest(returningItems: [resultsItem], completionHandler: nil) - } else { - // We still need to signal that we're done even if we have nothing to - // pass back. - self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) - } - - // Don't hold on to this after we finished with it. - self.extensionContext = nil - } - -} diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index b9259986a..a187164b5 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -29,10 +29,10 @@ 2A506CF4292CD85800059C37 /* FollowedTagsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A506CF3292CD85800059C37 /* FollowedTagsViewController.swift */; }; 2A506CF6292D040100059C37 /* HashtagTimelineHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A506CF5292D040100059C37 /* HashtagTimelineHeaderView.swift */; }; 2A64515E29642A8A00CD8B8A /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A6451022964223800CD8B8A /* UniformTypeIdentifiers.framework */; }; - 2A64516129642A8B00CD8B8A /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A64516029642A8B00CD8B8A /* Media.xcassets */; }; - 2A64516329642A8B00CD8B8A /* ActionRequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A64516229642A8B00CD8B8A /* ActionRequestHandler.swift */; }; - 2A64516529642A8B00CD8B8A /* Action.js in Resources */ = {isa = PBXBuildFile; fileRef = 2A64516429642A8B00CD8B8A /* Action.js */; }; - 2A64516929642A8B00CD8B8A /* FollowActionExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2A64515D29642A8A00CD8B8A /* FollowActionExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 2A64516929642A8B00CD8B8A /* OpenInActionExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2A64515D29642A8A00CD8B8A /* OpenInActionExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 2A71F541296DBDA80049F54A /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A71F53D296DBDA80049F54A /* Media.xcassets */; }; + 2A71F542296DBDA80049F54A /* Action.js in Resources */ = {isa = PBXBuildFile; fileRef = 2A71F53E296DBDA80049F54A /* Action.js */; }; + 2A71F543296DBDA80049F54A /* ActionRequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A71F53F296DBDA80049F54A /* ActionRequestHandler.swift */; }; 2A76F75C2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A76F75B2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift */; }; 2A82294F29262EE000D2A1F7 /* AppContext+NextAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A82294E29262EE000D2A1F7 /* AppContext+NextAccount.swift */; }; 2AB12E4629362F27006BC925 /* DataSourceFacade+Translate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AB12E4529362F27006BC925 /* DataSourceFacade+Translate.swift */; }; @@ -533,7 +533,7 @@ dstSubfolderSpec = 13; files = ( DB8FABCE26AEC7B2008E5AF4 /* MastodonIntent.appex in Embed Foundation Extensions */, - 2A64516929642A8B00CD8B8A /* FollowActionExtension.appex in Embed Foundation Extensions */, + 2A64516929642A8B00CD8B8A /* OpenInActionExtension.appex in Embed Foundation Extensions */, DBC6461C26A170AB00B0E31B /* ShareActionExtension.appex in Embed Foundation Extensions */, DBF8AE1A263293E400C9C23C /* NotificationService.appex in Embed Foundation Extensions */, ); @@ -567,11 +567,11 @@ 2A506CF3292CD85800059C37 /* FollowedTagsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowedTagsViewController.swift; sourceTree = ""; }; 2A506CF5292D040100059C37 /* HashtagTimelineHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagTimelineHeaderView.swift; sourceTree = ""; }; 2A6451022964223800CD8B8A /* UniformTypeIdentifiers.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UniformTypeIdentifiers.framework; path = System/Library/Frameworks/UniformTypeIdentifiers.framework; sourceTree = SDKROOT; }; - 2A64515D29642A8A00CD8B8A /* FollowActionExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = FollowActionExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 2A64516029642A8B00CD8B8A /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; - 2A64516229642A8B00CD8B8A /* ActionRequestHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionRequestHandler.swift; sourceTree = ""; }; - 2A64516429642A8B00CD8B8A /* Action.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = Action.js; sourceTree = ""; }; - 2A64516629642A8B00CD8B8A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2A64515D29642A8A00CD8B8A /* OpenInActionExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OpenInActionExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 2A71F53D296DBDA80049F54A /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; + 2A71F53E296DBDA80049F54A /* Action.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = Action.js; sourceTree = ""; }; + 2A71F53F296DBDA80049F54A /* ActionRequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionRequestHandler.swift; sourceTree = ""; }; + 2A71F540296DBDA80049F54A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2A76F75B2930D94700B3388D /* HashtagTimelineHeaderViewActionButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagTimelineHeaderViewActionButton.swift; sourceTree = ""; }; 2A82294E29262EE000D2A1F7 /* AppContext+NextAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppContext+NextAccount.swift"; sourceTree = ""; }; 2AB12E4529362F27006BC925 /* DataSourceFacade+Translate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Translate.swift"; sourceTree = ""; }; @@ -1318,15 +1318,15 @@ path = FollowedTags; sourceTree = ""; }; - 2A64515F29642A8B00CD8B8A /* FollowActionExtension */ = { + 2A71F53C296DBDA80049F54A /* OpenInActionExtension */ = { isa = PBXGroup; children = ( - 2A64516029642A8B00CD8B8A /* Media.xcassets */, - 2A64516229642A8B00CD8B8A /* ActionRequestHandler.swift */, - 2A64516429642A8B00CD8B8A /* Action.js */, - 2A64516629642A8B00CD8B8A /* Info.plist */, + 2A71F53D296DBDA80049F54A /* Media.xcassets */, + 2A71F53E296DBDA80049F54A /* Action.js */, + 2A71F53F296DBDA80049F54A /* ActionRequestHandler.swift */, + 2A71F540296DBDA80049F54A /* Info.plist */, ); - path = FollowActionExtension; + path = OpenInActionExtension; sourceTree = ""; }; 2D152A8A25C295B8009AA50C /* Content */ = { @@ -1865,7 +1865,7 @@ DBF8AE14263293E400C9C23C /* NotificationService */, DBC6461326A170AB00B0E31B /* ShareActionExtension */, DB8FABC826AEC7B2008E5AF4 /* MastodonIntent */, - 2A64515F29642A8B00CD8B8A /* FollowActionExtension */, + 2A71F53C296DBDA80049F54A /* OpenInActionExtension */, DB427DD325BAA00100D1B89D /* Products */, 1EBA4F56E920856A3FC84ACB /* Pods */, 3FE14AD363ED19AE7FF210A6 /* Frameworks */, @@ -1883,7 +1883,7 @@ DBF8AE13263293E400C9C23C /* NotificationService.appex */, DBC6461226A170AB00B0E31B /* ShareActionExtension.appex */, DB8FABC626AEC7B2008E5AF4 /* MastodonIntent.appex */, - 2A64515D29642A8A00CD8B8A /* FollowActionExtension.appex */, + 2A64515D29642A8A00CD8B8A /* OpenInActionExtension.appex */, ); name = Products; sourceTree = ""; @@ -2825,9 +2825,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 2A64515C29642A8A00CD8B8A /* FollowActionExtension */ = { + 2A64515C29642A8A00CD8B8A /* OpenInActionExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = 2A64516A29642A8B00CD8B8A /* Build configuration list for PBXNativeTarget "FollowActionExtension" */; + buildConfigurationList = 2A64516A29642A8B00CD8B8A /* Build configuration list for PBXNativeTarget "OpenInActionExtension" */; buildPhases = ( 2A64515929642A8A00CD8B8A /* Sources */, 2A64515A29642A8A00CD8B8A /* Frameworks */, @@ -2837,9 +2837,9 @@ ); dependencies = ( ); - name = FollowActionExtension; + name = OpenInActionExtension; productName = FollowActionExtension; - productReference = 2A64515D29642A8A00CD8B8A /* FollowActionExtension.appex */; + productReference = 2A64515D29642A8A00CD8B8A /* OpenInActionExtension.appex */; productType = "com.apple.product-type.app-extension"; }; DB427DD125BAA00100D1B89D /* Mastodon */ = { @@ -3057,7 +3057,7 @@ DBF8AE12263293E400C9C23C /* NotificationService */, DBC6461126A170AB00B0E31B /* ShareActionExtension */, DB8FABC526AEC7B2008E5AF4 /* MastodonIntent */, - 2A64515C29642A8A00CD8B8A /* FollowActionExtension */, + 2A64515C29642A8A00CD8B8A /* OpenInActionExtension */, ); }; /* End PBXProject section */ @@ -3067,8 +3067,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2A64516529642A8B00CD8B8A /* Action.js in Resources */, - 2A64516129642A8B00CD8B8A /* Media.xcassets in Resources */, + 2A71F541296DBDA80049F54A /* Media.xcassets in Resources */, + 2A71F542296DBDA80049F54A /* Action.js in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3294,7 +3294,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2A64516329642A8B00CD8B8A /* ActionRequestHandler.swift in Sources */, + 2A71F543296DBDA80049F54A /* ActionRequestHandler.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3760,7 +3760,7 @@ /* Begin PBXTargetDependency section */ 2A64516829642A8B00CD8B8A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 2A64515C29642A8A00CD8B8A /* FollowActionExtension */; + target = 2A64515C29642A8A00CD8B8A /* OpenInActionExtension */; targetProxy = 2A64516729642A8B00CD8B8A /* PBXContainerItemProxy */; }; DB427DEA25BAA00100D1B89D /* PBXTargetDependency */ = { @@ -3929,8 +3929,8 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 5Z4GVSS33P; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = FollowActionExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Follow on Mastodon"; + INFOPLIST_FILE = OpenInActionExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Open using Mastodon"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -3939,7 +3939,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.FollowActionExtension; + PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.OpenInActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -3958,8 +3958,8 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 5Z4GVSS33P; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = FollowActionExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Follow on Mastodon"; + INFOPLIST_FILE = OpenInActionExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Open using Mastodon"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -3968,7 +3968,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.FollowActionExtension; + PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.OpenInActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -3987,8 +3987,8 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 5Z4GVSS33P; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = FollowActionExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Follow on Mastodon"; + INFOPLIST_FILE = OpenInActionExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Open using Mastodon"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -3997,7 +3997,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.FollowActionExtension; + PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.OpenInActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -4016,8 +4016,8 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 5Z4GVSS33P; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = FollowActionExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Follow on Mastodon"; + INFOPLIST_FILE = OpenInActionExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Open using Mastodon"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -4026,7 +4026,7 @@ "@executable_path/../../Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.FollowActionExtension; + PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.OpenInActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -4857,7 +4857,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2A64516A29642A8B00CD8B8A /* Build configuration list for PBXNativeTarget "FollowActionExtension" */ = { + 2A64516A29642A8B00CD8B8A /* Build configuration list for PBXNativeTarget "OpenInActionExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( 2A64516B29642A8B00CD8B8A /* Debug */, diff --git a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved index e029f5bed..d2dce549d 100644 --- a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,250 +1,248 @@ { - "object": { - "pins": [ - { - "package": "Alamofire", - "repositoryURL": "https://github.com/Alamofire/Alamofire.git", - "state": { - "branch": null, - "revision": "8dd85aee02e39dd280c75eef88ffdb86eed4b07b", - "version": "5.6.2" - } - }, - { - "package": "AlamofireImage", - "repositoryURL": "https://github.com/Alamofire/AlamofireImage.git", - "state": { - "branch": null, - "revision": "98cbb00ce0ec5fc8e52a5b50a6bfc08d3e5aee10", - "version": "4.2.0" - } - }, - { - "package": "CommonOSLog", - "repositoryURL": "https://github.com/MainasuK/CommonOSLog", - "state": { - "branch": null, - "revision": "c121624a30698e9886efe38aebb36ff51c01b6c2", - "version": "0.1.1" - } - }, - { - "package": "FaviconFinder", - "repositoryURL": "https://github.com/will-lumley/FaviconFinder.git", - "state": { - "branch": null, - "revision": "1f74844f77f79b95c0bb0130b3a87d4f340e6d3a", - "version": "3.3.0" - } - }, - { - "package": "FLAnimatedImage", - "repositoryURL": "https://github.com/Flipboard/FLAnimatedImage.git", - "state": { - "branch": null, - "revision": "d4f07b6f164d53c1212c3e54d6460738b1981e9f", - "version": "1.0.17" - } - }, - { - "package": "FPSIndicator", - "repositoryURL": "https://github.com/MainasuK/FPSIndicator.git", - "state": { - "branch": null, - "revision": "e4a5067ccd5293b024c767f09e51056afd4a4796", - "version": "1.1.0" - } - }, - { - "package": "Fuzi", - "repositoryURL": "https://github.com/cezheng/Fuzi.git", - "state": { - "branch": null, - "revision": "f08c8323da21e985f3772610753bcfc652c2103f", - "version": "3.1.3" - } - }, - { - "package": "KeychainAccess", - "repositoryURL": "https://github.com/kishikawakatsumi/KeychainAccess.git", - "state": { - "branch": null, - "revision": "84e546727d66f1adc5439debad16270d0fdd04e7", - "version": "4.2.2" - } - }, - { - "package": "Kingfisher", - "repositoryURL": "https://github.com/onevcat/Kingfisher.git", - "state": { - "branch": null, - "revision": "44e891bdb61426a95e31492a67c7c0dfad1f87c5", - "version": "7.4.1" - } - }, - { - "package": "MetaTextKit", - "repositoryURL": "https://github.com/TwidereProject/MetaTextKit.git", - "state": { - "branch": null, - "revision": "dcd5255d6930c2fab408dc8562c577547e477624", - "version": "2.2.5" - } - }, - { - "package": "NextLevelSessionExporter", - "repositoryURL": "https://github.com/NextLevel/NextLevelSessionExporter.git", - "state": { - "branch": null, - "revision": "b6c0cce1aa37fe1547d694f958fac3c3524b74da", - "version": "0.4.6" - } - }, - { - "package": "Nuke", - "repositoryURL": "https://github.com/kean/Nuke.git", - "state": { - "branch": null, - "revision": "a002b7fd786f2df2ed4333fe73a9727499fd9d97", - "version": "10.11.2" - } - }, - { - "package": "NukeFLAnimatedImagePlugin", - "repositoryURL": "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", - "state": { - "branch": null, - "revision": "b59c346a7d536336db3b0f12c72c6e53ee709e16", - "version": "8.0.0" - } - }, - { - "package": "Pageboy", - "repositoryURL": "https://github.com/uias/Pageboy", - "state": { - "branch": null, - "revision": "af8fa81788b893205e1ff42ddd88c5b0b315d7c5", - "version": "3.7.0" - } - }, - { - "package": "PanModal", - "repositoryURL": "https://github.com/slackhq/PanModal.git", - "state": { - "branch": null, - "revision": "b012aecb6b67a8e46369227f893c12544846613f", - "version": "1.2.7" - } - }, - { - "package": "SDWebImage", - "repositoryURL": "https://github.com/SDWebImage/SDWebImage.git", - "state": { - "branch": null, - "revision": "3312bf5e67b52fbce7c3caf431b0cda721a9f7bb", - "version": "5.14.2" - } - }, - { - "package": "Stripes", - "repositoryURL": "https://github.com/eneko/Stripes.git", - "state": { - "branch": null, - "revision": "d533fd44b8043a3abbf523e733599173d6f98c11", - "version": "0.2.0" - } - }, - { - "package": "swift-collections", - "repositoryURL": "https://github.com/apple/swift-collections.git", - "state": { - "branch": null, - "revision": "f504716c27d2e5d4144fa4794b12129301d17729", - "version": "1.0.3" - } - }, - { - "package": "swift-nio", - "repositoryURL": "https://github.com/apple/swift-nio.git", - "state": { - "branch": null, - "revision": "546610d52b19be3e19935e0880bb06b9c03f5cef", - "version": "1.14.4" - } - }, - { - "package": "swift-nio-zlib-support", - "repositoryURL": "https://github.com/apple/swift-nio-zlib-support.git", - "state": { - "branch": null, - "revision": "37760e9a52030bb9011972c5213c3350fa9d41fd", - "version": "1.0.0" - } - }, - { - "package": "SwiftSoup", - "repositoryURL": "https://github.com/scinfu/SwiftSoup.git", - "state": { - "branch": null, - "revision": "6778575285177365cbad3e5b8a72f2a20583cfec", - "version": "2.4.3" - } - }, - { - "package": "Introspect", - "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect.git", - "state": { - "branch": null, - "revision": "f2616860a41f9d9932da412a8978fec79c06fe24", - "version": "0.1.4" - } - }, - { - "package": "TabBarPager", - "repositoryURL": "https://github.com/TwidereProject/TabBarPager.git", - "state": { - "branch": null, - "revision": "488aa66d157a648901b61721212c0dec23d27ee5", - "version": "0.1.0" - } - }, - { - "package": "Tabman", - "repositoryURL": "https://github.com/uias/Tabman", - "state": { - "branch": null, - "revision": "4a4f7c755b875ffd4f9ef10d67a67883669d2465", - "version": "2.13.0" - } - }, - { - "package": "TOCropViewController", - "repositoryURL": "https://github.com/TimOliver/TOCropViewController.git", - "state": { - "branch": null, - "revision": "d0470491f56e734731bbf77991944c0dfdee3e0e", - "version": "2.6.1" - } - }, - { - "package": "UIHostingConfigurationBackport", - "repositoryURL": "https://github.com/woxtu/UIHostingConfigurationBackport.git", - "state": { - "branch": null, - "revision": "6091f2d38faa4b24fc2ca0389c651e2f666624a3", - "version": "0.1.0" - } - }, - { - "package": "UITextView+Placeholder", - "repositoryURL": "https://github.com/MainasuK/UITextView-Placeholder.git", - "state": { - "branch": null, - "revision": "20f513ded04a040cdf5467f0891849b1763ede3b", - "version": "1.4.1" - } + "pins" : [ + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "8dd85aee02e39dd280c75eef88ffdb86eed4b07b", + "version" : "5.6.2" } - ] - }, - "version": 1 + }, + { + "identity" : "alamofireimage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/AlamofireImage.git", + "state" : { + "revision" : "98cbb00ce0ec5fc8e52a5b50a6bfc08d3e5aee10", + "version" : "4.2.0" + } + }, + { + "identity" : "commonoslog", + "kind" : "remoteSourceControl", + "location" : "https://github.com/MainasuK/CommonOSLog", + "state" : { + "revision" : "c121624a30698e9886efe38aebb36ff51c01b6c2", + "version" : "0.1.1" + } + }, + { + "identity" : "faviconfinder", + "kind" : "remoteSourceControl", + "location" : "https://github.com/will-lumley/FaviconFinder.git", + "state" : { + "revision" : "1f74844f77f79b95c0bb0130b3a87d4f340e6d3a", + "version" : "3.3.0" + } + }, + { + "identity" : "flanimatedimage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Flipboard/FLAnimatedImage.git", + "state" : { + "revision" : "d4f07b6f164d53c1212c3e54d6460738b1981e9f", + "version" : "1.0.17" + } + }, + { + "identity" : "fpsindicator", + "kind" : "remoteSourceControl", + "location" : "https://github.com/MainasuK/FPSIndicator.git", + "state" : { + "revision" : "e4a5067ccd5293b024c767f09e51056afd4a4796", + "version" : "1.1.0" + } + }, + { + "identity" : "fuzi", + "kind" : "remoteSourceControl", + "location" : "https://github.com/cezheng/Fuzi.git", + "state" : { + "revision" : "f08c8323da21e985f3772610753bcfc652c2103f", + "version" : "3.1.3" + } + }, + { + "identity" : "keychainaccess", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git", + "state" : { + "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7", + "version" : "4.2.2" + } + }, + { + "identity" : "kingfisher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/onevcat/Kingfisher.git", + "state" : { + "revision" : "44e891bdb61426a95e31492a67c7c0dfad1f87c5", + "version" : "7.4.1" + } + }, + { + "identity" : "metatextkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/TwidereProject/MetaTextKit.git", + "state" : { + "revision" : "dcd5255d6930c2fab408dc8562c577547e477624", + "version" : "2.2.5" + } + }, + { + "identity" : "nextlevelsessionexporter", + "kind" : "remoteSourceControl", + "location" : "https://github.com/NextLevel/NextLevelSessionExporter.git", + "state" : { + "revision" : "b6c0cce1aa37fe1547d694f958fac3c3524b74da", + "version" : "0.4.6" + } + }, + { + "identity" : "nuke", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kean/Nuke.git", + "state" : { + "revision" : "a002b7fd786f2df2ed4333fe73a9727499fd9d97", + "version" : "10.11.2" + } + }, + { + "identity" : "nuke-flanimatedimage-plugin", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", + "state" : { + "revision" : "b59c346a7d536336db3b0f12c72c6e53ee709e16", + "version" : "8.0.0" + } + }, + { + "identity" : "pageboy", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uias/Pageboy", + "state" : { + "revision" : "af8fa81788b893205e1ff42ddd88c5b0b315d7c5", + "version" : "3.7.0" + } + }, + { + "identity" : "panmodal", + "kind" : "remoteSourceControl", + "location" : "https://github.com/slackhq/PanModal.git", + "state" : { + "revision" : "b012aecb6b67a8e46369227f893c12544846613f", + "version" : "1.2.7" + } + }, + { + "identity" : "sdwebimage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SDWebImage/SDWebImage.git", + "state" : { + "revision" : "3312bf5e67b52fbce7c3caf431b0cda721a9f7bb", + "version" : "5.14.2" + } + }, + { + "identity" : "stripes", + "kind" : "remoteSourceControl", + "location" : "https://github.com/eneko/Stripes.git", + "state" : { + "revision" : "d533fd44b8043a3abbf523e733599173d6f98c11", + "version" : "0.2.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "f504716c27d2e5d4144fa4794b12129301d17729", + "version" : "1.0.3" + } + }, + { + "identity" : "swift-nio", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio.git", + "state" : { + "revision" : "546610d52b19be3e19935e0880bb06b9c03f5cef", + "version" : "1.14.4" + } + }, + { + "identity" : "swift-nio-zlib-support", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-zlib-support.git", + "state" : { + "revision" : "37760e9a52030bb9011972c5213c3350fa9d41fd", + "version" : "1.0.0" + } + }, + { + "identity" : "swiftsoup", + "kind" : "remoteSourceControl", + "location" : "https://github.com/scinfu/SwiftSoup.git", + "state" : { + "revision" : "6778575285177365cbad3e5b8a72f2a20583cfec", + "version" : "2.4.3" + } + }, + { + "identity" : "swiftui-introspect", + "kind" : "remoteSourceControl", + "location" : "https://github.com/siteline/SwiftUI-Introspect.git", + "state" : { + "revision" : "f2616860a41f9d9932da412a8978fec79c06fe24", + "version" : "0.1.4" + } + }, + { + "identity" : "tabbarpager", + "kind" : "remoteSourceControl", + "location" : "https://github.com/TwidereProject/TabBarPager.git", + "state" : { + "revision" : "488aa66d157a648901b61721212c0dec23d27ee5", + "version" : "0.1.0" + } + }, + { + "identity" : "tabman", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uias/Tabman", + "state" : { + "revision" : "4a4f7c755b875ffd4f9ef10d67a67883669d2465", + "version" : "2.13.0" + } + }, + { + "identity" : "tocropviewcontroller", + "kind" : "remoteSourceControl", + "location" : "https://github.com/TimOliver/TOCropViewController.git", + "state" : { + "revision" : "d0470491f56e734731bbf77991944c0dfdee3e0e", + "version" : "2.6.1" + } + }, + { + "identity" : "uihostingconfigurationbackport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/woxtu/UIHostingConfigurationBackport.git", + "state" : { + "revision" : "6091f2d38faa4b24fc2ca0389c651e2f666624a3", + "version" : "0.1.0" + } + }, + { + "identity" : "uitextview-placeholder", + "kind" : "remoteSourceControl", + "location" : "https://github.com/MainasuK/UITextView-Placeholder.git", + "state" : { + "revision" : "20f513ded04a040cdf5467f0891849b1763ede3b", + "version" : "1.4.1" + } + } + ], + "version" : 2 } diff --git a/FollowActionExtension/Action.js b/OpenInActionExtension/Action.js similarity index 51% rename from FollowActionExtension/Action.js rename to OpenInActionExtension/Action.js index 3f8f93723..75982b50f 100644 --- a/FollowActionExtension/Action.js +++ b/OpenInActionExtension/Action.js @@ -1,6 +1,6 @@ // // Action.js -// FollowActionExtension +// OpenInActionExtension // // Created by Marcus Kida on 03.01.23. // @@ -10,15 +10,13 @@ var Action = function() {}; Action.prototype = { run: function(arguments) { - var username = document.documentURI.match("@(.+)@([a-z0-9]+\.[a-z0-9]+)")[0]; - if (!username) { - username = document.head.querySelector('[property="profile:username"]').content + var username = detectUsername() + + if (username) { + arguments.completionFunction({ "username" : username }) } - - console.log("username" + username) - - arguments.completionFunction({ "username" : username }) + }, finalize: function(arguments) { @@ -34,5 +32,19 @@ Action.prototype = { } }; + +function detectUsername() { + var uriUsername = document.documentURI.match("@(.+)@([a-z0-9]+\.[a-z0-9]+)") + + if (typeof uriUsername === "Array") { + return uriUsername[0] + } + + return document.head.querySelector('[property="profile:username"]').content +} + +function detectPost() { + +} var ExtensionPreprocessingJS = new Action diff --git a/OpenInActionExtension/ActionRequestHandler.swift b/OpenInActionExtension/ActionRequestHandler.swift new file mode 100644 index 000000000..f8fb0f8e8 --- /dev/null +++ b/OpenInActionExtension/ActionRequestHandler.swift @@ -0,0 +1,75 @@ +// +// ActionRequestHandler.swift +// OpenInActionExtension +// +// Created by Marcus Kida on 03.01.23. +// + +import UIKit +import MobileCoreServices +import UniformTypeIdentifiers + +class ActionRequestHandler: NSObject, NSExtensionRequestHandling { + + var extensionContext: NSExtensionContext? + + func beginRequest(with context: NSExtensionContext) { + // Do not call super in an Action extension with no user interface + self.extensionContext = context + + guard + let itemProvider = context.inputItems + .compactMap({ $0 as? NSExtensionItem }) + .reduce([NSItemProvider](), { partialResult, acc in + var nextResult = partialResult + nextResult += acc.attachments ?? [] + return nextResult + }) + .filter({ $0.hasItemConformingToTypeIdentifier(UTType.propertyList.identifier) }) + .first + else { + return self.completeWithNotFoundError() + } + + itemProvider.loadItem(forTypeIdentifier: UTType.propertyList.identifier, options: nil, completionHandler: { (item, error) in + guard + let dictionary = item as? [String: Any], + let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as? [String: Any]? ?? [:] + else { + return self.completeWithNotFoundError() + } + + DispatchQueue.main.async { + self.completeWithOpenUserProfile(results) + } + }) + } +} + +private extension ActionRequestHandler { + func completeWithOpenUserProfile(_ results: [String: Any]) { + guard let username = results["username"] as? String else { return } + doneWithResults([ + "openURL": "mastodon://profile/\(username)" + ]) + } + + func completeWithNotFoundError() { + doneWithResults( + ["error": "Failed to find username. Are you sure this is a Mastodon Profile page?"] + ) + } + + func doneWithResults(_ resultsForJavaScriptFinalizeArg: [String: Any]?) { + if let resultsForJavaScriptFinalize = resultsForJavaScriptFinalizeArg { + let resultsDictionary = [NSExtensionJavaScriptFinalizeArgumentKey: resultsForJavaScriptFinalize] + let resultsProvider = NSItemProvider(item: resultsDictionary as NSDictionary, typeIdentifier: UTType.propertyList.identifier) + let resultsItem = NSExtensionItem() + resultsItem.attachments = [resultsProvider] + self.extensionContext!.completeRequest(returningItems: [resultsItem], completionHandler: nil) + } else { + self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil) + } + self.extensionContext = nil + } +} diff --git a/FollowActionExtension/Info.plist b/OpenInActionExtension/Info.plist similarity index 100% rename from FollowActionExtension/Info.plist rename to OpenInActionExtension/Info.plist diff --git a/FollowActionExtension/Media.xcassets/Contents.json b/OpenInActionExtension/Media.xcassets/Contents.json similarity index 100% rename from FollowActionExtension/Media.xcassets/Contents.json rename to OpenInActionExtension/Media.xcassets/Contents.json diff --git a/FollowActionExtension/Media.xcassets/Icon.appiconset/Contents.json b/OpenInActionExtension/Media.xcassets/Icon.appiconset/Contents.json similarity index 100% rename from FollowActionExtension/Media.xcassets/Icon.appiconset/Contents.json rename to OpenInActionExtension/Media.xcassets/Icon.appiconset/Contents.json diff --git a/FollowActionExtension/Media.xcassets/Icon.appiconset/MastodonActionExtensionIcon@3x.png b/OpenInActionExtension/Media.xcassets/Icon.appiconset/MastodonActionExtensionIcon@3x.png similarity index 100% rename from FollowActionExtension/Media.xcassets/Icon.appiconset/MastodonActionExtensionIcon@3x.png rename to OpenInActionExtension/Media.xcassets/Icon.appiconset/MastodonActionExtensionIcon@3x.png diff --git a/FollowActionExtension/Media.xcassets/TouchBarBezel.colorset/Contents.json b/OpenInActionExtension/Media.xcassets/TouchBarBezel.colorset/Contents.json similarity index 100% rename from FollowActionExtension/Media.xcassets/TouchBarBezel.colorset/Contents.json rename to OpenInActionExtension/Media.xcassets/TouchBarBezel.colorset/Contents.json