diff --git a/Hemera/Screen/ScreenManager.swift b/Hemera/Screen/ScreenManager.swift index eb07a70..56cf0a1 100644 --- a/Hemera/Screen/ScreenManager.swift +++ b/Hemera/Screen/ScreenManager.swift @@ -177,11 +177,18 @@ final class ScreenManager { if stayAwake && !isDimmed { resetInactivityTimer() } - case .background, .inactive: + case .background: cancelInactivityTimer() if isDimmed { isDimmed = false } + case .inactive: + /** + Transient interruptions (Control Center, Notification Center, + incoming calls) yield `.inactive` without backgrounding the app. + Keep the current dim state so it survives them. + */ + break @unknown default: break } diff --git a/HemeraTests/Screen/ScreenManagerTests.swift b/HemeraTests/Screen/ScreenManagerTests.swift index db015e5..8534e89 100644 --- a/HemeraTests/Screen/ScreenManagerTests.swift +++ b/HemeraTests/Screen/ScreenManagerTests.swift @@ -1,3 +1,4 @@ +import SwiftUI import Testing @testable import Hemera @@ -61,4 +62,26 @@ struct ScreenManagerTests { #expect(screenManager.isDimmed == true) } + // MARK: - Scene Phase + + @Test func handleScenePhase_inactive_whileDimmed_keepsDim() { + screenManager.stayAwake = true + screenManager.executePreviewDim() + #expect(screenManager.isDimmed == true) + + screenManager.handleScenePhase(.inactive) + + #expect(screenManager.isDimmed == true) + } + + @Test func handleScenePhase_background_whileDimmed_clearsDim() { + screenManager.stayAwake = true + screenManager.executePreviewDim() + #expect(screenManager.isDimmed == true) + + screenManager.handleScenePhase(.background) + + #expect(screenManager.isDimmed == false) + } + }