Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
32c9654
Update layout to center loading indicator
hueachilles Jul 21, 2025
45be74d
Center map on manually moved Case location
hueachilles Jul 21, 2025
215e110
Allow Worksite.files to be null from backend
hueachilles Jul 27, 2025
10df003
Set dense marker threshold relative to markers zoom level
hueachilles Jul 27, 2025
823582b
Validate and format Case phone number
hueachilles Jul 29, 2025
560f37a
Parse common phone format before trying other formats
hueachilles Jul 29, 2025
7ddf1a2
Change unsynced icon to crossed out cloud
hueachilles Jul 30, 2025
c19a968
Rearrange extreme action away from other actions
hueachilles Jul 30, 2025
68164b5
Update email login data query
hueachilles Jul 30, 2025
ae498ec
Bump version
hueachilles Jul 30, 2025
b137223
Update deleted files properly when all Case files are deleted
hueachilles Jul 31, 2025
6651541
Validate phone number on client side
hueachilles Aug 1, 2025
38d48de
Expand sorting order
hueachilles Aug 1, 2025
a84bc1c
Update account profile endpoint
hueachilles Aug 1, 2025
6628e73
Bump version
hueachilles Aug 1, 2025
d5de05c
Load phone notes from data
hueachilles Aug 1, 2025
c6cc9a4
Bump version
hueachilles Aug 1, 2025
c67c593
Delete Case photos consistently
hueachilles Aug 4, 2025
448fd11
Alert when app update is available
hueachilles Aug 5, 2025
aeb2282
Add visual for alerting new version in Menu
hueachilles Aug 5, 2025
b5ce5bb
Reset password from reset link when auth tokens are expired
hueachilles Aug 5, 2025
2ab67f6
Fade Cases marked for delete on Work map
hueachilles Aug 5, 2025
24d78ab
Bump version
hueachilles Aug 5, 2025
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
3 changes: 1 addition & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ plugins {

android {
defaultConfig {
val buildVersion = 256
val buildVersion = 264
applicationId = "com.crisiscleanup"
versionCode = buildVersion
versionName = "0.9.${buildVersion - 168}"
Expand Down Expand Up @@ -43,7 +43,6 @@ android {
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
"proguard-playservices.pro",
"proguard-retrofit2.pro",
"proguard-crashlytics.pro",
)

Expand Down
48 changes: 0 additions & 48 deletions app/proguard-retrofit2.pro

This file was deleted.

4 changes: 3 additions & 1 deletion app/src/main/java/com/crisiscleanup/MainActivityViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ import javax.inject.Inject
@HiltViewModel
class MainActivityViewModel @Inject constructor(
private val appPreferencesRepository: LocalAppPreferencesRepository,
private val appMetricsRepository: LocalAppMetricsRepository,
appMetricsRepository: LocalAppMetricsRepository,
accountDataRepository: AccountDataRepository,
incidentSelector: IncidentSelector,
appDataRepository: AppDataManagementRepository,
Expand Down Expand Up @@ -91,6 +91,8 @@ class MainActivityViewModel @Inject constructor(
started = SharingStarted.WhileSubscribed(5_000),
)

val isAppUpdateAvailable = appMetricsRepository.isAppUpdateAvailable

/**
* API account tokens need re-issuing
*/
Expand Down
53 changes: 52 additions & 1 deletion app/src/main/java/com/crisiscleanup/ui/AppNavigation.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.crisiscleanup.ui

import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.material3.Badge
import androidx.compose.material3.BadgedBox
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
Expand All @@ -13,6 +16,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
Expand All @@ -25,8 +29,10 @@ import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationBarI
import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationDefaults
import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationRail
import com.crisiscleanup.core.designsystem.component.CrisisCleanupNavigationRailItem
import com.crisiscleanup.core.designsystem.icon.CrisisCleanupIcons
import com.crisiscleanup.core.designsystem.icon.Icon
import com.crisiscleanup.core.designsystem.theme.disabledAlpha
import com.crisiscleanup.core.designsystem.theme.primaryOrangeColor
import com.crisiscleanup.navigation.TopLevelDestination

@Composable
Expand Down Expand Up @@ -61,6 +67,7 @@ private fun NavItems(
destinations: List<TopLevelDestination>,
onNavigateToDestination: (TopLevelDestination) -> Unit,
currentDestination: NavDestination?,
isAppUpdateAvailable: Boolean,
itemContent: @Composable (
Boolean,
String,
Expand All @@ -77,12 +84,21 @@ private fun NavItems(
t(destination.titleTranslateKey)
}
val selected = currentDestination.isTopLevelDestinationInHierarchy(destination)
val badgeImage = if (isAppUpdateAvailable && destination == TopLevelDestination.MENU) {
CrisisCleanupIcons.AppUpdateAvailable
} else {
null
}
itemContent(
selected,
title,
i == destinations.size - 1,
{ onNavigateToDestination(destination) },
{ destination.Icon(selected, title) },
{
BadgedView(badgeImage) {
destination.Icon(selected, title)
}
},
{
Text(
title,
Expand All @@ -98,6 +114,7 @@ internal fun AppNavigationBar(
destinations: List<TopLevelDestination>,
onNavigateToDestination: (TopLevelDestination) -> Unit,
currentDestination: NavDestination?,
isAppUpdateAvailable: Boolean,
modifier: Modifier = Modifier,
isRail: Boolean = false,
) {
Expand All @@ -106,13 +123,15 @@ internal fun AppNavigationBar(
destinations,
onNavigateToDestination,
currentDestination,
isAppUpdateAvailable,
modifier,
)
} else {
CrisisCleanupBottomBar(
destinations,
onNavigateToDestination,
currentDestination,
isAppUpdateAvailable,
modifier,
)
}
Expand All @@ -121,23 +140,52 @@ internal fun AppNavigationBar(
@Composable
internal fun AppNavigationBar(
appState: CrisisCleanupAppState,
isAppUpdateAvailable: Boolean,
modifier: Modifier = Modifier,
isRail: Boolean = false,
) {
AppNavigationBar(
appState.topLevelDestinations,
appState::navigateToTopLevelDestination,
appState.currentDestination,
isAppUpdateAvailable = isAppUpdateAvailable,
modifier,
isRail,
)
}

@Composable
private fun BadgedView(
badgeIcon: ImageVector?,
content: @Composable () -> Unit,
) {
if (badgeIcon == null) {
content()
} else {
BadgedBox(
badge = {
Badge(
Modifier.size(20.dp),
containerColor = primaryOrangeColor,
) {
Icon(
imageVector = badgeIcon,
contentDescription = null,
)
}
},
) {
content()
}
}
}

@Composable
private fun CrisisCleanupNavRail(
destinations: List<TopLevelDestination>,
onNavigateToDestination: (TopLevelDestination) -> Unit,
currentDestination: NavDestination?,
isAppUpdateAvailable: Boolean,
modifier: Modifier = Modifier,
) {
CrisisCleanupNavigationRail(modifier = modifier) {
Expand All @@ -146,6 +194,7 @@ private fun CrisisCleanupNavRail(
destinations = destinations,
onNavigateToDestination = onNavigateToDestination,
currentDestination = currentDestination,
isAppUpdateAvailable = isAppUpdateAvailable,
) {
isSelected: Boolean,
title: String,
Expand Down Expand Up @@ -180,13 +229,15 @@ private fun CrisisCleanupBottomBar(
destinations: List<TopLevelDestination>,
onNavigateToDestination: (TopLevelDestination) -> Unit,
currentDestination: NavDestination?,
isAppUpdateAvailable: Boolean,
modifier: Modifier = Modifier,
) {
CrisisCleanupNavigationBar(modifier = modifier) {
NavItems(
destinations = destinations,
onNavigateToDestination = onNavigateToDestination,
currentDestination = currentDestination,
isAppUpdateAvailable = isAppUpdateAvailable,
) {
isSelected: Boolean,
title: String,
Expand Down
16 changes: 13 additions & 3 deletions app/src/main/java/com/crisiscleanup/ui/CrisisCleanupApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,9 @@ private fun BoxScope.LoadedContent(
val orgPersistentInvite by viewModel.orgPersistentInvites.collectAsStateWithLifecycle()

if (showPasswordReset) {
appState.navController.navigateToPasswordReset(false)
LaunchedEffect(Unit) {
appState.navController.navigateToPasswordReset(false)
}
} else if (showMagicLinkLogin) {
appState.navController.navigateToMagicLinkLogin()
} else if (orgUserInviteCode.isNotBlank()) {
Expand Down Expand Up @@ -202,10 +204,13 @@ private fun BoxScope.LoadedContent(

val menuTutorialStep by viewModel.menuTutorialStep.collectAsStateWithLifecycle()

val isUpdateAvailable by viewModel.isAppUpdateAvailable.collectAsStateWithLifecycle(false)

NavigableContent(
snackbarHostState,
appState,
isOnboarding,
isAppUpdateAvailable = isUpdateAvailable,
isOnboarding = isOnboarding,
menuTutorialStep,
viewModel.tutorialViewTracker.viewSizePositionLookup,
viewModel::onMenuTutorialNext,
Expand All @@ -221,7 +226,9 @@ private fun BoxScope.LoadedContent(
}

if (showPasswordReset) {
appState.navController.navigateToPasswordReset(true)
LaunchedEffect(Unit) {
appState.navController.navigateToPasswordReset(true)
}
}
}

Expand Down Expand Up @@ -317,6 +324,7 @@ private fun AcceptTermsContent(
private fun NavigableContent(
snackbarHostState: SnackbarHostState,
appState: CrisisCleanupAppState,
isAppUpdateAvailable: Boolean,
isOnboarding: Boolean,
menuTutorialStep: TutorialStep,
tutorialViewLookup: SnapshotStateMap<TutorialViewId, LayoutSizePosition>,
Expand Down Expand Up @@ -348,6 +356,7 @@ private fun NavigableContent(
) {
AppNavigationBar(
appState,
isAppUpdateAvailable,
navBarSizePositionModifier.testTag("AppNavigationBottomBar"),
)
}
Expand Down Expand Up @@ -378,6 +387,7 @@ private fun NavigableContent(
if (showNavigation && !layoutBottomNav) {
AppNavigationBar(
appState,
isAppUpdateAvailable,
navBarSizePositionModifier
.safeDrawingPadding()
.testTag("AppNavigationSideRail"),
Expand Down
2 changes: 2 additions & 0 deletions core/common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ dependencies {
implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.datetime)
implementation(libs.timeago)
implementation(libs.libphonenumber)

testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.mockk.android)
}
Loading
Loading