Mercurial > public > simoleon
changeset 97:6328724d7fbc
Merge pull request #9 from DennisTechnologies/development
Submit new beta
committer: GitHub <noreply@github.com>
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Tue, 03 Aug 2021 18:03:09 +0100 |
parents | 88caa2e8573b (current diff) fa994172c050 (diff) |
children | dd4d99fa8966 |
files | Simoleon.xcodeproj/xcshareddata/xcschemes/Screenshots.xcscheme Simoleon.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme |
diffstat | 88 files changed, 901 insertions(+), 123 deletions(-) [+] |
line wrap: on
line diff
--- a/Configuration.storekit Mon Aug 02 21:27:56 2021 +0100 +++ b/Configuration.storekit Tue Aug 03 18:03:09 2021 +0100 @@ -7,7 +7,7 @@ ], "settings" : { - + "_timeRate" : 4 }, "subscriptionGroups" : [ {
--- a/Simoleon.xcodeproj/project.pbxproj Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon.xcodeproj/project.pbxproj Tue Aug 03 18:03:09 2021 +0100 @@ -15,6 +15,7 @@ 95561E3F26AF25EF00CCB543 /* SubscriptionFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95561E3E26AF25EF00CCB543 /* SubscriptionFeature.swift */; }; 95562D4D26A8962A0047E778 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95562D4C26A8962A0047E778 /* StoreKit.framework */; }; 95562D5226A8AEF60047E778 /* Purchases in Frameworks */ = {isa = PBXBuildFile; productRef = 95562D5126A8AEF60047E778 /* Purchases */; }; + 956088B626B9307600A4FD6C /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 956088B526B9307600A4FD6C /* SnapshotHelper.swift */; }; 957065E226A5FE0400523E68 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957065E126A5FE0400523E68 /* Settings.swift */; }; 958526C326B41D60001FC826 /* CurrencyPairModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958526C226B41D60001FC826 /* CurrencyPairModel.swift */; }; 9585BB1226A6B71B00E3193E /* ReadConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9585BB1126A6B71B00E3193E /* ReadConfig.swift */; }; @@ -100,6 +101,7 @@ 95559339269B0AB8000FD726 /* ParseJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseJson.swift; sourceTree = "<group>"; }; 95561E3E26AF25EF00CCB543 /* SubscriptionFeature.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionFeature.swift; sourceTree = "<group>"; }; 95562D4C26A8962A0047E778 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; + 956088B526B9307600A4FD6C /* SnapshotHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SnapshotHelper.swift; path = fastlane/SnapshotHelper.swift; sourceTree = "<group>"; }; 957065E126A5FE0400523E68 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; }; 958526C226B41D60001FC826 /* CurrencyPairModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyPairModel.swift; sourceTree = "<group>"; }; 9585BB0F26A6B58500E3193E /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = "<group>"; }; @@ -295,6 +297,7 @@ children = ( 9587599D26B2ACA6004086F0 /* Configuration.storekit */, 958759A126B2AE85004086F0 /* StoreKitTestCertificate.cer */, + 956088B526B9307600A4FD6C /* SnapshotHelper.swift */, 95C5B2262697752600941585 /* Simoleon */, 95C5B23D2697752700941585 /* SimoleonTests */, 95C5B2482697752700941585 /* SimoleonUITests */, @@ -602,6 +605,7 @@ buildActionMask = 2147483647; files = ( 95C5B24A2697752700941585 /* SimoleonUITests.swift in Sources */, + 956088B626B9307600A4FD6C /* SnapshotHelper.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };
Binary file Simoleon.xcodeproj/project.xcworkspace/xcuserdata/dennis.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Simoleon.xcodeproj/xcshareddata/xcschemes/Screenshots.xcscheme Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1250" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2232697752600941585" + BuildableName = "Simoleon.app" + BlueprintName = "Simoleon" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "NO" + buildForArchiving = "NO" + buildForAnalyzing = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2442697752700941585" + BuildableName = "SimoleonUITests.xctest" + BlueprintName = "SimoleonUITests" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2392697752700941585" + BuildableName = "SimoleonTests.xctest" + BlueprintName = "SimoleonTests" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2442697752700941585" + BuildableName = "SimoleonUITests.xctest" + BlueprintName = "SimoleonUITests" + ReferencedContainer = "container:Simoleon.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 = "95C5B2232697752600941585" + BuildableName = "Simoleon.app" + BlueprintName = "Simoleon" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + <StoreKitConfigurationFileReference + identifier = "../../Configuration.storekit"> + </StoreKitConfigurationFileReference> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2232697752600941585" + BuildableName = "Simoleon.app" + BlueprintName = "Simoleon" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme>
--- a/Simoleon.xcodeproj/xcshareddata/xcschemes/Simoleon - StoreKit Test.xcscheme Mon Aug 02 21:27:56 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Scheme - LastUpgradeVersion = "1250" - version = "1.3"> - <BuildAction - parallelizeBuildables = "YES" - buildImplicitDependencies = "YES"> - <BuildActionEntries> - <BuildActionEntry - buildForTesting = "YES" - buildForRunning = "YES" - buildForProfiling = "YES" - buildForArchiving = "YES" - buildForAnalyzing = "YES"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "95C5B2232697752600941585" - BuildableName = "Simoleon.app" - BlueprintName = "Simoleon" - ReferencedContainer = "container:Simoleon.xcodeproj"> - </BuildableReference> - </BuildActionEntry> - </BuildActionEntries> - </BuildAction> - <TestAction - buildConfiguration = "Debug" - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> - <Testables> - <TestableReference - skipped = "NO"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "95C5B2392697752700941585" - BuildableName = "SimoleonTests.xctest" - BlueprintName = "SimoleonTests" - ReferencedContainer = "container:Simoleon.xcodeproj"> - </BuildableReference> - </TestableReference> - <TestableReference - skipped = "NO"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "95C5B2442697752700941585" - BuildableName = "SimoleonUITests.xctest" - BlueprintName = "SimoleonUITests" - ReferencedContainer = "container:Simoleon.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 = "95C5B2232697752600941585" - BuildableName = "Simoleon.app" - BlueprintName = "Simoleon" - ReferencedContainer = "container:Simoleon.xcodeproj"> - </BuildableReference> - </BuildableProductRunnable> - <StoreKitConfigurationFileReference - identifier = "../../Configuration.storekit"> - </StoreKitConfigurationFileReference> - </LaunchAction> - <ProfileAction - buildConfiguration = "Release" - shouldUseLaunchSchemeArgsEnv = "YES" - savedToolIdentifier = "" - useCustomWorkingDirectory = "NO" - debugDocumentVersioning = "YES"> - <BuildableProductRunnable - runnableDebuggingMode = "0"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "95C5B2232697752600941585" - BuildableName = "Simoleon.app" - BlueprintName = "Simoleon" - ReferencedContainer = "container:Simoleon.xcodeproj"> - </BuildableReference> - </BuildableProductRunnable> - </ProfileAction> - <AnalyzeAction - buildConfiguration = "Debug"> - </AnalyzeAction> - <ArchiveAction - buildConfiguration = "Release" - revealArchiveInOrganizer = "YES"> - </ArchiveAction> -</Scheme>
--- a/Simoleon.xcodeproj/xcshareddata/xcschemes/Simoleon.xcscheme Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon.xcodeproj/xcshareddata/xcschemes/Simoleon.xcscheme Tue Aug 03 18:03:09 2021 +0100 @@ -51,7 +51,7 @@ </Testables> </TestAction> <LaunchAction - buildConfiguration = "Debug" + buildConfiguration = "Release" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Simoleon.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1250" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2232697752600941585" + BuildableName = "Simoleon.app" + BlueprintName = "Simoleon" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "NO" + buildForArchiving = "NO" + buildForAnalyzing = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2442697752700941585" + BuildableName = "SimoleonUITests.xctest" + BlueprintName = "SimoleonUITests" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2392697752700941585" + BuildableName = "SimoleonTests.xctest" + BlueprintName = "SimoleonTests" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2442697752700941585" + BuildableName = "SimoleonUITests.xctest" + BlueprintName = "SimoleonUITests" + ReferencedContainer = "container:Simoleon.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 = "95C5B2232697752600941585" + BuildableName = "Simoleon.app" + BlueprintName = "Simoleon" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + <StoreKitConfigurationFileReference + identifier = "../../Configuration.storekit"> + </StoreKitConfigurationFileReference> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2232697752600941585" + BuildableName = "Simoleon.app" + BlueprintName = "Simoleon" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme>
--- a/Simoleon.xcodeproj/xcuserdata/dennis.xcuserdatad/xcschemes/xcschememanagement.plist Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon.xcodeproj/xcuserdata/dennis.xcuserdatad/xcschemes/xcschememanagement.plist Tue Aug 03 18:03:09 2021 +0100 @@ -25,15 +25,15 @@ <key>orderHint</key> <integer>0</integer> </dict> - <key>Simoleon - StoreKit Test.xcscheme_^#shared#^_</key> + <key>Screenshots.xcscheme_^#shared#^_</key> <dict> <key>orderHint</key> - <integer>0</integer> + <integer>1</integer> </dict> <key>Simoleon.xcscheme_^#shared#^_</key> <dict> <key>orderHint</key> - <integer>1</integer> + <integer>3</integer> </dict> <key>SimoleonWatchOS (Complication).xcscheme_^#shared#^_</key> <dict> @@ -50,6 +50,11 @@ <key>orderHint</key> <integer>1</integer> </dict> + <key>Tests.xcscheme_^#shared#^_</key> + <dict> + <key>orderHint</key> + <integer>2</integer> + </dict> </dict> <key>SuppressBuildableAutocreation</key> <dict> @@ -58,6 +63,16 @@ <key>primary</key> <true/> </dict> + <key>95C5B2392697752700941585</key> + <dict> + <key>primary</key> + <true/> + </dict> + <key>95C5B2442697752700941585</key> + <dict> + <key>primary</key> + <true/> + </dict> </dict> </dict> </plist>
--- a/Simoleon/Conversion.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Conversion.swift Tue Aug 03 18:03:09 2021 +0100 @@ -33,6 +33,7 @@ .padding(.horizontal) ) } + .accessibilityIdentifier("CurrencySelector") FavoriteButton(currencyPair: currencyPair) }
--- a/Simoleon/Favorites.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Favorites.swift Tue Aug 03 18:03:09 2021 +0100 @@ -23,7 +23,7 @@ .padding(.top, 5) } .multilineTextAlignment(.center) - .foregroundColor(Color(.systemGray)) + .foregroundColor(.secondary) .padding(.horizontal, 50) } else { List { @@ -46,6 +46,11 @@ .if(UIDevice.current.userInterfaceIdiom == .phone) { content in NavigationView { content } } + .onAppear { + #if DEBUG + generateFavoritesToScreenshots() + #endif + } } private func removeFromFavorites(offsets: IndexSet) { @@ -60,11 +65,34 @@ } } } + + #if DEBUG + private func generateFavoritesToScreenshots() { + if favorite.isEmpty { + let favoriteCurrencies = [ + "EUR/USD", "BTC/USD", "USD/HKD", "USD/JPY", "AUD/USD", + "XAU/GBP", "DASH/ETH", "EUR/USD", "XAG/CAD" + ] + + for favoriteCurrency in favoriteCurrencies { + let favorite = Favorite(context: viewContext) + favorite.currencyPair = favoriteCurrency + + do { + try viewContext.save() + } catch { + let nsError = error as NSError + fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + } + } + } + } + #endif } struct Favorites_Previews: PreviewProvider { static var previews: some View { Favorites() -// .environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) + .environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) } }
--- a/Simoleon/Helpers/ConversionBox.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Helpers/ConversionBox.swift Tue Aug 03 18:03:09 2021 +0100 @@ -41,6 +41,7 @@ .font(Font.title.weight(.semibold)) .lineLimit(1) .padding(.bottom, 10) + .accessibilityIdentifier("ConversionTextfield") } Divider()
--- a/Simoleon/Helpers/CurrencyRow.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Helpers/CurrencyRow.swift Tue Aug 03 18:03:09 2021 +0100 @@ -20,14 +20,14 @@ .aspectRatio(contentMode: .fill) .frame(width: 30, height: 30) .clipShape(Circle()) - .overlay(Circle().stroke(Color(.systemGray), lineWidth: 1)) + .overlay(Circle().stroke(Color(.secondaryLabel), lineWidth: 1)) Image(currencyMetadata[String(currencies[1])]!.flag) .resizable() .aspectRatio(contentMode: .fill) .frame(width: 30, height: 30) .clipShape(Circle()) - .overlay(Circle().stroke(Color(.systemGray), lineWidth: 1)) + .overlay(Circle().stroke(Color(.secondaryLabel), lineWidth: 1)) .offset(x: -20) .padding(.trailing, -20) @@ -40,7 +40,7 @@ if isLocked ?? false { Image(systemName: "lock") - .foregroundColor(Color(.systemGray)) + .foregroundColor(.secondary) } } } @@ -48,6 +48,6 @@ struct CurrencyRow_Previews: PreviewProvider { static var previews: some View { - CurrencyRow(currencyPairName: "USD/GBP") + CurrencyRow(currencyPairName: "USD/GBP", isLocked: true) } }
--- a/Simoleon/Helpers/CurrencySelector.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Helpers/CurrencySelector.swift Tue Aug 03 18:03:09 2021 +0100 @@ -40,6 +40,7 @@ VStack { SearchBar(placeholder: "Search...", text: $searchCurrency) .padding() + .accessibilityIdentifier("SearchBar") if entitlementIsActive { List(searchResults, id: \.self) { currencyPair in @@ -49,6 +50,7 @@ }) { CurrencyRow(currencyPairName: currencyPair.name) } + .accessibilityIdentifier("CurrencyRow") } .listStyle() } else { @@ -96,6 +98,9 @@ // Check if user subscription is active private func checkEntitlement() { + #if DEBUG + entitlementIsActive = true + #else Purchases.shared.purchaserInfo { (purchaserInfo, error) in if purchaserInfo?.entitlements["all"]?.isActive == true { entitlementIsActive = true @@ -107,6 +112,7 @@ showingAlert = true } } + #endif } } extension View {
--- a/Simoleon/Helpers/FavoriteButton.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Helpers/FavoriteButton.swift Tue Aug 03 18:03:09 2021 +0100 @@ -27,6 +27,7 @@ .foregroundColor(Color(.systemYellow)) ) } + .accessibilityIdentifier("FavoriteButton") } /*
--- a/Simoleon/Helpers/LockedCurrencyPicker.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Helpers/LockedCurrencyPicker.swift Tue Aug 03 18:03:09 2021 +0100 @@ -16,10 +16,10 @@ Text("Default currency") Spacer() Text(defaultCurrency.first?.pair ?? "USD/GBP") - .foregroundColor(Color(.systemGray)) + .foregroundColor(.secondary) Image(systemName: "lock") - .foregroundColor(Color(.systemGray)) + .foregroundColor(.secondary) } } }
--- a/Simoleon/Helpers/SearchBar.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Helpers/SearchBar.swift Tue Aug 03 18:03:09 2021 +0100 @@ -18,7 +18,7 @@ .padding(10) .background( RoundedRectangle(cornerRadius: 15) - .foregroundColor(Color(.systemGray6)) + .foregroundColor(Color(.tertiarySystemFill)) ) } }
--- a/Simoleon/Settings.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/Simoleon/Settings.swift Tue Aug 03 18:03:09 2021 +0100 @@ -150,6 +150,9 @@ // Check if user subscription is active private func checkEntitlement() { + #if DEBUG + entitlementIsActive = true + #else Purchases.shared.purchaserInfo { (purchaserInfo, error) in if purchaserInfo?.entitlements["all"]?.isActive == true { entitlementIsActive = true @@ -161,6 +164,7 @@ showingAlert = true } } + #endif } }
--- a/SimoleonTests/SimoleonTests.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/SimoleonTests/SimoleonTests.swift Tue Aug 03 18:03:09 2021 +0100 @@ -17,11 +17,6 @@ override func tearDownWithError() throws { // Put teardown code here. This method is called after the invocation of each test method in the class. } - - func testExample() throws { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } func testMakeConversion() { // Given
--- a/SimoleonUITests/SimoleonUITests.swift Mon Aug 02 21:27:56 2021 +0100 +++ b/SimoleonUITests/SimoleonUITests.swift Tue Aug 03 18:03:09 2021 +0100 @@ -11,6 +11,7 @@ override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. + // In UI tests it is usually best to stop immediately when a failure occurs. continueAfterFailure = false @@ -22,11 +23,53 @@ // Put teardown code here. This method is called after the invocation of each test method in the class. } - // MARK: - Tab View - func testExample() throws { + // MARK: - Automate screenshots + func testLaunchScreenshots() { let app = XCUIApplication() + setupSnapshot(app) app.launch() - // Put code here + snapshot("0-Launch") + + // Remove 100 from conversion textfield and type custom amount + let conversionTextfield = app.textFields["ConversionTextfield"] + conversionTextfield.tap() + for _ in (0..<4) { + conversionTextfield.typeText(XCUIKeyboardKey.delete.rawValue) + } + conversionTextfield.typeText("1470.10") + snapshot("1-Convert") + + // Remove custom amount and type again 1000 + for _ in (0..<7) { + conversionTextfield.typeText(XCUIKeyboardKey.delete.rawValue) + } + conversionTextfield.typeText("1000\n") + } + + func testCurrencySelectorScreenshots() throws { + let app = XCUIApplication() + setupSnapshot(app) + app.launch() + + // Open currency selector, search BTC, and select first row + app.buttons["CurrencySelector"].tap() + snapshot("2-CurrencySelector") + + let searchBar = app.textFields["SearchBar"] + searchBar.tap() + searchBar.typeText("BTC") + app.buttons["CurrencyRow"].firstMatch.tap() + snapshot("3-Bitcoin") + } + + func testFavorites() throws { + let app = XCUIApplication() + setupSnapshot(app) + app.launch() + + // Go to favorites + app.tabBars.buttons.element(boundBy: 1).tap() + snapshot("4-Favorites") } func testLaunchPerformance() throws {
--- a/fastlane/Fastfile Mon Aug 02 21:27:56 2021 +0100 +++ b/fastlane/Fastfile Tue Aug 03 18:03:09 2021 +0100 @@ -16,6 +16,7 @@ default_platform(:ios) platform :ios do + desc "Push a new beta build to TestFlight" lane :beta do increment_build_number( @@ -28,4 +29,12 @@ build_app(scheme: "Simoleon") upload_to_testflight end + + desc "Release new version to App Store" + lane :release do + capture_screenshots + build_app(scheme: "Simoleon") + upload_to_app_store + end + end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/Snapfile Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,41 @@ +# Uncomment the lines below you want to change by removing the # in the beginning + +# A list of devices you want to take the screenshots from +devices([ + "iPhone 8 Plus", + "iPhone 12 Pro Max", + "iPad Pro (12.9-inch) (5th generation)" +]) + +languages([ + "en-US", + "es-ES", + "en-GB", + "de-DE", + "fr-FR", + "pt-PT", + "nl-NL", + "it-IT", + "ru-RU" +]) + +# The name of the scheme which contains the UI Tests +scheme("Tests") + +# Where should the resulting screenshots be stored? +# output_directory("./screenshots") + +# remove the '#' to clear all previously generated screenshots before creating new ones +clear_previous_screenshots(true) + +# Remove the '#' to set the status bar to 9:41 AM, and show full battery and reception. See also override_status_bar_arguments for custom options. +override_status_bar(true) + +# Arguments to pass to the app on launch. See https://docs.fastlane.tools/actions/snapshot/#launch-arguments +# launch_arguments(["-favColor red"]) + +# Enabling this option will configure the Simulator's system language +localize_simulator(true) + +# For more information about all available options run +# fastlane action snapshot
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/SnapshotHelper.swift Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,309 @@ +// +// SnapshotHelper.swift +// Example +// +// Created by Felix Krause on 10/8/15. +// + +// ----------------------------------------------------- +// IMPORTANT: When modifying this file, make sure to +// increment the version number at the very +// bottom of the file to notify users about +// the new SnapshotHelper.swift +// ----------------------------------------------------- + +import Foundation +import XCTest + +var deviceLanguage = "" +var locale = "" + +func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) { + Snapshot.setupSnapshot(app, waitForAnimations: waitForAnimations) +} + +func snapshot(_ name: String, waitForLoadingIndicator: Bool) { + if waitForLoadingIndicator { + Snapshot.snapshot(name) + } else { + Snapshot.snapshot(name, timeWaitingForIdle: 0) + } +} + +/// - Parameters: +/// - name: The name of the snapshot +/// - timeout: Amount of seconds to wait until the network loading indicator disappears. Pass `0` if you don't want to wait. +func snapshot(_ name: String, timeWaitingForIdle timeout: TimeInterval = 20) { + Snapshot.snapshot(name, timeWaitingForIdle: timeout) +} + +enum SnapshotError: Error, CustomDebugStringConvertible { + case cannotFindSimulatorHomeDirectory + case cannotRunOnPhysicalDevice + + var debugDescription: String { + switch self { + case .cannotFindSimulatorHomeDirectory: + return "Couldn't find simulator home location. Please, check SIMULATOR_HOST_HOME env variable." + case .cannotRunOnPhysicalDevice: + return "Can't use Snapshot on a physical device." + } + } +} + +@objcMembers +open class Snapshot: NSObject { + static var app: XCUIApplication? + static var waitForAnimations = true + static var cacheDirectory: URL? + static var screenshotsDirectory: URL? { + return cacheDirectory?.appendingPathComponent("screenshots", isDirectory: true) + } + + open class func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) { + + Snapshot.app = app + Snapshot.waitForAnimations = waitForAnimations + + do { + let cacheDir = try getCacheDirectory() + Snapshot.cacheDirectory = cacheDir + setLanguage(app) + setLocale(app) + setLaunchArguments(app) + } catch let error { + NSLog(error.localizedDescription) + } + } + + class func setLanguage(_ app: XCUIApplication) { + guard let cacheDirectory = self.cacheDirectory else { + NSLog("CacheDirectory is not set - probably running on a physical device?") + return + } + + let path = cacheDirectory.appendingPathComponent("language.txt") + + do { + let trimCharacterSet = CharacterSet.whitespacesAndNewlines + deviceLanguage = try String(contentsOf: path, encoding: .utf8).trimmingCharacters(in: trimCharacterSet) + app.launchArguments += ["-AppleLanguages", "(\(deviceLanguage))"] + } catch { + NSLog("Couldn't detect/set language...") + } + } + + class func setLocale(_ app: XCUIApplication) { + guard let cacheDirectory = self.cacheDirectory else { + NSLog("CacheDirectory is not set - probably running on a physical device?") + return + } + + let path = cacheDirectory.appendingPathComponent("locale.txt") + + do { + let trimCharacterSet = CharacterSet.whitespacesAndNewlines + locale = try String(contentsOf: path, encoding: .utf8).trimmingCharacters(in: trimCharacterSet) + } catch { + NSLog("Couldn't detect/set locale...") + } + + if locale.isEmpty && !deviceLanguage.isEmpty { + locale = Locale(identifier: deviceLanguage).identifier + } + + if !locale.isEmpty { + app.launchArguments += ["-AppleLocale", "\"\(locale)\""] + } + } + + class func setLaunchArguments(_ app: XCUIApplication) { + guard let cacheDirectory = self.cacheDirectory else { + NSLog("CacheDirectory is not set - probably running on a physical device?") + return + } + + let path = cacheDirectory.appendingPathComponent("snapshot-launch_arguments.txt") + app.launchArguments += ["-FASTLANE_SNAPSHOT", "YES", "-ui_testing"] + + do { + let launchArguments = try String(contentsOf: path, encoding: String.Encoding.utf8) + let regex = try NSRegularExpression(pattern: "(\\\".+?\\\"|\\S+)", options: []) + let matches = regex.matches(in: launchArguments, options: [], range: NSRange(location: 0, length: launchArguments.count)) + let results = matches.map { result -> String in + (launchArguments as NSString).substring(with: result.range) + } + app.launchArguments += results + } catch { + NSLog("Couldn't detect/set launch_arguments...") + } + } + + open class func snapshot(_ name: String, timeWaitingForIdle timeout: TimeInterval = 20) { + if timeout > 0 { + waitForLoadingIndicatorToDisappear(within: timeout) + } + + NSLog("snapshot: \(name)") // more information about this, check out https://docs.fastlane.tools/actions/snapshot/#how-does-it-work + + if Snapshot.waitForAnimations { + sleep(1) // Waiting for the animation to be finished (kind of) + } + + #if os(OSX) + guard let app = self.app else { + NSLog("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + return + } + + app.typeKey(XCUIKeyboardKeySecondaryFn, modifierFlags: []) + #else + + guard self.app != nil else { + NSLog("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + return + } + + let screenshot = XCUIScreen.main.screenshot() + #if os(iOS) + let image = XCUIDevice.shared.orientation.isLandscape ? fixLandscapeOrientation(image: screenshot.image) : screenshot.image + #else + let image = screenshot.image + #endif + + guard var simulator = ProcessInfo().environment["SIMULATOR_DEVICE_NAME"], let screenshotsDir = screenshotsDirectory else { return } + + do { + // The simulator name contains "Clone X of " inside the screenshot file when running parallelized UI Tests on concurrent devices + let regex = try NSRegularExpression(pattern: "Clone [0-9]+ of ") + let range = NSRange(location: 0, length: simulator.count) + simulator = regex.stringByReplacingMatches(in: simulator, range: range, withTemplate: "") + + let path = screenshotsDir.appendingPathComponent("\(simulator)-\(name).png") + #if swift(<5.0) + UIImagePNGRepresentation(image)?.write(to: path, options: .atomic) + #else + try image.pngData()?.write(to: path, options: .atomic) + #endif + } catch let error { + NSLog("Problem writing screenshot: \(name) to \(screenshotsDir)/\(simulator)-\(name).png") + NSLog(error.localizedDescription) + } + #endif + } + + class func fixLandscapeOrientation(image: UIImage) -> UIImage { + #if os(watchOS) + return image + #else + if #available(iOS 10.0, *) { + let format = UIGraphicsImageRendererFormat() + format.scale = image.scale + let renderer = UIGraphicsImageRenderer(size: image.size, format: format) + return renderer.image { context in + image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)) + } + } else { + return image + } + #endif + } + + class func waitForLoadingIndicatorToDisappear(within timeout: TimeInterval) { + #if os(tvOS) + return + #endif + + guard let app = self.app else { + NSLog("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + return + } + + let networkLoadingIndicator = app.otherElements.deviceStatusBars.networkLoadingIndicators.element + let networkLoadingIndicatorDisappeared = XCTNSPredicateExpectation(predicate: NSPredicate(format: "exists == false"), object: networkLoadingIndicator) + _ = XCTWaiter.wait(for: [networkLoadingIndicatorDisappeared], timeout: timeout) + } + + class func getCacheDirectory() throws -> URL { + let cachePath = "Library/Caches/tools.fastlane" + // on OSX config is stored in /Users/<username>/Library + // and on iOS/tvOS/WatchOS it's in simulator's home dir + #if os(OSX) + let homeDir = URL(fileURLWithPath: NSHomeDirectory()) + return homeDir.appendingPathComponent(cachePath) + #elseif arch(i386) || arch(x86_64) || arch(arm64) + guard let simulatorHostHome = ProcessInfo().environment["SIMULATOR_HOST_HOME"] else { + throw SnapshotError.cannotFindSimulatorHomeDirectory + } + let homeDir = URL(fileURLWithPath: simulatorHostHome) + return homeDir.appendingPathComponent(cachePath) + #else + throw SnapshotError.cannotRunOnPhysicalDevice + #endif + } +} + +private extension XCUIElementAttributes { + var isNetworkLoadingIndicator: Bool { + if hasAllowListedIdentifier { return false } + + let hasOldLoadingIndicatorSize = frame.size == CGSize(width: 10, height: 20) + let hasNewLoadingIndicatorSize = frame.size.width.isBetween(46, and: 47) && frame.size.height.isBetween(2, and: 3) + + return hasOldLoadingIndicatorSize || hasNewLoadingIndicatorSize + } + + var hasAllowListedIdentifier: Bool { + let allowListedIdentifiers = ["GeofenceLocationTrackingOn", "StandardLocationTrackingOn"] + + return allowListedIdentifiers.contains(identifier) + } + + func isStatusBar(_ deviceWidth: CGFloat) -> Bool { + if elementType == .statusBar { return true } + guard frame.origin == .zero else { return false } + + let oldStatusBarSize = CGSize(width: deviceWidth, height: 20) + let newStatusBarSize = CGSize(width: deviceWidth, height: 44) + + return [oldStatusBarSize, newStatusBarSize].contains(frame.size) + } +} + +private extension XCUIElementQuery { + var networkLoadingIndicators: XCUIElementQuery { + let isNetworkLoadingIndicator = NSPredicate { (evaluatedObject, _) in + guard let element = evaluatedObject as? XCUIElementAttributes else { return false } + + return element.isNetworkLoadingIndicator + } + + return self.containing(isNetworkLoadingIndicator) + } + + var deviceStatusBars: XCUIElementQuery { + guard let app = Snapshot.app else { + fatalError("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().") + } + + let deviceWidth = app.windows.firstMatch.frame.width + + let isStatusBar = NSPredicate { (evaluatedObject, _) in + guard let element = evaluatedObject as? XCUIElementAttributes else { return false } + + return element.isStatusBar(deviceWidth) + } + + return self.containing(isStatusBar) + } +} + +private extension CGFloat { + func isBetween(_ numberA: CGFloat, and numberB: CGFloat) -> Bool { + return numberA...numberB ~= self + } +} + +// Please don't remove the lines below +// They are used to detect outdated configuration files +// SnapshotHelperVersion [1.27]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/copyright.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +2021 Dennis Technologies Ltd. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/de-DE/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon ist ein Echtzeit-Währungsumrechner, der über 170 globale Währungen und 2000 Währungspaare unterstützt. Die einfache Bedienung und der reale Wechselkurs machen es zur perfekten App für Reisende, die wissen wollen, wie viel ihre Währung in jedem Moment wert ist. + +- 170 Weltwährungen, Kryptowährungen wie Bitcoin, Ethereum und Dash sowie Rohstoffe wie Gold, Silber und Platin. +- Kurse direkt von den europäischen Handelsplätzen. +- Wählen Sie Ihr Standard-Währungspaar und speichern Sie Ihre Lieblingswährungen. +- Simoleon wird auf all Ihren Geräten synchronisiert. +- Schnelle und einfache Schnittstelle. + +Datenschutzbestimmungen: https://dennistech.io/simoleon-privacy-policy +Nutzungsbedingungen: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/de-DE/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +währung,forex,umrechner,geld,euro,dollar,yen,reisen,wechsel,märkte,finanz \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/de-DE/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/de-DE/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/de-DE/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/de-DE/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Hallo zusammen! Dies ist ein großes Update, wir hoffen es gefällt euch: +- Simoleon ist jetzt in Spanisch, Deutsch, Französisch, Italienisch, Niederländisch, Portugiesisch und Russisch verfügbar. Wenn Sie eine falsche oder seltsame Übersetzung bemerken, kontaktieren Sie uns bitte: https://dennistech.io/contact +- In-App-Werbekäufe implementiert. +- Jetzt können Sie mit Simoleon kostenlos zwischen den gängigsten Währungspaaren umrechnen. +- UI-Aktualisierungen. +- Behebt Bugs. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/de-DE/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-GB/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon is a real-time currency converter with over 170 global currencies and 2000 currency pairs supported. The ease of use and the real exchange rate makes it the perfect app for travellers who want to know how much their currency is worth at every moment. + +- 170 global currencies, cryptos like Bitcoin, Ethereum, and Dash, and raw materials like gold, silver, and platinum. +- Quotes straight from European trading floors. +- Select your default currency pair and save your favourite currencies. +- Simoleon is synchronised across all your devices. +- Fast and simple interface. + +Privacy policy: https://dennistech.io/simoleon-privacy-policy +Terms of use: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-GB/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +currency,forex,converter,money,euro,dollar,yen,travel,exchange,markets,finance \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-GB/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-GB/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-GB/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-GB/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Hi there! This is a big update, we hope you like it: +- Simoleon is available in Spanish, German, French, Italian, Dutch, Portuguese, and Russian. If you notice a wrong or weird translation, please contact us: https://dennistech.io/contact +- Implemented In-App promotional purchases. +- Now, you can use Simoleon to convert between the most popular currency pairs for free. +- UI updates. +- Fixes bugs. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-GB/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-US/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon is a real-time currency converter with over 170 global currencies and 2000 currency pairs supported. The ease of use and the real exchange rate makes it the perfect app for travellers who want to know how much their currency is worth at every moment. + +- 170 global currencies, cryptos like Bitcoin, Ethereum, and Dash, and raw materials like gold, silver, and platinum. +- Quotes straight from European trading floors. +- Select your default currency pair and save your favorite currencies. +- Simoleon is synchronised across all your devices. +- Fast and simple interface. + +Privacy policy: https://dennistech.io/simoleon-privacy-policy +Terms of use: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-US/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +currency,forex,converter,money,euro,dollar,yen,travel,exchange,markets,finance \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-US/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-US/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-US/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-US/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Hi there! This is a big update, we hope you like it: +- Simoleon is available in Spanish, German, French, Italian, Dutch, Portuguese, and Russian. If you notice a wrong or weird translation, please contact us: https://dennistech.io/contact +- Implemented In-App promotional purchases. +- Now, you can use Simoleon to convert between the most popular currency pairs for free. +- UI updates. +- Fixes bugs. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/en-US/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/es-ES/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon es un conversor de divisas en tiempo real con más de 170 monedas mundiales y 2000 pares de divisas. Su facilidad de uso y el tipo de cambio en tiempo real hace que Simoleon sea la app perfecta para viajeros que necesitan saber cuánto vale su divisa en cada momento. + +- 170 monedas mundiales, criptomonedas como Bitcoin, Ethereum, y Dash, y materias primas como el oro, la plata, o el platino. +- Los tipos de cambios son recibidos directamente desde las salas de trading europeas. +- Selecciona el par de divisas principal, y guarda tus divisas favoritas. +- Simoleon se sincroniza con todos tus dispositivos. +- Interfaz rápida y sencilla. + +Política de privacidad: https://dennistech.io/simoleon-privacy-policy +Términos de uso: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/es-ES/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Divisa,moneda,conversor,dinero,euro,dolar,yen,viaje,intercambio,mercado,finanzas \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/es-ES/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/es-ES/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/es-ES/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/es-ES/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +¡Hola! Esta es la actualización más importante hasta el momento. Esperamos que te guste: +- Simoleon está disponible es español, alemán, francés, italiano, holandés, portugués, y ruso. Si ves alguna tradución equivocada o rara, por favor contáctanos: https://dennistech.io/contact +- Ya puedes comprar la suscripción directamente desde la App Store. +- Ahora puede convertir entre las divisas más populares gratuitamente. +- Mejoras en la interfaz. +- Arreglo de bugs. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/es-ES/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/fr-FR/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon est un convertisseur de devises en temps réel qui prend en charge plus de 170 devises internationales et 2000 paires de devises. La facilité d'utilisation et le taux de change réel en font l'application parfaite pour les voyageurs qui veulent savoir combien vaut leur devise à chaque instant. + +- 170 devises internationales, des cryptomonnaies comme le bitcoin, l'ethereum et le dash, et des matières premières comme l'or, l'argent et le platine. +- Des cotations en provenance directe des salles de marché européennes. +- Sélectionnez votre paire de devises par défaut et enregistrez vos devises préférées. +- Simoleon est synchronisé sur tous vos appareils. +- Interface simple et rapide. + +Politique de confidentialité : https://dennistech.io/simoleon-privacy-policy +Conditions d'utilisation : https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/fr-FR/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +monnaie,forex,convertisseur,argent,euro,dollar,yen,voyage,change,marchés,finance \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/fr-FR/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/fr-FR/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/fr-FR/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/fr-FR/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Bonjour à tous ! C'est une grosse mise à jour, nous espérons qu'elle vous plaira : +- Simoleon est disponible en espagnol, allemand, français, italien, néerlandais, portugais et russe. Si vous remarquez une traduction erronée ou bizarre, veuillez nous contacter : https://dennistech.io/contact. +- Mise en place des achats promotionnels In-App. +- Désormais, vous pouvez utiliser Simoleon pour convertir gratuitement les paires de devises les plus populaires. +- Mises à jour de l'interface utilisateur. +- Correction de bugs. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/fr-FR/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/it-IT/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon è un convertitore di valuta in tempo reale con oltre 170 valute globali e 2000 coppie di valute supportate. La facilità d'uso e il tasso di cambio reale lo rendono l'app perfetta per i viaggiatori che vogliono sapere quanto vale la loro valuta in ogni momento. + +- 170 valute globali, criptovalute come Bitcoin, Ethereum e Dash, e materie prime come oro, argento e platino. +- Quotazioni direttamente dai trading floor europei. +- Seleziona la tua coppia di valute predefinita e salva le tue valute preferite. +- Simoleon è sincronizzato su tutti i tuoi dispositivi. +- Interfaccia semplice e veloce. + +Informativa sulla privacy: https://dennistech.io/simoleon-privacy-policy +Termini di utilizzo: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/it-IT/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +valuta, forex, convertitore, soldi, euro, dollaro, yen, viaggio, scambio, mercati, finanza \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/it-IT/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/it-IT/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/it-IT/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/it-IT/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Ciao a tutti! Questo è un grande aggiornamento, speriamo che vi piaccia: +- Simoleon è disponibile in spagnolo, tedesco, francese, italiano, olandese, portoghese e russo. Se noti una traduzione sbagliata o strana, contattaci: https://dennistech.io/contact +- Implementati gli acquisti promozionali In-App. +- Ora, è possibile utilizzare Simoleon per convertire tra le coppie di valute più popolari gratuitamente. +- Aggiornamenti dell'interfaccia utente. +- Correzione di bug. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/it-IT/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/nl-NL/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon is een real-time valuta converter met meer dan 170 wereldwijde valuta's en 2000 valutaparen ondersteund. Het gebruiksgemak en de reële wisselkoers maakt het de perfecte app voor reizigers die op elk moment willen weten hoeveel hun valuta waard is. + +- 170 wereldwijde valuta's, crypto's zoals Bitcoin, Ethereum, en Dash, en grondstoffen zoals goud, zilver, en platina. +- Koersen rechtstreeks van Europese handelsvloeren. +- Selecteer uw standaard valutapaar en sla uw favoriete valuta's op. +- Simoleon wordt gesynchroniseerd op al uw apparaten. +- Snelle en eenvoudige interface. + +Privacybeleid: https://dennistech.io/simoleon-privacy-policy +Gebruiksvoorwaarden: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/nl-NL/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +valuta, forex, converter, geld, euro, dollar, yen, reizen, uitwisseling, markten, financiën \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/nl-NL/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/nl-NL/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/nl-NL/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/nl-NL/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Hallo daar! Dit is een grote update, we hopen dat jullie het leuk vinden: +- Simoleon is beschikbaar in het Spaans, Duits, Frans, Italiaans, Nederlands, Portugees, en Russisch. Als u een verkeerde of vreemde vertaling opmerkt, neem dan contact met ons op: https://dennistech.io/contact +- Geïmplementeerde In-App promotionele aankopen. +- Nu kun je Simoleon gebruiken om gratis om te rekenen tussen de meest populaire valuta paren. +- UI updates. +- Bugs opgelost. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/nl-NL/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/primary_category.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +UTILITIES \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/pt-PT/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon é um conversor de moeda em tempo real com mais de 170 moedas globais e 2000 pares de moedas suportados. A facilidade de utilização e a taxa de câmbio real torna-a a aplicação perfeita para viajantes que querem saber quanto vale a sua moeda em cada momento. + +- 170 moedas globais, criptos como Bitcoin, Ethereum, e Dash, e matérias-primas como ouro, prata, e platina. +- Cotações directamente dos pisos comerciais europeus. +- Seleccione o seu par de moedas padrão e guarde as suas moedas favoritas. +- O Simoleon está sincronizado em todos os seus dispositivos. +- Interface rápida e simples. + +Política de privacidade: https://dennistech.io/simoleon-privacy-policy +Termos de utilização: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/pt-PT/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +moeda,forex,conversor,dinheiro,euro,dólar,iene,viagens,câmbio,mercados,finanças \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/pt-PT/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/pt-PT/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/pt-PT/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/pt-PT/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Olá! Esta é uma grande actualização, esperamos que gostem: +- Simoleon está disponível em espanhol, alemão, francês, italiano, holandês, português, e russo. Se notar uma tradução errada ou estranha, por favor contacte-nos: https://dennistech.io/contact +- Compras promocionais implementadas In-App. +- Agora, pode usar o Simoleon para converter entre os pares de moedas mais populares gratuitamente. +- Actualizações UI. +- Corrige bugs. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/pt-PT/support_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/contact \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/ru-RU/description.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,10 @@ +Simoleon - это конвертер валют в реальном времени с поддержкой более 170 мировых валют и 2000 валютных пар. Простота использования и реальный обменный курс делают это приложение идеальным для путешественников, которые хотят знать, сколько стоит их валюта в каждый момент времени. + +- 170 мировых валют, криптовалюты, такие как Bitcoin, Ethereum и Dash, и сырьевые товары, такие как золото, серебро и платина. +- Котировки прямо с европейских торговых площадок. +- Выберите валютную пару по умолчанию и сохраните любимые валюты. +- Simoleon синхронизируется на всех ваших устройствах. +- Быстрый и простой интерфейс. + +Политика конфиденциальности: https://dennistech.io/simoleon-privacy-policy +Условия использования: https://dennistech.io/simoleon-terms-of-use \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/ru-RU/keywords.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +валюта,форекс,конвертер,деньги,евро,доллар,йена,путешествия,обмен,рынки,финансы \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/ru-RU/marketing_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/apps/simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/ru-RU/name.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +Simoleon \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/ru-RU/privacy_url.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,1 @@ +https://dennistech.io/simoleon-privacy-policy \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastlane/metadata/ru-RU/release_notes.txt Tue Aug 03 18:03:09 2021 +0100 @@ -0,0 +1,6 @@ +Привет! Это большое обновление, мы надеемся, что оно вам понравится: +- Simoleon доступен на испанском, немецком, французском, итальянском, голландском, португальском и русском языках. Если вы заметили неправильный или странный перевод, пожалуйста, свяжитесь с нами: https://dennistech.io/contact. +- Внедрены рекламные покупки In-App. +- Теперь вы можете использовать Simoleon для конвертации между самыми популярными валютными парами бесплатно. +- Обновления пользовательского интерфейса. +- Исправлены ошибки. \ No newline at end of file