Mercurial > public > simoleon
changeset 146:f10b0e188905 v1.3.1
Merge pull request #16 from DennisTechnologies/development
Release v1.3.1
committer: GitHub <noreply@github.com>
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Tue, 17 Aug 2021 22:14:58 +0100 |
parents | a6df002a0a5c (current diff) 407611b9df91 (diff) |
children | cbf8a128462e 70f0625bfcf1 |
files | |
diffstat | 41 files changed, 427 insertions(+), 243 deletions(-) [+] |
line wrap: on
line diff
--- a/.github/workflows/ios.yml Thu Aug 05 16:50:29 2021 +0100 +++ b/.github/workflows/ios.yml Tue Aug 17 22:14:58 2021 +0100 @@ -1,10 +1,8 @@ name: Build and test on: - push: - branches: [ development ] pull_request: - branches: [ main, beta ] + branches: [ main ] jobs: build:
--- a/Gemfile.lock Thu Aug 05 16:50:29 2021 +0100 +++ b/Gemfile.lock Tue Aug 17 22:14:58 2021 +0100 @@ -7,7 +7,7 @@ artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.1.1) - aws-partitions (1.482.0) + aws-partitions (1.487.0) aws-sdk-core (3.119.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) @@ -36,7 +36,7 @@ dotenv (2.7.6) emoji_regex (3.2.2) excon (0.85.0) - faraday (1.6.0) + faraday (1.7.0) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -60,8 +60,8 @@ faraday-rack (1.0.0) faraday_middleware (1.1.0) faraday (~> 1.0) - fastimage (2.2.4) - fastlane (2.189.0) + fastimage (2.2.5) + fastlane (2.191.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -189,7 +189,7 @@ unicode-display_width (1.7.0) webrick (1.7.0) word_wrap (1.0.0) - xcodeproj (1.20.0) + xcodeproj (1.21.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0)
--- a/Simoleon.xcodeproj/project.pbxproj Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon.xcodeproj/project.pbxproj Tue Aug 17 22:14:58 2021 +0100 @@ -466,6 +466,8 @@ 95C5B23C2697752700941585 /* PBXTargetDependency */, ); name = SimoleonTests; + packageProductDependencies = ( + ); productName = SimoleonTests; productReference = 95C5B23A2697752700941585 /* SimoleonTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; @@ -737,8 +739,10 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_SWIFT_FLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonScreenshots; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Simoleon; @@ -757,13 +761,168 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + OTHER_SWIFT_FLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonScreenshots; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = Simoleon; + }; + name = Release; + }; + 95B9EECD26CAC9EF00D94D60 /* Screenshots */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Screenshots; + }; + 95B9EECE26CAC9EF00D94D60 /* Screenshots */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9585BB0F26A6B58500E3193E /* Config.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\""; + DEVELOPMENT_TEAM = MTX83R5H8X; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = Simoleon/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.3.1; + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.Simoleon; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = SCREENSHOTS; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Screenshots; + }; + 95B9EECF26CAC9EF00D94D60 /* Screenshots */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MTX83R5H8X; + INFOPLIST_FILE = SimoleonTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Simoleon.app/Simoleon"; + }; + name = Screenshots; + }; + 95B9EED026CAC9EF00D94D60 /* Screenshots */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MTX83R5H8X; + INFOPLIST_FILE = SimoleonUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Simoleon; }; - name = Release; + name = Screenshots; + }; + 95B9EED126CAC9EF00D94D60 /* Screenshots */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MTX83R5H8X; + INFOPLIST_FILE = SimoleonScreenshots/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_SWIFT_FLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonScreenshots; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = Simoleon; + }; + name = Screenshots; }; 95C5B24C2697752700941585 /* Debug */ = { isa = XCBuildConfiguration; @@ -892,7 +1051,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\""; DEVELOPMENT_TEAM = MTX83R5H8X; ENABLE_PREVIEWS = YES; @@ -902,7 +1061,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3; + MARKETING_VERSION = 1.3.1; PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.Simoleon; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -917,7 +1076,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\""; DEVELOPMENT_TEAM = MTX83R5H8X; ENABLE_PREVIEWS = YES; @@ -927,7 +1086,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3; + MARKETING_VERSION = 1.3.1; PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.Simoleon; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -1026,6 +1185,7 @@ isa = XCConfigurationList; buildConfigurations = ( 959F6DEF26BBD53500101E53 /* Debug */, + 95B9EED126CAC9EF00D94D60 /* Screenshots */, 959F6DF026BBD53500101E53 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -1035,6 +1195,7 @@ isa = XCConfigurationList; buildConfigurations = ( 95C5B24C2697752700941585 /* Debug */, + 95B9EECD26CAC9EF00D94D60 /* Screenshots */, 95C5B24D2697752700941585 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -1044,6 +1205,7 @@ isa = XCConfigurationList; buildConfigurations = ( 95C5B24F2697752700941585 /* Debug */, + 95B9EECE26CAC9EF00D94D60 /* Screenshots */, 95C5B2502697752700941585 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -1053,6 +1215,7 @@ isa = XCConfigurationList; buildConfigurations = ( 95C5B2522697752700941585 /* Debug */, + 95B9EECF26CAC9EF00D94D60 /* Screenshots */, 95C5B2532697752700941585 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -1062,6 +1225,7 @@ isa = XCConfigurationList; buildConfigurations = ( 95C5B2552697752700941585 /* Debug */, + 95B9EED026CAC9EF00D94D60 /* Screenshots */, 95C5B2562697752700941585 /* Release */, ); defaultConfigurationIsVisible = 0;
--- a/Simoleon.xcodeproj/xcshareddata/xcschemes/Screenshots.xcscheme Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon.xcodeproj/xcshareddata/xcschemes/Screenshots.xcscheme Tue Aug 17 22:14:58 2021 +0100 @@ -65,33 +65,13 @@ </BuildActionEntries> </BuildAction> <TestAction - buildConfiguration = "Debug" + buildConfiguration = "Screenshots" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" disableMainThreadChecker = "YES"> <Testables> <TestableReference - skipped = "YES"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "95C5B2392697752700941585" - BuildableName = "SimoleonTests.xctest" - BlueprintName = "SimoleonTests" - ReferencedContainer = "container:Simoleon.xcodeproj"> - </BuildableReference> - </TestableReference> - <TestableReference - skipped = "YES"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "95C5B2442697752700941585" - BuildableName = "SimoleonUITests.xctest" - BlueprintName = "SimoleonUITests" - ReferencedContainer = "container:Simoleon.xcodeproj"> - </BuildableReference> - </TestableReference> - <TestableReference skipped = "NO"> <BuildableReference BuildableIdentifier = "primary" @@ -104,7 +84,7 @@ </Testables> </TestAction> <LaunchAction - buildConfiguration = "Debug" + buildConfiguration = "Screenshots" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" disableMainThreadChecker = "YES"
--- a/Simoleon.xcodeproj/xcshareddata/xcschemes/Simoleon.xcscheme Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon.xcodeproj/xcshareddata/xcschemes/Simoleon.xcscheme Tue Aug 17 22:14:58 2021 +0100 @@ -20,13 +20,56 @@ ReferencedContainer = "container:Simoleon.xcodeproj"> </BuildableReference> </BuildActionEntry> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "NO" + buildForProfiling = "NO" + buildForArchiving = "NO" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2442697752700941585" + BuildableName = "SimoleonUITests.xctest" + BlueprintName = "SimoleonUITests" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "NO" + buildForProfiling = "NO" + buildForArchiving = "NO" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "95C5B2392697752700941585" + BuildableName = "SimoleonTests.xctest" + BlueprintName = "SimoleonTests" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + <BuildActionEntry + buildForTesting = "NO" + buildForRunning = "NO" + buildForProfiling = "NO" + buildForArchiving = "NO" + buildForAnalyzing = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "959F6DE726BBD53500101E53" + BuildableName = "SimoleonScreenshots.xctest" + BlueprintName = "SimoleonScreenshots" + ReferencedContainer = "container:Simoleon.xcodeproj"> + </BuildableReference> + </BuildActionEntry> </BuildActionEntries> </BuildAction> <TestAction buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + language = "en"> <Testables> <TestableReference skipped = "NO"> @@ -48,22 +91,13 @@ ReferencedContainer = "container:Simoleon.xcodeproj"> </BuildableReference> </TestableReference> - <TestableReference - skipped = "NO"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "959F6DE726BBD53500101E53" - BuildableName = "SimoleonScreenshots.xctest" - BlueprintName = "SimoleonScreenshots" - ReferencedContainer = "container:Simoleon.xcodeproj"> - </BuildableReference> - </TestableReference> </Testables> </TestAction> <LaunchAction - buildConfiguration = "Release" + buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + disableMainThreadChecker = "YES" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO"
--- a/Simoleon/Conversion.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Conversion.swift Tue Aug 17 22:14:58 2021 +0100 @@ -12,7 +12,7 @@ var showNavigationView: Bool? @State var currencyPair: String - @State private var amountToConvert = "1000" + @State private var amountToConvert = "" @State private var price: Double = 1.00 @State private var showingConversion = false @State private var showingCurrencySelector = false @@ -33,6 +33,7 @@ .padding(.horizontal) ) } + .accessibilityIdentifier("OpenCurrencySelector") FavoriteButton(currencyPair: currencyPair) } @@ -59,7 +60,7 @@ UIApplication.shared.dismissKeyboard() amountIsEditing = false }) { - Text("Cancel") + Text("Done") } } }
--- a/Simoleon/Favorites.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Favorites.swift Tue Aug 17 22:14:58 2021 +0100 @@ -11,14 +11,15 @@ @Environment(\.managedObjectContext) private var viewContext @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Favorite.currencyPair, ascending: true)], - animation: .default) private var favorite: FetchedResults<Favorite> + animation: .default) private var favorites: FetchedResults<Favorite> var body: some View { VStack { - if favorite.isEmpty { + if favorites.isEmpty { Group { Image(systemName: "star") .font(.title) + Text("Search a currency pair and add it to favourites.") .padding(.top, 5) } @@ -27,7 +28,7 @@ .padding(.horizontal, 50) } else { List { - ForEach(favorite) { favorite in + ForEach(favorites) { favorite in NavigationLink(destination: Conversion(showNavigationView: false, currencyPair: favorite.currencyPair)) { CurrencyRow(currencyPairName: favorite.currencyPair) } @@ -47,15 +48,15 @@ NavigationView { content } } .onAppear { - #if DEBUG - generateFavoritesToScreenshots() + #if SCREENSHOTS + generateFavoritesForScreenshots() #endif } } private func removeFromFavorites(offsets: IndexSet) { withAnimation { - offsets.map { favorite[$0] }.forEach(viewContext.delete) + offsets.map { favorites[$0] }.forEach(viewContext.delete) do { try viewContext.save() @@ -66,17 +67,22 @@ } } - #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 + #if SCREENSHOTS + /* + Save currencies to favourites to take screenshots for the App Store + */ + private func generateFavoritesForScreenshots() { + let favoriteCurrencies = [ + "EUR/USD", "BTC/USD", "USD/HKD", "USD/JPY", "AUD/USD", + "XAU/GBP", "DASH/ETH", "EUR/USD", "XAG/CAD" + ] + + let coreDataCurrencyPairs = favorites.map { $0.currencyPair } + + for favoriteCurrency in favoriteCurrencies { + if !coreDataCurrencyPairs.contains(favoriteCurrency) { + let favorites = Favorite(context: viewContext) + favorites.currencyPair = favoriteCurrency do { try viewContext.save()
--- a/Simoleon/Helpers/ConversionBox.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Helpers/ConversionBox.swift Tue Aug 17 22:14:58 2021 +0100 @@ -40,7 +40,7 @@ .keyboardType(.decimalPad) .font(Font.title.weight(.semibold)) .lineLimit(1) - .padding(.bottom, 10) + .accessibilityIdentifier("ConversionTextField") } Divider() @@ -68,7 +68,7 @@ else: * Return zero */ - private func makeConversion() -> Double { + func makeConversion() -> Double { if let amountToConvert = Double(amountToConvert) { return amountToConvert * price // Conversion } else {
--- a/Simoleon/Helpers/CurrencySelector.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Helpers/CurrencySelector.swift Tue Aug 17 22:14:58 2021 +0100 @@ -40,6 +40,7 @@ VStack { SearchBar(placeholder: "Search...", text: $searchCurrency) .padding() + .accessibilityIdentifier("CurrencySearchBar") List { if entitlementIsActive { @@ -97,7 +98,7 @@ // Check if user subscription is active private func checkEntitlement() { - #if DEBUG + #if SCREENSHOTS entitlementIsActive = true #else Purchases.shared.purchaserInfo { (purchaserInfo, error) in
--- a/Simoleon/Helpers/FavoriteButton.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Helpers/FavoriteButton.swift Tue Aug 17 22:14:58 2021 +0100 @@ -11,12 +11,12 @@ var currencyPair: String @Environment(\.managedObjectContext) private var viewContext - @FetchRequest(sortDescriptors: []) private var favorite: FetchedResults<Favorite> + @FetchRequest(sortDescriptors: []) private var favorites: FetchedResults<Favorite> @State private var starSymbol = "star" var body: some View { - let favoriteCurrencyPairs = favorite.map { $0.currencyPair } + let favoriteCurrencyPairs = favorites.map { $0.currencyPair } Button(action: { favoriteAction(favoriteCurrencyPairs) }) { RoundedRectangle(cornerRadius: 15) .foregroundColor(Color(.secondarySystemBackground)) @@ -27,6 +27,7 @@ .foregroundColor(Color(.systemYellow)) ) } + .accessibilityIdentifier("AddToFavorites") } /* @@ -65,7 +66,7 @@ */ private func removeFromFavorites() { withAnimation { - let favoriteObject = favorite.first(where: { $0.currencyPair == currencyPair }) + let favoriteObject = favorites.first(where: { $0.currencyPair == currencyPair }) viewContext.delete(favoriteObject ?? Favorite()) do {
--- a/Simoleon/Helpers/Sidebar.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Helpers/Sidebar.swift Tue Aug 17 22:14:58 2021 +0100 @@ -16,17 +16,21 @@ NavigationLink(destination: Conversion(currencyPair: defaultCurrency.first?.pair ?? "USD/GBP")) { Label("Convert", systemImage: "arrow.counterclockwise.circle") } + .accessibilityIdentifier("NavigateToConversion") NavigationLink(destination: Favorites()) { Label("Favorites", systemImage: "star") } + .accessibilityIdentifier("NavigateToFavorites") NavigationLink(destination: Settings()) { Label("Settings", systemImage: "gear") } + .accessibilityIdentifier("NavigateToSettings") } .listStyle(SidebarListStyle()) .navigationTitle("Categories") + .accessibilityIdentifier("Sidebar") } }
--- a/Simoleon/Info.plist Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Info.plist Tue Aug 17 22:14:58 2021 +0100 @@ -23,7 +23,7 @@ <key>CFBundleShortVersionString</key> <string>$(MARKETING_VERSION)</string> <key>CFBundleVersion</key> - <string>6</string> + <string>1</string> <key>LSRequiresIPhoneOS</key> <true/> <key>PURCHASES_KEY</key>
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/de.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/en-GB.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/en.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/es.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/fr.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/it.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/nl.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/pt-PT.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/ru.lproj/Localizable.strings has changed
--- a/Simoleon/Resources/es.lproj/CurrencyMetadata.json Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Resources/es.lproj/CurrencyMetadata.json Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,6 @@ { "AED": { - "name": "D\u00edrham De Los Emiratos \u00c1rabes Unidos", + "name": "D\u00edrham de los Emiratos \u00c1rabes Unidos", "flag": "AE" }, "AFN": { @@ -16,7 +16,7 @@ "flag": "AM" }, "ANG": { - "name": "Flor\u00edn De Las Antillas Neerlandesas", + "name": "Flor\u00edn de las Antillas Neerlandesas", "flag": "CW" }, "AOA": { @@ -40,15 +40,15 @@ "flag": "AU" }, "AWG": { - "name": "Flor\u00edn De Aruba", + "name": "Flor\u00edn de Aruba", "flag": "AW" }, "BAM": { - "name": "Marco Convertible De Bosnia Y Herzegovina", + "name": "Marco Convertible de Bosnia y Herzegovina", "flag": "BA" }, "BBD": { - "name": "D\u00f3lar De Barbados", + "name": "D\u00f3lar de Barbados", "flag": "BB" }, "BDT": { @@ -68,11 +68,11 @@ "flag": "BI" }, "BMD": { - "name": "D\u00f3lar De Las Bermudas", + "name": "D\u00f3lar de las Bermudas", "flag": "BM" }, "BND": { - "name": "D\u00f3lares De Brunei", + "name": "D\u00f3lares de Brunei", "flag": "BN" }, "BOB": { @@ -88,7 +88,7 @@ "flag": "BR" }, "BSD": { - "name": "D\u00f3lar De Las Bahamas", + "name": "D\u00f3lar de las Bahamas", "flag": "BS" }, "BTN": { @@ -120,7 +120,7 @@ "flag": "CH" }, "CLF": { - "name": "Unidad De Cuenta Chilena", + "name": "Unidad de Cuenta Chilena", "flag": "CL" }, "CLP": { @@ -148,7 +148,7 @@ "flag": "CU" }, "CVE": { - "name": "Escudo De Cabo Verde", + "name": "Escudo de Cabo Verde", "flag": "CV" }, "CYP": { @@ -160,7 +160,7 @@ "flag": "CZ" }, "DJF": { - "name": "Franco De Yibuti", + "name": "Franco de Yibuti", "flag": "DJ" }, "DKK": { @@ -192,7 +192,7 @@ "flag": "EU" }, "FJD": { - "name": "D\u00f3lar De Fiji", + "name": "D\u00f3lar de Fiji", "flag": "FJ" }, "FRN": { @@ -208,11 +208,11 @@ "flag": "GE" }, "GHS": { - "name": "Cedi De Ghana", + "name": "Cedi de Ghana", "flag": "GH" }, "GMD": { - "name": "Dalasi De Gambia", + "name": "Dalasi de Gambia", "flag": "GM" }, "GNF": { @@ -224,11 +224,11 @@ "flag": "GT" }, "GYD": { - "name": "D\u00f3lar De Guyana", + "name": "D\u00f3lar de Guyana", "flag": "GY" }, "HKD": { - "name": "Dolar De Hong Kong", + "name": "Dolar de Hong Kong", "flag": "HK" }, "HNL": { @@ -292,7 +292,7 @@ "flag": "KH" }, "KMF": { - "name": "Franco De Las Comoras", + "name": "Franco de las Comoras", "flag": "KM" }, "KRU": { @@ -308,7 +308,7 @@ "flag": "KW" }, "KYD": { - "name": "D\u00f3lar De Las Islas Caim\u00e1n", + "name": "D\u00f3lar de las Islas Caim\u00e1n", "flag": "KY" }, "KZT": { @@ -324,11 +324,11 @@ "flag": "LB" }, "LFX": { - "name": "Tesoros De Sukuk", + "name": "Tesoros de Sukuk", "flag": "MY" }, "LKR": { - "name": "Rupia De Sri Lanka", + "name": "Rupia de Sri Lanka", "flag": "LK" }, "LRD": { @@ -336,7 +336,7 @@ "flag": "LR" }, "LSL": { - "name": "Loti De Lesoto", + "name": "Loti de Lesoto", "flag": "LS" }, "LTL": { @@ -356,7 +356,7 @@ "flag": "MA" }, "MAL": { - "name": "Hoja De Arce", + "name": "Hoja de Arce", "flag": "MA" }, "MDL": { @@ -372,11 +372,11 @@ "flag": "MK" }, "MMK": { - "name": "Kyat De Myanmar", + "name": "Kyat de Myanmar", "flag": "MM" }, "MOP": { - "name": "Pataca De Macao", + "name": "Pataca de Macao", "flag": "MO" }, "MRU": { @@ -388,11 +388,11 @@ "flag": "MT" }, "MUR": { - "name": "Rupia De Mauricio", + "name": "Rupia de Mauricio", "flag": "MU" }, "MVR": { - "name": "Rufiyaa De Maldivas", + "name": "Rufiyaa de Maldivas", "flag": "MV" }, "MWK": { @@ -412,11 +412,11 @@ "flag": "MZ" }, "NAD": { - "name": "D\u00f3lar De Namibia", + "name": "D\u00f3lar de Namibia", "flag": "NA" }, "NBL": { - "name": "Isla De Man Noble", + "name": "Isla de Man Noble", "flag": "IM" }, "NGN": { @@ -440,7 +440,7 @@ "flag": "GB" }, "NZD": { - "name": "Dolar De Nueva Zelanda", + "name": "Dolar de Nueva Zelanda", "flag": "NZ" }, "OMR": { @@ -480,7 +480,7 @@ "flag": "PY" }, "QAR": { - "name": "Riyal De Qatar", + "name": "Riyal de Qatar", "flag": "QA" }, "RON": { @@ -504,11 +504,11 @@ "flag": "SA" }, "SBD": { - "name": "D\u00f3lar De Las Islas Salom\u00f3n", + "name": "D\u00f3lar de las Islas Salom\u00f3n", "flag": "SB" }, "SCR": { - "name": "Rupia De Seychelles", + "name": "Rupia de Seychelles", "flag": "SC" }, "SDG": { @@ -520,11 +520,11 @@ "flag": "SE" }, "SGD": { - "name": "Dolar De Singapur", + "name": "Dolar de Singapur", "flag": "SG" }, "SHP": { - "name": "Libra De Santa Elena", + "name": "Libra de Santa Elena", "flag": "SH" }, "SLL": { @@ -540,7 +540,7 @@ "flag": "SR" }, "STN": { - "name": "Dobra De Santo Tom\u00e9", + "name": "Dobra de Santo Tom\u00e9", "flag": "ST" }, "SVC": { @@ -560,7 +560,7 @@ "flag": "TJ" }, "TMT": { - "name": "Manat De Turkmenist\u00e1n", + "name": "Manat de Turkmenist\u00e1n", "flag": "TM" }, "TND": { @@ -576,7 +576,7 @@ "flag": "TR" }, "TTD": { - "name": "D\u00f3lar De Trinidad Y Tobago", + "name": "D\u00f3lar de Trinidad y Tobago", "flag": "TT" }, "TWD": { @@ -584,7 +584,7 @@ "flag": "TW" }, "TZS": { - "name": "Chel\u00edn De Tanzania", + "name": "Chel\u00edn de Tanzania", "flag": "TZ" }, "UAH": { @@ -596,7 +596,7 @@ "flag": "UG" }, "USD": { - "name": "D\u00f3lar De Los Estados Unidos", + "name": "D\u00f3lar de los Estados Unidos", "flag": "US" }, "UYU": { @@ -676,11 +676,11 @@ "flag": "ZA" }, "ZMW": { - "name": "Kwacha De Zambia", + "name": "Kwacha de Zambia", "flag": "ZM" }, "ZWD": { - "name": "D\u00f3lar De Zimbabwe", + "name": "D\u00f3lar de Zimbabwe", "flag": "ZW" }, "DASH": {
--- a/Simoleon/Settings.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/Settings.swift Tue Aug 17 22:14:58 2021 +0100 @@ -150,7 +150,7 @@ // Check if user subscription is active private func checkEntitlement() { - #if DEBUG + #if SCREENSHOTS entitlementIsActive = true #else Purchases.shared.purchaserInfo { (purchaserInfo, error) in
--- a/Simoleon/SubscriptionPaywall.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/Simoleon/SubscriptionPaywall.swift Tue Aug 17 22:14:58 2021 +0100 @@ -27,6 +27,8 @@ Text("Unlock All Access") .font(.title) .fontWeight(.semibold) + .fixedSize(horizontal: false, vertical: true) + .multilineTextAlignment(.center) .padding(.top) }
--- a/SimoleonScreenshots/SimoleonScreenshots.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/SimoleonScreenshots/SimoleonScreenshots.swift Tue Aug 17 22:14:58 2021 +0100 @@ -6,15 +6,17 @@ // import XCTest - +import CoreData +// Automate screenshots with Fastlane class SimoleonScreenshots: XCTestCase { - var screnshotEndingName = "" + var screenshotEndingName = "" override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. + // This method is called before the invocation of each test method in the class. + if UIDevice.current.userInterfaceIdiom == .pad { XCUIDevice.shared.orientation = .landscapeLeft - screnshotEndingName = "-force_landscapeleft" + screenshotEndingName = "-force_landscapeleft" } let app = XCUIApplication() @@ -23,51 +25,50 @@ // In UI tests it is usually best to stop immediately when a failure occurs. continueAfterFailure = false - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. } override func tearDownWithError() throws { // Put teardown code here. This method is called after the invocation of each test method in the class. } - // MARK: - Automate screenshots - func testLaunch() { + func testLaunchScreenshot() throws { if UIDevice.current.userInterfaceIdiom == .pad { - XCUIApplication().tables.buttons.firstMatch.tap() + XCUIApplication().tables["Sidebar"].buttons["NavigateToConversion"].tap() } - snapshot("1Launch\(screnshotEndingName)") + sleep(2) + snapshot("1Launch\(screenshotEndingName)") } - func testCurrencySelector() { + func testConvertAmountScreenshot() throws { if UIDevice.current.userInterfaceIdiom == .pad { - XCUIApplication().tables.buttons.firstMatch.tap() + XCUIApplication().tables["Sidebar"].buttons["NavigateToConversion"].tap() } - XCUIApplication().scrollViews.buttons.firstMatch.tap() - snapshot("2CurrencySelector\(screnshotEndingName)") - - XCUIApplication().tables.buttons.element(boundBy: 6).tap() - let conversionTextfield = XCUIApplication().textFields.firstMatch - conversionTextfield.tap() - for _ in (0..<4) { - conversionTextfield.typeText(XCUIKeyboardKey.delete.rawValue) + let conversionTextField = XCUIApplication().textFields["ConversionTextField"] + conversionTextField.tap() + conversionTextField.typeText("1030.15\n") + snapshot("2Conversion\(screenshotEndingName)") + } + + func testCurrencySelectorScreenshot() throws { + if UIDevice.current.userInterfaceIdiom == .pad { + XCUIApplication().tables["Sidebar"].buttons["NavigateToConversion"].tap() } - conversionTextfield.typeText("\n") - - snapshot("3Amount\(screnshotEndingName)") + XCUIApplication().scrollViews.buttons["OpenCurrencySelector"].tap() + snapshot("3CurrencySelector\(screenshotEndingName)") } - func testFavorites() throws { - // Go to favorites + func testFavoriteScreenshot() throws { if UIDevice.current.userInterfaceIdiom == .pad { - XCUIApplication().tables.buttons.element(boundBy: 1).tap() + XCUIApplication().tables["Sidebar"].buttons["NavigateToFavorites"].tap() } else { XCUIApplication().tabBars.buttons.element(boundBy: 1).tap() } - - snapshot("4Favorites\(screnshotEndingName)") + + sleep(1) + + snapshot("4Favorites\(screenshotEndingName)") } }
--- a/SimoleonTests/Info.plist Thu Aug 05 16:50:29 2021 +0100 +++ b/SimoleonTests/Info.plist Tue Aug 17 22:14:58 2021 +0100 @@ -17,6 +17,6 @@ <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleVersion</key> - <string>6</string> + <string>1</string> </dict> </plist>
--- a/SimoleonTests/SimoleonTests.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/SimoleonTests/SimoleonTests.swift Tue Aug 17 22:14:58 2021 +0100 @@ -17,40 +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 testMakeConversion() { - // Given - let testAmounts = ["iawuh", Int(100), Float(3450.30), Double(12530.43435)] as [Any] - - for var amountToConvert in testAmounts { - // When - if let amountToConvert = amountToConvert as? Double { - // Then - XCTAssertEqual(amountToConvert, amountToConvert, "Amount to convert is not returning correctly") - } else { - // Then - amountToConvert = Int(0) - XCTAssertEqual(amountToConvert as! Int, 0, "Amount to convert must be 0") - } - } - } - - func testFormatCurrency() { - // Given - let availableIdentifiers = Locale.availableIdentifiers - let amount: NSDecimalNumber = 1000 - - for identifier in availableIdentifiers { - let locale = Locale(identifier: identifier) - - let formatter = NumberFormatter() - formatter.locale = locale - formatter.numberStyle = .currency - - XCTAssertTrue((formatter.string(from: amount as NSNumber) != nil)) - } - - } func testPerformanceExample() throws { // This is an example of a performance test case.
--- a/SimoleonUITests/Info.plist Thu Aug 05 16:50:29 2021 +0100 +++ b/SimoleonUITests/Info.plist Tue Aug 17 22:14:58 2021 +0100 @@ -17,6 +17,6 @@ <key>CFBundleShortVersionString</key> <string>1.0</string> <key>CFBundleVersion</key> - <string>6</string> + <string>1</string> </dict> </plist>
--- a/SimoleonUITests/SimoleonUITests.swift Thu Aug 05 16:50:29 2021 +0100 +++ b/SimoleonUITests/SimoleonUITests.swift Tue Aug 17 22:14:58 2021 +0100 @@ -11,6 +11,12 @@ override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. + if UIDevice.current.userInterfaceIdiom == .pad { + XCUIDevice.shared.orientation = .landscapeLeft + } + + let app = XCUIApplication() + app.launch() // In UI tests it is usually best to stop immediately when a failure occurs. continueAfterFailure = false @@ -21,7 +27,58 @@ override func tearDownWithError() throws { // Put teardown code here. This method is called after the invocation of each test method in the class. } - + + func testTabBar() throws { + let app = XCUIApplication() + if UIDevice.current.userInterfaceIdiom == .pad { + app.tables["Sidebar"].buttons["NavigateToConversion"].tap() + XCTAssertTrue(app.staticTexts["Convert"].exists) + + app.tables["Sidebar"].buttons["NavigateToFavorites"].tap() + XCTAssertTrue(app.staticTexts["Favorites"].exists) + + app.tables["Sidebar"].buttons["NavigateToSettings"].tap() + XCTAssertTrue(app.staticTexts["Settings"].exists) + } else { + app.tabBars.buttons.element(boundBy: 0).tap() + XCTAssertTrue(app.staticTexts["Convert"].exists) + + app.tabBars.buttons.element(boundBy: 1).tap() + XCTAssertTrue(app.staticTexts["Favorites"].exists) + + app.tabBars.buttons.element(boundBy: 2).tap() + XCTAssertTrue(app.staticTexts["Settings"].exists) + + } + } + + func testCurrencySelector() throws { + let app = XCUIApplication() + app.scrollViews.buttons["OpenCurrencySelector"].tap() + + let currencySearchBar = app.textFields["CurrencySearchBar"] + currencySearchBar.tap() + currencySearchBar.typeText("USD/BTC") + app.tables.buttons["From USD to BTC"].tap() + } + + func testCoreData() throws { + let app = XCUIApplication() + app.scrollViews.buttons["AddToFavorites"].tap() + + if UIDevice.current.userInterfaceIdiom == .pad { + app.tables["Sidebar"].buttons["NavigateToFavorites"].tap() + } else { + app.tabBars.buttons.element(boundBy: 1).tap() + } + + XCTAssertTrue(app.tables.buttons["From USD to GBP"].exists) + + let favoriteList = app.tables + favoriteList.buttons["From USD to GBP"].swipeLeft() + favoriteList.buttons["Delete"].tap() + XCTAssertFalse(app.tables.buttons["From USD to GBP"].exists) + } func testLaunchPerformance() throws { if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
--- a/fastlane/Fastfile Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/Fastfile Tue Aug 17 22:14:58 2021 +0100 @@ -19,11 +19,7 @@ desc "Push a new beta build to TestFlight" lane :beta do - increment_build_number( - build_number: latest_testflight_build_number + 1, - xcodeproj: "Simoleon.xcodeproj" - ) - + increment_build_number(xcodeproj: "Simoleon.xcodeproj") build_app(scheme: "Simoleon") upload_to_testflight( beta_app_review_info: { @@ -36,11 +32,17 @@ ) end - desc "Release new version to App Store" + desc "Capture screenshots and release version to App Store" lane :release do capture_screenshots build_app(scheme: "Simoleon") upload_to_app_store end + + desc "Upload to App Store Connect" + lane :upload do + build_app(scheme: "Simoleon") + upload_to_app_store + end end
--- a/fastlane/README.md Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/README.md Tue Aug 17 22:14:58 2021 +0100 @@ -25,7 +25,12 @@ ``` fastlane ios release ``` -Release new version to App Store +Capture screenshots and release version to App Store +### ios upload +``` +fastlane ios upload +``` +Upload to App Store Connect ----
--- a/fastlane/Snapfile Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/Snapfile Tue Aug 17 22:14:58 2021 +0100 @@ -2,7 +2,8 @@ devices([ "iPhone 8 Plus", "iPhone 12 Pro Max", - "iPad Pro (12.9-inch) (5th generation)" + "iPad Pro (12.9-inch) (5th generation)", + "iPad Pro (12.9-inch) (3rd generation)" ]) languages([ @@ -21,7 +22,13 @@ scheme("Screenshots") # Enabling this option will automatically uninstall the application before running it. -# reinstall_app(true) +reinstall_app(true) + +# Enabling this option will automatically erase the simulator before running the application +# erase_simulator(true) + +# Take snapshots on multiple simulators concurrently. +concurrent_simulators(false) # Should the project be cleaned before building it? clean(true)
--- a/fastlane/metadata/de-DE/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/de-DE/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -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 +Wie läuft's denn so? In diesem Update haben wir einige kleinere Fehler behoben und die Benutzeroberfläche verbessert. Nichts Großes, aber sehr wichtige Verbesserungen. Wir sehen uns in der nächsten Version! \ No newline at end of file
--- a/fastlane/metadata/en-GB/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/en-GB/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -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 +How's everything going? In this update we fixed some minor bugs and improved the UX. Nothing big but very important improvements. See you in the next version! \ No newline at end of file
--- a/fastlane/metadata/en-US/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/en-US/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -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 +How's everything going? In this update we fixed some minor bugs and improved the UX. Nothing big but very important improvements. See you in the next version! \ No newline at end of file
--- a/fastlane/metadata/es-ES/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/es-ES/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -¡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 +¿Cómo va todo? En esta actualización hemos corregido algunos errores menores y mejorado la UX. Nada grande pero son mejoras muy importantes. ¡Nos vemos en la próxima versión! \ No newline at end of file
--- a/fastlane/metadata/fr-FR/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/fr-FR/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -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 +Comment ça se passe ? Dans cette mise à jour, nous avons corrigé quelques bugs mineurs et amélioré l'interface utilisateur. Rien de gros mais des améliorations très importantes. A bientôt dans la prochaine version! \ No newline at end of file
--- a/fastlane/metadata/it/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/it/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -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 +Come vanno le cose? In questo aggiornamento abbiamo risolto alcuni bug minori e migliorato l'UX. Niente di che, ma miglioramenti molto importanti. Ci vediamo nella prossima versione! \ No newline at end of file
--- a/fastlane/metadata/nl-NL/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/nl-NL/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -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 +Hoe gaat het met alles? In deze update hebben we wat kleine bugs verholpen en de UX verbeterd. Niets groots, maar zeer belangrijke verbeteringen. Tot ziens in de volgende versie! \ No newline at end of file
--- a/fastlane/metadata/pt-PT/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/pt-PT/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -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 +Como está tudo a correr? Nesta actualização corrigimos alguns bugs menores e melhorámos o UX. Nada de grande mas melhorias muito importantes. Vejo-vos na próxima versão! \ No newline at end of file
--- a/fastlane/metadata/ru/release_notes.txt Thu Aug 05 16:50:29 2021 +0100 +++ b/fastlane/metadata/ru/release_notes.txt Tue Aug 17 22:14:58 2021 +0100 @@ -1,6 +1,1 @@ -Привет! Это большое обновление, мы надеемся, что оно вам понравится: -- Simoleon доступен на испанском, немецком, французском, итальянском, голландском, португальском и русском языках. Если вы заметили неправильный или странный перевод, пожалуйста, свяжитесь с нами: https://dennistech.io/contact. -- Внедрены рекламные покупки In-App. -- Теперь вы можете использовать Simoleon для конвертации между самыми популярными валютными парами бесплатно. -- Обновления пользовательского интерфейса. -- Исправлены ошибки. \ No newline at end of file +Как идут дела? В этом обновлении мы исправили несколько мелких ошибок и улучшили UX. Ничего особенного, но очень важные улучшения. Увидимся в следующей версии! \ No newline at end of file