mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-14 17:23:25 +01:00
[AltServer] Removes “Install Mail Plug-In” menu option
Leaves “Uninstall Mail Plug-In” option to allow users to remove already-installed plug-ins now that they’re not required.
This commit is contained in:
@@ -109,16 +109,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
|||||||
UserDefaults.standard.didPresentInitialNotification = true
|
UserDefaults.standard.didPresentInitialNotification = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.pluginManager.isUpdateAvailable { result in
|
|
||||||
guard let isUpdateAvailable = try? result.get() else { return }
|
|
||||||
self.isAltPluginUpdateAvailable = isUpdateAvailable
|
|
||||||
|
|
||||||
if isUpdateAvailable
|
|
||||||
{
|
|
||||||
self.installMailPlugin()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationWillTerminate(_ aNotification: Notification)
|
func applicationWillTerminate(_ aNotification: Notification)
|
||||||
@@ -332,46 +322,7 @@ private extension AppDelegate
|
|||||||
LaunchAtLogin.isEnabled.toggle()
|
LaunchAtLogin.isEnabled.toggle()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func handleInstallMailPluginMenuItem(_ item: NSMenuItem)
|
@IBAction private func uninstallMailPlugin(_ sender: NSMenuItem)
|
||||||
{
|
|
||||||
if !self.pluginManager.isMailPluginInstalled || self.isAltPluginUpdateAvailable
|
|
||||||
{
|
|
||||||
self.installMailPlugin()
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self.uninstallMailPlugin()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func installMailPlugin(completion: ((Result<Void, Error>) -> Void)? = nil)
|
|
||||||
{
|
|
||||||
self.pluginManager.installMailPlugin { (result) in
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(PluginError.cancelled): break
|
|
||||||
case .failure(let error):
|
|
||||||
let alert = NSAlert()
|
|
||||||
alert.messageText = NSLocalizedString("Failed to Install Mail Plug-in", comment: "")
|
|
||||||
alert.informativeText = error.localizedDescription
|
|
||||||
alert.runModal()
|
|
||||||
|
|
||||||
case .success:
|
|
||||||
let alert = NSAlert()
|
|
||||||
alert.messageText = NSLocalizedString("Mail Plug-in Installed", comment: "")
|
|
||||||
alert.informativeText = NSLocalizedString("Please restart Mail and enable AltPlugin in Mail's Preferences. Mail must be running when installing or refreshing apps with AltServer.", comment: "")
|
|
||||||
alert.runModal()
|
|
||||||
|
|
||||||
self.isAltPluginUpdateAvailable = false
|
|
||||||
}
|
|
||||||
|
|
||||||
completion?(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func uninstallMailPlugin()
|
|
||||||
{
|
{
|
||||||
self.pluginManager.uninstallMailPlugin { (result) in
|
self.pluginManager.uninstallMailPlugin { (result) in
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
@@ -387,7 +338,7 @@ private extension AppDelegate
|
|||||||
case .success:
|
case .success:
|
||||||
let alert = NSAlert()
|
let alert = NSAlert()
|
||||||
alert.messageText = NSLocalizedString("Mail Plug-in Uninstalled", comment: "")
|
alert.messageText = NSLocalizedString("Mail Plug-in Uninstalled", comment: "")
|
||||||
alert.informativeText = NSLocalizedString("Please restart Mail for changes to take effect. You will not be able to use AltServer until the plug-in is reinstalled.", comment: "")
|
alert.informativeText = NSLocalizedString("Please restart Mail for changes to take effect.", comment: "")
|
||||||
alert.runModal()
|
alert.runModal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,20 +365,11 @@ extension AppDelegate: NSMenuDelegate
|
|||||||
self.launchAtLoginMenuItem.action = #selector(AppDelegate.toggleLaunchAtLogin(_:))
|
self.launchAtLoginMenuItem.action = #selector(AppDelegate.toggleLaunchAtLogin(_:))
|
||||||
self.launchAtLoginMenuItem.state = LaunchAtLogin.isEnabled ? .on : .off
|
self.launchAtLoginMenuItem.state = LaunchAtLogin.isEnabled ? .on : .off
|
||||||
|
|
||||||
if self.isAltPluginUpdateAvailable
|
if !self.pluginManager.isMailPluginInstalled
|
||||||
{
|
{
|
||||||
self.installMailPluginMenuItem.title = NSLocalizedString("Update Mail Plug-in…", comment: "")
|
// Hide "Install Mail Plug-In" option now that it's not required.
|
||||||
|
self.installMailPluginMenuItem.isHidden = true
|
||||||
}
|
}
|
||||||
else if self.pluginManager.isMailPluginInstalled
|
|
||||||
{
|
|
||||||
self.installMailPluginMenuItem.title = NSLocalizedString("Uninstall Mail Plug-in…", comment: "")
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self.installMailPluginMenuItem.title = NSLocalizedString("Install Mail Plug-in…", comment: "")
|
|
||||||
}
|
|
||||||
self.installMailPluginMenuItem.target = self
|
|
||||||
self.installMailPluginMenuItem.action = #selector(AppDelegate.handleInstallMailPluginMenuItem(_:))
|
|
||||||
|
|
||||||
// Need to re-set this every time menu appears so we can refresh device app list.
|
// Need to re-set this every time menu appears so we can refresh device app list.
|
||||||
self.enableJITMenuController.submenuHandler = { [weak self] device in
|
self.enableJITMenuController.submenuHandler = { [weak self] device in
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="22154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22154"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="300" height="46"/>
|
<rect key="frame" x="0.0" y="0.0" width="300" height="46"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zLd-d8-ghZ">
|
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zLd-d8-ghZ">
|
||||||
<rect key="frame" x="0.0" y="25" width="300" height="21"/>
|
<rect key="frame" x="0.0" y="25" width="300" height="21"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Apple ID" drawsBackground="YES" id="BXa-Re-rs3">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Apple ID" drawsBackground="YES" id="BXa-Re-rs3">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<outlet property="nextKeyView" destination="9rp-Vx-rvB" id="bQY-qj-Sej"/>
|
<outlet property="nextKeyView" destination="9rp-Vx-rvB" id="bQY-qj-Sej"/>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<secureTextField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9rp-Vx-rvB">
|
<secureTextField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9rp-Vx-rvB">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="300" height="21"/>
|
<rect key="frame" x="0.0" y="0.0" width="300" height="21"/>
|
||||||
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Password" drawsBackground="YES" usesSingleLineMode="YES" id="xqJ-wt-DlP">
|
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Password" drawsBackground="YES" usesSingleLineMode="YES" id="xqJ-wt-DlP">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
@@ -125,8 +125,11 @@
|
|||||||
<menuItem title="Launch at Login" id="IyR-FQ-upe" userLabel="Launch At Login">
|
<menuItem title="Launch at Login" id="IyR-FQ-upe" userLabel="Launch At Login">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem title="Install Mail Plug-in…" id="3CM-gV-X2G" userLabel="Mail Plug-in">
|
<menuItem title="Uninstall Mail Plug-in…" id="3CM-gV-X2G" userLabel="Mail Plug-in">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="uninstallMailPlugin:" target="Voe-Tx-rLC" id="Bkx-mS-cnE"/>
|
||||||
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="mVM-Nm-Zi9"/>
|
<menuItem isSeparatorItem="YES" id="mVM-Nm-Zi9"/>
|
||||||
<menuItem title="Check for Updates..." id="Tnq-gD-Eic" userLabel="Check for Updates">
|
<menuItem title="Check for Updates..." id="Tnq-gD-Eic" userLabel="Check for Updates">
|
||||||
@@ -395,7 +398,7 @@
|
|||||||
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="16" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aUr-m2-nXm">
|
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="16" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aUr-m2-nXm">
|
||||||
<rect key="frame" x="20" y="20" width="410" height="84"/>
|
<rect key="frame" x="20" y="20" width="410" height="84"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8GZ-nV-XXA">
|
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8GZ-nV-XXA">
|
||||||
<rect key="frame" x="-2" y="68" width="40" height="16"/>
|
<rect key="frame" x="-2" y="68" width="40" height="16"/>
|
||||||
<textFieldCell key="cell" lineBreakMode="clipping" selectable="YES" title="Label" id="V5D-v5-MVX">
|
<textFieldCell key="cell" lineBreakMode="clipping" selectable="YES" title="Label" id="V5D-v5-MVX">
|
||||||
<font key="font" metaFont="systemBold"/>
|
<font key="font" metaFont="systemBold"/>
|
||||||
@@ -403,7 +406,7 @@
|
|||||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="j2o-2b-63k">
|
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="j2o-2b-63k">
|
||||||
<rect key="frame" x="-2" y="36" width="92" height="16"/>
|
<rect key="frame" x="-2" y="36" width="92" height="16"/>
|
||||||
<textFieldCell key="cell" selectable="YES" title="Multiline Label" id="3jf-Z7-88l">
|
<textFieldCell key="cell" selectable="YES" title="Multiline Label" id="3jf-Z7-88l">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
|
|||||||
@@ -149,92 +149,11 @@ class PluginManager
|
|||||||
|
|
||||||
extension PluginManager
|
extension PluginManager
|
||||||
{
|
{
|
||||||
func installMailPlugin(completionHandler: @escaping (Result<Void, Error>) -> Void)
|
|
||||||
{
|
|
||||||
self.isUpdateAvailable(useCache: true) { result in
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
do
|
|
||||||
{
|
|
||||||
let isUpdateAvailable = try result.get()
|
|
||||||
|
|
||||||
let alert = NSAlert()
|
|
||||||
if isUpdateAvailable
|
|
||||||
{
|
|
||||||
alert.messageText = NSLocalizedString("Update Mail Plug-in", comment: "")
|
|
||||||
alert.informativeText = NSLocalizedString("An update is available for AltServer's Mail plug-in. Please update the plug-in now in order to keep using AltStore.", comment: "")
|
|
||||||
|
|
||||||
alert.addButton(withTitle: NSLocalizedString("Update Plug-in", comment: ""))
|
|
||||||
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
alert.messageText = NSLocalizedString("Install Mail Plug-in", comment: "")
|
|
||||||
alert.informativeText = NSLocalizedString("AltServer requires a Mail plug-in in order to retrieve necessary information about your Apple ID. Would you like to install it now?", comment: "")
|
|
||||||
|
|
||||||
alert.addButton(withTitle: NSLocalizedString("Install Plug-in", comment: ""))
|
|
||||||
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
|
|
||||||
}
|
|
||||||
|
|
||||||
NSRunningApplication.current.activate(options: .activateIgnoringOtherApps)
|
|
||||||
|
|
||||||
let response = alert.runModal()
|
|
||||||
guard response == .alertFirstButtonReturn else { throw PluginError.cancelled }
|
|
||||||
|
|
||||||
self.downloadPlugin { (result) in
|
|
||||||
do
|
|
||||||
{
|
|
||||||
let fileURL = try result.get()
|
|
||||||
|
|
||||||
// Ensure plug-in directory exists.
|
|
||||||
let authorization = try self.runAndKeepAuthorization("mkdir", arguments: ["-p", pluginDirectoryURL.path])
|
|
||||||
|
|
||||||
// Create temporary directory.
|
|
||||||
let temporaryDirectoryURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
|
|
||||||
try FileManager.default.createDirectory(at: temporaryDirectoryURL, withIntermediateDirectories: true, attributes: nil)
|
|
||||||
defer { try? FileManager.default.removeItem(at: temporaryDirectoryURL) }
|
|
||||||
|
|
||||||
// Unzip AltPlugin to temporary directory.
|
|
||||||
try self.runAndKeepAuthorization("unzip", arguments: ["-o", fileURL.path, "-d", temporaryDirectoryURL.path], authorization: authorization)
|
|
||||||
|
|
||||||
if FileManager.default.fileExists(atPath: pluginURL.path)
|
|
||||||
{
|
|
||||||
// Delete existing Mail plug-in.
|
|
||||||
try self.runAndKeepAuthorization("rm", arguments: ["-rf", pluginURL.path], authorization: authorization)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy AltPlugin to Mail plug-ins directory.
|
|
||||||
// Must be separate step than unzip to prevent macOS from considering plug-in corrupted.
|
|
||||||
let unzippedPluginURL = temporaryDirectoryURL.appendingPathComponent(pluginURL.lastPathComponent)
|
|
||||||
try self.runAndKeepAuthorization("cp", arguments: ["-R", unzippedPluginURL.path, pluginDirectoryURL.path], authorization: authorization)
|
|
||||||
|
|
||||||
guard self.isMailPluginInstalled else { throw PluginError.unknown() }
|
|
||||||
|
|
||||||
// Enable Mail plug-in preferences.
|
|
||||||
try self.run("defaults", arguments: ["write", "/Library/Preferences/com.apple.mail", "EnableBundles", "-bool", "YES"], authorization: authorization)
|
|
||||||
|
|
||||||
print("Finished installing Mail plug-in!")
|
|
||||||
|
|
||||||
completionHandler(.success(()))
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
completionHandler(.failure(error))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
completionHandler(.failure(error))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func uninstallMailPlugin(completionHandler: @escaping (Result<Void, Error>) -> Void)
|
func uninstallMailPlugin(completionHandler: @escaping (Result<Void, Error>) -> Void)
|
||||||
{
|
{
|
||||||
let alert = NSAlert()
|
let alert = NSAlert()
|
||||||
alert.messageText = NSLocalizedString("Uninstall Mail Plug-in", comment: "")
|
alert.messageText = NSLocalizedString("Uninstall Mail Plug-in", comment: "")
|
||||||
alert.informativeText = NSLocalizedString("Are you sure you want to uninstall the AltServer Mail plug-in? You will no longer be able to install or refresh apps with AltStore.", comment: "")
|
alert.informativeText = NSLocalizedString("Are you sure you want to uninstall the AltServer Mail plug-in?", comment: "")
|
||||||
|
|
||||||
alert.addButton(withTitle: NSLocalizedString("Uninstall Plug-in", comment: ""))
|
alert.addButton(withTitle: NSLocalizedString("Uninstall Plug-in", comment: ""))
|
||||||
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
|
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
|
||||||
|
|||||||
Reference in New Issue
Block a user