Skip to content

Commit 10aeec8

Browse files
authored
Merge pull request #137 from CrisisCleanup/various-updates
Various updates
2 parents bed31b3 + 04edc75 commit 10aeec8

File tree

66 files changed

+3953
-346
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+3953
-346
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ plugins {
1414

1515
android {
1616
defaultConfig {
17-
val buildVersion = 252
17+
val buildVersion = 253
1818
applicationId = "com.crisiscleanup"
1919
versionCode = buildVersion
2020
versionName = "0.9.${buildVersion - 168}"

app/src/main/java/com/crisiscleanup/navigation/CrisisCleanupNavHost.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import com.crisiscleanup.feature.caseeditor.navigation.navigateToCaseAddFlag
3535
import com.crisiscleanup.feature.caseeditor.navigation.navigateToCaseEditor
3636
import com.crisiscleanup.feature.caseeditor.navigation.navigateToTransferWorkType
3737
import com.crisiscleanup.feature.caseeditor.navigation.navigateToViewCase
38-
import com.crisiscleanup.feature.caseeditor.navigation.rerouteToCaseChange
38+
import com.crisiscleanup.feature.caseeditor.navigation.rerouteToViewCase
3939
import com.crisiscleanup.feature.cases.navigation.casesFilterScreen
4040
import com.crisiscleanup.feature.cases.navigation.casesGraph
4141
import com.crisiscleanup.feature.cases.navigation.casesSearchScreen
@@ -133,7 +133,7 @@ fun CrisisCleanupNavHost(
133133
}
134134
}
135135

136-
val replaceRouteViewCase = navController::rerouteToCaseChange
136+
val replaceRouteViewCase = navController::rerouteToViewCase
137137

138138
val openViewCase = remember(navController) {
139139
{ ids: ExistingWorksiteIdentifier ->

build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ class AndroidFeatureConventionPlugin : Plugin<Project> {
3939
add("implementation", project(":core:common"))
4040
add("implementation", project(":core:data"))
4141
add("implementation", project(":core:designsystem"))
42-
add("implementation", project(":core:domain"))
4342
add("implementation", project(":core:model"))
4443
add("implementation", project(":core:ui"))
4544

build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
2929
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
3030
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
3131

32-
internal const val DefaultConfigTargetSdk = 34
32+
internal const val DefaultConfigTargetSdk = 35
3333

3434
/**
3535
* Configure base Kotlin with Android options

core/app-component/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ dependencies {
1919
implementation(projects.core.commoncase)
2020
implementation(projects.core.data)
2121
implementation(projects.core.designsystem)
22-
implementation(projects.core.domain)
2322
implementation(projects.core.selectincident)
2423

2524
implementation(libs.androidx.core.ktx)

core/app-component/src/main/kotlin/com/crisiscleanup/core/appcomponent/AppTopBarDataProvider.kt

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import com.crisiscleanup.core.data.IncidentSelector
66
import com.crisiscleanup.core.data.repository.AccountDataRepository
77
import com.crisiscleanup.core.data.repository.IncidentCacheRepository
88
import com.crisiscleanup.core.data.repository.IncidentsRepository
9-
import com.crisiscleanup.core.data.repository.LocalAppPreferencesRepository
10-
import com.crisiscleanup.core.domain.LoadSelectIncidents
119
import kotlinx.coroutines.CoroutineScope
1210
import kotlinx.coroutines.flow.SharingStarted
1311
import kotlinx.coroutines.flow.map
@@ -21,18 +19,9 @@ class AppTopBarDataProvider(
2119
incidentSelector: IncidentSelector,
2220
private val translator: KeyResourceTranslator,
2321
accountDataRepository: AccountDataRepository,
24-
appPreferencesRepository: LocalAppPreferencesRepository,
2522
coroutineScope: CoroutineScope,
2623
) {
27-
28-
val loadSelectIncidents = LoadSelectIncidents(
29-
incidentsRepository = incidentsRepository,
30-
accountDataRepository = accountDataRepository,
31-
incidentSelector = incidentSelector,
32-
appPreferencesRepository = appPreferencesRepository,
33-
coroutineScope = coroutineScope,
34-
)
35-
val incidentsData = loadSelectIncidents.data
24+
val incidentsData = incidentSelector.data
3625

3726
val disasterIconResId = incidentSelector.incident.map { getDisasterIcon(it.disaster) }
3827
.stateIn(

core/app-component/src/main/kotlin/com/crisiscleanup/core/appcomponent/ui/AppTopBar.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fun AppTopBar(
2020
modifier: Modifier = Modifier,
2121
incidentDropdownModifier: Modifier = Modifier,
2222
accountToggleModifier: Modifier = Modifier,
23+
incidentSelectTestTag: String = "appIncidentSelect",
2324
dataProvider: AppTopBarDataProvider,
2425
openAuthentication: () -> Unit = {},
2526
onOpenIncidents: (() -> Unit)? = null,
@@ -35,7 +36,11 @@ fun AppTopBar(
3536

3637
AppTopBar(
3738
modifier = modifier,
38-
incidentDropdownModifier = incidentDropdownModifier,
39+
incidentDropdownModifier = if (enableIncidentSelect) {
40+
incidentDropdownModifier.testTag(incidentSelectTestTag)
41+
} else {
42+
incidentDropdownModifier
43+
},
3944
accountToggleModifier = accountToggleModifier,
4045
title = screenTitle,
4146
isAppHeaderLoading = isHeaderLoading,
@@ -83,7 +88,7 @@ internal fun AppTopBar(
8388
TruncatedAppBarText(title = title)
8489
} else {
8590
IncidentDropdownSelect(
86-
modifier = incidentDropdownModifier.testTag("appIncidentSelector"),
91+
modifier = incidentDropdownModifier,
8792
onOpenIncidents,
8893
disasterIconResId,
8994
title = title,

core/common/src/main/java/com/crisiscleanup/core/common/AppVersionProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class AndroidAppVersionProvider @Inject constructor(
3737

3838
override val version: Pair<Long, String> by lazy {
3939
val code = packageInfo.longVersionCode
40-
val name = packageInfo.versionName
40+
val name = packageInfo.versionName!!
4141
Pair(code, name)
4242
}
4343

core/data/src/main/java/com/crisiscleanup/core/data/IncidentSelectManager.kt

Lines changed: 0 additions & 52 deletions
This file was deleted.
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package com.crisiscleanup.core.data
2+
3+
import com.crisiscleanup.core.common.di.ApplicationScope
4+
import com.crisiscleanup.core.common.subscribedReplay
5+
import com.crisiscleanup.core.data.repository.AccountDataRepository
6+
import com.crisiscleanup.core.data.repository.IncidentsRepository
7+
import com.crisiscleanup.core.data.repository.LocalAppPreferencesRepository
8+
import com.crisiscleanup.core.model.data.EmptyIncident
9+
import com.crisiscleanup.core.model.data.Incident
10+
import com.crisiscleanup.core.model.data.IncidentsData
11+
import kotlinx.coroutines.CoroutineScope
12+
import kotlinx.coroutines.flow.StateFlow
13+
import kotlinx.coroutines.flow.combine
14+
import kotlinx.coroutines.flow.first
15+
import kotlinx.coroutines.flow.launchIn
16+
import kotlinx.coroutines.flow.map
17+
import kotlinx.coroutines.flow.mapLatest
18+
import kotlinx.coroutines.flow.mapNotNull
19+
import kotlinx.coroutines.flow.onEach
20+
import kotlinx.coroutines.flow.stateIn
21+
import kotlinx.coroutines.launch
22+
import javax.inject.Inject
23+
import javax.inject.Singleton
24+
25+
interface IncidentSelector {
26+
val incidentId: StateFlow<Long>
27+
28+
val incident: StateFlow<Incident>
29+
30+
val data: StateFlow<IncidentsData>
31+
32+
fun selectIncident(incident: Incident)
33+
suspend fun submitIncidentChange(incident: Incident): Boolean
34+
}
35+
36+
@Singleton
37+
class IncidentSelectManager @Inject constructor(
38+
incidentsRepository: IncidentsRepository,
39+
accountDataRepository: AccountDataRepository,
40+
private val appPreferencesRepository: LocalAppPreferencesRepository,
41+
@ApplicationScope private val coroutineScope: CoroutineScope,
42+
) : IncidentSelector {
43+
private val incidentsSource = combine(
44+
incidentsRepository.incidents,
45+
accountDataRepository.accountData,
46+
::Pair,
47+
)
48+
.mapLatest { (incidents, accountData) ->
49+
if (accountData.isCrisisCleanupAdmin) {
50+
incidents
51+
} else {
52+
incidents.filter { accountData.approvedIncidents.contains(it.id) }
53+
}
54+
}
55+
56+
private val preferencesIncidentId =
57+
appPreferencesRepository.userPreferences.map {
58+
it.selectedIncidentId
59+
}
60+
61+
private val selectedIncident = combine(
62+
preferencesIncidentId,
63+
incidentsSource,
64+
::Pair,
65+
)
66+
.map { (selectedId, incidents) ->
67+
incidents.firstOrNull { it.id == selectedId }
68+
?: incidents.firstOrNull()
69+
?: EmptyIncident
70+
}
71+
72+
override val data = combine(
73+
incidentsSource,
74+
selectedIncident,
75+
::Pair,
76+
)
77+
.map { (incidents, selected) ->
78+
if (incidents.isEmpty()) {
79+
IncidentsData.Empty
80+
} else {
81+
IncidentsData.Incidents(incidents, selected)
82+
}
83+
}.stateIn(
84+
scope = coroutineScope,
85+
initialValue = IncidentsData.Loading,
86+
started = subscribedReplay(),
87+
)
88+
89+
override var incident = data.mapNotNull {
90+
(it as? IncidentsData.Incidents)?.selected
91+
}
92+
.stateIn(
93+
scope = coroutineScope,
94+
initialValue = EmptyIncident,
95+
started = subscribedReplay(),
96+
)
97+
98+
override val incidentId = incident.map { it.id }
99+
.stateIn(
100+
scope = coroutineScope,
101+
initialValue = EmptyIncident.id,
102+
started = subscribedReplay(),
103+
)
104+
105+
init {
106+
combine(
107+
preferencesIncidentId,
108+
incidentsSource,
109+
::Pair,
110+
)
111+
.onEach { (selectedId, incidents) ->
112+
val selectedIncident = incidents.find { it.id == selectedId } ?: EmptyIncident
113+
if (selectedIncident == EmptyIncident && incidents.isNotEmpty()) {
114+
val firstIncident = incidents[0]
115+
appPreferencesRepository.setSelectedIncident(firstIncident.id)
116+
}
117+
}
118+
.launchIn(coroutineScope)
119+
}
120+
121+
override fun selectIncident(incident: Incident) {
122+
coroutineScope.launch {
123+
submitIncidentChange(incident)
124+
}
125+
}
126+
127+
override suspend fun submitIncidentChange(incident: Incident): Boolean {
128+
val incidentId = incident.id
129+
val incidents = incidentsSource.first()
130+
incidents
131+
.find { it.id == incidentId }
132+
?.let {
133+
appPreferencesRepository.setSelectedIncident(incidentId)
134+
return true
135+
}
136+
137+
return false
138+
}
139+
}

0 commit comments

Comments
 (0)