Skip to content

Commit

Permalink
#35: Add a check for update solution
Browse files Browse the repository at this point in the history
- Add a basic check for update solution
  • Loading branch information
Timac committed Apr 10, 2024
1 parent 122d215 commit d2b7743
Show file tree
Hide file tree
Showing 12 changed files with 770 additions and 2 deletions.
5 changes: 5 additions & 0 deletions Common/ACPreferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@
-(NSInteger)alwaysConnectedRetryDelay;
-(void)setAlwaysConnectedRetryDelay:(NSInteger)retryDelay;

/**
Ignore the update
*/
-(NSString *)checkForUpdateSkipVersion;
-(void)setCheckForUpdateSkipVersion:(NSString *)version;

@end

11 changes: 11 additions & 0 deletions Common/ACPreferences.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

NSString * const kAlwaysConnectedRetryDelayPrefKey = @"AlwaysConnectedRetryDelay";

NSString * const kSkipVersionPrefKey = @"SkipVersion";


@implementation ACPreferences
Expand Down Expand Up @@ -144,4 +145,14 @@ -(void)setAlwaysConnectedRetryDelay:(NSInteger)retryDelay
}
}

-(NSString *)checkForUpdateSkipVersion
{
return [[NSUserDefaults standardUserDefaults] objectForKey:kSkipVersionPrefKey];
}

-(void)setCheckForUpdateSkipVersion:(NSString *)version
{
[[NSUserDefaults standardUserDefaults] setObject:version forKey:kSkipVersionPrefKey];
}

@end
187 changes: 185 additions & 2 deletions VPN.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

91 changes: 91 additions & 0 deletions VPN.xcodeproj/xcshareddata/xcschemes/VPNApp.xcscheme
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1530"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FA53906720EF5F7F00BA9AF7"
BuildableName = "VPNApp.app"
BlueprintName = "VPNApp"
ReferencedContainer = "container:VPN.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "024D90052BC71C04005BF977"
BuildableName = "VPNAppTests.xctest"
BlueprintName = "VPNAppTests"
ReferencedContainer = "container:VPN.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FA53906720EF5F7F00BA9AF7"
BuildableName = "VPNApp.app"
BlueprintName = "VPNApp"
ReferencedContainer = "container:VPN.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FA53906720EF5F7F00BA9AF7"
BuildableName = "VPNApp.app"
BlueprintName = "VPNApp"
ReferencedContainer = "container:VPN.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
78 changes: 78 additions & 0 deletions VPN.xcodeproj/xcshareddata/xcschemes/VPNStatus.xcscheme
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1530"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "02619DE320F7DF2200099652"
BuildableName = "VPNStatus.app"
BlueprintName = "VPNStatus"
ReferencedContainer = "container:VPN.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "02619DE320F7DF2200099652"
BuildableName = "VPNStatus.app"
BlueprintName = "VPNStatus"
ReferencedContainer = "container:VPN.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "02619DE320F7DF2200099652"
BuildableName = "VPNStatus.app"
BlueprintName = "VPNStatus"
ReferencedContainer = "container:VPN.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
70 changes: 70 additions & 0 deletions VPNAppTests/GitHubReleaseTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import XCTest

