From 2cce9ae56c1460ae0880403b685cc7d723ad7c70 Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Sun, 7 Jun 2026 05:00:41 -0700 Subject: [PATCH] fix: case-open popup re-appears after the case is closed --- .../reaction/core/popup/PopUpReaction.kt | 4 +-- .../core/popup/PopUpReactionLogicTest.kt | 35 +++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/darken/capod/reaction/core/popup/PopUpReaction.kt b/app/src/main/java/eu/darken/capod/reaction/core/popup/PopUpReaction.kt index d07e4743..94de514d 100644 --- a/app/src/main/java/eu/darken/capod/reaction/core/popup/PopUpReaction.kt +++ b/app/src/main/java/eu/darken/capod/reaction/core/popup/PopUpReaction.kt @@ -290,8 +290,8 @@ class PopUpReaction @Inject constructor( DualApplePods.LidState.CLOSED -> CasePopUpDecision( shouldShow = false, shouldHide = true, - shouldResetCooldown = true, - reason = "Lid CLOSED, resetting cooldown", + shouldResetCooldown = false, + reason = "Lid CLOSED, refreshing cooldown", ) else -> CasePopUpDecision( diff --git a/app/src/test/java/eu/darken/capod/reaction/core/popup/PopUpReactionLogicTest.kt b/app/src/test/java/eu/darken/capod/reaction/core/popup/PopUpReactionLogicTest.kt index 1ffe63bd..a7657e25 100644 --- a/app/src/test/java/eu/darken/capod/reaction/core/popup/PopUpReactionLogicTest.kt +++ b/app/src/test/java/eu/darken/capod/reaction/core/popup/PopUpReactionLogicTest.kt @@ -36,10 +36,11 @@ class PopUpReactionLogicTest : BaseTest() { private fun evaluate( currentLidState: DualApplePods.LidState?, lastShownTime: Instant? = null, + at: Instant = now, ) = popUpReaction.evaluateCasePopUp( currentLidState = currentLidState, lastShownTime = lastShownTime, - now = now, + now = at, cooldownDuration = cooldown, ) @@ -81,11 +82,39 @@ class PopUpReactionLogicTest : BaseTest() { } @Test - fun `lid CLOSED - should NOT show, should hide, should reset cooldown`() { + fun `lid CLOSED - should NOT show, should hide, should NOT reset cooldown`() { val decision = evaluate(currentLidState = DualApplePods.LidState.CLOSED) decision.shouldShow shouldBe false decision.shouldHide shouldBe true - decision.shouldResetCooldown shouldBe true + decision.shouldResetCooldown shouldBe false + } + + @Test + fun `lid CLOSED followed by residual OPEN within cooldown - should NOT show`() { + val closeDecision = evaluate(currentLidState = DualApplePods.LidState.CLOSED) + closeDecision.shouldHide shouldBe true + closeDecision.shouldResetCooldown shouldBe false + + val residualOpenDecision = evaluate( + currentLidState = DualApplePods.LidState.OPEN, + lastShownTime = now, + at = now.plusMillis(500), + ) + residualOpenDecision.shouldShow shouldBe false + } + + @Test + fun `lid CLOSED then OPEN after cooldown elapsed - should show`() { + val closeDecision = evaluate(currentLidState = DualApplePods.LidState.CLOSED) + closeDecision.shouldHide shouldBe true + closeDecision.shouldResetCooldown shouldBe false + + val reopenDecision = evaluate( + currentLidState = DualApplePods.LidState.OPEN, + lastShownTime = now, + at = now.plus(cooldown), + ) + reopenDecision.shouldShow shouldBe true } @Test