diff --git a/Example/ExampleTests/NotchGradientLoadingBar/NotchGradientLoadingBarViewModelTestCase.swift b/Example/ExampleTests/NotchGradientLoadingBar/NotchGradientLoadingBarViewModelTestCase.swift index 171bf28..be0ce5e 100644 --- a/Example/ExampleTests/NotchGradientLoadingBar/NotchGradientLoadingBarViewModelTestCase.swift +++ b/Example/ExampleTests/NotchGradientLoadingBar/NotchGradientLoadingBarViewModelTestCase.swift @@ -12,86 +12,34 @@ import XCTest final class NotchGradientLoadingBarViewModelTestCase: XCTestCase { - func test_initializer_shouldSetSafeAreaDevice_toIPhoneX() { + func test_initializer_shouldSetCorrectSafeAreaDevice() { // Given - let deviceIdentifiers = ["iPhone10,3", "iPhone10,6", "iPhone11,2", "iPhone11,4", "iPhone11,6"] - deviceIdentifiers.forEach { deviceIdentifier in + let identifiersToSafeAreaDeviceMap: [String: NotchGradientLoadingBarViewModel.SafeAreaDevice] = [ + "iPhone10,3": .iPhoneX, + "iPhone10,6": .iPhoneX, + "iPhone11,2": .iPhoneXS, + "iPhone11,4": .iPhoneXSMax, + "iPhone11,6": .iPhoneXSMax, + "iPhone11,8": .iPhoneXR, + "iPhone12,1": .iPhone11, + "iPhone12,3": .iPhone11Pro, + "iPhone12,5": .iPhone11ProMax, + "iPhone13,1": .iPhone12Mini, + "iPhone13,2": .iPhone12, + "iPhone13,3": .iPhone12Pro, + "iPhone13,4": .iPhone12ProMax, + "iPhone14,4": .iPhone13Mini, + "iPhone14,5": .iPhone13, + "iPhone14,2": .iPhone13Pro, + "iPhone14,3": .iPhone13ProMax, + ] + identifiersToSafeAreaDeviceMap.forEach { deviceIdentifier, safeAreaDevice in // When let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhoneX) - } - } - - func test_initializer_shouldSetSafeAreaDevice_toIPhoneXR() { - // Given - let deviceIdentifier = "iPhone11,8" - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhoneXR) - } - - func test_initializer_shouldSetSafeAreaDevice_toIPhone11() { - // Given - let deviceIdentifier = "iPhone12,1" - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone11) - } - - func test_initializer_shouldSetSafeAreaDevice_toIPhone11Pro() { - // Given - let deviceIdentifier = "iPhone12,3" - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone11Pro) - } - - func test_initializer_shouldSetSafeAreaDevice_toIPhone11ProMax() { - // Given - let deviceIdentifier = "iPhone12,5" - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone11ProMax) - } - - func test_initializer_shouldSetSafeAreaDevice_toIPhone12() { - // Given - let deviceIdentifiers = ["iPhone13,1", "iPhone13,2", "iPhone13,3", "iPhone13,4"] - deviceIdentifiers.forEach { deviceIdentifier in - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone12) - } - } - - func test_initializer_shouldSetSafeAreaDevice_toIPhone13() { - // Given - let deviceIdentifiers = ["iPhone14,4", "iPhone14,5", "iPhone14,2", "iPhone14,3"] - deviceIdentifiers.forEach { deviceIdentifier in - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone13) + XCTAssertEqual(viewModel.safeAreaDevice, safeAreaDevice) } } diff --git a/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarController.swift b/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarController.swift index 70f8f1c..fa9cc7f 100644 --- a/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarController.swift +++ b/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarController.swift @@ -212,33 +212,48 @@ private extension NotchConfig { case .unknown: return nil - case .iPhoneX: - /// The default configuration for the iPhone X and 11. + case .iPhoneX, .iPhoneXS, .iPhoneXSMax: + /// The default configuration for the iPhone X. /// Values are based on . - self.init(notchWidth: 208, + self.init(notchWidth: 209, largeCircleRadius: 22.5, largeCircleVerticalOffset: -4.75, - transform: CGAffineTransform(translationX: 0.33, y: 0)) + transform: safeAreaDevice == .iPhoneXSMax ? .identity : CGAffineTransform(translationX: 0.33, y: 0)) case .iPhoneXR, .iPhone11: - self.init(notchWidth: 230.5, + self.init(notchWidth: 230, largeCircleRadius: 24, largeCircleVerticalOffset: -3.5, transform: .identity) + // The "iPhone 11 Pro" and "iPhone 11 Pro Max" have a smaller notch than the "iPhone 11". case .iPhone11Pro, .iPhone11ProMax: self.init(notchWidth: 209, largeCircleRadius: 21, largeCircleVerticalOffset: -3.5, + transform: safeAreaDevice == .iPhone11ProMax ? .identity : CGAffineTransform(translationX: 0.33, y: 0)) + + // The "iPhone 12 Mini" has a larger notch than the "iPhone 12". + case .iPhone12Mini: + self.init(notchWidth: 226, + largeCircleRadius: 24, + largeCircleVerticalOffset: -2, transform: .identity) - case .iPhone12: + case .iPhone12, .iPhone12Pro, .iPhone12ProMax: self.init(notchWidth: 209.5, largeCircleRadius: 21, largeCircleVerticalOffset: -1.75, transform: .identity) - case .iPhone13: + // The "iPhone 13 Mini" has a larger notch than the "iPhone 13". + case .iPhone13Mini: + self.init(notchWidth: 174.75, + largeCircleRadius: 24.5, + largeCircleVerticalOffset: 0.5, + transform: .identity) + + case .iPhone13, .iPhone13Pro, .iPhone13ProMax: // The iPhone 13 specific configuration: ‟iPhone 13 notch is 20% smaller in width, but it is also a little taller in height‟. // Source: . self.init(notchWidth: 161, diff --git a/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarViewModel.swift b/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarViewModel.swift index c1bd3cd..269ee68 100644 --- a/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarViewModel.swift +++ b/GradientLoadingBar/Feature/NotchGradientLoadingBar/NotchGradientLoadingBarViewModel.swift @@ -15,13 +15,20 @@ final class NotchGradientLoadingBarViewModel { enum SafeAreaDevice { case unknown case iPhoneX + case iPhoneXS + case iPhoneXSMax case iPhoneXR case iPhone11 - // The "iPhone 11 Pro" and "iPhone 11 Pro Max" have a smaller notch than the "iPhone 11". case iPhone11Pro case iPhone11ProMax + case iPhone12Mini case iPhone12 + case iPhone12Pro + case iPhone12ProMax + case iPhone13Mini case iPhone13 + case iPhone13Pro + case iPhone13ProMax } // MARK: - Public properties @@ -44,10 +51,17 @@ private extension NotchGradientLoadingBarViewModel.SafeAreaDevice { /// /// - Note: This is taken from init(deviceIdentifier: String) { + // swiftlint:disable:previous cyclomatic_complexity switch deviceIdentifier { - case "iPhone10,3", "iPhone10,6", "iPhone11,2", "iPhone11,4", "iPhone11,6": + case "iPhone10,3", "iPhone10,6": self = .iPhoneX + case "iPhone11,2": + self = .iPhoneXS + + case "iPhone11,4", "iPhone11,6": + self = .iPhoneXSMax + case "iPhone11,8": self = .iPhoneXR @@ -60,12 +74,30 @@ private extension NotchGradientLoadingBarViewModel.SafeAreaDevice { case "iPhone12,5": self = .iPhone11ProMax - case "iPhone13,1", "iPhone13,2", "iPhone13,3", "iPhone13,4": + case "iPhone13,1": + self = .iPhone12Mini + + case "iPhone13,2": self = .iPhone12 - case "iPhone14,4", "iPhone14,5", "iPhone14,2", "iPhone14,3": + case "iPhone13,3": + self = .iPhone12Pro + + case "iPhone13,4": + self = .iPhone12ProMax + + case "iPhone14,4": + self = .iPhone13Mini + + case "iPhone14,5": self = .iPhone13 + case "iPhone14,2": + self = .iPhone13Pro + + case "iPhone14,3": + self = .iPhone13ProMax + default: self = .unknown }