Loading feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContentPreview.kt +45 −4 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme import app.k9mail.feature.funding.googleplay.domain.DomainContract import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State @Composable Loading @@ -13,9 +14,12 @@ fun ContributionContentPreview() { PreviewWithTheme { ContributionContent( state = State( listState = ContributionListState( recurringContributions = FakeData.recurringContributions, oneTimeContributions = FakeData.oneTimeContributions, selectedContribution = FakeData.recurringContributions.first(), isLoading = false, ), ), onEvent = {}, contentPadding = PaddingValues(), Loading @@ -28,7 +32,44 @@ fun ContributionContentPreview() { fun ContributionContentEmptyPreview() { PreviewWithTheme { ContributionContent( state = State(), state = State( listState = ContributionListState( isLoading = false, ), ), onEvent = {}, contentPadding = PaddingValues(), ) } } @Composable @Preview(showBackground = true) fun ContributionContentLoadingPreview() { PreviewWithTheme { ContributionContent( state = State( listState = ContributionListState( isLoading = true, ), ), onEvent = {}, contentPadding = PaddingValues(), ) } } @Composable @Preview(showBackground = true) fun ContributionContentListErrorPreview() { PreviewWithTheme { ContributionContent( state = State( listState = ContributionListState( error = DomainContract.BillingError.DeveloperError("Developer error"), isLoading = false, ), ), onEvent = {}, contentPadding = PaddingValues(), ) Loading feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionListPreview.kt +85 −20 Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ package app.k9mail.feature.funding.googleplay.ui.contribution import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme import app.k9mail.feature.funding.googleplay.domain.DomainContract import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState import kotlinx.collections.immutable.persistentListOf @Composable Loading @@ -10,13 +12,17 @@ import kotlinx.collections.immutable.persistentListOf internal fun ContributionListPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = FakeData.oneTimeContributions, recurringContributions = FakeData.recurringContributions, selectedContribution = FakeData.recurringContributions.first(), isRecurringContributionSelected = true, selectedItem = FakeData.recurringContributions.first(), isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -26,13 +32,17 @@ internal fun ContributionListPreview() { internal fun ContributionListRecurringPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = FakeData.oneTimeContributions, recurringContributions = FakeData.recurringContributions, selectedItem = FakeData.oneTimeContributions.last(), selectedContribution = FakeData.oneTimeContributions.last(), isRecurringContributionSelected = false, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -42,13 +52,17 @@ internal fun ContributionListRecurringPreview() { internal fun ContributionListOneTimeOnlyPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = FakeData.oneTimeContributions, recurringContributions = persistentListOf(), selectedItem = null, selectedContribution = null, isRecurringContributionSelected = false, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -58,13 +72,17 @@ internal fun ContributionListOneTimeOnlyPreview() { internal fun ContributionListRecurringOnlyPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = FakeData.recurringContributions, selectedItem = null, selectedContribution = null, isRecurringContributionSelected = true, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -74,13 +92,60 @@ internal fun ContributionListRecurringOnlyPreview() { internal fun ContributionListEmptyPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = persistentListOf(), selectedItem = null, selectedContribution = null, isRecurringContributionSelected = false, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } @Composable @Preview(showBackground = true) internal fun ContributionListLoadingPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = persistentListOf(), selectedContribution = null, isRecurringContributionSelected = false, isLoading = true, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } @Composable @Preview(showBackground = true) internal fun ContributionListErrorPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = persistentListOf(), selectedContribution = null, isRecurringContributionSelected = false, isLoading = false, error = DomainContract.BillingError.UnknownError( "An error occurred", ), ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionScreenPreview.kt +6 −3 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ package app.k9mail.feature.funding.googleplay.ui.contribution import androidx.compose.runtime.Composable import app.k9mail.core.ui.compose.common.annotation.PreviewDevicesWithBackground import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State @Composable Loading @@ -13,11 +14,13 @@ fun ContributionScreenPreview() { onBack = {}, viewModel = FakeContributionViewModel( initialState = State( listState = ContributionListState( recurringContributions = FakeData.recurringContributions, oneTimeContributions = FakeData.oneTimeContributions, selectedContribution = FakeData.recurringContributions.first(), ), ), ), ) } } feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/FakeContributionViewModel.kt +2 −1 Original line number Diff line number Diff line package app.k9mail.feature.funding.googleplay.ui.contribution import app.k9mail.core.ui.compose.common.mvi.BaseViewModel import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.Effect import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.Event import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ViewModel internal class FakeContributionViewModel( initialState: State, ) : BaseViewModel<State, Event, Nothing>(initialState = initialState), ViewModel { ) : BaseViewModel<State, Event, Effect>(initialState = initialState), ViewModel { val events = mutableListOf<Event>() Loading feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt +8 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ import app.k9mail.feature.funding.googleplay.data.remote.GoogleBillingPurchaseHa import app.k9mail.feature.funding.googleplay.domain.BillingManager import app.k9mail.feature.funding.googleplay.domain.ContributionIdProvider import app.k9mail.feature.funding.googleplay.domain.DomainContract import app.k9mail.feature.funding.googleplay.domain.usecase.GetAvailableContributions import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionViewModel import com.android.billingclient.api.ProductDetails import org.koin.androidx.viewmodel.dsl.viewModel Loading Loading @@ -70,9 +71,16 @@ val featureFundingModule = module { ) } single<DomainContract.UseCase.GetAvailableContributions> { GetAvailableContributions( billingManager = get(), ) } viewModel { ContributionViewModel( billingManager = get(), getAvailableContributions = get(), ) } } Loading
feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContentPreview.kt +45 −4 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme import app.k9mail.feature.funding.googleplay.domain.DomainContract import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State @Composable Loading @@ -13,9 +14,12 @@ fun ContributionContentPreview() { PreviewWithTheme { ContributionContent( state = State( listState = ContributionListState( recurringContributions = FakeData.recurringContributions, oneTimeContributions = FakeData.oneTimeContributions, selectedContribution = FakeData.recurringContributions.first(), isLoading = false, ), ), onEvent = {}, contentPadding = PaddingValues(), Loading @@ -28,7 +32,44 @@ fun ContributionContentPreview() { fun ContributionContentEmptyPreview() { PreviewWithTheme { ContributionContent( state = State(), state = State( listState = ContributionListState( isLoading = false, ), ), onEvent = {}, contentPadding = PaddingValues(), ) } } @Composable @Preview(showBackground = true) fun ContributionContentLoadingPreview() { PreviewWithTheme { ContributionContent( state = State( listState = ContributionListState( isLoading = true, ), ), onEvent = {}, contentPadding = PaddingValues(), ) } } @Composable @Preview(showBackground = true) fun ContributionContentListErrorPreview() { PreviewWithTheme { ContributionContent( state = State( listState = ContributionListState( error = DomainContract.BillingError.DeveloperError("Developer error"), isLoading = false, ), ), onEvent = {}, contentPadding = PaddingValues(), ) Loading
feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionListPreview.kt +85 −20 Original line number Diff line number Diff line Loading @@ -3,6 +3,8 @@ package app.k9mail.feature.funding.googleplay.ui.contribution import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme import app.k9mail.feature.funding.googleplay.domain.DomainContract import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState import kotlinx.collections.immutable.persistentListOf @Composable Loading @@ -10,13 +12,17 @@ import kotlinx.collections.immutable.persistentListOf internal fun ContributionListPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = FakeData.oneTimeContributions, recurringContributions = FakeData.recurringContributions, selectedContribution = FakeData.recurringContributions.first(), isRecurringContributionSelected = true, selectedItem = FakeData.recurringContributions.first(), isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -26,13 +32,17 @@ internal fun ContributionListPreview() { internal fun ContributionListRecurringPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = FakeData.oneTimeContributions, recurringContributions = FakeData.recurringContributions, selectedItem = FakeData.oneTimeContributions.last(), selectedContribution = FakeData.oneTimeContributions.last(), isRecurringContributionSelected = false, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -42,13 +52,17 @@ internal fun ContributionListRecurringPreview() { internal fun ContributionListOneTimeOnlyPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = FakeData.oneTimeContributions, recurringContributions = persistentListOf(), selectedItem = null, selectedContribution = null, isRecurringContributionSelected = false, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -58,13 +72,17 @@ internal fun ContributionListOneTimeOnlyPreview() { internal fun ContributionListRecurringOnlyPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = FakeData.recurringContributions, selectedItem = null, selectedContribution = null, isRecurringContributionSelected = true, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } Loading @@ -74,13 +92,60 @@ internal fun ContributionListRecurringOnlyPreview() { internal fun ContributionListEmptyPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = persistentListOf(), selectedItem = null, selectedContribution = null, isRecurringContributionSelected = false, isLoading = false, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } @Composable @Preview(showBackground = true) internal fun ContributionListLoadingPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = persistentListOf(), selectedContribution = null, isRecurringContributionSelected = false, isLoading = true, ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } } @Composable @Preview(showBackground = true) internal fun ContributionListErrorPreview() { PreviewWithTheme { ContributionList( state = ContributionListState( oneTimeContributions = persistentListOf(), recurringContributions = persistentListOf(), selectedContribution = null, isRecurringContributionSelected = false, isLoading = false, error = DomainContract.BillingError.UnknownError( "An error occurred", ), ), onOneTimeContributionTypeClick = {}, onRecurringContributionTypeClick = {}, onItemClick = {}, onRetryClick = {}, ) } }
feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionScreenPreview.kt +6 −3 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ package app.k9mail.feature.funding.googleplay.ui.contribution import androidx.compose.runtime.Composable import app.k9mail.core.ui.compose.common.annotation.PreviewDevicesWithBackground import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State @Composable Loading @@ -13,11 +14,13 @@ fun ContributionScreenPreview() { onBack = {}, viewModel = FakeContributionViewModel( initialState = State( listState = ContributionListState( recurringContributions = FakeData.recurringContributions, oneTimeContributions = FakeData.oneTimeContributions, selectedContribution = FakeData.recurringContributions.first(), ), ), ), ) } }
feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/FakeContributionViewModel.kt +2 −1 Original line number Diff line number Diff line package app.k9mail.feature.funding.googleplay.ui.contribution import app.k9mail.core.ui.compose.common.mvi.BaseViewModel import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.Effect import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.Event import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ViewModel internal class FakeContributionViewModel( initialState: State, ) : BaseViewModel<State, Event, Nothing>(initialState = initialState), ViewModel { ) : BaseViewModel<State, Event, Effect>(initialState = initialState), ViewModel { val events = mutableListOf<Event>() Loading
feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt +8 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ import app.k9mail.feature.funding.googleplay.data.remote.GoogleBillingPurchaseHa import app.k9mail.feature.funding.googleplay.domain.BillingManager import app.k9mail.feature.funding.googleplay.domain.ContributionIdProvider import app.k9mail.feature.funding.googleplay.domain.DomainContract import app.k9mail.feature.funding.googleplay.domain.usecase.GetAvailableContributions import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionViewModel import com.android.billingclient.api.ProductDetails import org.koin.androidx.viewmodel.dsl.viewModel Loading Loading @@ -70,9 +71,16 @@ val featureFundingModule = module { ) } single<DomainContract.UseCase.GetAvailableContributions> { GetAvailableContributions( billingManager = get(), ) } viewModel { ContributionViewModel( billingManager = get(), getAvailableContributions = get(), ) } }