diff --git a/Delta.xcodeproj/project.pbxproj b/Delta.xcodeproj/project.pbxproj index 1b7d117..411f8f3 100644 --- a/Delta.xcodeproj/project.pbxproj +++ b/Delta.xcodeproj/project.pbxproj @@ -134,6 +134,7 @@ BFB359442278FD7E00CFD920 /* N64DeltaCore_Video.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BFB359412278FD6700CFD920 /* N64DeltaCore_Video.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; BFB359452278FD8100CFD920 /* N64DeltaCore_RSP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFB359422278FD6800CFD920 /* N64DeltaCore_RSP.framework */; }; BFB359462278FD8100CFD920 /* N64DeltaCore_RSP.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BFB359422278FD6800CFD920 /* N64DeltaCore_RSP.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + BFB3645823245A6000CD0EB1 /* LicensesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB3645723245A6000CD0EB1 /* LicensesViewController.swift */; }; BFBAB2E31EB685A2004E0B0E /* DeltaCoreProtocol+Delta.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBAB2E21EB685A2004E0B0E /* DeltaCoreProtocol+Delta.swift */; }; BFC1F2CC22F9515F00606A45 /* CopyDeepLinkActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC1F2CB22F9515F00606A45 /* CopyDeepLinkActivity.swift */; }; BFC3628021ADE2BA00EF2BE6 /* UIAlertController+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC3627F21ADE2BA00EF2BE6 /* UIAlertController+Error.swift */; }; @@ -316,6 +317,7 @@ BFAB9F87219A4B670080EC7D /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; BFB359412278FD6700CFD920 /* N64DeltaCore_Video.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = N64DeltaCore_Video.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BFB359422278FD6800CFD920 /* N64DeltaCore_RSP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = N64DeltaCore_RSP.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BFB3645723245A6000CD0EB1 /* LicensesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicensesViewController.swift; sourceTree = ""; }; BFBAB2E21EB685A2004E0B0E /* DeltaCoreProtocol+Delta.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DeltaCoreProtocol+Delta.swift"; sourceTree = ""; }; BFC134E01AAD82460087AD7B /* SNESDeltaCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SNESDeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BFC1F2CB22F9515F00606A45 /* CopyDeepLinkActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyDeepLinkActivity.swift; sourceTree = ""; }; @@ -698,6 +700,7 @@ BFAA1FEC1B8AA4FA00495943 /* Settings.swift */, BF5E7F451B9A652600AE44F8 /* Settings.storyboard */, BF5E7F431B9A650B00AE44F8 /* SettingsViewController.swift */, + BFB3645723245A6000CD0EB1 /* LicensesViewController.swift */, BF71CF851FE8FFF1001F1613 /* App Icon Shortcuts */, BF11734E1DA32CEC00047DF8 /* Controllers */, BF1DAD5B1D9F574900E752A7 /* Controller Skins */, @@ -1029,6 +1032,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BFB3645823245A6000CD0EB1 /* LicensesViewController.swift in Sources */, BFC6F7B81F435BC500221B96 /* Input+Display.swift in Sources */, BF59426A1E09BBD00051894B /* GridCollectionViewCell.swift in Sources */, BF6BF3181EB82111008E83CD /* iTunesImportOption.swift in Sources */, diff --git a/Delta/Base.lproj/Settings.storyboard b/Delta/Base.lproj/Settings.storyboard index ae6413f..88f37d3 100644 --- a/Delta/Base.lproj/Settings.storyboard +++ b/Delta/Base.lproj/Settings.storyboard @@ -7,6 +7,7 @@ + @@ -19,7 +20,7 @@ diff --git a/Delta/Settings/LicensesViewController.swift b/Delta/Settings/LicensesViewController.swift new file mode 100644 index 0000000..3d0ac68 --- /dev/null +++ b/Delta/Settings/LicensesViewController.swift @@ -0,0 +1,49 @@ +// +// LicensesViewController.swift +// Delta +// +// Created by Riley Testut on 9/7/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +import UIKit + +class LicensesViewController: UIViewController +{ + private var _didAppear = false + + @IBOutlet private var textView: UITextView! + + override func viewWillAppear(_ animated: Bool) + { + super.viewWillAppear(animated) + + self.view.setNeedsLayout() + self.view.layoutIfNeeded() + + // Fix incorrect initial offset on iPhone SE. + self.textView.contentOffset.y = 0 + } + + override func viewDidAppear(_ animated: Bool) + { + super.viewDidAppear(animated) + + _didAppear = true + } + + override func viewDidLayoutSubviews() + { + super.viewDidLayoutSubviews() + + self.textView.textContainerInset.left = self.view.layoutMargins.left + self.textView.textContainerInset.right = self.view.layoutMargins.right + self.textView.textContainer.lineFragmentPadding = 0 + + if !_didAppear + { + // Fix incorrect initial offset on iPhone SE. + self.textView.contentOffset.y = 0 + } + } +} diff --git a/Delta/Settings/SettingsViewController.swift b/Delta/Settings/SettingsViewController.swift index 78879e0..9a8db4e 100644 --- a/Delta/Settings/SettingsViewController.swift +++ b/Delta/Settings/SettingsViewController.swift @@ -7,6 +7,7 @@ // import UIKit +import SafariServices import DeltaCore @@ -21,6 +22,8 @@ private extension SettingsViewController case controllerOpacity case syncing case threeDTouch + case patreon + case credits } enum Segue: String @@ -34,6 +37,14 @@ private extension SettingsViewController case service case status } + + enum CreditsRow: Int, CaseIterable + { + case riley + case caroline + case grant + case softwareLicenses + } } class SettingsViewController: UITableViewController @@ -197,6 +208,28 @@ private extension SettingsViewController sender.value = Float(Settings.translucentControllerSkinOpacity) self.selectionFeedbackGenerator = nil } + + func openTwitter(username: String) + { + let twitterAppURL = URL(string: "twitter://user?screen_name=" + username)! + UIApplication.shared.open(twitterAppURL, options: [:]) { (success) in + if success + { + if let selectedIndexPath = self.tableView.indexPathForSelectedRow + { + self.tableView.deselectRow(at: selectedIndexPath, animated: true) + } + } + else + { + let safariURL = URL(string: "https://twitter.com/" + username)! + + let safariViewController = SFSafariViewController(url: safariURL) + safariViewController.preferredControlTintColor = .deltaPurple + self.present(safariViewController, animated: true, completion: nil) + } + } + } } private extension SettingsViewController @@ -290,7 +323,7 @@ extension SettingsViewController case .service: break } - case .controllerOpacity, .threeDTouch: break + case .controllerOpacity, .threeDTouch, .patreon, .credits: break } return cell @@ -306,6 +339,28 @@ extension SettingsViewController case .controllers: self.performSegue(withIdentifier: Segue.controllers.rawValue, sender: cell) case .controllerSkins: self.performSegue(withIdentifier: Segue.controllerSkins.rawValue, sender: cell) case .controllerOpacity, .threeDTouch, .syncing: break + case .patreon: + let patreonURL = URL(string: "altstore://patreon")! + + UIApplication.shared.open(patreonURL, options: [:]) { (success) in + guard !success else { return } + + let alertController = UIAlertController(title: NSLocalizedString("AltStore Not Installed", comment: ""), message: NSLocalizedString("You must have AltStore installed to receive Patreon benefits.", comment: ""), preferredStyle: .alert) + alertController.addAction(.ok) + self.present(alertController, animated: true, completion: nil) + } + + tableView.deselectRow(at: indexPath, animated: true) + + case .credits: + let row = CreditsRow(rawValue: indexPath.row)! + switch row + { + case .riley: self.openTwitter(username: "rileytestut") + case .caroline: self.openTwitter(username: "1carolinemoore") + case .grant: self.openTwitter(username: "grantgliner") + case .softwareLicenses: break + } } }