Loading feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt +1 −3 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ import org.koin.dsl.module val featureFundingModule = module { single<FundingReminderContract.Dialog> { FundingReminderDialog( settings = get(), ) FundingReminderDialog() } single<FundingReminderContract.FragmentLifecycleObserver> { Loading feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminder.kt +12 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ class FundingReminder( if (shouldShowReminder()) { fragmentObserver.register(activity.supportFragmentManager) { dialog.show(activity, onOpenFunding) showFundingReminderDialog(activity, onOpenFunding) } } } Loading @@ -65,4 +65,15 @@ class FundingReminder( settings.setReminderReferenceTimestamp(clock.now().toEpochMilliseconds()) } } private fun showFundingReminderDialog( activity: AppCompatActivity, openFunding: () -> Unit, ) { // We're about to show the funding reminder dialog. So mark it as being shown. This way, if there's an error, // we err on the side of the dialog not being shown rather than it being shown more than once. settings.setReminderShownTimestamp(clock.now().toEpochMilliseconds()) dialog.show(activity, openFunding) } } feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminderDialog.kt +2 −9 Original line number Diff line number Diff line package app.k9mail.feature.funding.googleplay.ui.reminder import androidx.appcompat.app.AppCompatActivity import app.k9mail.feature.funding.api.FundingSettings import app.k9mail.feature.funding.googleplay.R import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.datetime.Clock class FundingReminderDialog( private val settings: FundingSettings, private val clock: Clock = Clock.System, ) : FundingReminderContract.Dialog { class FundingReminderDialog : FundingReminderContract.Dialog { override fun show(activity: AppCompatActivity, onOpenFunding: () -> Unit) { MaterialAlertDialogBuilder(activity) .setIcon(R.drawable.funding_googleplay_contribution_reminder_icon) Loading @@ -19,8 +14,6 @@ class FundingReminderDialog( onOpenFunding() } .setNegativeButton(R.string.funding_googleplay_contribution_reminder_negative_button, null) .setOnDismissListener { settings.setReminderShownTimestamp(clock.now().toEpochMilliseconds()) }.show() .show() } } feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminderDialogTest.kt +3 −39 Original line number Diff line number Diff line Loading @@ -3,12 +3,10 @@ package app.k9mail.feature.funding.googleplay.ui.reminder import android.app.Application import android.widget.Button import androidx.appcompat.app.AppCompatActivity import app.k9mail.core.testing.TestClock import assertk.assertThat import assertk.assertions.isEqualTo import assertk.assertions.isFalse import assertk.assertions.isTrue import kotlinx.datetime.Instant import com.google.android.material.R import org.junit.Test import org.junit.runner.RunWith import org.robolectric.Robolectric Loading @@ -16,39 +14,16 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import org.robolectric.shadows.ShadowDialog import org.robolectric.shadows.ShadowLooper import com.google.android.material.R @RunWith(RobolectricTestRunner::class) @Config(application = TestApplication::class) class FundingReminderDialogTest { @Test fun `should show dialog and set reminder shown timestamp on dismiss`() { val activity = Robolectric.buildActivity(AppCompatActivity::class.java).create().get() activity.setTheme(R.style.Theme_Material3_Light) val settings = FakeFundingSettings() val clock = TestClock(CURRENT_TIME_INSTANT) val dialog = FundingReminderDialog(settings, clock) dialog.show(activity) {} val shadowDialog = ShadowDialog.getLatestDialog() ShadowLooper.idleMainLooper() assertThat(shadowDialog.isShowing).isTrue() shadowDialog.dismiss() ShadowLooper.idleMainLooper() assertThat(settings.getReminderShownTimestamp()).isEqualTo(CURRENT_TIME) } @Test fun `should call onOpenFunding when positive button is clicked`() { val activity = Robolectric.buildActivity(AppCompatActivity::class.java).create().get() activity.setTheme(R.style.Theme_Material3_Light) val settings = FakeFundingSettings() val clock = TestClock(CURRENT_TIME_INSTANT) val dialog = FundingReminderDialog(settings, clock) val dialog = FundingReminderDialog() var fundingOpened = false val onOpenFunding = { fundingOpened = true } Loading @@ -61,18 +36,14 @@ class FundingReminderDialogTest { shadowDialog.findViewById<Button>(android.R.id.button1).performClick() ShadowLooper.idleMainLooper() // Then assertThat(fundingOpened).isTrue() assertThat(settings.getReminderShownTimestamp()).isEqualTo(CURRENT_TIME) } @Test fun `should not call onOpenFunding when negative button is clicked`() { val activity = Robolectric.buildActivity(AppCompatActivity::class.java).create().get() activity.setTheme(R.style.Theme_Material3_Light) val settings = FakeFundingSettings() val clock = TestClock(CURRENT_TIME_INSTANT) val dialog = FundingReminderDialog(settings, clock) val dialog = FundingReminderDialog() var fundingOpened = false val onOpenFunding = { fundingOpened = true } Loading @@ -85,14 +56,7 @@ class FundingReminderDialogTest { shadowDialog.findViewById<Button>(android.R.id.button2).performClick() ShadowLooper.idleMainLooper() // Then assertThat(fundingOpened).isFalse() assertThat(settings.getReminderShownTimestamp()).isEqualTo(CURRENT_TIME) } private companion object { private const val CURRENT_TIME = 1000L private val CURRENT_TIME_INSTANT = Instant.fromEpochMilliseconds(CURRENT_TIME) } } Loading feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminderTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import app.k9mail.feature.funding.googleplay.ui.reminder.FundingReminderContract import assertk.assertThat import assertk.assertions.isEqualTo import assertk.assertions.isFalse import assertk.assertions.isNotEqualTo import assertk.assertions.isTrue import kotlin.test.Test import kotlinx.datetime.Instant Loading Loading @@ -111,6 +112,7 @@ class FundingReminderTest { assertThat(dialogShown).isEqualTo(true) assertThat(fragmentObserver.isRegistered).isTrue() assertThat(activityObserver.isRegistered).isTrue() assertThat(settings.getReminderShownTimestamp()).isEqualTo(currentTime) } private fun createTestActivity( Loading Loading
feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt +1 −3 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ import org.koin.dsl.module val featureFundingModule = module { single<FundingReminderContract.Dialog> { FundingReminderDialog( settings = get(), ) FundingReminderDialog() } single<FundingReminderContract.FragmentLifecycleObserver> { Loading
feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminder.kt +12 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ class FundingReminder( if (shouldShowReminder()) { fragmentObserver.register(activity.supportFragmentManager) { dialog.show(activity, onOpenFunding) showFundingReminderDialog(activity, onOpenFunding) } } } Loading @@ -65,4 +65,15 @@ class FundingReminder( settings.setReminderReferenceTimestamp(clock.now().toEpochMilliseconds()) } } private fun showFundingReminderDialog( activity: AppCompatActivity, openFunding: () -> Unit, ) { // We're about to show the funding reminder dialog. So mark it as being shown. This way, if there's an error, // we err on the side of the dialog not being shown rather than it being shown more than once. settings.setReminderShownTimestamp(clock.now().toEpochMilliseconds()) dialog.show(activity, openFunding) } }
feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminderDialog.kt +2 −9 Original line number Diff line number Diff line package app.k9mail.feature.funding.googleplay.ui.reminder import androidx.appcompat.app.AppCompatActivity import app.k9mail.feature.funding.api.FundingSettings import app.k9mail.feature.funding.googleplay.R import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.datetime.Clock class FundingReminderDialog( private val settings: FundingSettings, private val clock: Clock = Clock.System, ) : FundingReminderContract.Dialog { class FundingReminderDialog : FundingReminderContract.Dialog { override fun show(activity: AppCompatActivity, onOpenFunding: () -> Unit) { MaterialAlertDialogBuilder(activity) .setIcon(R.drawable.funding_googleplay_contribution_reminder_icon) Loading @@ -19,8 +14,6 @@ class FundingReminderDialog( onOpenFunding() } .setNegativeButton(R.string.funding_googleplay_contribution_reminder_negative_button, null) .setOnDismissListener { settings.setReminderShownTimestamp(clock.now().toEpochMilliseconds()) }.show() .show() } }
feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminderDialogTest.kt +3 −39 Original line number Diff line number Diff line Loading @@ -3,12 +3,10 @@ package app.k9mail.feature.funding.googleplay.ui.reminder import android.app.Application import android.widget.Button import androidx.appcompat.app.AppCompatActivity import app.k9mail.core.testing.TestClock import assertk.assertThat import assertk.assertions.isEqualTo import assertk.assertions.isFalse import assertk.assertions.isTrue import kotlinx.datetime.Instant import com.google.android.material.R import org.junit.Test import org.junit.runner.RunWith import org.robolectric.Robolectric Loading @@ -16,39 +14,16 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import org.robolectric.shadows.ShadowDialog import org.robolectric.shadows.ShadowLooper import com.google.android.material.R @RunWith(RobolectricTestRunner::class) @Config(application = TestApplication::class) class FundingReminderDialogTest { @Test fun `should show dialog and set reminder shown timestamp on dismiss`() { val activity = Robolectric.buildActivity(AppCompatActivity::class.java).create().get() activity.setTheme(R.style.Theme_Material3_Light) val settings = FakeFundingSettings() val clock = TestClock(CURRENT_TIME_INSTANT) val dialog = FundingReminderDialog(settings, clock) dialog.show(activity) {} val shadowDialog = ShadowDialog.getLatestDialog() ShadowLooper.idleMainLooper() assertThat(shadowDialog.isShowing).isTrue() shadowDialog.dismiss() ShadowLooper.idleMainLooper() assertThat(settings.getReminderShownTimestamp()).isEqualTo(CURRENT_TIME) } @Test fun `should call onOpenFunding when positive button is clicked`() { val activity = Robolectric.buildActivity(AppCompatActivity::class.java).create().get() activity.setTheme(R.style.Theme_Material3_Light) val settings = FakeFundingSettings() val clock = TestClock(CURRENT_TIME_INSTANT) val dialog = FundingReminderDialog(settings, clock) val dialog = FundingReminderDialog() var fundingOpened = false val onOpenFunding = { fundingOpened = true } Loading @@ -61,18 +36,14 @@ class FundingReminderDialogTest { shadowDialog.findViewById<Button>(android.R.id.button1).performClick() ShadowLooper.idleMainLooper() // Then assertThat(fundingOpened).isTrue() assertThat(settings.getReminderShownTimestamp()).isEqualTo(CURRENT_TIME) } @Test fun `should not call onOpenFunding when negative button is clicked`() { val activity = Robolectric.buildActivity(AppCompatActivity::class.java).create().get() activity.setTheme(R.style.Theme_Material3_Light) val settings = FakeFundingSettings() val clock = TestClock(CURRENT_TIME_INSTANT) val dialog = FundingReminderDialog(settings, clock) val dialog = FundingReminderDialog() var fundingOpened = false val onOpenFunding = { fundingOpened = true } Loading @@ -85,14 +56,7 @@ class FundingReminderDialogTest { shadowDialog.findViewById<Button>(android.R.id.button2).performClick() ShadowLooper.idleMainLooper() // Then assertThat(fundingOpened).isFalse() assertThat(settings.getReminderShownTimestamp()).isEqualTo(CURRENT_TIME) } private companion object { private const val CURRENT_TIME = 1000L private val CURRENT_TIME_INSTANT = Instant.fromEpochMilliseconds(CURRENT_TIME) } } Loading
feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/reminder/FundingReminderTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import app.k9mail.feature.funding.googleplay.ui.reminder.FundingReminderContract import assertk.assertThat import assertk.assertions.isEqualTo import assertk.assertions.isFalse import assertk.assertions.isNotEqualTo import assertk.assertions.isTrue import kotlin.test.Test import kotlinx.datetime.Instant Loading Loading @@ -111,6 +112,7 @@ class FundingReminderTest { assertThat(dialogShown).isEqualTo(true) assertThat(fragmentObserver.isRegistered).isTrue() assertThat(activityObserver.isRegistered).isTrue() assertThat(settings.getReminderShownTimestamp()).isEqualTo(currentTime) } private fun createTestActivity( Loading