diff --git a/.semver b/.semver index ae1d35b..4007e54 100644 --- a/.semver +++ b/.semver @@ -1 +1 @@ -1.4.17 \ No newline at end of file +1.4.18 \ No newline at end of file diff --git a/Raivo.xcodeproj/project.pbxproj b/Raivo.xcodeproj/project.pbxproj index c094c15..c562905 100644 --- a/Raivo.xcodeproj/project.pbxproj +++ b/Raivo.xcodeproj/project.pbxproj @@ -79,6 +79,8 @@ 70684DEF225A1BF70038BDB4 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70684DEE225A1BF70038BDB4 /* main.swift */; }; 70684DF1225A2ED90038BDB4 /* MiscellaneousForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70684DF0225A2ED90038BDB4 /* MiscellaneousForm.swift */; }; 70684DF4225A37630038BDB4 /* MiscellaneousInactivityLockFormOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70684DF3225A37630038BDB4 /* MiscellaneousInactivityLockFormOption.swift */; }; + 706ED9BD2A4A218E00CE66D6 /* AuthRoboticTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 706ED9BC2A4A218E00CE66D6 /* AuthRoboticTest.swift */; }; + 706ED9BF2A4A21FB00CE66D6 /* AuthFlowHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 706ED9BE2A4A21FB00CE66D6 /* AuthFlowHelper.swift */; }; 706FD81522EB71A500F433F7 /* QuickResponseCodeForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 706FD81422EB71A500F433F7 /* QuickResponseCodeForm.swift */; }; 7076C22622E7909000AFBDD9 /* MainQuickResponseCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7076C22522E7909000AFBDD9 /* MainQuickResponseCodeViewController.swift */; }; 7077A337227CC84F00338CA3 /* PasswordAlgorithmFormOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7077A336227CC84F00338CA3 /* PasswordAlgorithmFormOption.swift */; }; @@ -290,6 +292,8 @@ 70684DEE225A1BF70038BDB4 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 70684DF0225A2ED90038BDB4 /* MiscellaneousForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiscellaneousForm.swift; sourceTree = ""; }; 70684DF3225A37630038BDB4 /* MiscellaneousInactivityLockFormOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiscellaneousInactivityLockFormOption.swift; sourceTree = ""; }; + 706ED9BC2A4A218E00CE66D6 /* AuthRoboticTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRoboticTest.swift; sourceTree = ""; }; + 706ED9BE2A4A21FB00CE66D6 /* AuthFlowHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthFlowHelper.swift; sourceTree = ""; }; 706FD81422EB71A500F433F7 /* QuickResponseCodeForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickResponseCodeForm.swift; sourceTree = ""; }; 7076C22522E7909000AFBDD9 /* MainQuickResponseCodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainQuickResponseCodeViewController.swift; sourceTree = ""; }; 7077A336227CC84F00338CA3 /* PasswordAlgorithmFormOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordAlgorithmFormOption.swift; sourceTree = ""; }; @@ -663,6 +667,7 @@ isa = PBXGroup; children = ( 70F2DB80238D9A4C00CFF63F /* SetupFlowHelper.swift */, + 706ED9BE2A4A21FB00CE66D6 /* AuthFlowHelper.swift */, ); path = Flows; sourceTree = ""; @@ -768,6 +773,14 @@ path = Options; sourceTree = ""; }; + 706ED9BB2A4A215100CE66D6 /* Auth */ = { + isa = PBXGroup; + children = ( + 706ED9BC2A4A218E00CE66D6 /* AuthRoboticTest.swift */, + ); + path = Auth; + sourceTree = ""; + }; 7077A333227CC75E00338CA3 /* Rows */ = { isa = PBXGroup; children = ( @@ -1077,6 +1090,7 @@ 70F2DB7C238D4E4700CFF63F /* Flows */ = { isa = PBXGroup; children = ( + 706ED9BB2A4A215100CE66D6 /* Auth */, 70F64B53238EF3B300A5F56E /* Setup */, ); path = Flows; @@ -1458,7 +1472,9 @@ buildActionMask = 2147483647; files = ( 701ECE3C23D387700015D12A /* HumanDelayHelper.swift in Sources */, + 706ED9BD2A4A218E00CE66D6 /* AuthRoboticTest.swift in Sources */, 70F2DB81238D9A4C00CFF63F /* SetupFlowHelper.swift in Sources */, + 706ED9BF2A4A21FB00CE66D6 /* AuthFlowHelper.swift in Sources */, 70F64B76238F082400A5F56E /* BiometricHelper.swift in Sources */, 70631CAE230DC2A10040DD71 /* SetupRoboticTest.swift in Sources */, ); @@ -1621,7 +1637,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Raivo/Raivo.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 82; + CURRENT_PROJECT_VERSION = 83; DEVELOPMENT_TEAM = 564B4ETY69; INFOPLIST_FILE = "$(SRCROOT)/Raivo/Supporting/Info.plist"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; @@ -1630,7 +1646,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.17; + MARKETING_VERSION = 1.4.18; PRODUCT_BUNDLE_IDENTIFIER = com.finnwea.Raivo.Debug; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1648,7 +1664,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Raivo/Raivo.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 82; + CURRENT_PROJECT_VERSION = 83; DEVELOPMENT_TEAM = 564B4ETY69; INFOPLIST_FILE = "$(SRCROOT)/Raivo/Supporting/Info.plist"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; @@ -1657,7 +1673,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.17; + MARKETING_VERSION = 1.4.18; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -1673,6 +1689,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 564B4ETY69; INFOPLIST_FILE = RaivoUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1680,6 +1697,9 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.finnwea.RaivoUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Raivo; @@ -1692,6 +1712,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 564B4ETY69; INFOPLIST_FILE = RaivoUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1699,6 +1720,9 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.finnwea.RaivoUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Raivo; diff --git a/Raivo/Controllers/Auth/AuthEntryViewController.swift b/Raivo/Controllers/Auth/AuthEntryViewController.swift index ca6727d..f0e0c4b 100644 --- a/Raivo/Controllers/Auth/AuthEntryViewController.swift +++ b/Raivo/Controllers/Auth/AuthEntryViewController.swift @@ -30,6 +30,7 @@ class AuthEntryViewController: UIViewController, UIPasscodeFieldDelegate { biometricButton.isHidden = !StorageHelper.shared.getBiometricUnlockEnabled() + passcodeField.shadowAccessibilityIdentifier = "passcode" passcodeField.delegate = self passcodeField.layoutIfNeeded() diff --git a/Raivo/Forms/MiscellaneousForm.swift b/Raivo/Forms/MiscellaneousForm.swift index 7ded879..35f085f 100644 --- a/Raivo/Forms/MiscellaneousForm.swift +++ b/Raivo/Forms/MiscellaneousForm.swift @@ -458,6 +458,7 @@ class MiscellaneousForm { <<< ButtonRow("sign_out", { row in row.title = "Sign out of Raivo" + row.cell.accessibilityIdentifier = "miscSignOut" }).cellUpdate({ cell, row in cell.textLabel?.textAlignment = .left cell.imageView?.image = UIImage(named: "form-logout") diff --git a/Raivo/Helpers/AppHelper.swift b/Raivo/Helpers/AppHelper.swift index a1daf7f..1d574f1 100644 --- a/Raivo/Helpers/AppHelper.swift +++ b/Raivo/Helpers/AppHelper.swift @@ -77,4 +77,7 @@ class AppHelper { /// If the current runtime should reset the app state before startup public static let argumentResetState = CommandLine.arguments.contains("--ResetState") + /// If the current runtime should disable biometric unlock + public static let argumentDisableBiometrics = CommandLine.arguments.contains("--DisableBiometrics") + } diff --git a/Raivo/Helpers/StorageHelper.swift b/Raivo/Helpers/StorageHelper.swift index 0cc312c..b8f2917 100644 --- a/Raivo/Helpers/StorageHelper.swift +++ b/Raivo/Helpers/StorageHelper.swift @@ -315,6 +315,10 @@ class StorageHelper { /// /// - Returns: Positive if biometric unlock is enabled public func getBiometricUnlockEnabled() -> Bool { + guard !AppHelper.argumentDisableBiometrics else { + return false + } + guard let enabled = try? globals().string(forKey: Key.BIOMETRIC_AUTHENTICATION_ENABLED) else { return false } diff --git a/Raivo/Storyboards/Auth.storyboard b/Raivo/Storyboards/Auth.storyboard index 3d089dc..3bd2ce4 100644 --- a/Raivo/Storyboards/Auth.storyboard +++ b/Raivo/Storyboards/Auth.storyboard @@ -1,9 +1,9 @@ - + - + @@ -30,7 +30,7 @@ - + @@ -53,13 +53,13 @@ - + - + - + @@ -127,6 +127,7 @@ + diff --git a/Raivo/Storyboards/Setup.storyboard b/Raivo/Storyboards/Setup.storyboard index 94d71f6..1fa8d2e 100644 --- a/Raivo/Storyboards/Setup.storyboard +++ b/Raivo/Storyboards/Setup.storyboard @@ -1,9 +1,9 @@ - + - + @@ -137,7 +137,7 @@ - + @@ -160,13 +160,13 @@ - + - + - + @@ -224,7 +224,7 @@