Skip to content

Commit 713e2fa

Browse files
authored
Merge pull request #140 from CrisisCleanup/various-fixes
Various fixes
2 parents 237dd8e + 24d78ab commit 713e2fa

File tree

89 files changed

+4065
-982
lines changed

Some content is hidden

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

89 files changed

+4065
-982
lines changed

app/build.gradle.kts

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

1515
android {
1616
defaultConfig {
17-
val buildVersion = 256
17+
val buildVersion = 264
1818
applicationId = "com.crisiscleanup"
1919
versionCode = buildVersion
2020
versionName = "0.9.${buildVersion - 168}"
@@ -43,7 +43,6 @@ android {
4343
getDefaultProguardFile("proguard-android-optimize.txt"),
4444
"proguard-rules.pro",
4545
"proguard-playservices.pro",
46-
"proguard-retrofit2.pro",
4746
"proguard-crashlytics.pro",
4847
)
4948

app/proguard-retrofit2.pro

Lines changed: 0 additions & 48 deletions
This file was deleted.

app/src/main/java/com/crisiscleanup/MainActivityViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ import javax.inject.Inject
5757
@HiltViewModel
5858
class MainActivityViewModel @Inject constructor(
5959
private val appPreferencesRepository: LocalAppPreferencesRepository,
60-
private val appMetricsRepository: LocalAppMetricsRepository,
60+
appMetricsRepository: LocalAppMetricsRepository,
6161
accountDataRepository: AccountDataRepository,
6262
incidentSelector: IncidentSelector,
6363
appDataRepository: AppDataManagementRepository,
@@ -91,6 +91,8 @@ class MainActivityViewModel @Inject constructor(
9191
started = SharingStarted.WhileSubscribed(5_000),
9292
)
9393

94+
val isAppUpdateAvailable = appMetricsRepository.isAppUpdateAvailable
95+
9496
/**
9597
* API account tokens need re-issuing
9698
*/

app/src/main/java/com/crisiscleanup/ui/AppNavigation.kt

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.crisiscleanup.ui
22

33
import androidx.compose.foundation.layout.Spacer
4+
import androidx.compose.foundation.layout.size
45
import androidx.compose.foundation.layout.sizeIn
6+
import androidx.compose.material3.Badge
7+
import androidx.compose.material3.BadgedBox
58
import androidx.compose.material3.HorizontalDivider
69
import androidx.compose.material3.Icon
710
import androidx.compose.material3.LocalContentColor
@@ -13,6 +16,7 @@ import androidx.compose.runtime.getValue
1316
import androidx.compose.runtime.remember
1417
import androidx.compose.ui.Modifier
1518
import androidx.compose.ui.graphics.Color
19+
import androidx.compose.ui.graphics.vector.ImageVector
1620
import androidx.compose.ui.platform.testTag
1721
import androidx.compose.ui.res.painterResource
1822
import androidx.compose.ui.unit.dp
@@ -25,8 +29,10 @@ import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationBarI
2529
import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationDefaults
2630
import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationRail
2731
import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationRailItem
32+
import com.crisiscleanup.core.designsystem.icon.CrisisCleanupIcons
2833
import com.crisiscleanup.core.designsystem.icon.Icon
2934
import com.crisiscleanup.core.designsystem.theme.disabledAlpha
35+
import com.crisiscleanup.core.designsystem.theme.primaryOrangeColor
3036
import com.crisiscleanup.navigation.TopLevelDestination
3137

3238
@Composable
@@ -61,6 +67,7 @@ private fun NavItems(
6167
destinations: List<TopLevelDestination>,
6268
onNavigateToDestination: (TopLevelDestination) -> Unit,
6369
currentDestination: NavDestination?,
70+
isAppUpdateAvailable: Boolean,
6471
itemContent: @Composable (
6572
Boolean,
6673
String,
@@ -77,12 +84,21 @@ private fun NavItems(
7784
t(destination.titleTranslateKey)
7885
}
7986
val selected = currentDestination.isTopLevelDestinationInHierarchy(destination)
87+
val badgeImage = if (isAppUpdateAvailable && destination == TopLevelDestination.MENU) {
88+
CrisisCleanupIcons.AppUpdateAvailable
89+
} else {
90+
null
91+
}
8092
itemContent(
8193
selected,
8294
title,
8395
i == destinations.size - 1,
8496
{ onNavigateToDestination(destination) },
85-
{ destination.Icon(selected, title) },
97+
{
98+
BadgedView(badgeImage) {
99+
destination.Icon(selected, title)
100+
}
101+
},
86102
{
87103
Text(
88104
title,
@@ -98,6 +114,7 @@ internal fun AppNavigationBar(
98114
destinations: List<TopLevelDestination>,
99115
onNavigateToDestination: (TopLevelDestination) -> Unit,
100116
currentDestination: NavDestination?,
117+
isAppUpdateAvailable: Boolean,
101118
modifier: Modifier = Modifier,
102119
isRail: Boolean = false,
103120
) {
@@ -106,13 +123,15 @@ internal fun AppNavigationBar(
106123
destinations,
107124
onNavigateToDestination,
108125
currentDestination,
126+
isAppUpdateAvailable,
109127
modifier,
110128
)
111129
} else {
112130
CrisisCleanupBottomBar(
113131
destinations,
114132
onNavigateToDestination,
115133
currentDestination,
134+
isAppUpdateAvailable,
116135
modifier,
117136
)
118137
}
@@ -121,23 +140,52 @@ internal fun AppNavigationBar(
121140
@Composable
122141
internal fun AppNavigationBar(
123142
appState: CrisisCleanupAppState,
143+
isAppUpdateAvailable: Boolean,
124144
modifier: Modifier = Modifier,
125145
isRail: Boolean = false,
126146
) {
127147
AppNavigationBar(
128148
appState.topLevelDestinations,
129149
appState::navigateToTopLevelDestination,
130150
appState.currentDestination,
151+
isAppUpdateAvailable = isAppUpdateAvailable,
131152
modifier,
132153
isRail,
133154
)
134155
}
135156

157+
@Composable
158+
private fun BadgedView(
159+
badgeIcon: ImageVector?,
160+
content: @Composable () -> Unit,
161+
) {
162+
if (badgeIcon == null) {
163+
content()
164+
} else {
165+
BadgedBox(
166+
badge = {
167+
Badge(
168+
Modifier.size(20.dp),
169+
containerColor = primaryOrangeColor,
170+
) {
171+
Icon(
172+
imageVector = badgeIcon,
173+
contentDescription = null,
174+
)
175+
}
176+
},
177+
) {
178+
content()
179+
}
180+
}
181+
}
182+
136183
@Composable
137184
private fun CrisisCleanupNavRail(
138185
destinations: List<TopLevelDestination>,
139186
onNavigateToDestination: (TopLevelDestination) -> Unit,
140187
currentDestination: NavDestination?,
188+
isAppUpdateAvailable: Boolean,
141189
modifier: Modifier = Modifier,
142190
) {
143191
CrisisCleanupNavigationRail(modifier = modifier) {
@@ -146,6 +194,7 @@ private fun CrisisCleanupNavRail(
146194
destinations = destinations,
147195
onNavigateToDestination = onNavigateToDestination,
148196
currentDestination = currentDestination,
197+
isAppUpdateAvailable = isAppUpdateAvailable,
149198
) {
150199
isSelected: Boolean,
151200
title: String,
@@ -180,13 +229,15 @@ private fun CrisisCleanupBottomBar(
180229
destinations: List<TopLevelDestination>,
181230
onNavigateToDestination: (TopLevelDestination) -> Unit,
182231
currentDestination: NavDestination?,
232+
isAppUpdateAvailable: Boolean,
183233
modifier: Modifier = Modifier,
184234
) {
185235
CrisisCleanupNavigationBar(modifier = modifier) {
186236
NavItems(
187237
destinations = destinations,
188238
onNavigateToDestination = onNavigateToDestination,
189239
currentDestination = currentDestination,
240+
isAppUpdateAvailable = isAppUpdateAvailable,
190241
) {
191242
isSelected: Boolean,
192243
title: String,

app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ private fun BoxScope.LoadedContent(
162162
val orgPersistentInvite by viewModel.orgPersistentInvites.collectAsStateWithLifecycle()
163163

164164
if (showPasswordReset) {
165-
appState.navController.navigateToPasswordReset(false)
165+
LaunchedEffect(Unit) {
166+
appState.navController.navigateToPasswordReset(false)
167+
}
166168
} else if (showMagicLinkLogin) {
167169
appState.navController.navigateToMagicLinkLogin()
168170
} else if (orgUserInviteCode.isNotBlank()) {
@@ -202,10 +204,13 @@ private fun BoxScope.LoadedContent(
202204

203205
val menuTutorialStep by viewModel.menuTutorialStep.collectAsStateWithLifecycle()
204206

207+
val isUpdateAvailable by viewModel.isAppUpdateAvailable.collectAsStateWithLifecycle(false)
208+
205209
NavigableContent(
206210
snackbarHostState,
207211
appState,
208-
isOnboarding,
212+
isAppUpdateAvailable = isUpdateAvailable,
213+
isOnboarding = isOnboarding,
209214
menuTutorialStep,
210215
viewModel.tutorialViewTracker.viewSizePositionLookup,
211216
viewModel::onMenuTutorialNext,
@@ -221,7 +226,9 @@ private fun BoxScope.LoadedContent(
221226
}
222227

223228
if (showPasswordReset) {
224-
appState.navController.navigateToPasswordReset(true)
229+
LaunchedEffect(Unit) {
230+
appState.navController.navigateToPasswordReset(true)
231+
}
225232
}
226233
}
227234

@@ -317,6 +324,7 @@ private fun AcceptTermsContent(
317324
private fun NavigableContent(
318325
snackbarHostState: SnackbarHostState,
319326
appState: CrisisCleanupAppState,
327+
isAppUpdateAvailable: Boolean,
320328
isOnboarding: Boolean,
321329
menuTutorialStep: TutorialStep,
322330
tutorialViewLookup: SnapshotStateMap<TutorialViewId, LayoutSizePosition>,
@@ -348,6 +356,7 @@ private fun NavigableContent(
348356
) {
349357
AppNavigationBar(
350358
appState,
359+
isAppUpdateAvailable,
351360
navBarSizePositionModifier.testTag("AppNavigationBottomBar"),
352361
)
353362
}
@@ -378,6 +387,7 @@ private fun NavigableContent(
378387
if (showNavigation && !layoutBottomNav) {
379388
AppNavigationBar(
380389
appState,
390+
isAppUpdateAvailable,
381391
navBarSizePositionModifier
382392
.safeDrawingPadding()
383393
.testTag("AppNavigationSideRail"),

core/common/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ dependencies {
2121
implementation(libs.kotlinx.coroutines.android)
2222
implementation(libs.kotlinx.datetime)
2323
implementation(libs.timeago)
24+
implementation(libs.libphonenumber)
2425

2526
testImplementation(libs.kotlinx.coroutines.test)
27+
testImplementation(libs.mockk.android)
2628
}

0 commit comments

Comments
 (0)