Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84dba184 authored by cketti's avatar cketti
Browse files

Mark funding reminder dialog as being shown early

parent be823532
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -28,9 +28,7 @@ import org.koin.dsl.module

val featureFundingModule = module {
    single<FundingReminderContract.Dialog> {
        FundingReminderDialog(
            settings = get(),
        )
        FundingReminderDialog()
    }

    single<FundingReminderContract.FragmentLifecycleObserver> {
+12 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ class FundingReminder(

        if (shouldShowReminder()) {
            fragmentObserver.register(activity.supportFragmentManager) {
                dialog.show(activity, onOpenFunding)
                showFundingReminderDialog(activity, onOpenFunding)
            }
        }
    }
@@ -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)
    }
}
+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)
@@ -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()
    }
}
+3 −39
Original line number Diff line number Diff line
@@ -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
@@ -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 }

@@ -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 }

@@ -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)
    }
}

+2 −0
Original line number Diff line number Diff line
@@ -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
@@ -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(