Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ import com.hedvig.android.auth.MemberIdService
import com.hedvig.android.core.appreview.WaitUntilAppReviewDialogShouldBeOpenedUseCase
import com.hedvig.android.core.buildconstants.HedvigBuildConstants
import com.hedvig.android.core.demomode.DemoManager
import com.hedvig.android.core.demomode.Provider
import com.hedvig.android.core.rive.RiveInitializer
import com.hedvig.android.data.settings.datastore.SettingsDataStore
import com.hedvig.android.featureflags.FeatureManager
Expand Down Expand Up @@ -99,7 +98,7 @@ class MainActivity : AppCompatActivity() {
private lateinit var memberIdService: MemberIdService

@Inject
private lateinit var missedPaymentNotificationServiceProvider: Provider<MissedPaymentNotificationService>
private lateinit var missedPaymentNotificationService: MissedPaymentNotificationService

@Inject
private lateinit var currentDestinationHolder: CurrentDestinationHolder
Expand Down Expand Up @@ -244,7 +243,7 @@ class MainActivity : AppCompatActivity() {
externalNavigator = externalNavigator,
logoutUseCase = logoutUseCase,
getMemberAuthorizationCodeUseCase = getMemberAuthorizationCodeUseCase,
missedPaymentNotificationServiceProvider = missedPaymentNotificationServiceProvider,
missedPaymentNotificationService = missedPaymentNotificationService,
currentDestinationHolder = currentDestinationHolder,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ import com.hedvig.android.compose.ui.LocalSharedTransitionScope
import com.hedvig.android.core.appreview.WaitUntilAppReviewDialogShouldBeOpenedUseCase
import com.hedvig.android.core.buildconstants.HedvigBuildConstants
import com.hedvig.android.core.demomode.DemoManager
import com.hedvig.android.core.demomode.Provider
import com.hedvig.android.data.settings.datastore.SettingsDataStore
import com.hedvig.android.design.system.hedvig.DemoModeLabel
import com.hedvig.android.design.system.hedvig.Surface
Expand Down Expand Up @@ -109,7 +108,7 @@ internal fun HedvigApp(
externalNavigator: ExternalNavigator,
logoutUseCase: LogoutUseCase,
getMemberAuthorizationCodeUseCase: GetMemberAuthorizationCodeUseCase,
missedPaymentNotificationServiceProvider: Provider<MissedPaymentNotificationService>,
missedPaymentNotificationService: MissedPaymentNotificationService,
currentDestinationHolder: CurrentDestinationHolder,
) {
ReportCurrentDestinationEffect(backstackController, currentDestinationHolder)
Expand All @@ -118,7 +117,7 @@ internal fun HedvigApp(
windowSizeClass = windowSizeClass,
settingsDataStore = settingsDataStore,
featureManager = featureManager,
missedPaymentNotificationServiceProvider = missedPaymentNotificationServiceProvider,
missedPaymentNotificationService = missedPaymentNotificationService,
)
val darkTheme = hedvigAppState.darkTheme
HedvigTheme(darkTheme = darkTheme) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import com.hedvig.android.app.navigation.BackstackController
import com.hedvig.android.core.demomode.Provider
import com.hedvig.android.data.settings.datastore.SettingsDataStore
import com.hedvig.android.featureflags.FeatureManager
import com.hedvig.android.featureflags.flags.Feature
Expand All @@ -31,7 +30,7 @@ internal fun rememberHedvigAppState(
windowSizeClass: WindowSizeClass,
settingsDataStore: SettingsDataStore,
featureManager: FeatureManager,
missedPaymentNotificationServiceProvider: Provider<MissedPaymentNotificationService>,
missedPaymentNotificationService: MissedPaymentNotificationService,
coroutineScope: CoroutineScope = rememberCoroutineScope(),
): HedvigAppState {
val appState = remember(
Expand All @@ -40,15 +39,15 @@ internal fun rememberHedvigAppState(
coroutineScope,
settingsDataStore,
featureManager,
missedPaymentNotificationServiceProvider,
missedPaymentNotificationService,
) {
HedvigAppState(
backstackController = backstackController,
windowSizeClass = windowSizeClass,
coroutineScope = coroutineScope,
settingsDataStore = settingsDataStore,
featureManager = featureManager,
missedPaymentNotificationServiceProvider = missedPaymentNotificationServiceProvider,
missedPaymentNotificationService = missedPaymentNotificationService,
)
}
return appState
Expand All @@ -61,7 +60,7 @@ internal class HedvigAppState(
coroutineScope: CoroutineScope,
private val settingsDataStore: SettingsDataStore,
featureManager: FeatureManager,
missedPaymentNotificationServiceProvider: Provider<MissedPaymentNotificationService>,
missedPaymentNotificationService: MissedPaymentNotificationService,
) {
/**
* App kill-switch. If this is enabled we must show nothing in the app but a button to try to update the app
Expand All @@ -88,9 +87,7 @@ internal class HedvigAppState(
)

val showPaymentsBadge: StateFlow<Boolean> = flow {
val service = missedPaymentNotificationServiceProvider
.provide()
emitAll(service.showRedDotNotification())
emitAll(missedPaymentNotificationService.showRedDotNotification())
}.stateIn(
coroutineScope,
SharingStarted.WhileSubscribed(5_000),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.hedvig.android.core.demomode

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map

/**
* Shared selection logic for a type that has a prod and a demo implementation. Implementors also implement [T] itself
* and forward each member through [pick] (suspend members) or [pickFlow] (Flow-returning members), so consumers inject
* the plain [T] and never know demo mode exists.
*/
abstract class DemoSwitcher<T> {
abstract val demoManager: DemoManager
abstract val demoImpl: T
abstract val prodImpl: T

private fun selected(): Flow<T> =
demoManager.isDemoMode().distinctUntilChanged().map { isDemo -> if (isDemo) demoImpl else prodImpl }

protected suspend fun pick(): T = selected().first()

protected fun <R> pickFlow(block: suspend (T) -> Flow<R>): Flow<R> = selected().flatMapLatest(block)
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@ package com.hedvig.android.data.addons.data

import com.hedvig.android.core.common.di.AppScope
import com.hedvig.android.core.demomode.DemoManager
import com.hedvig.android.core.demomode.ProdOrDemoProvider
import com.hedvig.android.core.demomode.Provider
import com.hedvig.android.core.demomode.DemoSwitcher
import dev.zacsweers.metro.ContributesBinding
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
import dev.zacsweers.metro.binding

@Inject
@SingleIn(AppScope::class)
@ContributesBinding(AppScope::class, binding<Provider<GetAddonBannerInfoUseCase>>())
internal class GetTravelAddonBannerInfoUseCaseProvider(
@ContributesBinding(AppScope::class, binding = binding<GetAddonBannerInfoUseCase>())
internal class SwitchingGetAddonBannerInfoUseCase(
override val demoManager: DemoManager,
override val demoImpl: DemoGetAddonBannerInfoUseCase,
override val prodImpl: GetAddonBannerInfoUseCaseImpl,
) : ProdOrDemoProvider<GetAddonBannerInfoUseCase>
) : GetAddonBannerInfoUseCase, DemoSwitcher<GetAddonBannerInfoUseCase>() {
override fun invoke(source: AddonBannerSource) = pickFlow { it.invoke(source) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ import com.hedvig.android.apollo.safeExecute
import com.hedvig.android.core.common.ErrorMessage
import com.hedvig.android.core.common.di.AppScope
import com.hedvig.android.core.demomode.DemoManager
import com.hedvig.android.core.demomode.ProdOrDemoProvider
import com.hedvig.android.core.demomode.Provider
import com.hedvig.android.core.demomode.DemoSwitcher
import com.hedvig.android.data.contract.ContractType
import com.hedvig.android.data.contract.toContractType
import com.hedvig.android.logger.logcat
import dev.zacsweers.metro.ContributesBinding
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
Expand All @@ -34,7 +32,7 @@ enum class MemberType {
STANDARD_MEMBER,

// current logic
STANDARD_TO_QASA_MEMBER
STANDARD_TO_QASA_MEMBER,
// in Payments: if no upcoming payments: hide discounts and member payment details
// in Payments: if upcoming payment and missing payin: show connect payin reminder,
// else show connect payout reminder if missing
Expand All @@ -43,12 +41,14 @@ enum class MemberType {

@Inject
@SingleIn(AppScope::class)
@ContributesBinding(AppScope::class, binding<Provider<GetMemberTypeUseCase>>())
internal class GetMemberTypeUseCaseProvider(
@ContributesBinding(AppScope::class, binding = binding<GetMemberTypeUseCase>())
internal class SwitchingGetMemberTypeUseCase(
override val demoManager: DemoManager,
override val demoImpl: GetMemberTypeUseCaseDemo,
override val prodImpl: GetMemberTypeUseCaseImpl,
) : ProdOrDemoProvider<GetMemberTypeUseCase>
) : GetMemberTypeUseCase, DemoSwitcher<GetMemberTypeUseCase>() {
override suspend fun invoke() = pick().invoke()
}

@SingleIn(AppScope::class)
@Inject
Expand All @@ -67,9 +67,11 @@ internal class GetMemberTypeUseCaseImpl(
.terminatedContracts
.map { it.currentAgreement.productVariant.typeOfContract.toContractType() }

val onlyQasaContracts = (activeContractsTypes.isNotEmpty()
|| terminatedContractsTypes.isNotEmpty()) &&
activeContractsTypes.all { it == ContractType.SE_QASA_LANDLORD } &&
val onlyQasaContracts = (
activeContractsTypes.isNotEmpty() ||
terminatedContractsTypes.isNotEmpty()
) &&
activeContractsTypes.all { it == ContractType.SE_QASA_LANDLORD } &&
terminatedContractsTypes.all { it == ContractType.SE_QASA_LANDLORD }
if (onlyQasaContracts) return@either MemberType.QASA_ONLY_MEMBER

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import com.hedvig.android.core.common.di.ActivityRetainedScope
import com.hedvig.android.core.common.di.HedvigViewModel
import com.hedvig.android.core.demomode.Provider
import com.hedvig.android.data.addons.data.AddonBannerSource
import com.hedvig.android.data.addons.data.GetAddonBannerInfoUseCase
import com.hedvig.android.molecule.public.MoleculePresenter
Expand All @@ -22,15 +21,15 @@ import kotlinx.coroutines.flow.first
@AssistedInject
@HedvigViewModel(ActivityRetainedScope::class)
internal class TravelAddonTriageViewModel(
getAddonBannerInfoUseCaseProvider: Provider<GetAddonBannerInfoUseCase>,
getAddonBannerInfoUseCase: GetAddonBannerInfoUseCase,
@Assisted addonBannerSource: AddonBannerSource,
) : MoleculeViewModel<TravelAddonTriageEvent, TravelAddonTriageState>(
initialState = TravelAddonTriageState.Loading,
presenter = TravelAddonTriagePresenter(getAddonBannerInfoUseCaseProvider, addonBannerSource),
presenter = TravelAddonTriagePresenter(getAddonBannerInfoUseCase, addonBannerSource),
)

internal class TravelAddonTriagePresenter(
private val getAddonBannerInfoUseCaseProvider: Provider<GetAddonBannerInfoUseCase>,
private val getAddonBannerInfoUseCase: GetAddonBannerInfoUseCase,
private val addonBannerSource: AddonBannerSource,
) : MoleculePresenter<TravelAddonTriageEvent, TravelAddonTriageState> {
@Composable
Expand All @@ -42,7 +41,7 @@ internal class TravelAddonTriagePresenter(

LaunchedEffect(loadIteration) {
currentState = TravelAddonTriageState.Loading
val result = getAddonBannerInfoUseCaseProvider.provide().invoke(addonBannerSource)
val result = getAddonBannerInfoUseCase.invoke(addonBannerSource)
result.first().fold(
ifLeft = { _ ->
currentState = TravelAddonTriageState.Failure(FailureReason.GENERAL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import arrow.core.Either
import com.benasher44.uuid.Uuid
import com.hedvig.android.core.common.di.ActivityRetainedScope
import com.hedvig.android.core.common.di.HedvigViewModel
import com.hedvig.android.core.demomode.Provider
import com.hedvig.android.data.chat.database.ChatDao
import com.hedvig.android.data.chat.database.ChatMessageEntity
import com.hedvig.android.data.chat.database.RemoteKeyDao
Expand Down Expand Up @@ -79,7 +78,7 @@ internal class CbmChatViewModel @AssistedInject constructor(
database: RoomDatabase,
chatDao: ChatDao,
remoteKeyDao: RemoteKeyDao,
chatRepository: Provider<CbmChatRepository>,
chatRepository: CbmChatRepository,
clock: Clock,
context: Context,
coroutineScope: CoroutineScope = CoroutineScope(SupervisorJob() + AndroidUiDispatcher.Main),
Expand Down Expand Up @@ -109,7 +108,7 @@ private fun cbmChatPresenterPagingData(
database: RoomDatabase,
chatDao: ChatDao,
remoteKeyDao: RemoteKeyDao,
chatRepository: Provider<CbmChatRepository>,
chatRepository: CbmChatRepository,
clock: Clock,
scope: CoroutineScope,
): Flow<PagingData<CbmUiChatMessage>> {
Expand Down Expand Up @@ -138,7 +137,7 @@ internal class CbmChatPresenter(
private val conversationId: Uuid,
private val pagingData: Flow<PagingData<CbmUiChatMessage>>,
private val chatDao: ChatDao,
private val chatRepository: Provider<CbmChatRepository>,
private val chatRepository: CbmChatRepository,
private val context: Context,
) : MoleculePresenter<CbmChatEvent, CbmChatUiState> {
@OptIn(ExperimentalPagingApi::class)
Expand Down Expand Up @@ -166,7 +165,7 @@ internal class CbmChatPresenter(
return@LaunchedEffect
}
conversationInfoStatus = Initializing
chatRepository.provide().getConversationInfo(conversationId).collect { result ->
chatRepository.getConversationInfo(conversationId).collect { result ->
result.fold(
ifLeft = {
conversationInfoStatus = Failed
Expand Down Expand Up @@ -198,7 +197,7 @@ internal class CbmChatPresenter(
}
}
if (!conversationAlreadyStarted) {
chatRepository.provide().createConversation(conversationId).onRight { backendConversationInfo ->
chatRepository.createConversation(conversationId).onRight { backendConversationInfo ->
conversationInfoStatus = Loaded(backendConversationInfo)
}
}
Expand All @@ -212,7 +211,7 @@ internal class CbmChatPresenter(
launch {
numberOfOngoingUploads.update { it + 1 }
startConversationIfNecessary()
chatRepository.provide().sendText(conversationId, null, event.message)
chatRepository.sendText(conversationId, null, event.message)
numberOfOngoingUploads.update { it - 1 }
}
}
Expand All @@ -221,7 +220,7 @@ internal class CbmChatPresenter(
launch {
numberOfOngoingUploads.update { it + 1 }
startConversationIfNecessary()
chatRepository.provide().sendPhotos(conversationId, event.uriList)
chatRepository.sendPhotos(conversationId, event.uriList)
numberOfOngoingUploads.update { it - 1 }
}
}
Expand All @@ -230,7 +229,7 @@ internal class CbmChatPresenter(
launch {
numberOfOngoingUploads.update { it + 1 }
startConversationIfNecessary()
val result = chatRepository.provide().sendMedia(conversationId, event.uriList)
val result = chatRepository.sendMedia(conversationId, event.uriList)
Snapshot.withMutableSnapshot {
for (result in result) {
result.onError(
Expand All @@ -247,7 +246,7 @@ internal class CbmChatPresenter(
launch {
numberOfOngoingUploads.update { it + 1 }
startConversationIfNecessary()
val result = chatRepository.provide().retrySendMessage(conversationId, event.messageId)
val result = chatRepository.retrySendMessage(conversationId, event.messageId)
result.onError(
onFailedToPersistUriPermissionError = { showFileFailedToBeSendToast = true },
onFileTooBigError = { showFileTooBigErrorToast = true },
Expand Down Expand Up @@ -305,7 +304,7 @@ private fun presentLoadedChat(
enableInlineMediaPlayer: Boolean,
conversationId: Uuid,
chatDao: ChatDao,
chatRepository: Provider<CbmChatRepository>,
chatRepository: CbmChatRepository,
showUploading: Boolean,
showFileTooBigErrorToast: Boolean,
hideBanner: Boolean,
Expand All @@ -317,7 +316,7 @@ private fun presentLoadedChat(

val bannerText by if (!hideBanner) {
remember(conversationId, chatRepository) {
flow { emitAll(chatRepository.provide().bannerText(conversationId)) }
chatRepository.bannerText(conversationId)
}.collectAsState(null)
} else {
remember { mutableStateOf(null) }
Expand All @@ -336,7 +335,7 @@ private fun presentLoadedChat(
.distinctUntilChanged()
.collectLatest { poll ->
if (poll) {
chatRepository.provide().pollNewestMessages(conversationId).collect {
chatRepository.pollNewestMessages(conversationId).collect {
logcat { "Polling error: $it" }
}
}
Expand Down
Loading
Loading