From ac94168de0822e8cb7995c360c9dfecebc5ebb2d Mon Sep 17 00:00:00 2001 From: Bas Broek Date: Mon, 25 Sep 2017 16:36:07 +0200 Subject: [PATCH] Add handoff support for issues (#331) * Add handoff support for issues * Update Info.plist --- Classes/Issues/IssuesViewController.swift | 18 ++++++++- .../UIViewController+UserActivity.swift | 40 +++++++++++++++++++ Freetime.xcodeproj/project.pbxproj | 4 ++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 Classes/View Controllers/UIViewController+UserActivity.swift diff --git a/Classes/Issues/IssuesViewController.swift b/Classes/Issues/IssuesViewController.swift index 2472d842..39cb1f08 100644 --- a/Classes/Issues/IssuesViewController.swift +++ b/Classes/Issues/IssuesViewController.swift @@ -71,7 +71,7 @@ IssueTextActionsViewDelegate { // force unwrap, this absolutely must work super.init(collectionViewLayout: UICollectionViewFlowLayout())! - title = "\(model.owner)/\(model.repo)#\(model.number)" + title = issueTitle self.addCommentClient.addListener(listener: self) @@ -152,6 +152,18 @@ IssueTextActionsViewDelegate { rightItem.accessibilityLabel = NSLocalizedString("More options", comment: "") navigationItem.rightBarButtonItem = rightItem } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + let informator = HandoffInformator(activityName: "viewIssue", activityTitle: + issueTitle, url: externalURL) + setupUserActivity(with: informator) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + invalidateUserActivity() + } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() @@ -214,6 +226,10 @@ IssueTextActionsViewDelegate { var externalURL: URL { return URL(string: "https://github.com/\(model.owner)/\(model.repo)/issues/\(model.number)")! } + + var issueTitle: String { + return "\(model.owner)/\(model.repo)#\(model.number)" + } func shareAction(sender: UIBarButtonItem) -> UIAlertAction { return UIAlertAction(title: NSLocalizedString("Send To", comment: ""), style: .default) { [weak self] _ in diff --git a/Classes/View Controllers/UIViewController+UserActivity.swift b/Classes/View Controllers/UIViewController+UserActivity.swift new file mode 100644 index 00000000..940b1696 --- /dev/null +++ b/Classes/View Controllers/UIViewController+UserActivity.swift @@ -0,0 +1,40 @@ +// +// UIViewController+UserActivity.swift +// Freetime +// +// Created by Bas Broek on 20/09/2017. +// Copyright © 2017 Ryan Nystrom. All rights reserved. +// + +import Foundation + +protocol UserActivitySupporting { + var activityName: String { get } + var activityTitle: String { get } +} + +struct HandoffInformator: UserActivitySupporting { + let activityName: String + let activityTitle: String + let url: URL +} + +extension UIViewController { + + func setupUserActivity(with informator: HandoffInformator) { + let activity = NSUserActivity(activityType: "\(Bundle.main.bundleIdentifier ?? "").\(informator.activityTitle)") + activity.title = NSLocalizedString(informator.activityTitle, comment: "") + activity.webpageURL = informator.url + activity.isEligibleForHandoff = true + self.userActivity = activity + self.userActivity?.becomeCurrent() + } + + func resignUserActivity() { + userActivity?.resignCurrent() + } + + func invalidateUserActivity() { + userActivity?.invalidate() + } +} diff --git a/Freetime.xcodeproj/project.pbxproj b/Freetime.xcodeproj/project.pbxproj index 041cef0e..30752b89 100644 --- a/Freetime.xcodeproj/project.pbxproj +++ b/Freetime.xcodeproj/project.pbxproj @@ -314,6 +314,7 @@ 29FB942E1EE751F70016E6D4 /* IssueLabeledSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FB942D1EE751F70016E6D4 /* IssueLabeledSectionController.swift */; }; 29FB94301EE752280016E6D4 /* IssueLabeledCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FB942F1EE752280016E6D4 /* IssueLabeledCell.swift */; }; 29FF85A51EE1EA7A007B8762 /* ReactionContent+ReactionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29FF85A41EE1EA7A007B8762 /* ReactionContent+ReactionType.swift */; }; + 4920F1A81F72E27200131E9D /* UIViewController+UserActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4920F1A71F72E27200131E9D /* UIViewController+UserActivity.swift */; }; 4C733A0B57F91680B08D3CEC /* Pods_Freetime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 665D835932698FC1ED93ABE3 /* Pods_Freetime.framework */; }; 54AD5E8E1F24D953004A4BD6 /* FeedSelectionProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AD5E8D1F24D953004A4BD6 /* FeedSelectionProviding.swift */; }; 6224B05BDD260B22C7D6684F /* Pods_FreetimeTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB06D68438D845EC6D23788D /* Pods_FreetimeTests.framework */; }; @@ -642,6 +643,7 @@ 29FB94391EE767420016E6D4 /* Freetime-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Freetime-Bridging-Header.h"; sourceTree = ""; }; 29FF85A41EE1EA7A007B8762 /* ReactionContent+ReactionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ReactionContent+ReactionType.swift"; sourceTree = ""; }; 2DFFA8FCC50B686D7424BC06 /* Pods-Freetime.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Freetime.release.xcconfig"; path = "Pods/Target Support Files/Pods-Freetime/Pods-Freetime.release.xcconfig"; sourceTree = ""; }; + 4920F1A71F72E27200131E9D /* UIViewController+UserActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+UserActivity.swift"; sourceTree = ""; }; 54AD5E8D1F24D953004A4BD6 /* FeedSelectionProviding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedSelectionProviding.swift; sourceTree = ""; }; 665D835932698FC1ED93ABE3 /* Pods_Freetime.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Freetime.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7ADC39F0C328AE48CFFA207E /* Pods-FreetimeTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FreetimeTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-FreetimeTests/Pods-FreetimeTests.debug.xcconfig"; sourceTree = ""; }; @@ -1226,6 +1228,7 @@ 292CD3D71F0DC52900D3D57B /* UIViewController+IssueCommentHtmlCellNavigationDelegate.swift */, 297AE86A1EC0D5C200B44A1F /* UIViewController+LoadingIndicator.swift */, 292CD3D11F0DBEC000D3D57B /* UIViewController+Safari.swift */, + 4920F1A71F72E27200131E9D /* UIViewController+UserActivity.swift */, 290D2A3C1F044CB20082E6CC /* UIViewController+SmartDeselection.swift */, ); path = "View Controllers"; @@ -2005,6 +2008,7 @@ 290EF5761F06BA06006A2160 /* NoNewNotificationsCell.swift in Sources */, 295C31D11F0AA72000521CED /* IssueStatusEvent+ButtonState.swift in Sources */, 29C9FDCF1EC65FEE00EE3A52 /* Organization.swift in Sources */, + 4920F1A81F72E27200131E9D /* UIViewController+UserActivity.swift in Sources */, 29DA1E821F5DF5CC0050C64B /* SearchRecentStore.swift in Sources */, 292FCAFF1EDFCC510026635E /* IssueCommentSectionController.swift in Sources */, 986B871D1F2B8FCD00AAB55C /* SearchViewController.swift in Sources */,