final class GitHubReleaseTests: XCTestCase {

func testGitHubReleaseComparison() throws {
let release_1_0 = GitHubRelease(name: "1.0", prerelease: false, draft: false)
let release_1_1 = GitHubRelease(name: "1.1", prerelease: false, draft: false)
let release_1_2 = GitHubRelease(name: "1.2", prerelease: false, draft: false)
let release_1_10 = GitHubRelease(name: "1.10", prerelease: false, draft: false)
let release_1_0_0 = GitHubRelease(name: "1.0.0", prerelease: false, draft: false)
let release_1_0_1 = GitHubRelease(name: "1.0.1", prerelease: false, draft: false)
let release_1_1_1 = GitHubRelease(name: "1.1.1", prerelease: false, draft: false)
let release_1_10_1 = GitHubRelease(name: "1.10.1", prerelease: false, draft: false)
let release_2_0 = GitHubRelease(name: "2.0", prerelease: false, draft: false)
let release_3_0 = GitHubRelease(name: "3.0", prerelease: false, draft: false)


XCTAssertTrue(release_1_0 < release_1_1)
XCTAssertTrue(release_1_1 < release_1_2)
XCTAssertTrue(release_1_2 < release_1_10)
XCTAssertTrue(release_1_1 < release_1_10)
XCTAssertTrue(release_1_0 < release_1_10)

XCTAssertTrue(release_1_0_0 == release_1_0)
XCTAssertTrue(release_1_0_0 == release_1_0_0)
XCTAssertTrue(release_1_0_0 < release_1_1)
XCTAssertTrue(release_1_0_0 < release_1_2)
XCTAssertTrue(release_1_0_0 < release_1_0_1)
XCTAssertTrue(release_1_0_0 < release_1_1_1)
XCTAssertTrue(release_1_0_0 < release_1_10_1)
XCTAssertTrue(release_1_0_0 < release_2_0)
XCTAssertTrue(release_1_0_0 < release_3_0)

XCTAssertTrue(release_1_0_1 < release_1_1)
XCTAssertTrue(release_1_0_1 < release_1_2)
XCTAssertTrue(release_1_0_1 == release_1_0_1)
XCTAssertTrue(release_1_0_1 < release_1_1_1)
XCTAssertTrue(release_1_0_1 < release_1_10_1)
XCTAssertTrue(release_1_0_1 < release_2_0)
XCTAssertTrue(release_1_0_1 < release_3_0)

XCTAssertTrue(release_1_10_1 > release_1_1)
XCTAssertTrue(release_1_10_1 > release_1_2)
XCTAssertTrue(release_1_10_1 == release_1_10_1)
XCTAssertTrue(release_1_10_1 > release_1_1_1)
XCTAssertTrue(release_1_10_1 == release_1_10_1)
XCTAssertTrue(release_1_10_1 < release_2_0)
XCTAssertTrue(release_1_10_1 < release_3_0)

XCTAssertTrue(release_2_0 > release_1_0)
XCTAssertTrue(release_2_0 > release_1_1)
XCTAssertTrue(release_2_0 > release_1_2)
XCTAssertTrue(release_2_0 > release_1_10)
XCTAssertTrue(release_2_0 > release_1_0_0)
XCTAssertTrue(release_2_0 > release_1_0_1)
XCTAssertTrue(release_2_0 > release_1_1_1)
XCTAssertTrue(release_2_0 > release_1_10_1)
XCTAssertTrue(release_2_0 == release_2_0)
XCTAssertTrue(release_2_0 < release_3_0)
}

func testGitHubReleasePrereleaseDraft() throws {
let release_1_0 = GitHubRelease(name: "1.0", prerelease: false, draft: false)
let release_1_1 = GitHubRelease(name: "1.1", prerelease: true, draft: false)
let release_1_2 = GitHubRelease(name: "1.2", prerelease: true, draft: false)

XCTAssertTrue(release_1_0 < release_1_1)
XCTAssertTrue(release_1_1 < release_1_2)
}
}
103 changes: 103 additions & 0 deletions VPNStatus/Base.lproj/ACCheckForUpdateWindow.xib
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22689"/>
<capability name="Image references" minToolsVersion="12.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="ACCheckForUpdateWindow">
<connections>
<outlet property="versionsLabel" destination="w3a-Pv-huV" id="cQ4-fy-0eN"/>
<outlet property="window" destination="xOd-HO-29H" id="JIz-fz-R2o"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Software Update" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" tabbingMode="disallowed" id="xOd-HO-29H" userLabel="Window">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<rect key="contentRect" x="133" y="235" width="471" height="158"/>
<rect key="screenRect" x="0.0" y="0.0" width="1512" height="944"/>
<value key="minSize" type="size" width="471" height="303"/>
<value key="maxSize" type="size" width="471" height="303"/>
<value key="minFullScreenContentSize" type="size" width="471" height="303"/>
<value key="maxFullScreenContentSize" type="size" width="471" height="303"/>
<view key="contentView" id="gIp-Ho-8D9">
<rect key="frame" x="0.0" y="0.0" width="471" height="158"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Gbf-gn-mXu">
<rect key="frame" x="20" y="74" width="64" height="64"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="aLR-qG-YKm">
<imageReference key="image" image="VPNStatus" symbolScale="large"/>
</imageCell>
<color key="contentTintColor" name="systemPinkColor" catalog="System" colorSpace="catalog"/>
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Zeg-Ha-1do">
<rect key="frame" x="90" y="107" width="363" height="24"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="A new version of VPNStatus is available!" id="yQk-ZW-ZYH">
<font key="font" textStyle="headline" name=".SFNS-Bold"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="w3a-Pv-huV">
<rect key="frame" x="90" y="90" width="363" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="VPNStatus %@ is now available, you have %@." id="Ndp-hu-NOz">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fUp-dY-kQg">
<rect key="frame" x="340" y="13" width="118" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Install Update" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="yZc-ae-Ne3">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="doInstallUpdate:" target="-2" id="fUk-8P-npy"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="SNV-n7-UZ0">
<rect key="frame" x="205" y="13" width="137" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Remind Me Later" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="rNz-5F-3FG">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="doRemindMeLater:" target="-2" id="Wfk-2f-YyX"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hxV-Fc-CXR">
<rect key="frame" x="13" y="13" width="135" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Skip this Version" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="NJD-tK-Kd9">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="doSkipThisVersion:" target="-2" id="D69-c9-m1W"/>
</connections>
</button>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-x8E"/>
</connections>
<point key="canvasLocation" x="-61.5" y="-78"/>
</window>
</objects>
<resources>
<image name="VPNStatus" width="256" height="256"/>
</resources>
</document>
9 changes: 9 additions & 0 deletions VPNStatus/CheckForUpdate/ACCheckForUpdateWindow.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#import <Cocoa/Cocoa.h>

@interface ACCheckForUpdateWindow : NSWindowController

+ (ACCheckForUpdateWindow *)sharedWindowController;
-(void)showUpdateAvailable:(NSString *)oldVersion newVersion:(NSString*)newVersion;

@end

Loading

0 comments on commit d2b7743

Please sign in to comment.