From cc6d3af3a376f3182eb691a406686f920bb5b664 Mon Sep 17 00:00:00 2001 From: brianhu72 Date: Thu, 20 Nov 2025 19:27:41 -0500 Subject: [PATCH 01/31] created object with colors imported from figma, allowed for colors to be used in all screens. Have not put the colors in each screen yet --- .../android/eatery/MainActivity.kt | 3 +- .../android/eatery/ui/screens/HomeScreen.kt | 4 +- .../android/eatery/ui/theme/Color.kt | 42 +++++++++++ .../android/eatery/ui/theme/Theme.kt | 72 +++++++++++++++++++ 4 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt diff --git a/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt b/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt index ee46a886..21dc60bd 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.LifecycleOwner import com.cornellappdev.android.eatery.data.repositories.EateryRepository import com.cornellappdev.android.eatery.data.repositories.UserPreferencesRepository import com.cornellappdev.android.eatery.ui.navigation.NavigationSetup +import com.cornellappdev.android.eatery.ui.theme.AppColorTheme import com.cornellappdev.android.eatery.util.LockScreenOrientation import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.runBlocking @@ -35,7 +36,7 @@ class MainActivity : ComponentActivity() { setContent { LockScreenOrientation() - androidx.compose.material3.MaterialTheme(typography = typography) { + AppColorTheme { NavigationSetup(hasOnboarded) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt index 260a1a18..03ff43f5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt @@ -92,6 +92,7 @@ import com.cornellappdev.android.eatery.ui.components.home.MainLoadingItem import com.cornellappdev.android.eatery.ui.components.home.MainLoadingItem.Companion.CreateMainLoadingItem import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.HomeViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.util.EateryPreview @@ -117,6 +118,7 @@ fun HomeScreen( onCompareMenusClick: (selectedEateriesIds: List) -> Unit, onNotificationsClick: () -> Unit ) { + val colors = currentColors val context = LocalContext.current val favorites = homeViewModel.favoriteEateries.collectAsState().value val nearestEateries = homeViewModel.eateriesByDistance.collectAsState().value @@ -197,7 +199,7 @@ fun HomeScreen( content = { paddingValues -> Box( modifier = Modifier - .background(Color.White) + .background(colors.backgroundDefault) .padding(paddingValues) ) { ModalBottomSheetLayout( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt index 2f5e7dc2..e666e8a2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt @@ -16,6 +16,48 @@ val Red = Color(0xFFF2655D) val Green = Color(0xFF63C774) val Yellow = Color(0xFFFEC50E) val Orange = Color(0xFFFF990E) +// Error colors +val ErrorLight = Color(0xFFF2655D) +val ErrorDark = Color(0xFFF2655D) + +// Success colors +val SuccessLight = Color(0xFF63C774) +val SuccessDark = Color(0xFF76CE85) + +// Background colors +val BgDefaultLight = Color(0xFFFFFFFF) +val BgDefaultDark = Color(0xFF141414) + +val BgSecondaryLight = Color(0xFF4A90E2) +val BgSecondaryDark = Color(0xFF609EE6) + +val BgDefault10Light = Color(0x1AFFFFFF) // FFFFFF with 10% opacity +val BgDefault10Dark = Color(0x1A141414) // 141414 with 10% opacity + +val BgDefault92Light = Color(0xEBFFFFFF) // FFFFFF with 92% opacity +val BgDefault92Dark = Color(0xEB141414) // 141414 with 92% opacity + +val BgSurfaceLight = Color(0xFFFAFAFA) +val BgSurfaceDark = Color(0xFF121212) + +// Text colors +val TextPrimaryLight = Color(0xFF050505) +val TextPrimaryDark = Color(0xFFFFFFFF) + +val TextSecondaryLight = Color(0xFF586069) +val TextSecondaryDark = Color(0xFF9EA8B5) + +// Accent colors +val AccentPrimaryLight = Color(0xFFEFF1F4) +val AccentPrimaryDark = Color(0xFF272727) + +val AccentPressedLight = Color(0xFFE8EFF8) +val AccentPressedDark = Color(0xFF1C1C1C) + +// Border colors +val BorderDefaultLight = Color(0xFFE1E4E8) +val BorderDefaultDark = Color(0xFF282828) + /** * Interpolates a color between [color1] and [color2] by choosing a color a [fraction] in between. diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt new file mode 100644 index 00000000..4d7265e8 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt @@ -0,0 +1,72 @@ +package com.cornellappdev.android.eatery.ui.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.graphics.Color + +val LocalColorMode = staticCompositionLocalOf { ColorTheme.darkMode } + +@Composable +fun AppColorTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + content: @Composable () -> Unit +) { + val colors = if (darkTheme) ColorTheme.darkMode else ColorTheme.lightMode + CompositionLocalProvider(LocalColorMode provides colors) { + content() + } +} + +val currentColors: ColorMode + @Composable get() = LocalColorMode.current + +object ColorTheme +{ + val lightMode = ColorMode( + error = ErrorLight, + success = SuccessLight, + backgroundDefault = BgDefaultLight, + backgroundSecondary = BgSecondaryLight, + backgroundDefault10 = BgDefault10Light, + backgroundDefault92 = BgDefault92Light, + backgroundSurface = BgSurfaceLight, + textPrimary = TextPrimaryLight, + textSecondary = TextSecondaryLight, + accentPrimary = AccentPrimaryLight, + accentPressed = AccentPressedLight, + borderDefault = BorderDefaultLight + ) + val darkMode = ColorMode( + error = ErrorDark, + success = SuccessDark, + backgroundDefault = BgDefaultDark, + backgroundSecondary = BgSecondaryDark, + backgroundDefault10 = BgDefault10Dark, + backgroundDefault92 = BgDefault92Dark, + backgroundSurface = BgSurfaceDark, + textPrimary = TextPrimaryDark, + textSecondary = TextSecondaryDark, + accentPrimary = AccentPrimaryDark, + accentPressed = AccentPressedDark, + borderDefault = BorderDefaultDark + ) + +} + +data class ColorMode( + val error : Color, + val success : Color, + val backgroundDefault : Color, + val backgroundSecondary : Color, + val backgroundDefault10 : Color, + val backgroundDefault92 : Color, + val backgroundSurface : Color, + val textPrimary : Color, + val textSecondary : Color, + val accentPrimary : Color, + val accentPressed : Color, + val borderDefault : Color +) From 74087f2579a3e5ef528427256065349f75efbf0c Mon Sep 17 00:00:00 2001 From: brianhu72 Date: Sat, 4 Apr 2026 16:50:41 -0500 Subject: [PATCH 02/31] Finished Dark Mode Feature --- .../android/eatery/MainActivity.kt | 19 +- .../repositories/UserPreferencesRepository.kt | 19 + .../comparemenus/CompareMenusBotSheet.kt | 29 +- .../comparemenus/CompareMenusFAB.kt | 6 +- .../ui/components/details/AlertsSection.kt | 10 +- .../ui/components/details/CalendarButton.kt | 5 +- .../details/EateryDetailsStickyHeader.kt | 13 +- .../details/EateryHourBottomSheet.kt | 31 +- .../ui/components/details/EateryMealTabs.kt | 17 +- .../details/EateryMenusBottomSheet.kt | 27 +- .../ui/components/details/FavoritesToggle.kt | 7 +- .../components/details/ItemFavoritesCard.kt | 9 +- .../ui/components/details/PaymentWidgets.kt | 12 +- .../components/general/AppStoreRatingPopup.kt | 14 +- .../general/CalendarWeekSelector.kt | 22 +- .../ui/components/general/CustomTextField.kt | 9 +- .../ui/components/general/EateryCard.kt | 52 +- .../ui/components/general/FavoriteButton.kt | 6 +- .../eatery/ui/components/general/FilterRow.kt | 29 +- .../eatery/ui/components/general/MenuItems.kt | 8 +- .../ui/components/general/NoEateryFound.kt | 9 +- .../general/PaymentMethodsAvailable.kt | 34 +- .../general/PaymentMethodsBottomSheet.kt | 28 +- .../general/PermissionRequestDialog.kt | 8 +- .../eatery/ui/components/general/SearchBar.kt | 14 +- .../ui/components/home/AnnouncementsPopUp.kt | 10 +- .../ui/components/home/DietaryWidgets.kt | 6 +- .../components/home/EateryDetailsLoading.kt | 39 +- .../ui/components/home/EateryHomeSection.kt | 8 +- .../eatery/ui/components/home/MainLoading.kt | 13 +- .../eatery/ui/components/login/AccountPage.kt | 120 +++-- .../eatery/ui/components/login/LoginPage.kt | 13 +- .../notifications/FavoriteItemRow.kt | 8 +- .../ui/components/onboarding/IconSheet.kt | 4 +- .../onboarding/OnboardingCarousel.kt | 3 +- .../components/onboarding/OnboardingHeader.kt | 9 +- .../components/settings/AppIconBottomSheet.kt | 20 +- .../components/settings/ReportBottomSheet.kt | 43 +- .../ui/components/settings/SettingsOption.kt | 10 +- .../ui/components/settings/SwitchOption.kt | 11 +- .../ui/components/upcoming/MealBottomSheet.kt | 19 +- .../eatery/ui/components/upcoming/MenuCard.kt | 20 +- .../ui/components/upcoming/UpcomingLoading.kt | 11 +- .../ui/navigation/MainTabbedNavigation.kt | 31 +- .../eatery/ui/navigation/NavigationItem.kt | 15 +- .../android/eatery/ui/screens/AboutScreen.kt | 36 +- .../eatery/ui/screens/CompareMenusScreen.kt | 49 +- .../eatery/ui/screens/EateryDetailScreen.kt | 87 ++-- .../eatery/ui/screens/FavoritesScreen.kt | 14 +- .../android/eatery/ui/screens/HomeScreen.kt | 59 ++- .../android/eatery/ui/screens/LegalScreen.kt | 12 +- .../eatery/ui/screens/NearestScreen.kt | 10 +- .../ui/screens/NotificationsHomeScreen.kt | 4 +- .../ui/screens/NotificationsSettingsScreen.kt | 8 +- .../eatery/ui/screens/OnboardingScreen.kt | 16 +- .../eatery/ui/screens/PrivacyScreen.kt | 18 +- .../android/eatery/ui/screens/SearchScreen.kt | 16 +- .../eatery/ui/screens/SettingsScreen.kt | 480 ++++++++++-------- .../eatery/ui/screens/SupportScreen.kt | 40 +- .../android/eatery/ui/screens/ThemeSheet.kt | 172 +++++++ .../eatery/ui/screens/UpcomingMenuScreen.kt | 33 +- .../android/eatery/ui/theme/Color.kt | 71 ++- .../android/eatery/ui/theme/Theme.kt | 55 +- .../ui/viewmodels/FavoritesViewModel.kt | 10 +- .../eatery/ui/viewmodels/ThemeViewModel.kt | 45 ++ .../eatery/ui/viewmodels/UpcomingViewModel.kt | 10 +- .../android/eatery/util/PreviewUtil.kt | 15 +- app/src/main/proto/user_prefs.proto | 2 + app/src/main/res/drawable/dark_mode.xml | 9 + app/src/main/res/drawable/ic_brightness.xml | 10 + .../drawable/ic_calendar_selected_dark.xml | 16 + .../drawable/ic_grid_view_selected_dark.xml | 29 ++ .../res/drawable/ic_grid_view_unselected.xml | 2 +- .../drawable/ic_grid_view_unselected_dark.xml | 29 ++ .../res/drawable/ic_home_selected_dark.xml | 13 + .../drawable/ic_list_view_selected_dark.xml | 18 + .../drawable/ic_list_view_unselected_dark.xml | 18 + .../res/drawable/ic_profile_selected_dark.xml | 13 + app/src/main/res/drawable/light_mode.xml | 33 ++ app/src/main/res/drawable/system_setting.xml | 12 + gradle/wrapper/gradle-wrapper.properties | 2 +- 81 files changed, 1459 insertions(+), 857 deletions(-) create mode 100644 app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt create mode 100644 app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/ThemeViewModel.kt create mode 100644 app/src/main/res/drawable/dark_mode.xml create mode 100644 app/src/main/res/drawable/ic_brightness.xml create mode 100644 app/src/main/res/drawable/ic_calendar_selected_dark.xml create mode 100644 app/src/main/res/drawable/ic_grid_view_selected_dark.xml create mode 100644 app/src/main/res/drawable/ic_grid_view_unselected_dark.xml create mode 100644 app/src/main/res/drawable/ic_home_selected_dark.xml create mode 100644 app/src/main/res/drawable/ic_list_view_selected_dark.xml create mode 100644 app/src/main/res/drawable/ic_list_view_unselected_dark.xml create mode 100644 app/src/main/res/drawable/ic_profile_selected_dark.xml create mode 100644 app/src/main/res/drawable/light_mode.xml create mode 100644 app/src/main/res/drawable/system_setting.xml diff --git a/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt b/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt index 21dc60bd..7218750c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt @@ -3,13 +3,20 @@ package com.cornellappdev.android.eatery import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.core.view.WindowCompat +import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import com.cornellappdev.android.eatery.data.repositories.EateryRepository import com.cornellappdev.android.eatery.data.repositories.UserPreferencesRepository import com.cornellappdev.android.eatery.ui.navigation.NavigationSetup import com.cornellappdev.android.eatery.ui.theme.AppColorTheme +import com.cornellappdev.android.eatery.ui.theme.ColorTheme +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import com.cornellappdev.android.eatery.util.LockScreenOrientation import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.runBlocking @@ -35,8 +42,18 @@ class MainActivity : ComponentActivity() { val typography = androidx.compose.material3.Typography() setContent { LockScreenOrientation() + val themeViewModel: ThemeViewModel = hiltViewModel() + val userPreferenceDark by themeViewModel.isDarkMode.collectAsState() + val isSystemDark = isSystemInDarkTheme() + val activeMode = when (userPreferenceDark) { + true -> ColorTheme.darkMode + false -> ColorTheme.lightMode + null -> if (isSystemDark) ColorTheme.darkMode + else ColorTheme.lightMode + } + - AppColorTheme { + AppColorTheme(activeMode) { NavigationSetup(hasOnboarded) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/data/repositories/UserPreferencesRepository.kt b/app/src/main/java/com/cornellappdev/android/eatery/data/repositories/UserPreferencesRepository.kt index 87ecbb7d..a9fe5b11 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/data/repositories/UserPreferencesRepository.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/data/repositories/UserPreferencesRepository.kt @@ -24,6 +24,25 @@ class UserPreferencesRepository @Inject constructor( ) { private val userPreferencesFlow: Flow = userPreferencesStore.data + val isDarkModeFlow : StateFlow = userPreferencesFlow.map { prefs -> + if (prefs.hasIsDarkMode()) prefs.isDarkMode else null} + .stateIn( + CoroutineScope(Dispatchers.IO), + SharingStarted.Eagerly, + null + ) + suspend fun setDarkMode(enabled: Boolean) + { + userPreferencesStore.updateData { prefs -> prefs.toBuilder() + .setIsDarkMode(enabled) + .build()} + } + suspend fun setSystemMode() + { + userPreferencesStore.updateData { prefs -> prefs.toBuilder() + .clearIsDarkMode() + .build()} + } /** * A flow automatically emitting maps indicating whether particular Eateries are favorited. */ diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBotSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBotSheet.kt index 28d3e98e..d3a3c6bb 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBotSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBotSheet.kt @@ -37,10 +37,8 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.ui.components.general.FilterRow -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayTwo -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.CompareMenusBotViewModel import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -52,6 +50,7 @@ fun CompareMenusBotSheet( compareMenusBotViewModel: CompareMenusBotViewModel = hiltViewModel(), firstEatery: Eatery? = null ) { + val colors = currentColors val compareMenusUIState by compareMenusBotViewModel.compareMenusUiState.collectAsState() val filters = compareMenusUIState.filters val selectedEateries = compareMenusUIState.selected @@ -75,7 +74,7 @@ fun CompareMenusBotSheet( ) { Text( text = "Compare Menus", style = EateryBlueTypography.h4, - color = Color.Black + color = currentColors.textPrimary ) IconButton( onClick = { @@ -84,12 +83,12 @@ fun CompareMenusBotSheet( }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = colors.backgroundDefault, shape = CircleShape) ) { Icon( Icons.Default.Close, contentDescription = Icons.Default.Close.name, - tint = Color.Black + tint = currentColors.textPrimary ) } } @@ -111,7 +110,7 @@ fun CompareMenusBotSheet( Box( modifier = Modifier - .background(Color.White) + .background(currentColors.backgroundDefault) .fillMaxHeight(0.4f) .fillMaxWidth() ) { @@ -135,15 +134,15 @@ fun CompareMenusBotSheet( .align(Alignment.CenterHorizontally), shape = RoundedCornerShape(100), colors = ButtonDefaults.buttonColors( - backgroundColor = if (selectedEateries.size < 2) GrayTwo else EateryBlue, - contentColor = if (selectedEateries.size < 2) GrayZero else Color.White + backgroundColor = if (selectedEateries.size < 2) colors.backgroundDefault92 else colors.accentPrimary, + contentColor = if (selectedEateries.size < 2) colors.backgroundDefault else currentColors.backgroundDefault ) ) { Text( text = if (selectedEateries.size < 2) "Select at least ${2 - selectedEateries.size} more" else "Compare ${selectedEateries.size} now", style = EateryBlueTypography.h5, - color = Color.White + color = colors.backgroundDefault ) } } @@ -185,12 +184,12 @@ private fun SelectableEateriesList( contentAlignment = Alignment.Center, modifier = Modifier .size(26.dp) - .background(Color.Black, CircleShape) + .background(currentColors.textPrimary, CircleShape) ) { Icon( imageVector = Icons.Default.Check, contentDescription = "Selected", - tint = Color.White, + tint = currentColors.backgroundDefault, modifier = Modifier.size(24.dp) ) } @@ -199,8 +198,8 @@ private fun SelectableEateriesList( contentAlignment = Alignment.Center, modifier = Modifier .size(26.dp) - .background(Color.White, CircleShape) - .border(2.dp, Color.Black, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) + .border(2.dp, currentColors.textPrimary, CircleShape) ) { } } @@ -208,7 +207,7 @@ private fun SelectableEateriesList( eatery.name?.let { Text( text = it, style = EateryBlueTypography.body1, - color = Color.Black + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt index 89d937a0..a6c9c32d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt @@ -9,7 +9,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R -import com.cornellappdev.android.eatery.ui.theme.EateryBlue +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun CompareMenusFAB( @@ -20,12 +20,12 @@ fun CompareMenusFAB( onClick = { onClick() }, modifier = modifier .padding(16.dp), - backgroundColor = EateryBlue + backgroundColor = currentColors.backgroundSecondary ) { Icon( painter = painterResource(id = R.drawable.ic_compare_menus), "Compare Menus Floating Action Button", - tint = Color.White + tint = currentColors.backgroundDefault ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt index 4ed442b8..b1d26657 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt @@ -20,9 +20,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.data.models.Eatery -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.LightBlue +import com.cornellappdev.android.eatery.ui.theme.currentColors import java.time.LocalDateTime /** @@ -30,6 +29,7 @@ import java.time.LocalDateTime */ @Composable fun AlertsSection(eatery: Eatery) { + val colors = currentColors Column( verticalArrangement = Arrangement.spacedBy(12.dp), modifier = Modifier.padding(top = 12.dp) ) { @@ -47,16 +47,16 @@ fun AlertsSection(eatery: Eatery) { Row( modifier = Modifier .fillMaxWidth() - .background(LightBlue) + .background(colors.accentPrimary) ) { Icon( - Icons.Default.Info, contentDescription = "Warning", tint = EateryBlue + Icons.Default.Info, contentDescription = "Warning", tint = colors.backgroundSecondary ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( text = it.description, style = EateryBlueTypography.body2, - color = EateryBlue, + color = colors.textPrimary, modifier = Modifier.padding(start = 5.dp) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt index 4b91cf61..74818ae8 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt @@ -19,15 +19,16 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.EateryPreview @Composable fun CalendarButton(onClick: () -> Unit) { + val colors = currentColors Row( modifier = Modifier .clip(RoundedCornerShape(100)) - .background(GrayZero) + .background(colors.backgroundDefault) .clickable { onClick() } .padding(vertical = 8.dp, horizontal = 12.dp), verticalAlignment = Alignment.CenterVertically, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt index efc257c2..e9c16d82 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt @@ -32,8 +32,7 @@ import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.data.models.Event import com.cornellappdev.android.eatery.data.models.MenuCategory -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.AppStorePopupRepository import com.cornellappdev.android.eatery.util.appStorePopupRepository import kotlinx.coroutines.launch @@ -49,6 +48,7 @@ fun EateryDetailsStickyHeader( onItemClick: (Int) -> Unit, appStorePopupRepository: AppStorePopupRepository = appStorePopupRepository(), ) { + val colors = currentColors val rowState = rememberLazyListState() val rowCoroutine = rememberCoroutineScope() val selectedEvent = nextEvent?.menu?.find { category -> @@ -80,7 +80,7 @@ fun EateryDetailsStickyHeader( Column( modifier = Modifier .fillMaxWidth() - .background(Color.White) + .background(currentColors.backgroundDefault) ) { Spacer(modifier = Modifier.height(6.dp)) @@ -143,7 +143,7 @@ fun EateryDetailsStickyHeader( } Divider( - color = GrayZero, + color = colors.backgroundDefault, thickness = 1.dp ) } @@ -156,12 +156,13 @@ fun CategoryItem( isHighlighted: Boolean, onItemClick: () -> Unit ) { + val backgroundColor by animateColorAsState( - if (isHighlighted) Color.Black else Color.White, + if (isHighlighted) currentColors.textPrimary else currentColors.backgroundDefault, label = "Background Color" ) val textColor by animateColorAsState( - if (isHighlighted) Color.White else GrayFive, + if (isHighlighted) currentColors.backgroundDefault else currentColors.textPrimary, label = "Text Color" ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt index 0c97a080..636543a2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt @@ -31,11 +31,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayZero -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Red -import com.cornellappdev.android.eatery.ui.theme.Yellow +import com.cornellappdev.android.eatery.ui.theme.currentColors /** * BottomSheet that displays the specific opening times of days in a week. @@ -48,6 +44,7 @@ fun EateryHourBottomSheet( onDismiss: () -> Unit, onReportIssue: () -> Unit ) { + val colors = currentColors Column( modifier = Modifier .fillMaxWidth() @@ -63,14 +60,14 @@ fun EateryHourBottomSheet( Icon( imageVector = Icons.Outlined.Schedule, contentDescription = "Hours Icon", - tint = Color.Black, + tint = currentColors.textPrimary, modifier = Modifier.size(32.dp) ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( text = "Hours", style = EateryBlueTypography.h4, - color = Color.Black + color = currentColors.textPrimary ) } IconButton( @@ -79,12 +76,12 @@ fun EateryHourBottomSheet( }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = colors.backgroundDefault, shape = CircleShape) ) { Icon( Icons.Default.Close, contentDescription = Icons.Default.Close.name, - tint = Color.Black + tint = currentColors.textPrimary ) } } @@ -101,9 +98,9 @@ fun EateryHourBottomSheet( style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 16.sp ), - color = if (openUntil == null) Red - else if (eatery.isClosingSoon()) Yellow - else Green + color = if (openUntil == null) currentColors.error + else if (eatery.isClosingSoon()) colors.accentPressed + else currentColors.success ) Spacer(modifier = Modifier.height(12.dp)) @@ -115,14 +112,14 @@ fun EateryHourBottomSheet( Text( text = dayRange, fontSize = 16.sp, - color = GrayFive, + color = colors.textSecondary, fontWeight = FontWeight(500) ) hours.forEach { hour -> Text( text = hour, fontSize = 18.sp, - color = Color.Black, + color = currentColors.textPrimary, fontWeight = FontWeight(600) ) } @@ -141,10 +138,10 @@ fun EateryHourBottomSheet( modifier = Modifier .fillMaxWidth() .height(48.dp), - colors = ButtonDefaults.buttonColors(backgroundColor = GrayZero), + colors = ButtonDefaults.buttonColors(backgroundColor = colors.backgroundDefault), shape = RoundedCornerShape(corner = CornerSize(24.dp)), ) { - Text("Close", color = Color.Black, fontSize = 18.sp, fontWeight = FontWeight.SemiBold) + Text("Close", color = currentColors.textPrimary, fontSize = 18.sp, fontWeight = FontWeight.SemiBold) } Spacer(modifier = Modifier.height(12.dp)) @@ -155,7 +152,7 @@ fun EateryHourBottomSheet( ) { Text( "Report an issue", - color = Color.Black, + color = currentColors.textPrimary, fontSize = 14.sp, fontWeight = FontWeight.SemiBold ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt index 3975f7e2..1ea71b93 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.components.details +import android.content.res.Configuration import androidx.compose.foundation.layout.padding import androidx.compose.material3.Tab import androidx.compose.material3.TabRow @@ -11,21 +12,25 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp + import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayThree +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.EateryPreview @Composable fun EateryMealTabs(selectedMealIndex: Int, onSelectMeal: (Int) -> Unit, meals: List) { - TabRow(selectedTabIndex = selectedMealIndex, indicator = { tabPositions -> + TabRow( + selectedTabIndex = selectedMealIndex, + containerColor = currentColors.backgroundSurface, + indicator = { tabPositions -> TabRowDefaults.Indicator( Modifier.tabIndicatorOffset( // We were having lots of users crash here, so avoiding any unsafe accesses for tab positions tabPositions.getOrNull(selectedMealIndex) ?: tabPositions.firstOrNull() ?: return@TabRow ), - color = Color.Black, + color = currentColors.textPrimary, height = 1.dp, ) }) { @@ -41,9 +46,9 @@ fun EateryMealTabs(selectedMealIndex: Int, onSelectMeal: (Int) -> Unit, meals: L style = EateryBlueTypography.button.copy( color = if (index == selectedMealIndex) { - Color.Black + currentColors.textPrimary } else { - GrayThree + currentColors.textSecondary } ), modifier = Modifier.padding(horizontal = 10.dp, vertical = 12.dp), @@ -53,7 +58,7 @@ fun EateryMealTabs(selectedMealIndex: Int, onSelectMeal: (Int) -> Unit, meals: L } } -@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) @Composable fun EateryMealTabsPreview() = EateryPreview { EateryMealTabs(0, {}, listOf("Breakfast", "Lunch", "Dinner")) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt index cee32ae0..06c2169e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt @@ -38,9 +38,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.ui.components.general.CalendarWeekSelector -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.toReadableShortName import java.time.DayOfWeek import java.time.LocalDate @@ -59,6 +58,7 @@ fun EateryMenusBottomSheet( onShowMenuClick: (Int, String, Int) -> Unit, onResetClick: () -> Unit ) { + val colors = currentColors val zoneId: ZoneId? = ZoneId.of("America/New_York") val today = LocalDate.now(zoneId) val currentDay by remember { mutableStateOf(today) } @@ -129,7 +129,7 @@ fun EateryMenusBottomSheet( }, modifier = Modifier .padding(all = 8.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = colors.backgroundDefault, shape = CircleShape) ) { Icon( imageVector = Icons.Default.Close, @@ -174,14 +174,14 @@ fun EateryMenusBottomSheet( text = description, fontSize = 18.sp, fontWeight = FontWeight(600), - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding(bottom = 2.dp) ) Text( text = duration, fontSize = 12.sp, fontWeight = FontWeight(600), - color = Color.Gray + color = currentColors.textSecondary ) } IconButton(onClick = { selectedMealType = description }) { @@ -190,12 +190,12 @@ fun EateryMenusBottomSheet( contentAlignment = Alignment.Center, modifier = Modifier .size(26.dp) - .background(Color.Black, CircleShape) + .background(currentColors.textPrimary, CircleShape) ) { Icon( imageVector = Icons.Default.Check, contentDescription = "Selected", - tint = Color.White, + tint = currentColors.backgroundDefault, modifier = Modifier.fillMaxSize(0.7f) ) } @@ -204,8 +204,8 @@ fun EateryMenusBottomSheet( contentAlignment = Alignment.Center, modifier = Modifier .size(26.dp) - .background(Color.White, CircleShape) - .border(2.dp, Color.Black, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) + .border(2.dp, currentColors.textPrimary, CircleShape) ) { } } @@ -218,7 +218,7 @@ fun EateryMenusBottomSheet( .padding(top = 12.dp, bottom = 12.dp) .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) ) } } @@ -250,13 +250,14 @@ fun EateryMenusBottomSheet( .height(48.dp), shape = RoundedCornerShape(100), colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, contentColor = Color.White + backgroundColor = currentColors.accentPrimary, + contentColor = currentColors.backgroundDefault ) ) { Text( text = "Show menu", style = EateryBlueTypography.h5, - color = Color.White + color = currentColors.backgroundDefault ) } ClickableText(modifier = Modifier.padding(top = 12.dp), @@ -265,7 +266,7 @@ fun EateryMenusBottomSheet( fontSize = 14.sp, lineHeight = 17.5.sp, fontWeight = FontWeight(600), - color = Color(0xFF050505) + color = currentColors.textPrimary ), onClick = { selectedDay = weekDayIndex diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt index 6a75aed2..62ce5f1a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt @@ -22,9 +22,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.EateryPreview @Composable @@ -33,8 +32,8 @@ fun FavoritesToggle( label: String, active: Boolean ) { - val detailColor = if (active) EateryBlue else Color(0xFF6B6B6B) - val backgroundColor = if (active) Color.White else GrayZero + val detailColor = if (active) Color(0xFFFFD700) else currentColors.accentPrimary + val backgroundColor = if (active) currentColors.backgroundDefault else Color.Transparent Row( modifier = Modifier .clip(RoundedCornerShape(8)) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt index c5548906..ebcb2418 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt @@ -32,8 +32,7 @@ import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.EateryStatus import com.cornellappdev.android.eatery.ui.components.general.FavoriteButton import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero -import com.cornellappdev.android.eatery.ui.theme.Green +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.conditional @@ -57,10 +56,10 @@ fun ItemFavoritesCard( Card( modifier = modifier .fillMaxWidth() - .border(BorderStroke(Dp.Hairline, GrayZero), RoundedCornerShape(8)), + .border(BorderStroke(Dp.Hairline, currentColors.backgroundDefault), RoundedCornerShape(8)), shape = RoundedCornerShape(8.dp), colors = CardDefaults.cardColors( - containerColor = Color.White + containerColor = currentColors.backgroundDefault ), elevation = CardDefaults.cardElevation(8.dp) ) { @@ -130,7 +129,7 @@ private fun FavoritesCardPreview() = EateryPreview { ItemFavoritesCard( ItemFavoritesCardViewState( "tes", - EateryStatus("Available", Green), + EateryStatus("Available", currentColors.success), mapOf( "lunch" to listOf("becker"), "lunch" to listOf("becker"), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt index 5cf5118d..34670646 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt @@ -15,9 +15,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.Eatery -import com.cornellappdev.android.eatery.ui.theme.EateryBlue -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Red +import com.cornellappdev.android.eatery.ui.theme.currentColors /** * Payment widgets that are displayed at the top right region eatery details screen @@ -27,7 +25,7 @@ fun PaymentWidgets(eatery: Eatery, modifier: Modifier = Modifier, onClick: () -> Surface( modifier = modifier.clickable { onClick.invoke() - }, shape = CircleShape, color = Color.White + }, shape = CircleShape, color = currentColors.backgroundDefault ) { Row( modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp), @@ -37,21 +35,21 @@ fun PaymentWidgets(eatery: Eatery, modifier: Modifier = Modifier, onClick: () -> Icon( painter = painterResource(id = R.drawable.ic_payment_swipes), contentDescription = "Accepts Swipes", - tint = EateryBlue + tint = currentColors.accentPrimary ) } if (eatery.paymentAcceptsBrbs == true) { Icon( painter = painterResource(id = R.drawable.ic_payment_brbs), contentDescription = "Accepts BRBs", - tint = Red + tint = currentColors.error ) } if (eatery.paymentAcceptsCash == true) { Icon( painter = painterResource(id = R.drawable.ic_payment_cash), contentDescription = "Accepts Cash", - tint = Green + tint = currentColors.success ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt index 37bd2270..06b06f3c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme.colors import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Star @@ -44,9 +45,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.core.content.ContextCompat.startActivity import com.cornellappdev.android.eatery.ui.components.home.EateryDetailLoadingScreen -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.AppStorePopupRepository import com.cornellappdev.android.eatery.util.appStorePopupRepository import com.valentinilk.shimmer.ShimmerBounds @@ -125,13 +125,13 @@ private fun ActionPrompt( Spacer(Modifier.height(12.dp)) Button( onButtonPress, - colors = ButtonDefaults.buttonColors(backgroundColor = EateryBlue), + colors = ButtonDefaults.buttonColors(backgroundColor = currentColors.accentPrimary), shape = RoundedCornerShape(100.dp) ) { Text( buttonText, style = EateryBlueTypography.button, - color = Color.White + color = currentColors.backgroundDefault ) } } @@ -181,7 +181,7 @@ private fun AppStoreRatingCardBorder( Column( modifier = Modifier .shadow(3.dp, shape = RoundedCornerShape(20.dp)) - .background(Color.White) + .background(currentColors.backgroundDefault) .clip(RoundedCornerShape(20.dp)) .padding(bottom = 24.dp, start = 24.dp) ) { @@ -191,12 +191,12 @@ private fun AppStoreRatingCardBorder( modifier = Modifier .padding(end = 16.dp, top = 16.dp) .size(20.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { androidx.compose.material.Icon( Icons.Default.Close, contentDescription = Icons.Default.Close.name, - tint = Color.Black + tint = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt index 0c07b6dd..8b478c65 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt @@ -22,10 +22,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayThree +import com.cornellappdev.android.eatery.ui.theme.currentColors /** * Reusable UI component that displays today and the next six days @@ -59,7 +57,7 @@ fun CalendarWeekSelector( ) { Text( text = dayNames[i].uppercase(), - color = GrayFive, + color = currentColors.textSecondary, textAlign = TextAlign.Center, style = EateryBlueTypography.caption, modifier = Modifier.padding(bottom = 8.dp), @@ -87,9 +85,9 @@ fun CalendarWeekSelector( .size(size = (34 * size).dp) .alpha(size), color = when { - i == currSelectedDay && currSelectedDay == 0 -> EateryBlue - i == currSelectedDay || i == selectedDay -> GrayFive - else -> GrayFive + i == currSelectedDay && currSelectedDay == 0 -> currentColors.accentPrimary + i == currSelectedDay || i == selectedDay -> currentColors.textSecondary + else -> currentColors.textSecondary }, shape = CircleShape ) {} @@ -97,11 +95,11 @@ fun CalendarWeekSelector( Text( text = days[i].toString(), color = when { - closedDays?.contains(dayNames[i]) == true -> GrayThree - i != currSelectedDay && i == 0 -> EateryBlue - i != currSelectedDay && i == selectedDay -> Color.Black - i == currSelectedDay || i == selectedDay -> Color.White - else -> Color.Black + closedDays?.contains(dayNames[i]) == true -> currentColors.backgroundDefault10 + i != currSelectedDay && i == 0 -> currentColors.accentPrimary + i != currSelectedDay && i == selectedDay -> currentColors.textPrimary + i == currSelectedDay || i == selectedDay -> currentColors.backgroundDefault + else -> currentColors.textPrimary }, style = EateryBlueTypography.h6, fontWeight = FontWeight.Normal, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt index a4bc58d3..ba0b5939 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt @@ -39,8 +39,7 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayThree +import com.cornellappdev.android.eatery.ui.theme.currentColors @OptIn(ExperimentalMaterialApi::class) @Composable @@ -50,7 +49,7 @@ fun CustomTextField( onValueChange: (updated: String) -> Unit, placeholder: String, onSubmit: () -> Unit = {}, - backgroundColor: Color = Color.White, + backgroundColor: Color = currentColors.backgroundDefault, enabled: Boolean = true, focusRequester: FocusRequester? = null, isPassword: Boolean = false, @@ -87,7 +86,7 @@ fun CustomTextField( singleLine = singleLine, visualTransformation = if (isPassword) passwordVisualTransformation else VisualTransformation.None, textStyle = TextStyle( - color = if (!enabled) GrayThree else Color.Black, + color = if (!enabled) currentColors.backgroundDefault10 else currentColors.textPrimary, fontSize = 16.sp, fontWeight = FontWeight.Medium ), @@ -114,7 +113,7 @@ fun CustomTextField( Text( text = placeholder, style = EateryBlueTypography.subtitle2, - color = GrayFive, + color = currentColors.textSecondary, ) }, interactionSource = interactionSource, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt index ad6354ed..8a720a8a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt @@ -53,16 +53,9 @@ import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.data.repositories.CoilRepository -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayOne -import com.cornellappdev.android.eatery.ui.theme.GrayThree -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Orange -import com.cornellappdev.android.eatery.ui.theme.Red -import com.cornellappdev.android.eatery.ui.theme.Yellow import com.cornellappdev.android.eatery.ui.theme.colorInterp +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse enum class EateryCardStyle { @@ -114,7 +107,7 @@ fun EateryCard( onClick = { selectEatery(eatery) }, - backgroundColor = Color.White, + backgroundColor = currentColors.accentPrimary, modifier = modifier ) { Column { @@ -142,7 +135,9 @@ fun EateryCard( modifier = Modifier .height(imageHeight) .fillMaxWidth() - .background(colorInterp(progress, GrayOne, GrayThree)), + .background(colorInterp(progress, + currentColors.backgroundSecondary, + currentColors.backgroundDefault10)), contentDescription = "", contentScale = ContentScale.Crop ) @@ -186,8 +181,8 @@ fun EateryCard( .padding(top = 12.dp, end = 12.dp) .align(Alignment.TopEnd), shape = RoundedCornerShape(100.dp), - contentColor = Orange, - backgroundColor = Color.White + contentColor = Color(0xFFFFA500), + backgroundColor = currentColors.accentPrimary ) { Row( modifier = Modifier.padding( @@ -221,6 +216,7 @@ fun EateryCard( maxLines = 1, overflow = TextOverflow.Ellipsis, style = EateryBlueTypography.h5, + color = currentColors.textPrimary, modifier = Modifier .weight(1f) .padding(end = 30.dp) @@ -264,11 +260,11 @@ fun GridViewFavoriteWidget( onClick = onClick ), shape = CircleShape, - color = Color.White + color = currentColors.backgroundDefault ) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) Yellow else GrayFive, + tint = if (isFavorite) currentColors.accentPressed else currentColors.textSecondary, modifier = Modifier .padding(8.dp), contentDescription = null @@ -283,7 +279,7 @@ fun EateryCardPrimaryHeader(eatery: Eatery, style: EateryCardStyle = EateryCardS Row { Text( text = eatery.location ?: "Unknown location", - color = GrayFive, + color = currentColors.textSecondary, style = EateryBlueTypography.subtitle2 ) } @@ -304,14 +300,14 @@ fun EateryCardSecondaryHeader(eatery: Eatery, style: EateryCardStyle = EateryCar Icon( painter = painterResource(id = R.drawable.ic_walk_small), contentDescription = null, - tint = GrayFive, + tint = currentColors.textSecondary, modifier = Modifier.padding(end = 4.dp, top = 1.dp) ) Text( text = walkText, fontSize = 14.sp, fontWeight = FontWeight(500), - color = GrayFive, + color = currentColors.textSecondary, style = EateryBlueTypography.subtitle2 ) DotSeparator() @@ -324,9 +320,9 @@ fun EateryCardSecondaryHeader(eatery: Eatery, style: EateryCardStyle = EateryCar else if (eatery.isClosingSoon()) "Closing at $openUntil" else ("Open until $openUntil"), style = EateryBlueTypography.subtitle2, - color = if (openUntil == null) Red - else if (eatery.isClosingSoon()) Yellow - else Green + color = if (openUntil == null) currentColors.error + else if (eatery.isClosingSoon()) currentColors.accentPressed + else currentColors.success ) } } @@ -343,12 +339,12 @@ fun EateryCardTertiaryHeader(eatery: Eatery, style: EateryCardStyle = EateryCard ) { Text( text = "Recommended for You: ", - color = GrayFive, + color = currentColors.textSecondary, style = EateryBlueTypography.subtitle2 ) Text( text = "Carved Roast Beef", - color = EateryBlue, + color = currentColors.textPrimary, fontStyle = FontStyle.Italic, style = EateryBlueTypography.subtitle2 ) @@ -357,12 +353,12 @@ fun EateryCardTertiaryHeader(eatery: Eatery, style: EateryCardStyle = EateryCard Column(modifier = Modifier.padding(top = 8.dp)) { Text( text = "Recommended for You: ", - color = GrayFive, + color = currentColors.textSecondary, style = EateryBlueTypography.subtitle2 ) Text( text = "Carved Roast Beef", - color = EateryBlue, + color = currentColors.textPrimary, fontStyle = FontStyle.Italic, style = EateryBlueTypography.subtitle2 ) @@ -374,7 +370,7 @@ fun EateryCardTertiaryHeader(eatery: Eatery, style: EateryCardStyle = EateryCard fun DotSeparator() { Text( text = "·", - color = GrayFive, + color = currentColors.textSecondary, style = EateryBlueTypography.subtitle2, modifier = Modifier.padding(horizontal = 5.dp) ) @@ -387,7 +383,7 @@ fun EateryMenuSummary(eatery: Eatery) { Text( text = "Meal swipes allowed", maxLines = 1, - color = EateryBlue, + color = currentColors.textPrimary, style = EateryBlueTypography.subtitle2 ) } else if (eatery.paymentAcceptsBrbs == false && @@ -397,7 +393,7 @@ fun EateryMenuSummary(eatery: Eatery) { Text( text = "Cash or credit only", maxLines = 1, - color = Green, + color = currentColors.success, style = EateryBlueTypography.subtitle2 ) } else if (!eatery.menuSummary.isNullOrEmpty()) { @@ -405,7 +401,7 @@ fun EateryMenuSummary(eatery: Eatery) { Text( text = eatery.menuSummary, maxLines = 1, - color = GrayFive, + color = currentColors.textSecondary, style = EateryBlueTypography.subtitle2 ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt index 290d5e50..108f9296 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt @@ -10,9 +10,9 @@ import androidx.compose.material.icons.outlined.StarOutline import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.Yellow +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun FavoriteButton( @@ -37,7 +37,7 @@ fun FavoriteButton( fun FavoriteIcon(isFavorite: Boolean, modifier: Modifier = Modifier) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) Yellow else GrayFive, + tint = if (isFavorite) Color(0xFFFFD700) else currentColors.accentPrimary, modifier = modifier, contentDescription = "favorite: $isFavorite" ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt index e3bdda5e..70bf4518 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt @@ -2,6 +2,7 @@ package com.cornellappdev.android.eatery.ui.components.general import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -19,13 +20,16 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import androidx.hilt.navigation.compose.hiltViewModel import com.cornellappdev.android.eatery.ui.theme.colorInterp +import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel @Composable fun FilterRow( @@ -34,8 +38,11 @@ fun FilterRow( onFilterClicked: (Filter) -> Unit, customItemsBefore: LazyListScope.() -> Unit = {}, customItemsAfter: LazyListScope.() -> Unit = {}, - rowState: LazyListState = rememberLazyListState() + rowState: LazyListState = rememberLazyListState(), + themeViewModel : ThemeViewModel = hiltViewModel() ) { + val isDarkMode by themeViewModel.isDarkMode.collectAsState() + val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() LazyRow( horizontalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(horizontal = 16.dp), @@ -47,7 +54,8 @@ fun FilterRow( onFilterClicked = { onFilterClicked(filter) }, selected = filter in currentFiltersSelected, - text = filter.text + text = filter.text, + isDarkMode = resolvedDarkMode ) } customItemsAfter() @@ -62,15 +70,24 @@ fun FilterButton( onFilterClicked: () -> Unit, selected: Boolean, text: String, - icon: ImageVector? = null + icon: ImageVector? = null, + isDarkMode: Boolean ) { val progress by animateFloatAsState( targetValue = if (selected) 0f else 1f, label = "Button Color", animationSpec = tween(150) ) - val background = colorInterp(progress, Color.Black, GrayZero) - val contentColor = colorInterp(progress, Color.White, Color.Black) + var background = colorInterp(progress, Color.Black, Color(0xFFEFF1F4)) + var contentColor = colorInterp(progress, Color.White, Color.Black) + + if (isDarkMode==true) + { + background = colorInterp(progress, Color.White, Color(0xFF272727)) + contentColor = colorInterp(progress, Color.Black, Color.White) + } + + Button( onClick = onFilterClicked, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/MenuItems.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/MenuItems.kt index c6b63cae..2408a36e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/MenuItems.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/MenuItems.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.data.models.MenuCategory import com.cornellappdev.android.eatery.data.models.MenuItem import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors data class MenuCategoryViewState( val category: String, @@ -48,6 +48,7 @@ fun LazyListScope.menuItems( item { Text( text = category.category, + color = currentColors.textPrimary, style = EateryBlueTypography.h5, modifier = Modifier.padding( horizontal = 16.dp, @@ -70,6 +71,7 @@ fun LazyListScope.menuItems( ) { Text( text = menuItem.item.name ?: "Item Name", + color = currentColors.textPrimary, style = EateryBlueTypography.button, modifier = Modifier.weight(1f) ) @@ -85,12 +87,12 @@ fun LazyListScope.menuItems( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.accentPrimary, CircleShape) ) } if (category.items.lastIndex == index) { Divider( - color = GrayZero, + color = currentColors.accentPrimary, modifier = Modifier.height(10.dp) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt index 0e2b5c76..a5c81c3b 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt @@ -17,9 +17,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayTwo +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun NoEateryFound(modifier: Modifier = Modifier, resetFilters: () -> Unit) { @@ -35,7 +34,7 @@ fun NoEateryFound(modifier: Modifier = Modifier, resetFilters: () -> Unit) { modifier = Modifier .height(72.dp) .width(72.dp), - tint = GrayTwo + tint = currentColors.backgroundDefault92 ) Text( text = "No eatery found...", @@ -46,7 +45,7 @@ fun NoEateryFound(modifier: Modifier = Modifier, resetFilters: () -> Unit) { modifier = Modifier.padding(top = 12.dp), shape = RoundedCornerShape(100.dp), colors = buttonColors( - backgroundColor = EateryBlue + backgroundColor = currentColors.accentPrimary ), onClick = { resetFilters() @@ -55,7 +54,7 @@ fun NoEateryFound(modifier: Modifier = Modifier, resetFilters: () -> Unit) { Text( text = "Reset filters", color = - Color.White + currentColors.backgroundDefault ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index 9fb8e28d..5dadecab 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -34,12 +34,8 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayTwo -import com.cornellappdev.android.eatery.ui.theme.GrayZero -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Red +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable @@ -99,9 +95,9 @@ fun PaymentMethodsAvailable( }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { - Icon(Icons.Default.Close, contentDescription = "Close", tint = Color.Black) + Icon(Icons.Default.Close, contentDescription = "Close", tint = currentColors.textPrimary) } } @@ -118,14 +114,14 @@ fun PaymentMethodsAvailable( modifier = Modifier .size(64.dp) .background( - color = Color.White, + color = currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( painter = painterResource(id = R.drawable.ic_payment_swipes), contentDescription = "Swipes", - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.SWIPES)) EateryBlue else GrayTwo + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.SWIPES)) currentColors.backgroundSecondary else currentColors.backgroundDefault92 ) } } @@ -137,14 +133,14 @@ fun PaymentMethodsAvailable( modifier = Modifier .size(64.dp) .background( - color = Color.White, + color = currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( painter = painterResource(id = R.drawable.ic_payment_brbs), contentDescription = "BRBs", - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.BRB)) Red else GrayTwo + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.BRB)) currentColors.error else currentColors.backgroundDefault92 ) } } @@ -155,14 +151,14 @@ fun PaymentMethodsAvailable( modifier = Modifier .size(64.dp) .background( - color = Color.White, + color = currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( painter = painterResource(id = R.drawable.ic_payment_cash), contentDescription = "Cash or card", - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.CASH)) Green else GrayTwo + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.CASH)) currentColors.success else currentColors.backgroundDefault92 ) } } @@ -184,8 +180,8 @@ fun PaymentMethodsAvailable( .padding(top = 12.dp, bottom = 12.dp) .fillMaxWidth(), colors = ButtonDefaults.buttonColors( - backgroundColor = GrayZero, - contentColor = Color.Black + backgroundColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary ) ) { Text( @@ -197,8 +193,10 @@ fun PaymentMethodsAvailable( } } + + enum class PaymentMethodsAvailable(val drawable: Int, val color: Color, val text: String) { - BRB(drawable = R.drawable.ic_small_brbs, color = Red, text = "BRBs"), - CASH(drawable = R.drawable.ic_small_cash, color = Green, text = "Cash or credit"), - SWIPES(drawable = R.drawable.ic_small_swipes, color = EateryBlue, text = "Meal swipes"); + BRB(drawable = R.drawable.ic_small_brbs, color = Color.Red, text = "BRBs"), + CASH(drawable = R.drawable.ic_small_cash, color = Color.Green, text = "Cash or credit"), + SWIPES(drawable = R.drawable.ic_small_swipes, color = Color(0xFF808080), text = "Meal swipes"); } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt index 614971c8..9b4efb6b 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt @@ -27,12 +27,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayZero -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Red +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun PaymentMethodsBottomSheet( @@ -59,9 +55,9 @@ fun PaymentMethodsBottomSheet( }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { - Icon(Icons.Default.Close, contentDescription = "Close", tint = Color.Black) + Icon(Icons.Default.Close, contentDescription = "Close", tint = currentColors.textPrimary) } } @@ -85,14 +81,14 @@ fun PaymentMethodsBottomSheet( modifier = Modifier .size(64.dp) .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) EateryBlue else GrayZero, + color = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) currentColors.backgroundSecondary else currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( painter = painterResource(id = R.drawable.ic_payment_swipes), contentDescription = "Swipes", - tint = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) Color.White else GrayFive + tint = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) currentColors.backgroundDefault else currentColors.textSecondary ) } @@ -117,14 +113,14 @@ fun PaymentMethodsBottomSheet( modifier = Modifier .size(64.dp) .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) Red else GrayZero, + color = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) currentColors.error else currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( painter = painterResource(id = R.drawable.ic_payment_brbs), contentDescription = "BRBs", - tint = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) Color.White else GrayFive + tint = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) currentColors.backgroundDefault else currentColors.textSecondary ) } @@ -148,14 +144,14 @@ fun PaymentMethodsBottomSheet( modifier = Modifier .size(64.dp) .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) Green else GrayZero, + color = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) currentColors.success else currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( painter = painterResource(id = R.drawable.ic_payment_cash), contentDescription = "Cash or credit", - tint = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) Color.White else GrayFive + tint = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) currentColors.backgroundDefault else currentColors.textSecondary ) } @@ -174,8 +170,8 @@ fun PaymentMethodsBottomSheet( .padding(top = 12.dp) .fillMaxWidth(), colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, - contentColor = Color.White + backgroundColor = currentColors.accentPrimary, + contentColor = currentColors.backgroundDefault ) ) { Text( @@ -197,7 +193,7 @@ fun PaymentMethodsBottomSheet( Text( text = "Reset", style = EateryBlueTypography.h5, - color = Color.Black + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt index b2627682..5627764e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt @@ -36,7 +36,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.EateryBlue +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.LocationHandler import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberMultiplePermissionsState @@ -74,7 +74,7 @@ fun PermissionRequestDialog( requestingPermission = false } else { Surface( - color = Color.Black.copy(alpha = 0.6f), + color = currentColors.textPrimary.copy(alpha = 0.6f), modifier = Modifier.fillMaxSize() ) { Column( @@ -116,7 +116,7 @@ fun PermissionRequestDialog( requestingPermission = false }, shape = RoundedCornerShape(5.dp), - colors = ButtonDefaults.buttonColors(backgroundColor = EateryBlue), + colors = ButtonDefaults.buttonColors(backgroundColor = currentColors.accentPrimary), ) { Text( text = if (notificationPermissionState.shouldShowRationale || !notificationFlowStatus) { @@ -124,7 +124,7 @@ fun PermissionRequestDialog( } else { "Open Settings" }, - color = Color.White, + color = currentColors.textPrimary, ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt index 9713e97b..11458cdc 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt @@ -34,8 +34,7 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors @OptIn(ExperimentalMaterialApi::class) @Composable @@ -76,12 +75,13 @@ fun SearchBar( interactionSource = interactionSource, singleLine = true, textStyle = TextStyle( - color = GrayFive, + color = currentColors.textSecondary, fontWeight = FontWeight.Medium, fontSize = 14.sp ) ) { innerTextField -> - Surface(shape = RoundedCornerShape(8.dp), color = GrayZero) { + Surface(shape = RoundedCornerShape(8.dp), + color = currentColors.accentPrimary) { TextFieldDefaults.TextFieldDecorationBox( value = searchText, innerTextField = innerTextField, @@ -92,14 +92,14 @@ fun SearchBar( Icon( Icons.Default.Search, contentDescription = "Search", - tint = GrayFive + tint = currentColors.textSecondary ) }, placeholder = { Text( text = placeholderText, - color = GrayFive + color = currentColors.textSecondary ) }, colors = TextFieldDefaults.textFieldColors( @@ -123,7 +123,7 @@ fun SearchBar( Text( text = "Cancel", style = EateryBlueTypography.subtitle2, - color = GrayFive + color = currentColors.textSecondary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt index d5c4322d..ba30d983 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt @@ -1,3 +1,4 @@ + package com.cornellappdev.android.eatery.ui.components.home import androidx.compose.foundation.Image @@ -30,6 +31,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties import com.cornellappdev.android.eatery.R +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.HomeViewModel @Composable @@ -49,13 +51,13 @@ fun AnnouncementsPopUp( .padding(16.dp) .width(50.dp) .height(50.dp) - .background(Color.White, RoundedCornerShape(10.dp)) + .background(currentColors.backgroundDefault, RoundedCornerShape(10.dp)) .clip(RoundedCornerShape(10.dp)) .clickable { homeViewModel.setPopUp(true) } ) { Icon( painter = painterResource(id = R.drawable.ic_appdev), - tint = Color.Red, + tint = currentColors.error, modifier = Modifier .fillMaxSize() .alpha(.6f), @@ -69,7 +71,7 @@ fun AnnouncementsPopUp( Modifier .fillMaxWidth(.8f) .fillMaxHeight(.4f) - .background(Color.White, RoundedCornerShape(20.dp)) + .background(currentColors.backgroundDefault, RoundedCornerShape(20.dp)) .clip(RoundedCornerShape(20.dp)) .focusable(true) ) { @@ -95,7 +97,7 @@ fun AnnouncementsPopUp( contentDescription = Icons.Default.Close.name, Modifier .size(30.dp) - .background(Color.White, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) .clip(CircleShape) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/DietaryWidgets.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/DietaryWidgets.kt index 35acfa66..34bbbf53 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/DietaryWidgets.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/DietaryWidgets.kt @@ -15,9 +15,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.Eatery -import com.cornellappdev.android.eatery.ui.theme.EateryBlue -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Red +import com.cornellappdev.android.eatery.ui.theme.currentColors /** * Dietary widgets that are displayed at the bottom left corner of Eatery Card @@ -27,7 +25,7 @@ fun DietaryWidgets(eatery: Eatery, modifier: Modifier = Modifier, onClick: () -> Surface( modifier = modifier.clickable { onClick.invoke() - }, shape = CircleShape, color = Color.White + }, shape = CircleShape, color = currentColors.backgroundDefault ) { Row( modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt index 7e43aac7..428cff9f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.GrayTwo +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.valentinilk.shimmer.Shimmer import com.valentinilk.shimmer.ShimmerBounds import com.valentinilk.shimmer.rememberShimmer @@ -30,16 +30,17 @@ import com.valentinilk.shimmer.shimmer fun EateryDetailLoadingScreen( shimmer: Shimmer ) { + val colors = currentColors Column { Box { // this is where the image should be - Box(modifier = Modifier.background(color = Color.White)) { + Box(modifier = Modifier.background(color = currentColors.backgroundDefault)) { Surface( modifier = Modifier .height(240.dp) .shimmer(shimmer) - .fillMaxWidth(), color = GrayTwo + .fillMaxWidth(), color = colors.backgroundDefault92 ) {} } @@ -47,7 +48,7 @@ fun EateryDetailLoadingScreen( modifier = Modifier .align(Alignment.TopEnd) .padding(top = 40.dp, end = 16.dp) - .size(40.dp), color = Color.White, + .size(40.dp), color = currentColors.backgroundDefault, shape = CircleShape ) {} @@ -63,13 +64,13 @@ fun EateryDetailLoadingScreen( } // simulates eatery name and details - Column(modifier = Modifier.background(Color.White)) { + Column(modifier = Modifier.background(currentColors.backgroundDefault)) { Surface( modifier = Modifier .padding(start = 16.dp, top = 16.dp) .shimmer(shimmer) .height(40.dp) - .fillMaxWidth(.6f), color = GrayTwo, + .fillMaxWidth(.6f), color = colors.backgroundDefault92, shape = RoundedCornerShape(20.dp) ) {} Surface( @@ -79,7 +80,7 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .height(20.dp), shape = RoundedCornerShape(20.dp), - color = GrayTwo + color = colors.backgroundDefault92 ) {} Row( @@ -97,7 +98,7 @@ fun EateryDetailLoadingScreen( .padding(horizontal = 16.dp) .weight(0.3f), shape = RoundedCornerShape(100), - color = GrayTwo + color = colors.backgroundDefault92 ) { } } @@ -110,14 +111,14 @@ fun EateryDetailLoadingScreen( .fillMaxHeight(.2f) .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 12.dp), - shape = RoundedCornerShape(8.dp), color = GrayTwo + shape = RoundedCornerShape(8.dp), color = currentColors.backgroundDefault92 ) {} Surface( modifier = Modifier .fillMaxWidth() .height(16.dp) - .shimmer(shimmer), color = GrayTwo + .shimmer(shimmer), color = currentColors.backgroundDefault92 ) {} // simulates menu dropdown @@ -131,7 +132,7 @@ fun EateryDetailLoadingScreen( .align(Alignment.TopEnd) .shimmer(shimmer) .padding(16.dp) - .size(35.dp), color = GrayTwo, + .size(35.dp), color = colors.backgroundDefault92, shape = CircleShape ) {} @@ -147,7 +148,7 @@ fun EateryDetailLoadingScreen( .fillMaxWidth(.6f) .shimmer(shimmer) .padding(16.dp), - color = GrayTwo, + color = colors.backgroundDefault92, shape = RoundedCornerShape(100.dp) ) {} @@ -158,7 +159,7 @@ fun EateryDetailLoadingScreen( .fillMaxWidth() .shimmer(shimmer) .padding(horizontal = 16.dp, vertical = 12.dp), - shape = RoundedCornerShape(8.dp), color = GrayTwo + shape = RoundedCornerShape(8.dp), color = colors.backgroundDefault92 ) {} Spacer(modifier = Modifier.height(8.dp)) @@ -168,7 +169,7 @@ fun EateryDetailLoadingScreen( .height(3.dp) .fillMaxWidth() .shimmer(shimmer) - .padding(horizontal = 16.dp), color = GrayTwo + .padding(horizontal = 16.dp), color = colors.backgroundDefault92 ) {} Spacer(modifier = Modifier.height(8.dp)) @@ -179,7 +180,7 @@ fun EateryDetailLoadingScreen( .fillMaxWidth(.6f) .shimmer(shimmer) .padding(horizontal = 16.dp, vertical = 5.dp), - color = GrayTwo, + color = colors.backgroundDefault92, shape = RoundedCornerShape(100.dp) ) {} @@ -193,7 +194,7 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .fillMaxWidth(.45f) .padding(horizontal = 16.dp, vertical = 3.dp), - shape = RoundedCornerShape(8.dp), color = GrayTwo + shape = RoundedCornerShape(8.dp), color = colors.backgroundDefault92 ) {} Spacer(modifier = Modifier.weight(1f)) @@ -204,7 +205,7 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .fillMaxWidth(.35f) .padding(horizontal = 16.dp, vertical = 3.dp), - shape = RoundedCornerShape(8.dp), color = GrayTwo + shape = RoundedCornerShape(8.dp), color = colors.backgroundDefault92 ) {} } @@ -217,7 +218,7 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .fillMaxWidth() .padding(horizontal = 16.dp), - shape = RoundedCornerShape(100.dp), color = GrayTwo + shape = RoundedCornerShape(100.dp), color = colors.backgroundDefault92 ) {} } } @@ -234,7 +235,7 @@ fun PaymentsBlob() { .fillMaxHeight(.05f) .fillMaxWidth(.25f), shape = RoundedCornerShape(100.dp), - color = Color.White + color = currentColors.backgroundDefault ) { } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt index f2c273da..a5837479 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.ui.components.general.EateryCard import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.popIn import com.cornellappdev.android.eatery.util.popOut @@ -114,14 +114,14 @@ private fun EateryHomeSectionHeader( modifier = Modifier .size(40.dp) .background( - color = GrayZero, + color = currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( Icons.Default.ArrowForward, contentDescription = "Favorites", - tint = Color.Black + tint = currentColors.textPrimary ) } } else { @@ -172,7 +172,7 @@ private fun EaterySectionRow( private fun EateryHomeSectionPreview() { Column(modifier = Modifier .fillMaxSize() - .background(Color.White)) { + .background(currentColors.backgroundDefault)) { EateryHomeSection( title = "Eateries With Expand", eateries = listOf(PreviewData.mockEatery(), PreviewData.mockEatery()), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/MainLoading.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/MainLoading.kt index 0e3118b6..2eb5a554 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/MainLoading.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/MainLoading.kt @@ -23,8 +23,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayThree -import com.cornellappdev.android.eatery.ui.theme.GrayTwo +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.valentinilk.shimmer.Shimmer import com.valentinilk.shimmer.shimmer @@ -42,7 +41,7 @@ fun FilterItem(width: Dp, modifier: Modifier = Modifier) { .then(modifier) .width(width) .fillMaxHeight(), - backgroundColor = GrayTwo, + backgroundColor = currentColors.backgroundDefault92, shape = RoundedCornerShape(8.dp), content = {} ) @@ -65,7 +64,7 @@ fun EateryBlob( ) .then(if (fillMaxWidth) Modifier.fillMaxWidth() else Modifier.width(295.dp)) .height(height), - color = GrayTwo + color = currentColors.backgroundDefault92 ) {} } @@ -100,7 +99,7 @@ sealed class MainLoadingItem { .padding(top = 12.dp, start = 16.dp, end = 16.dp, bottom = 12.dp) .height(38.dp) .fillMaxWidth(), - color = GrayTwo, + color = currentColors.backgroundDefault92, shape = RoundedCornerShape( CornerSize(8.dp) ) @@ -131,7 +130,7 @@ sealed class MainLoadingItem { modifier = Modifier .shimmer(shimmer) .padding(top = 12.dp, bottom = 12.dp, start = 16.dp), - color = GrayThree + color = currentColors.backgroundDefault10 ) } @@ -161,7 +160,7 @@ sealed class MainLoadingItem { modifier = Modifier .padding(start = 16.dp) .shimmer(shimmer), - color = GrayThree + color = currentColors.backgroundDefault10 ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index 54037bee..3bb16b4c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -35,6 +36,7 @@ import androidx.compose.material.icons.filled.KeyboardArrowDown import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -46,21 +48,23 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.Account import com.cornellappdev.android.eatery.data.models.AccountType import com.cornellappdev.android.eatery.data.models.Transaction import com.cornellappdev.android.eatery.ui.components.general.SearchBar import com.cornellappdev.android.eatery.ui.components.home.BottomSheetContent -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import kotlinx.coroutines.launch import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -76,8 +80,10 @@ fun AccountPage( checkMealPlan: () -> Account?, onSettingsClicked: () -> Unit, getTransactionsOfType: (AccountType, String) -> List, - updateAccountFilter: (AccountType) -> Unit + updateAccountFilter: (AccountType) -> Unit, + themeViewModel: ThemeViewModel = hiltViewModel() ) { + val isDarkMode by themeViewModel.isDarkMode.collectAsState() var filterText by remember { mutableStateOf("") } val modalBottomSheetState = rememberModalBottomSheetState( @@ -119,6 +125,11 @@ fun AccountPage( ), sheetElevation = 8.dp ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(currentColors.backgroundDefault) + ) val innerListState = rememberLazyListState() val isFirstVisible = remember { derivedStateOf { innerListState.firstVisibleItemIndex > 1 } } @@ -131,8 +142,8 @@ fun AccountPage( Column( modifier = Modifier .fillMaxWidth() - .background(EateryBlue) - .then(Modifier.statusBarsPadding()) + .background(currentColors.backgroundSecondary) + .statusBarsPadding() .padding(bottom = 7.dp), ) { AnimatedContent( @@ -142,14 +153,13 @@ fun AccountPage( Box( modifier = Modifier .fillMaxWidth() - .background(color = EateryBlue) .padding(top = 12.dp) ) { Text( modifier = Modifier.align(Alignment.Center), textAlign = TextAlign.Center, text = "Account", - color = Color.White, + color = currentColors.oppTextPrimary, style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 20.sp @@ -164,9 +174,9 @@ fun AccountPage( ) { Icon( modifier = Modifier.size(28.dp), - imageVector = Icons.Outlined.Settings, + painter = painterResource(id=R.drawable.system_setting), contentDescription = Icons.Outlined.Settings.name, - tint = Color.White + tint = currentColors.textPrimary ) } } @@ -174,7 +184,6 @@ fun AccountPage( Column( modifier = Modifier .fillMaxWidth() - .background(color = EateryBlue) .then(Modifier.statusBarsPadding()) .padding(bottom = 7.dp), ) { @@ -189,7 +198,7 @@ fun AccountPage( modifier = Modifier.size(28.dp), imageVector = Icons.Outlined.Settings, contentDescription = Icons.Outlined.Settings.name, - tint = Color.White + tint = currentColors.textPrimary ) } Column( @@ -201,7 +210,7 @@ fun AccountPage( ) { Text( text = "Account", - color = Color.White, + color = currentColors.oppTextPrimary, style = EateryBlueTypography.h2 ) } @@ -216,6 +225,7 @@ fun AccountPage( Text( text = "Meal Plan", style = EateryBlueTypography.h4, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 16.dp) ) AccountBalanceRow( @@ -228,7 +238,7 @@ fun AccountPage( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.accentPrimary, CircleShape) ) AccountBalanceRow( accountName = "Big Red Bucks", @@ -240,7 +250,7 @@ fun AccountPage( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.accentPrimary, CircleShape) ) AccountBalanceRow( accountName = "City Bucks", @@ -252,7 +262,7 @@ fun AccountPage( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.accentPrimary, CircleShape) ) AccountBalanceRow( accountName = "Laundry", @@ -269,15 +279,12 @@ fun AccountPage( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(GrayZero) + .background(currentColors.accentPrimary) ) } stickyHeader { - Column( - modifier = Modifier - .background(color = Color.White) - ) { + Row( modifier = Modifier.padding(top = 12.dp, start = 16.dp, end = 16.dp), verticalAlignment = Alignment.CenterVertically @@ -294,6 +301,7 @@ fun AccountPage( else -> "Account Type" }, style = EateryBlueTypography.h4, + color = currentColors.textPrimary ) } @@ -306,47 +314,53 @@ fun AccountPage( }, modifier = Modifier .padding(start = 8.dp, top = 8.dp, bottom = 8.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { Icon( imageVector = Icons.Default.KeyboardArrowDown, contentDescription = "Change Account Type", modifier = Modifier - .size(26.dp) + .size(26.dp), + tint = currentColors.accentPrimary ) } } SearchBar( searchText = filterText, onSearchTextChange = { filterText = it }, - modifier = Modifier.padding(bottom = 12.dp, start = 16.dp, end = 16.dp), + modifier = Modifier + .padding(bottom = 12.dp, start = 16.dp, end = 16.dp), placeholderText = "Search for transactions...", onCancelClicked = { filterText = "" - } + }, + ) Spacer( modifier = Modifier .fillMaxWidth() .height(1.dp) + .background(currentColors.accentPrimary, CircleShape) .padding(horizontal = 16.dp) - .background(GrayZero, CircleShape) + ) Text( text = "Past 30 Days", modifier = Modifier.padding(vertical = 12.dp, horizontal = 16.dp), - style = EateryBlueTypography.h5 + style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) Spacer( modifier = Modifier .fillMaxWidth() .height(1.dp) + .background(currentColors.accentPrimary, CircleShape) .padding(horizontal = 16.dp) - .background(GrayZero, CircleShape) + ) - } + } items( getTransactionsOfType( @@ -365,30 +379,27 @@ fun AccountPage( verticalAlignment = Alignment.CenterVertically ) { Column(modifier = Modifier.weight(1f)) { - Text(text = "${it.location}", style = EateryBlueTypography.button) + Text(text = "${it.location}", + style = EateryBlueTypography.button, + color = currentColors.textPrimary) Text( text = outputFormatter.format(dateTime), - style = EateryBlueTypography.subtitle2 + style = EateryBlueTypography.subtitle2, + color = currentColors.textSecondary ) } - var amtColor by remember { mutableStateOf(Color.Unspecified) } - var amtString by remember { mutableStateOf("$0.00") } + val (amtString, amtColor) = when { it.transactionType == 3 -> { - amtString = "+$%.2f".format(it.amount) - amtColor = - Color(LocalContext.current.resources.getColor(R.color.green)) + "+$%.2f".format(it.amount) to currentColors.success } it.amount?.toInt() == 0 -> { - amtString = "$0.00" - amtColor = Color.Black + "$0.00" to currentColors.textPrimary } else -> { - amtString = "-$%.2f".format(it.amount) - amtColor = - Color(LocalContext.current.resources.getColor(R.color.red)) + "-$%.2f".format(it.amount) to currentColors.error } } Text( @@ -404,7 +415,7 @@ fun AccountPage( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.accentPrimary, CircleShape) ) } } @@ -422,13 +433,15 @@ fun AccountBalanceRow( checkMealPlan: () -> Account? ) { Row( - modifier = Modifier.height(50.dp), + modifier = Modifier.height(50.dp) + .background(currentColors.backgroundDefault), verticalAlignment = Alignment.CenterVertically ) { Text( modifier = Modifier.weight(1f), text = accountName, style = EateryBlueTypography.button, + color = currentColors.textPrimary ) Text( modifier = Modifier.weight(1f), @@ -443,6 +456,7 @@ fun AccountBalanceRow( ) + " remaining" }, style = EateryBlueTypography.button, + color = currentColors.textPrimary ) } } @@ -458,7 +472,9 @@ fun AccountTypesAvailable( var selected by remember { mutableStateOf(accountFilter) } Column( modifier = Modifier + .background(currentColors.backgroundDefault) .padding(vertical = 24.dp) + ) { Row( modifier = Modifier @@ -469,7 +485,8 @@ fun AccountTypesAvailable( Text( text = "Payment Methods", style = EateryBlueTypography.h4, - modifier = Modifier.padding(bottom = 12.dp) + modifier = Modifier.padding(bottom = 12.dp), + color = currentColors.textPrimary ) IconButton( @@ -478,12 +495,13 @@ fun AccountTypesAvailable( }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { - Icon(Icons.Default.Close, contentDescription = "Close", tint = Color.Black) + Icon(Icons.Default.Close, contentDescription = "Close", tint = currentColors.textPrimary) } } - Column { + Column( modifier = Modifier.background(currentColors.backgroundDefault)) + { selectedPaymentMethod.forEachIndexed { index, account -> val select = when (selected) { account -> true @@ -499,7 +517,7 @@ fun AccountTypesAvailable( ), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween) { - Text( + Text(color = currentColors.textPrimary, text = when (account.name) { "MEALSWIPES" -> "Meal Swipes" "BRBS" -> "Big Red Bucks" @@ -530,7 +548,7 @@ fun AccountTypesAvailable( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) .padding(horizontal = 16.dp) ) } @@ -547,15 +565,15 @@ fun AccountTypesAvailable( shape = RoundedCornerShape(100), colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, - contentColor = Color.White + backgroundColor = currentColors.accentPrimary, + contentColor = currentColors.textPrimary ) ) { Text( modifier = Modifier.padding(vertical = 6.dp), text = "Show transactions", style = EateryBlueTypography.h5, - color = Color.White + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt index 754e8e14..d698083d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt @@ -46,11 +46,8 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.zIndex import com.cornellappdev.android.eatery.BuildConfig import com.cornellappdev.android.eatery.R -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GraySix -import com.cornellappdev.android.eatery.ui.theme.GrayThree -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.EateryPreview import com.valentinilk.shimmer.ShimmerBounds import com.valentinilk.shimmer.rememberShimmer @@ -155,7 +152,7 @@ private fun LoginPageMainLayer( } Text( text = "Log into Eatery", - color = EateryBlue, + color = currentColors.textPrimary, style = EateryBlueTypography.h3 ) val shimmer = rememberShimmer(ShimmerBounds.View) @@ -169,7 +166,7 @@ private fun LoginPageMainLayer( Text( text = "Log in with your Cornell NetID to see your account balance and history", style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = GraySix, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 7.dp) ) @@ -198,13 +195,13 @@ private fun LoginPageMainLayer( onLoginPressed() }, colors = ButtonDefaults.buttonColors( - backgroundColor = if (clickable) EateryBlue else GrayZero + backgroundColor = if (clickable) currentColors.backgroundSecondary else currentColors.backgroundDefault ), elevation = ButtonDefaults.elevation(defaultElevation = 0.dp) ) { Text( text = if (loading) "Logging in..." else "Log in", - color = if (clickable) Color.White else GrayThree, + color = if (clickable) currentColors.backgroundDefault else currentColors.backgroundDefault10, style = EateryBlueTypography.h5 ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt index afd35539..55e2f186 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun FavoriteItemRow( @@ -58,7 +58,7 @@ fun FavoriteItemRow( text = "Today", fontSize = 10.sp, style = EateryBlueTypography.body1, - color = Color.DarkGray + color = currentColors.textSecondary ) } Row { @@ -70,14 +70,14 @@ fun FavoriteItemRow( modifier = Modifier .size(24.dp) .background( - color = GrayZero, + color = currentColors.backgroundDefault, shape = CircleShape ) ) { Icon( Icons.Default.ArrowForward, contentDescription = "", - tint = Color.Black + tint = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/IconSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/IconSheet.kt index a9fbe7c5..72f7f336 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/IconSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/IconSheet.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.LightBlue +import com.cornellappdev.android.eatery.ui.theme.currentColors import kotlin.math.absoluteValue @Composable @@ -54,7 +54,7 @@ fun IconSheet( translationX = offsetLerp }, - tint = LightBlue + tint = currentColors.accentPrimary ) // Only adds spacers after the Icons up to the last Icon diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt index 6f5706e5..898df01f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.zIndex import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.User import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.google.accompanist.navigation.animation.rememberAnimatedNavController import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPager @@ -157,7 +158,7 @@ fun OnboardingCarousel( onClick = { onProceed() }, - colors = ButtonDefaults.buttonColors(backgroundColor = Color.White), + colors = ButtonDefaults.buttonColors(backgroundColor = currentColors.backgroundDefault), elevation = ButtonDefaults.elevation( defaultElevation = 4.dp, pressedElevation = 4.dp, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt index f6167397..1aea7ada 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt @@ -18,9 +18,8 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GraySix +import com.cornellappdev.android.eatery.ui.theme.currentColors import kotlin.math.absoluteValue import kotlin.math.pow @@ -56,7 +55,7 @@ fun OnboardingHeader( else -> "Log in with Eatery" }, style = EateryBlueTypography.h3, - color = EateryBlue, + color = currentColors.textPrimary, modifier = Modifier.padding(start = 16.dp) ) @@ -72,7 +71,7 @@ fun OnboardingHeader( Text( text = "Skip", modifier = Modifier.offset(x = 0.dp, y = (-7).dp), - color = Color.Black, + color = currentColors.textPrimary, style = EateryBlueTypography.h6, ) } @@ -89,7 +88,7 @@ fun OnboardingHeader( else -> "See your meal swipes, BRBs, and more" }, style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = GraySix, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 7.dp, start = 16.dp) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt index a2e7cae2..faa550de 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt @@ -43,10 +43,8 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayOne -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.AppIcon import com.cornellappdev.android.eatery.util.changeIcon import com.cornellappdev.android.eatery.util.currentIcon @@ -69,7 +67,7 @@ fun AppIconBottomSheet(hide: () -> Unit) { Text( text = "App Icon", style = EateryBlueTypography.h4, - color = Color.Black, + color = currentColors.textPrimary, ) IconButton( @@ -78,9 +76,9 @@ fun AppIconBottomSheet(hide: () -> Unit) { }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { - Icon(Icons.Default.Close, contentDescription = "Close", tint = Color.Black) + Icon(Icons.Default.Close, contentDescription = "Close", tint = currentColors.textPrimary) } } val pagerState = androidx.compose.foundation.pager.rememberPagerState() @@ -142,8 +140,8 @@ fun AppIconBottomSheet(hide: () -> Unit) { .padding(top = 12.dp) .fillMaxWidth(), colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, - contentColor = Color.White + backgroundColor = currentColors.accentPrimary, + contentColor = currentColors.backgroundDefault ) ) { Text( @@ -166,7 +164,7 @@ fun AppIconBottomSheet(hide: () -> Unit) { Text( text = "Reset", style = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.SemiBold), - color = if (selectedAppIcon != currentIcon) Color.Black else GrayOne + color = if (selectedAppIcon != currentIcon) currentColors.textPrimary else currentColors.backgroundSecondary ) } } @@ -183,7 +181,7 @@ fun AppIconButton( Surface( modifier = Modifier .padding(start = 18.dp, bottom = 12.dp) - .border(1.dp, GrayOne, shape = RoundedCornerShape(25.dp)) + .border(1.dp, currentColors.backgroundSecondary, shape = RoundedCornerShape(25.dp)) .shadow(1.dp, RoundedCornerShape(25.dp), clip = true) ) { Box { @@ -207,7 +205,7 @@ fun AppIconButton( .align(Alignment.Center), imageVector = Icons.Filled.CheckCircle, contentDescription = null, - tint = EateryBlue + tint = currentColors.backgroundSecondary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt index c0860050..623577a4 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt @@ -50,11 +50,8 @@ import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayOne -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import kotlinx.coroutines.launch enum class Issue(val option: String) { @@ -96,7 +93,7 @@ fun ReportBottomSheet( Column { Row(modifier = Modifier.padding(top = 12.dp)) { Spacer(Modifier.weight(1f, true)) - Divider(Modifier.weight(0.75f, true), color = GrayOne, thickness = 3.dp) + Divider(Modifier.weight(0.75f, true), color = currentColors.backgroundSecondary, thickness = 3.dp) Spacer(Modifier.weight(1f, true)) } @@ -111,7 +108,7 @@ fun ReportBottomSheet( Column { Row(modifier = Modifier.statusBarsPadding()) { Spacer(Modifier.weight(1f, true)) - Divider(Modifier.weight(0.75f, true), color = GrayOne, thickness = 3.dp) + Divider(Modifier.weight(0.75f, true), color = currentColors.backgroundSecondary, thickness = 3.dp) Spacer(Modifier.weight(1f, true)) } @@ -125,7 +122,7 @@ fun ReportBottomSheet( Text( text = "Report an Issue", style = EateryBlueTypography.h4, - color = Color.Black, + color = currentColors.textPrimary, ) IconButton( @@ -134,19 +131,19 @@ fun ReportBottomSheet( }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { Icon( Icons.Default.Close, contentDescription = Icons.Default.Close.name, - tint = Color.Black + tint = currentColors.textPrimary ) } } Text( text = "Type of issue", style = EateryBlueTypography.h5, - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 15.dp) ) Button( @@ -161,8 +158,8 @@ fun ReportBottomSheet( } }, colors = ButtonDefaults.buttonColors( - backgroundColor = GrayZero, - contentColor = Color.Black + backgroundColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary ) ) { Row( @@ -173,7 +170,7 @@ fun ReportBottomSheet( Text( text = selectedIssue?.option ?: "Choose an option...", style = EateryBlueTypography.h6, - color = if (selectedIssue == null) GrayFive else Color.Black + color = if (selectedIssue == null) currentColors.textSecondary else currentColors.textPrimary ) Icon( imageVector = Icons.Default.ExpandMore, @@ -185,7 +182,7 @@ fun ReportBottomSheet( Text( text = "Description", style = EateryBlueTypography.h5, - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 15.dp, bottom = 5.dp) ) @@ -203,7 +200,7 @@ fun ReportBottomSheet( keyboardActions = KeyboardActions(onDone = { onSubmit() }), interactionSource = interactionSource, textStyle = TextStyle( - color = Color.Black, + color = currentColors.textPrimary, fontWeight = FontWeight.Medium, fontSize = 16.sp ), @@ -212,7 +209,7 @@ fun ReportBottomSheet( autoCorrect = false, ), ) { innerTextField -> - Surface(shape = RoundedCornerShape(8.dp), color = GrayZero) { + Surface(shape = RoundedCornerShape(8.dp), color = currentColors.backgroundDefault) { TextFieldDefaults.TextFieldDecorationBox( value = textEntry, innerTextField = innerTextField, @@ -223,7 +220,7 @@ fun ReportBottomSheet( Text( text = "Tell us what's wrong...", style = EateryBlueTypography.h6, - color = GrayFive + color = currentColors.textSecondary ) }, colors = TextFieldDefaults.textFieldColors( @@ -253,10 +250,10 @@ fun ReportBottomSheet( }, enabled = textEntry.isNotEmpty() && selectedIssue != null && !isSending, colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, - contentColor = Color.White, - disabledBackgroundColor = GrayOne, - disabledContentColor = Color.White + backgroundColor = currentColors.accentPrimary, + contentColor = currentColors.backgroundDefault, + disabledBackgroundColor = currentColors.backgroundSecondary, + disabledContentColor = currentColors.backgroundDefault ) ) { Row( @@ -267,11 +264,11 @@ fun ReportBottomSheet( Text( text = "Submit", style = EateryBlueTypography.h5, - color = Color.White + color = currentColors.backgroundDefault ) else CircularProgressIndicator( - color = Color.White, + color = currentColors.backgroundDefault, modifier = Modifier.size(30.dp) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SettingsOption.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SettingsOption.kt index 2e269487..6abeffab 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SettingsOption.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SettingsOption.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.components.settings +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Column @@ -22,8 +23,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayOne +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun SettingsOption( @@ -36,6 +36,7 @@ fun SettingsOption( val interactionSource = remember { MutableInteractionSource() } Row( modifier = Modifier + .background(color = currentColors.backgroundDefault) .fillMaxWidth() .height(80.dp) .clickable( @@ -58,12 +59,13 @@ fun SettingsOption( Text( text = title, style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) if (!description.isNullOrEmpty()) Text( text = description, style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), - color = GrayFive, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 2.dp) ) } @@ -77,5 +79,5 @@ fun SettingsOption( @Composable fun SettingsLineSeparator() { - Divider(color = GrayOne, modifier = Modifier.fillMaxWidth(), thickness = 1.dp) + Divider(color = currentColors.accentPrimary, modifier = Modifier.fillMaxWidth(), thickness = 1.dp) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt index 68162cb0..c84e0be6 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt @@ -14,8 +14,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.ui.theme.EateryBlue -import com.cornellappdev.android.eatery.ui.theme.GrayOne +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun SwitchOption( @@ -41,10 +40,10 @@ fun SwitchOption( }, enabled = enabled, colors = SwitchDefaults.colors( - checkedThumbColor = Color.White, - uncheckedThumbColor = Color.White, - checkedTrackColor = EateryBlue, - uncheckedTrackColor = GrayOne, + checkedThumbColor = currentColors.backgroundDefault, + uncheckedThumbColor = currentColors.backgroundDefault, + checkedTrackColor = currentColors.accentPrimary, + uncheckedTrackColor = currentColors.backgroundSecondary, checkedBorderColor = Color.Transparent, uncheckedBorderColor = Color.Transparent, ), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt index 9493b1ae..937e0ca7 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt @@ -35,9 +35,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.components.general.MealFilter -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors /** * The pop up that shows up when users want to pick a different meal as the filter in the upcoming @@ -74,9 +73,9 @@ fun MealBottomSheet( }, modifier = Modifier .size(40.dp) - .background(color = GrayZero, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { - Icon(Icons.Default.Close, contentDescription = "Close", tint = Color.Black) + Icon(Icons.Default.Close, contentDescription = "Close", tint = currentColors.textPrimary) } } @@ -130,7 +129,7 @@ fun MealBottomSheet( .padding(start = 12.dp, end = 16.dp) .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) ) Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier @@ -180,7 +179,7 @@ fun MealBottomSheet( .padding(start = 12.dp, end = 16.dp) .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) ) Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier @@ -228,7 +227,7 @@ fun MealBottomSheet( .padding(start = 12.dp, end = 16.dp) .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) ) Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier @@ -281,8 +280,8 @@ fun MealBottomSheet( .padding(top = 10.dp, start = 16.dp, end = 16.dp) .fillMaxWidth(), colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, - contentColor = Color.White + backgroundColor = currentColors.accentPrimary, + contentColor = currentColors.backgroundDefault ) ) { Text( @@ -304,7 +303,7 @@ fun MealBottomSheet( Text( text = "Reset", style = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.SemiBold), - color = Color.Black + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt index 7c30fc87..949055f3 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt @@ -41,8 +41,7 @@ import com.cornellappdev.android.eatery.ui.components.general.FavoriteIcon import com.cornellappdev.android.eatery.ui.components.general.MenuCategoryViewState import com.cornellappdev.android.eatery.ui.components.general.MenuItemViewState import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors data class MenuCardViewState( @@ -73,7 +72,7 @@ fun MenuCard( Card( elevation = 5.dp, shape = RoundedCornerShape(10.dp), - backgroundColor = Color.White, + backgroundColor = currentColors.accentPrimary, modifier = Modifier.clickable { openDropdown = !openDropdown if (!openDropdown) { @@ -86,11 +85,12 @@ fun MenuCard( Text( text = menuCardViewState.name, style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) Icon( imageVector = if (!openDropdown) Icons.Default.ExpandMore else Icons.Default.ExpandLess, contentDescription = "Expand menu", - tint = Color.Black, + tint = currentColors.textPrimary, modifier = Modifier .padding(top = 10.dp, end = 20.dp) .size(24.dp) @@ -107,7 +107,7 @@ fun MenuCard( Text( text = " • ", style = EateryBlueTypography.subtitle2, - color = GrayFive + color = currentColors.textSecondary ) } eateryHours?.let { @@ -117,7 +117,7 @@ fun MenuCard( ), text = "${it.startTime} - ${it.endTime}", style = EateryBlueTypography.subtitle2, - color = GrayFive + color = currentColors.textSecondary ) } } @@ -133,7 +133,7 @@ fun MenuCard( .padding(end = 12.dp, bottom = 8.dp) .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(currentColors.backgroundDefault, CircleShape) ) Box(modifier = Modifier.padding(end = 12.dp)) { EateryDetails( @@ -160,7 +160,7 @@ private fun EateryDetails( onClick = { selectEatery() }, - backgroundColor = GrayZero, + backgroundColor = currentColors.backgroundDefault, modifier = Modifier .fillMaxWidth() .padding(top = 8.dp, bottom = 8.dp) @@ -177,11 +177,11 @@ private fun EateryDetails( Icon( painter = painterResource(R.drawable.ic_eatery), contentDescription = null, - tint = Color.Black + tint = currentColors.textPrimary ) Text( text = "View Eatery Details", - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding(start = 8.dp), fontWeight = FontWeight.Bold ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt index d9ced242..93a4b8bd 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt @@ -23,8 +23,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayThree -import com.cornellappdev.android.eatery.ui.theme.GrayTwo +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.valentinilk.shimmer.Shimmer import com.valentinilk.shimmer.shimmer @@ -41,7 +40,7 @@ fun EateryBlob2( defaultElevation = 10.dp ), colors = CardDefaults.cardColors( - containerColor = Color.White + containerColor = currentColors.backgroundDefault ) ) { Column( @@ -58,7 +57,7 @@ fun EateryBlob2( ) .height(22.dp) .width(200.dp), - color = GrayTwo + color = currentColors.backgroundDefault92 ) { } Surface( @@ -71,7 +70,7 @@ fun EateryBlob2( ) .height(18.dp) .width(140.dp), - color = GrayTwo + color = currentColors.backgroundDefault92 ) { } } @@ -102,7 +101,7 @@ sealed class UpcomingLoadingItem { modifier = Modifier .shimmer(shimmer) .padding(top = 12.dp, bottom = 12.dp, start = 16.dp), - color = GrayThree + color = currentColors.backgroundDefault10 ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index 5a771cd3..7c4ca8bb 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -8,6 +8,7 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.animation.with +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.padding import androidx.compose.material.BottomNavigationItem import androidx.compose.material.Icon @@ -15,6 +16,7 @@ import androidx.compose.material.Scaffold import androidx.compose.material3.NavigationBar import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -47,9 +49,11 @@ import com.cornellappdev.android.eatery.ui.screens.ProfileScreen import com.cornellappdev.android.eatery.ui.screens.SearchScreen import com.cornellappdev.android.eatery.ui.screens.SettingsScreen import com.cornellappdev.android.eatery.ui.screens.SupportScreen +import com.cornellappdev.android.eatery.ui.screens.ThemeSheet import com.cornellappdev.android.eatery.ui.screens.UpcomingMenuScreen -import com.cornellappdev.android.eatery.ui.theme.EateryBlue +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.LoginViewModel +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import com.google.accompanist.navigation.animation.AnimatedNavHost import com.google.accompanist.navigation.animation.composable import com.google.accompanist.navigation.animation.rememberAnimatedNavController @@ -130,18 +134,31 @@ fun NavigationSetup(hasOnboarded: Boolean) { } @Composable -fun BottomNavigationBar(navController: NavHostController, tabItems: List) { +fun BottomNavigationBar(navController: NavHostController, + tabItems: List, + themeViewModel : ThemeViewModel = hiltViewModel()) { NavigationBar( - containerColor = Color.White, - contentColor = EateryBlue + containerColor = currentColors.accentPrimary, + contentColor = currentColors.accentPressed ) { + val isDarkMode by themeViewModel.isDarkMode.collectAsState() + val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() + val currentRoute = currentRoute(navController) tabItems.forEach { item -> + val isSelected = item.selectedRoutes.contains(currentRoute) + val iconId = when { + resolvedDarkMode && isSelected -> item.selectedDarkIconId + !resolvedDarkMode && isSelected -> item.selectedIconId + + else -> item.unselectedIconId + } BottomNavigationItem( + icon = { Icon( painter = painterResource( - id = if (item.selectedRoutes.contains(currentRoute)) item.selectedIconId else item.unselectedIconId + id = iconId ), contentDescription = item.route ) @@ -166,6 +183,7 @@ fun SetupNavHost( navController: NavHostController, showBottomBar: MutableState, loginViewModel: LoginViewModel = hiltViewModel(), + themeViewModel : ThemeViewModel = hiltViewModel() ) { AppStoreRatingPopup(navigateToSupport = { navController.navigate(Routes.SUPPORT.route) }) @@ -349,7 +367,8 @@ fun SetupNavHost( } } ), - loginViewModel = loginViewModel + loginViewModel = loginViewModel, + themeViewModel = themeViewModel ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt index 0bf14940..d950df24 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt @@ -1,6 +1,8 @@ package com.cornellappdev.android.eatery.ui.navigation +import androidx.hilt.navigation.compose.hiltViewModel import com.cornellappdev.android.eatery.R +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel /** * Class to represent each tab. @@ -14,12 +16,15 @@ sealed class NavigationItem( val route: String, val unselectedIconId: Int, val selectedIconId: Int, - val selectedRoutes: Set + val selectedDarkIconId: Int, + val selectedRoutes: Set, ) { + object Home : NavigationItem( route = Routes.HOME.route, unselectedIconId = R.drawable.ic_home_unselected, selectedIconId = R.drawable.ic_home_selected, + selectedDarkIconId = R.drawable.ic_home_selected_dark, selectedRoutes = setOf( Routes.HOME.route, Routes.SEARCH.route, @@ -31,6 +36,7 @@ sealed class NavigationItem( route = Routes.UPCOMING.route, unselectedIconId = R.drawable.ic_calendar_unselected, selectedIconId = R.drawable.ic_calendar_selected, + selectedDarkIconId = R.drawable.ic_calendar_selected_dark, selectedRoutes = setOf( Routes.UPCOMING.route ) @@ -40,6 +46,7 @@ sealed class NavigationItem( route = "${Routes.PROFILE.route}/true", unselectedIconId = R.drawable.ic_profile_unselected, selectedIconId = R.drawable.ic_profile_selected, + selectedDarkIconId = R.drawable.ic_profile_selected_dark, selectedRoutes = setOf( "${Routes.PROFILE.route}/{autoLogin}", Routes.ACCOUNT.route, @@ -48,7 +55,8 @@ sealed class NavigationItem( Routes.FAVORITES.route, Routes.LEGAL.route, Routes.PRIVACY.route, - Routes.SUPPORT.route + Routes.SUPPORT.route, + Routes.THEME.route ) ) @@ -91,5 +99,6 @@ enum class Routes(override var route: String) : NavUnit { LEGAL("legal"), PRIVACY("privacy"), SUPPORT("support"), - COMPAREMENUS("compare_menus") + COMPAREMENUS("compare_menus"), + THEME("theme") } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt index 87f90bdd..7dd35d48 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt @@ -47,16 +47,16 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R -import com.cornellappdev.android.eatery.ui.theme.EateryBlue + import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayOne -import com.cornellappdev.android.eatery.ui.theme.GraySix + +import com.cornellappdev.android.eatery.ui.theme.currentColors import kotlinx.coroutines.launch @Composable fun AboutScreen() { val uriCurrent = LocalUriHandler.current + val colors = currentColors Column(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier @@ -65,13 +65,13 @@ fun AboutScreen() { ) { Text( text = "About Eatery", - color = EateryBlue, + color = colors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) Text( text = "Learn more about Cornell AppDev", - color = GraySix, + color = colors.textSecondary, style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), modifier = Modifier.padding(top = 7.dp, bottom = 24.dp) ) @@ -85,7 +85,7 @@ fun AboutScreen() { Icon( painter = painterResource(id = R.drawable.ic_appdev), contentDescription = null, - tint = GrayFive, + tint = colors.textSecondary, modifier = Modifier .height(24.dp) .width(24.dp) @@ -94,7 +94,7 @@ fun AboutScreen() { Text( text = "DESIGNED AND DEVELOPED BY", style = EateryBlueTypography.subtitle1, - color = GrayFive, + color = colors.textSecondary, modifier = Modifier.padding(top = 12.dp) ) @@ -107,12 +107,12 @@ fun AboutScreen() { Text( text = "Cornell", style = EateryBlueTypography.h2, - color = Color.Black, + color = colors.textPrimary, ) Text( text = "AppDev", style = EateryBlueTypography.h2, - color = Color.Black, + color = colors.textPrimary, ) } } @@ -138,17 +138,18 @@ fun AboutScreen() { uriCurrent.openUri("https://www.cornellappdev.com/") }, colors = ButtonDefaults.buttonColors( - backgroundColor = GrayOne, - contentColor = Color.Black + backgroundColor = colors.backgroundSecondary, + contentColor = colors.textPrimary ) ) { - Icon(Icons.Default.Language, null) + Icon(Icons.Default.Language, contentDescription = null, tint = colors.textPrimary) Spacer( Modifier.size(ButtonDefaults.IconSpacing) ) Text( text = "Visit our website", style = EateryBlueTypography.h5, + color = colors.textPrimary, modifier = Modifier.padding(start = 8.dp) ) } @@ -248,6 +249,7 @@ private val teamRosterMap: HashMap> = hashMapOf( @Composable fun CreditsRow(position: TeamPosition) { // First item in the row is the position, e.g. Android Developer, Pod Leads. + val colors = currentColors val lazyRowList = mutableListOf(position) val names: List = teamRosterMap[position]!! names.forEach { name -> lazyRowList.add(name) } @@ -291,7 +293,7 @@ fun CreditsRow(position: TeamPosition) { Text( text = teamNameMap[item]!!, style = EateryBlueTypography.button, - color = Color.Black, + color = colors.textPrimary, modifier = Modifier.padding(start = 15.dp) ) } else { @@ -299,12 +301,12 @@ fun CreditsRow(position: TeamPosition) { modifier = Modifier .height(34.dp) .clip(RoundedCornerShape(17.dp)) - .background(GrayOne) + .background(colors.backgroundSecondary) ) { Text( text = item as String, style = EateryBlueTypography.button, - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding( start = 10.dp, top = 8.dp, @@ -318,7 +320,7 @@ fun CreditsRow(position: TeamPosition) { Icon( Icons.Filled.Star, contentDescription = null, - tint = GrayOne, + tint = colors.backgroundSecondary, modifier = Modifier .height(7.dp) .padding(start = 12.33.dp, end = 12.33.dp) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt index 9fe4aa7d..3c891884 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt @@ -72,11 +72,7 @@ import com.cornellappdev.android.eatery.ui.components.home.BottomSheetContent import com.cornellappdev.android.eatery.ui.components.settings.Issue import com.cornellappdev.android.eatery.ui.components.settings.ReportBottomSheet import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayZero -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Red -import com.cornellappdev.android.eatery.ui.theme.Yellow +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.CompareMenusViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -89,6 +85,7 @@ fun CompareMenusScreen( compareMenusViewModel: CompareMenusViewModel = hiltViewModel(), onEateryClick: (eatery: Eatery) -> Unit, ) { + val colors = currentColors compareMenusViewModel.openEatery(eateryIds) val eateries by compareMenusViewModel.eateryFlow.collectAsState() @@ -118,7 +115,7 @@ fun CompareMenusScreen( ) } Divider( - color = GrayZero, + color = colors.backgroundDefault, modifier = Modifier .fillMaxWidth() .height(1.dp) @@ -226,6 +223,7 @@ private fun MenuPager( modalBottomSheetState: ModalBottomSheetState, onEateryClick: (eatery: Eatery) -> Unit ) { + val colors = currentColors var sheetContent1 = sheetContent HorizontalPager( pageCount = eateries.size, @@ -257,7 +255,7 @@ private fun MenuPager( bottom = 12.dp ) .border( - 1.dp, GrayZero, RoundedCornerShape(8.dp) + 1.dp, colors.backgroundDefault, RoundedCornerShape(8.dp) ), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically @@ -281,14 +279,14 @@ private fun MenuPager( Icon( imageVector = Icons.Outlined.Schedule, contentDescription = "Hours Icon", - tint = GrayFive + tint = colors.textSecondary ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( text = "Hours", style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 16.sp - ), color = GrayFive + ), color = colors.textSecondary ) } val openUntil = eateries[page].getOpenUntil() @@ -302,9 +300,9 @@ private fun MenuPager( fontWeight = FontWeight.SemiBold, fontSize = 16.sp ), - color = if (openUntil == null) Red - else if (eateries[page].isClosingSoon()) Yellow - else Green + color = if (openUntil == null) colors.error + else if (eateries[page].isClosingSoon()) colors.accentPressed + else colors.success ) } @@ -329,7 +327,7 @@ private fun MenuPager( if (currentEvent != null) { Box( modifier = Modifier - .background(GrayZero) + .background(colors.backgroundDefault) .padding( start = 8.dp, end = 8.dp, @@ -342,7 +340,7 @@ private fun MenuPager( state = listState, modifier = Modifier .fillMaxSize() - .background(Color.White) + .background(currentColors.backgroundDefault) ) { currentEvent.menu?.forEach { category -> item { @@ -381,12 +379,12 @@ private fun MenuPager( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(colors.backgroundDefault, CircleShape) ) } if (category.items?.lastIndex == index) { Divider( - color = GrayZero, + color = colors.backgroundDefault, modifier = Modifier.height(10.dp) ) } @@ -396,7 +394,7 @@ private fun MenuPager( item { Row( modifier = Modifier - .background(Color.White) + .background(colors.backgroundSurface) .clip( shape = RoundedCornerShape( 12.dp @@ -411,14 +409,14 @@ private fun MenuPager( ) { Text( text = "Sorry, there is no menu available now.", - color = Color.Black, + color = colors.textPrimary, style = EateryBlueTypography.h5, modifier = Modifier.padding(start = 8.dp), fontWeight = FontWeight(500), ) } Divider( - color = GrayZero, + color = colors.backgroundDefault, modifier = Modifier .fillMaxWidth() .height(10.dp) @@ -426,13 +424,13 @@ private fun MenuPager( } } item { - Column(modifier = Modifier.background(Color.White)) { + Column(modifier = Modifier.background(currentColors.backgroundDefault)) { Card( shape = RoundedCornerShape(20.dp), onClick = { onEateryClick(eateries[page]) }, - colors = CardDefaults.cardColors(containerColor = GrayZero), + colors = CardDefaults.cardColors(containerColor = colors.backgroundDefault), modifier = Modifier .fillMaxWidth() .padding( @@ -453,11 +451,11 @@ private fun MenuPager( Icon( painter = painterResource(R.drawable.ic_eatery), contentDescription = null, - tint = Color.Black + tint = colors.textPrimary ) Text( text = "View Eatery Details", - color = Color.Black, + color = colors.textPrimary, modifier = Modifier.padding( start = 8.dp, ), @@ -485,12 +483,13 @@ private fun TitlePager( eateries: List, secondPagerState: PagerState ) { + val colors = currentColors HorizontalPager( pageCount = eateries.size, state = secondPagerState, modifier = Modifier .fillMaxSize() - .background(GrayZero), + .background(colors.backgroundDefault), contentPadding = PaddingValues(horizontal = 100.dp), pageSpacing = 2.dp, verticalAlignment = Alignment.CenterVertically, @@ -505,7 +504,7 @@ private fun TitlePager( modifier = Modifier .shadow(2.dp, shape = RoundedCornerShape(8.dp)) .clip(shape = RoundedCornerShape(8.dp)) - .background(Color.White) + .background(colors.backgroundDefault) .padding(vertical = 8.dp, horizontal = 16.dp) ) { eateries[page].name?.let { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index e9ca70ea..1351c7aa 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -100,16 +100,9 @@ import com.cornellappdev.android.eatery.ui.components.home.BottomSheetContent import com.cornellappdev.android.eatery.ui.components.home.EateryDetailLoadingScreen import com.cornellappdev.android.eatery.ui.components.settings.Issue import com.cornellappdev.android.eatery.ui.components.settings.ReportBottomSheet -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayOne -import com.cornellappdev.android.eatery.ui.theme.GrayThree -import com.cornellappdev.android.eatery.ui.theme.GrayZero -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Red -import com.cornellappdev.android.eatery.ui.theme.Yellow import com.cornellappdev.android.eatery.ui.theme.colorInterp +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.EateryDetailViewModel import com.cornellappdev.android.eatery.ui.viewmodels.EateryDetailViewState import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse @@ -131,6 +124,7 @@ fun EateryDetailScreen( appStorePopupRepository: AppStorePopupRepository = appStorePopupRepository(), onCompareMenusClick: (selectedEateriesIds: List) -> Unit, ) { + val colors = currentColors val shimmer = rememberShimmer(ShimmerBounds.View) val context = LocalContext.current val modalBottomSheetState = @@ -190,7 +184,7 @@ fun EateryDetailScreen( ) { paddingValues -> Box( modifier = Modifier - .background(Color.White) + .background(currentColors.backgroundDefault) .padding(paddingValues) ) { when (viewState) { @@ -375,8 +369,8 @@ fun EateryDetailScreen( .background( colorInterp( progress, - GrayOne, - GrayThree + colors.backgroundSecondary, + colors.backgroundDefault10 ) ), contentDescription = "", @@ -409,12 +403,12 @@ fun EateryDetailScreen( contentPadding = PaddingValues(6.dp), shape = CircleShape, colors = ButtonDefaults.buttonColors( - backgroundColor = Color.White, + backgroundColor = currentColors.backgroundDefault, ) ) { Icon( imageVector = if (viewState.isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (viewState.isFavorite) Yellow else GrayFive, + tint = if (viewState.isFavorite) colors.accentPressed else colors.textSecondary, contentDescription = null ) } @@ -440,6 +434,7 @@ fun EateryDetailScreen( text = eatery.name ?: "Loading...", modifier = Modifier.padding(start = 16.dp, top = 16.dp), style = EateryBlueTypography.h3, + color = currentColors.textPrimary ) } item { @@ -447,7 +442,7 @@ fun EateryDetailScreen( text = "${eatery.location} ${if (!eatery.menuSummary.isNullOrBlank()) "· ${eatery.menuSummary}" else ""}", modifier = Modifier.padding(start = 16.dp), style = EateryBlueTypography.subtitle2, - color = GrayFive + color = colors.textSecondary ) } item { @@ -480,20 +475,21 @@ fun EateryDetailScreen( }, shape = RoundedCornerShape(100), colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, - contentColor = Color.White + backgroundColor = colors.accentPrimary, + contentColor = currentColors.backgroundDefault ) ) { Icon( painter = painterResource(id = R.drawable.ic_android_phone), - contentDescription = "Phone - Order Online" + contentDescription = "Phone - Order Online", + tint = currentColors.textPrimary ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( modifier = Modifier.padding(vertical = 6.dp), text = "Order online", style = EateryBlueTypography.h5, - color = Color.White + color = currentColors.textPrimary ) } } @@ -512,8 +508,8 @@ fun EateryDetailScreen( .fillMaxWidth() .padding(horizontal = 15.dp), colors = ButtonDefaults.buttonColors( - backgroundColor = GrayZero, - contentColor = Color.Black + backgroundColor = currentColors.accentPrimary, + contentColor = currentColors.textPrimary ) ) { Icon( @@ -542,7 +538,7 @@ fun EateryDetailScreen( .fillMaxWidth() .padding(start = 16.dp, end = 16.dp, bottom = 12.dp) .border( - 1.dp, GrayZero, RoundedCornerShape(8.dp) + 1.dp, colors.accentPrimary, RoundedCornerShape(8.dp) ), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically @@ -560,20 +556,20 @@ fun EateryDetailScreen( } ) { Row( - modifier = Modifier, + modifier = Modifier.border(1.dp, color = currentColors.accentPrimary), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = Icons.Outlined.Schedule, contentDescription = "Hours Icon", - tint = GrayFive + tint = colors.textSecondary ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( text = "Hours", style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 16.sp - ), color = GrayFive + ), color = colors.textSecondary ) } val openUntil = eatery.getOpenUntil() @@ -587,15 +583,15 @@ fun EateryDetailScreen( fontWeight = FontWeight.SemiBold, fontSize = 16.sp ), - color = if (openUntil == null) Red - else if (eatery.isClosingSoon()) Yellow - else Green + color = if (openUntil == null) colors.error + else if (eatery.isClosingSoon()) colors.accentPressed + else colors.success ) } Divider( - color = GrayZero, + color = colors.accentPrimary, modifier = Modifier .align(Alignment.CenterVertically) .fillMaxHeight(0.5f) @@ -622,7 +618,7 @@ fun EateryDetailScreen( // Icon( // imageVector = Icons.Default.HourglassTop, // contentDescription = "Watch Icon", -// tint = GrayFive +// tint = colors.textSecondary // ) // Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) // Text( @@ -631,7 +627,7 @@ fun EateryDetailScreen( // fontWeight = FontWeight.SemiBold, // fontSize = 16.sp // ), -// color = GrayFive +// color = colors.textSecondary // ) // } // @@ -647,7 +643,7 @@ fun EateryDetailScreen( // fontWeight = FontWeight.SemiBold, // fontSize = 16.sp // ), -// color = Color.Black, +// color = currentColors.textPrimary, // ) // // @@ -661,7 +657,7 @@ fun EateryDetailScreen( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(GrayZero) + .background(colors.accentPrimary) ) } nextEvent.menu?.let { @@ -696,7 +692,7 @@ fun EateryDetailScreen( ) .fillMaxWidth() .height(1.dp) - .background(GrayZero, CircleShape) + .background(colors.accentPrimary, CircleShape) ) } eatery.getTypeMeal(viewState.weekdayIndex.fromOffsetToDayOfWeek()) @@ -734,7 +730,7 @@ fun EateryDetailScreen( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(GrayZero) + .background(colors.accentPrimary) ) } } @@ -757,7 +753,7 @@ fun EateryDetailScreen( text = "Help us make this info more accurate by letting us know what's wrong.", style = EateryBlueTypography.body2, modifier = Modifier.padding(bottom = 5.dp), - color = GrayFive + color = colors.textSecondary ) @@ -775,7 +771,7 @@ fun EateryDetailScreen( } }, colors = ButtonDefaults.buttonColors( - backgroundColor = GrayZero, + backgroundColor = colors.backgroundDefault, ) ) { Icon( @@ -786,7 +782,7 @@ fun EateryDetailScreen( Text( text = "Report an Issue", style = EateryBlueTypography.button, - color = Color.Black + color = currentColors.textPrimary ) } @@ -803,7 +799,7 @@ fun EateryDetailScreen( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(GrayZero) + .background(colors.backgroundDefault) ) } } @@ -815,7 +811,7 @@ fun EateryDetailScreen( Column( modifier = Modifier .fillMaxWidth() - .background(Color.White) + .background(currentColors.backgroundDefault) .padding(top = 48.dp, bottom = 12.dp) ) { EateryHeader( @@ -859,7 +855,10 @@ private fun LazyListScope.menuHeadingItem( nextEvent: Event, hoursOnClick: () -> Job ) { + + item { + val colors = currentColors Row( modifier = Modifier.padding( top = 16.dp, @@ -876,6 +875,7 @@ private fun LazyListScope.menuHeadingItem( text = weekDayIndex.fromOffsetToDayOfWeek() .toReadableFullName(), style = EateryBlueTypography.h4, + color= currentColors.textPrimary ) if (nextEvent.startTime != null && nextEvent.endTime != null) { Text( @@ -889,7 +889,7 @@ private fun LazyListScope.menuHeadingItem( ) }", style = EateryBlueTypography.subtitle2, - color = GrayFive + color = colors.textSecondary ) } } @@ -900,6 +900,7 @@ private fun LazyListScope.menuHeadingItem( @Composable fun EateryHeader(eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Unit) { + val colors = currentColors Box( modifier = Modifier .fillMaxWidth() @@ -914,7 +915,7 @@ fun EateryHeader(eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Uni text = eatery.name ?: "Loading...", maxLines = 1, overflow = TextOverflow.Ellipsis, - color = Color.Black, + color = currentColors.textPrimary, style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 20.sp @@ -930,7 +931,7 @@ fun EateryHeader(eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Uni contentPadding = PaddingValues(6.dp), shape = CircleShape, colors = ButtonDefaults.buttonColors( - backgroundColor = Color.White, + backgroundColor = currentColors.backgroundDefault, ), elevation = ButtonDefaults.elevation( defaultElevation = 0.dp, @@ -939,7 +940,7 @@ fun EateryHeader(eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Uni ) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) Yellow else GrayFive, + tint = if (isFavorite) colors.accentPressed else colors.textSecondary, contentDescription = null ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt index dc8c57e8..a0755870 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt @@ -48,9 +48,8 @@ import com.cornellappdev.android.eatery.ui.components.details.ToggleRow import com.cornellappdev.android.eatery.ui.components.general.EateryCard import com.cornellappdev.android.eatery.ui.components.general.Filter import com.cornellappdev.android.eatery.ui.components.general.FilterRow -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayTwo +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.FavoritesScreenViewState import com.cornellappdev.android.eatery.ui.viewmodels.FavoritesViewModel import com.valentinilk.shimmer.ShimmerBounds @@ -64,6 +63,7 @@ fun FavoritesScreen( onSearchClick: () -> Unit, onBackClick: () -> Unit ) { + val colors = currentColors val shimmer = rememberShimmer(ShimmerBounds.View) val favoritesScreenViewState = favoriteViewModel.favoritesScreenViewState.collectAsState().value @@ -99,7 +99,7 @@ fun FavoritesScreen( } Text( text = "Favorites", - color = EateryBlue, + color = colors.backgroundSecondary, style = EateryBlueTypography.h2, modifier = Modifier.padding(start = 6.dp, end = 6.dp) ) @@ -237,6 +237,7 @@ private fun ColumnScope.MainScrollableContent( @Composable private fun EateriesEmptyState(message: String) { + val colors = currentColors Box( modifier = Modifier .fillMaxHeight(0.7f) @@ -253,7 +254,7 @@ private fun EateriesEmptyState(message: String) { modifier = Modifier .height(72.dp) .width(72.dp), - tint = GrayTwo, + tint = colors.backgroundDefault92, ) Text( @@ -262,7 +263,7 @@ private fun EateriesEmptyState(message: String) { fontWeight = FontWeight.Medium, fontSize = 18.sp ), - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 12.dp) ) } @@ -275,6 +276,7 @@ private fun EateryBlob( fillMaxWidth: Boolean = true, height: Dp = 186.dp ) { + val colors = currentColors Surface( modifier = Modifier .padding(end = 12.dp) @@ -286,6 +288,6 @@ private fun EateryBlob( ) .then(if (fillMaxWidth) Modifier.fillMaxWidth() else Modifier.width(295.dp)) .height(height), - color = GrayTwo + color = colors.backgroundDefault92 ) {} } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt index 03ff43f5..d2c9e069 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -90,10 +91,10 @@ import com.cornellappdev.android.eatery.ui.components.home.BottomSheetContent import com.cornellappdev.android.eatery.ui.components.home.EateryHomeSection import com.cornellappdev.android.eatery.ui.components.home.MainLoadingItem import com.cornellappdev.android.eatery.ui.components.home.MainLoadingItem.Companion.CreateMainLoadingItem -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.HomeViewModel +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.LocationHandler @@ -116,9 +117,11 @@ fun HomeScreen( onEateryClick: (eatery: Eatery) -> Unit, onFavoriteExpand: () -> Unit, onCompareMenusClick: (selectedEateriesIds: List) -> Unit, - onNotificationsClick: () -> Unit + onNotificationsClick: () -> Unit, + themeViewModel : ThemeViewModel = hiltViewModel() ) { - val colors = currentColors + val isDarkMode by themeViewModel.isDarkMode.collectAsState() + val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() val context = LocalContext.current val favorites = homeViewModel.favoriteEateries.collectAsState().value val nearestEateries = homeViewModel.eateriesByDistance.collectAsState().value @@ -199,7 +202,7 @@ fun HomeScreen( content = { paddingValues -> Box( modifier = Modifier - .background(colors.backgroundDefault) + .background(currentColors.backgroundDefault) .padding(paddingValues) ) { ModalBottomSheetLayout( @@ -241,7 +244,8 @@ fun HomeScreen( onListClick = { isGridView = false }, onGridClick = { isGridView = true }, onNotificationsClick = onNotificationsClick, - onReload = homeViewModel::pingEateries + onReload = homeViewModel::pingEateries, + isDarkMode = resolvedDarkMode ) } ) @@ -321,7 +325,8 @@ private fun HomeScrollableMainContent( onListClick: () -> Unit, onGridClick: () -> Unit, onNotificationsClick: () -> Unit, - onReload: () -> Unit + onReload: () -> Unit, + isDarkMode : Boolean ) { val listState = rememberLazyListState() val filterRowState = rememberLazyListState() @@ -359,7 +364,8 @@ private fun HomeScrollableMainContent( isGridView, onListClick, onGridClick, - nearestEateries + nearestEateries, + isDarkMode ) } } @@ -458,14 +464,14 @@ fun ErrorContent(onTryAgain: () -> Unit) { painter = painterResource(R.drawable.ic_error), contentDescription = "Error Icon", modifier = Modifier.size(72.dp), - tint = Color.Red + tint = currentColors.error ) Spacer(modifier = Modifier.height(12.dp)) Text( text = "Hmm, no chow here (yet).", fontSize = 20.sp, fontWeight = FontWeight.SemiBold, - color = Color(0xFF1B1F23), + color = currentColors.textPrimary, textAlign = TextAlign.Center ) Spacer(modifier = Modifier.height(4.dp)) @@ -473,7 +479,7 @@ fun ErrorContent(onTryAgain: () -> Unit) { text = "We ran into an issue loading this page. Check your connection or try reloading the page.", fontSize = 18.sp, fontWeight = FontWeight.Normal, - color = Color(0xFF1B1F23), + color = currentColors.textPrimary, textAlign = TextAlign.Center ) Spacer(modifier = Modifier.height(16.dp)) @@ -483,10 +489,10 @@ fun ErrorContent(onTryAgain: () -> Unit) { .width(109.dp) .height(34.dp) .clip(RoundedCornerShape(17.dp)), - colors = ButtonDefaults.buttonColors(containerColor = EateryBlue) + colors = ButtonDefaults.buttonColors(currentColors.accentPrimary) ) { Text( - text = "Try Again", color = Color.White, + text = "Try Again", color = currentColors.textPrimary, fontSize = 14.sp, fontWeight = FontWeight.SemiBold, textAlign = TextAlign.Center, lineHeight = 1.25.em @@ -514,8 +520,10 @@ private fun LazyListScope.regularContent( isGridView: Boolean, onListClick: () -> Unit, onGridClick: () -> Unit, - nearestEateries: List + nearestEateries: List, + isDarkMode : Boolean ) { + val eateries = eateriesApiResponse.data if (selectedFilters.isNotEmpty()) { @@ -580,6 +588,7 @@ private fun LazyListScope.regularContent( .padding(start = 16.dp, bottom = 12.dp), text = "All Eateries", style = EateryBlueTypography.h4, + color = currentColors.textPrimary ) Row( horizontalArrangement = Arrangement.spacedBy(2.dp), @@ -587,13 +596,20 @@ private fun LazyListScope.regularContent( .padding(end = 12.dp) ) { Icon( - painter = painterResource(id = if (isGridView) R.drawable.ic_list_view_unselected else R.drawable.ic_list_view_selected), + painter = painterResource(id = + if (isGridView && isDarkMode) { R.drawable.ic_list_view_unselected_dark } + else if (isGridView && !isDarkMode) {R.drawable.ic_list_view_unselected} + else if (!isGridView && isDarkMode) { R.drawable.ic_list_view_selected_dark } + else {R.drawable.ic_list_view_unselected}), contentDescription = "List View", tint = Color.Unspecified, modifier = Modifier.clickable { onListClick() } ) Icon( - painter = painterResource(id = if (isGridView) R.drawable.ic_grid_view_selected else R.drawable.ic_grid_view_unselected), + painter = painterResource(if (isGridView && isDarkMode) { R.drawable.ic_grid_view_selected_dark } + else if (isGridView && !isDarkMode) {R.drawable.ic_grid_view_selected} + else if (!isGridView && isDarkMode) { R.drawable.ic_grid_view_unselected_dark } + else {R.drawable.ic_grid_view_unselected}), contentDescription = "Grid View", tint = Color.Unspecified, modifier = Modifier.clickable { onGridClick() } @@ -666,10 +682,11 @@ private fun HomeStickyHeader( onSearchClick: () -> Unit, onNotificationsClick: () -> Unit ) { + val colors = currentColors Column( modifier = Modifier .fillMaxWidth() - .background(EateryBlue) + .background(colors.backgroundSecondary) .then(Modifier.statusBarsPadding()) .padding(bottom = 7.dp), ) { @@ -686,7 +703,7 @@ private fun HomeStickyHeader( modifier = Modifier.align(Alignment.Center), textAlign = TextAlign.Center, text = "Eatery", - color = Color.White, + color = currentColors.oppTextPrimary, style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 20.sp @@ -703,7 +720,7 @@ private fun HomeStickyHeader( Icon( Icons.Default.Search, contentDescription = Icons.Default.Search.name, - tint = Color.White + tint = currentColors.backgroundDefault ) } } @@ -721,7 +738,7 @@ private fun HomeStickyHeader( Icon( painter = painterResource(id = R.drawable.ic_eaterylogo), contentDescription = null, - tint = Color.White + tint = currentColors.backgroundDefault ) } Row( @@ -731,14 +748,14 @@ private fun HomeStickyHeader( ) { Text( text = "Eatery", - color = Color.White, + color = currentColors.oppTextPrimary, style = EateryBlueTypography.h2 ) if (BuildConfig.ENABLE_NOTIFICATIONS) { Icon( painter = painterResource(id = R.drawable.ic_bell), contentDescription = null, - tint = Color.White, + tint = currentColors.backgroundDefault, modifier = Modifier.clickable { onNotificationsClick() } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt index 52ebd6a1..647ea16f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt @@ -16,13 +16,13 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.ui.components.settings.SettingsLineSeparator import com.cornellappdev.android.eatery.ui.components.settings.SettingsOption -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GraySix +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun LegalScreen() { val uriCurrent = LocalUriHandler.current + val colors = currentColors Column( modifier = Modifier .padding(top = 36.dp, start = 16.dp, end = 16.dp) @@ -30,14 +30,14 @@ fun LegalScreen() { ) { Text( text = "Legal", - color = EateryBlue, + color = colors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) Text( text = "Find terms, conditions, and privacy policy", style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = GraySix, + color = colors.textPrimary, modifier = Modifier.padding(top = 7.dp, bottom = 12.dp) ) @@ -48,7 +48,7 @@ fun LegalScreen() { Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = EateryBlue, + tint = colors.backgroundSecondary, ) } ) @@ -60,7 +60,7 @@ fun LegalScreen() { Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = EateryBlue, + tint = colors.backgroundSecondary, ) } ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt index 1cdc28c7..3458374f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt @@ -28,9 +28,8 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.ui.components.general.EateryCard -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayTwo +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.NearestViewModel import com.valentinilk.shimmer.ShimmerBounds import com.valentinilk.shimmer.rememberShimmer @@ -43,6 +42,7 @@ fun NearestScreen( nearestViewModel: NearestViewModel = hiltViewModel(), onEateryClick: (eatery: Eatery) -> Unit ) { + val colors = currentColors val shimmer = rememberShimmer(ShimmerBounds.View) val nearestEateries = nearestViewModel.nearestEateries.collectAsState().value val favorites = nearestViewModel.favoriteEateries.collectAsState().value @@ -54,7 +54,7 @@ fun NearestScreen( ) { Text( text = "Nearest to You", - color = EateryBlue, + color = colors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) @@ -79,7 +79,7 @@ fun NearestScreen( modifier = Modifier .height(72.dp) .width(72.dp), - tint = GrayTwo, + tint = colors.backgroundDefault92, ) Text( @@ -88,7 +88,7 @@ fun NearestScreen( fontWeight = FontWeight.Medium, fontSize = 18.sp ), - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 12.dp) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt index 2a42e538..6d48ecde 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt @@ -9,8 +9,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.components.notifications.FavoriteItemRow -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun NotificationsHomeScreen( @@ -23,7 +23,7 @@ fun NotificationsHomeScreen( ) { Text( text = "Notifications", - color = EateryBlue, + color = currentColors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp, bottom = 20.dp) ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt index cdd4745a..2e9b3d30 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt @@ -13,12 +13,12 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.ui.components.settings.SwitchOption -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GraySix +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun NotificationsSettingsScreen() { + val colors = currentColors Column( modifier = Modifier @@ -27,7 +27,7 @@ fun NotificationsSettingsScreen() { ) { Text( text = "Notifications", - color = EateryBlue, + color = colors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) @@ -35,7 +35,7 @@ fun NotificationsSettingsScreen() { Text( text = "Manage item and promotional notifications", style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = GraySix, + color = colors.textPrimary, modifier = Modifier.padding(top = 7.dp, bottom = 12.dp) ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt index 7aab6824..aface4ae 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt @@ -35,9 +35,8 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.components.onboarding.OnboardingCarousel -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayThree +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.OnboardingViewModel import com.google.accompanist.pager.ExperimentalPagerApi import com.google.accompanist.pager.HorizontalPager @@ -51,6 +50,7 @@ fun OnboardingScreen( onboardingViewModel: OnboardingViewModel = hiltViewModel(), proceedHome: () -> Unit ) { + val colors = currentColors val pagerState = rememberPagerState(0) val coroutineScope = rememberCoroutineScope() var fadePage by rememberSaveable { mutableStateOf(false) } @@ -72,7 +72,7 @@ fun OnboardingScreen( Icon( painter = painterResource(id = R.drawable.ic_eaterylogo_blue), - tint = EateryBlue, + tint = colors.backgroundSecondary, modifier = Modifier .width(96.dp) .height(96.dp), @@ -81,7 +81,7 @@ fun OnboardingScreen( Text( text = "Eatery", - color = EateryBlue, + color = currentColors.oppTextPrimary, style = EateryBlueTypography.h1 ) @@ -98,7 +98,7 @@ fun OnboardingScreen( fadePage = true } }, - colors = ButtonDefaults.buttonColors(backgroundColor = Color.White), + colors = ButtonDefaults.buttonColors(backgroundColor = currentColors.backgroundDefault), elevation = ButtonDefaults.elevation( defaultElevation = 4.dp, pressedElevation = 4.dp, @@ -125,13 +125,13 @@ fun OnboardingScreen( painter = painterResource(id = R.drawable.ic_appdev), modifier = Modifier.padding(end = 6.dp), contentDescription = null, - tint = GrayThree + tint = colors.backgroundDefault10 ) Text( buildAnnotatedString { withStyle( style = SpanStyle( - color = GrayThree, + color = colors.backgroundDefault10, fontWeight = FontWeight.Normal ) ) { @@ -139,7 +139,7 @@ fun OnboardingScreen( } withStyle( style = SpanStyle( - color = GrayThree, + color = colors.backgroundDefault10, fontWeight = FontWeight.SemiBold ) ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt index 5bb46b49..212ffb14 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt @@ -23,9 +23,8 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.cornellappdev.android.eatery.ui.components.settings.SettingsLineSeparator import com.cornellappdev.android.eatery.ui.components.settings.SettingsOption import com.cornellappdev.android.eatery.ui.components.settings.SwitchOption -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GraySix +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.PrivacyViewModel import com.google.firebase.analytics.FirebaseAnalytics @@ -33,6 +32,7 @@ import com.google.firebase.analytics.FirebaseAnalytics fun PrivacyScreen(privacyViewModel: PrivacyViewModel = hiltViewModel()) { val context = LocalContext.current val uriCurrent = LocalUriHandler.current + val colors = currentColors Column( modifier = Modifier @@ -41,19 +41,19 @@ fun PrivacyScreen(privacyViewModel: PrivacyViewModel = hiltViewModel()) { ) { Text( text = "Privacy", - color = EateryBlue, + color = colors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) Text( text = "Manage permissions and analytics", style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = GraySix, + color = colors.textPrimary, modifier = Modifier.padding(top = 7.dp, bottom = 24.dp) ) Text( text = "Permissions", - color = Color.Black, + color = currentColors.textPrimary, style = EateryBlueTypography.h4, ) SettingsOption( @@ -73,7 +73,7 @@ fun PrivacyScreen(privacyViewModel: PrivacyViewModel = hiltViewModel()) { Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = EateryBlue, + tint = colors.backgroundSecondary, ) }) SettingsLineSeparator() @@ -94,14 +94,14 @@ fun PrivacyScreen(privacyViewModel: PrivacyViewModel = hiltViewModel()) { Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = EateryBlue, + tint = colors.backgroundSecondary, ) } ) SettingsLineSeparator() Text( text = "Analytics", - color = Color.Black, + color = currentColors.textPrimary, style = EateryBlueTypography.h4, modifier = Modifier.padding(top = 28.dp) ) @@ -123,7 +123,7 @@ fun PrivacyScreen(privacyViewModel: PrivacyViewModel = hiltViewModel()) { Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = EateryBlue, + tint = colors.backgroundSecondary, ) } ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt index fcf8d2bd..3a5b4ce7 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt @@ -58,7 +58,7 @@ import com.cornellappdev.android.eatery.ui.components.general.FilterRow import com.cornellappdev.android.eatery.ui.components.general.PaymentMethodsBottomSheet import com.cornellappdev.android.eatery.ui.components.general.SearchBar import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.SearchViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.util.popIn @@ -76,6 +76,7 @@ fun SearchScreen( onEateryClick: (eatery: Eatery) -> Unit, onFavoriteClick: () -> Unit ) { + val colors = currentColors val selectedPaymentMethodFilters = remember { mutableStateListOf() } val focusRequester = remember { FocusRequester() } val modalBottomSheetState = rememberModalBottomSheetState( @@ -124,7 +125,7 @@ fun SearchScreen( LazyColumn(state = listState, modifier = Modifier.fillMaxSize()) { stickyHeader { - Column(modifier = Modifier.background(Color.White)) { + Column(modifier = Modifier.background(currentColors.backgroundDefault)) { SearchBar( searchText = query, onSearchTextChange = { @@ -167,7 +168,7 @@ fun SearchScreen( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(GrayZero) + .background(colors.backgroundDefault) ) } } @@ -209,14 +210,14 @@ fun SearchScreen( modifier = Modifier .size(40.dp) .background( - color = GrayZero, + color = colors.backgroundDefault, shape = CircleShape ) ) { Icon( Icons.Default.ArrowForward, contentDescription = "Favorites", - tint = Color.Black + tint = currentColors.textPrimary ) } } @@ -314,6 +315,7 @@ fun SearchScreen( fun FavoriteItem( eatery: Eatery, onEateryClick: (eatery: Eatery) -> Unit ) { + val colors = currentColors Column( modifier = Modifier .width(96.dp) @@ -333,8 +335,8 @@ fun FavoriteItem( ), component = rememberImageComponent { +ShimmerPlugin( - baseColor = Color.White, - highlightColor = GrayZero, + baseColor = currentColors.backgroundDefault, + highlightColor = colors.backgroundDefault, durationMillis = 350, dropOff = 0.65f, tilt = 20f diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt index dafd8397..df19ae0d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt @@ -1,10 +1,14 @@ package com.cornellappdev.android.eatery.ui.screens +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape @@ -25,28 +29,33 @@ import androidx.compose.material.icons.outlined.StarOutline import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R +import com.cornellappdev.android.eatery.data.repositories.UserPreferencesRepository import com.cornellappdev.android.eatery.ui.components.settings.AppIconBottomSheet import com.cornellappdev.android.eatery.ui.components.settings.SettingsLineSeparator import com.cornellappdev.android.eatery.ui.components.settings.SettingsOption import com.cornellappdev.android.eatery.ui.navigation.Routes -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.LoginViewModel +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import kotlinx.coroutines.launch @OptIn(ExperimentalMaterialApi::class) @Composable fun SettingsScreen( loginViewModel: LoginViewModel, + themeViewModel : ThemeViewModel, destinations: HashMap Unit> ) { // To sign out, setIsLoggedIn to false and transition back to profileView with autoLogin false @@ -55,6 +64,8 @@ fun SettingsScreen( val modalBottomSheetState = rememberModalBottomSheetState( initialValue = ModalBottomSheetValue.Hidden, ) + + var modalSheetType by remember { mutableStateOf("") } ModalBottomSheetLayout( sheetState = modalBottomSheetState, sheetShape = RoundedCornerShape( @@ -65,225 +76,276 @@ fun SettingsScreen( ), sheetElevation = 8.dp, sheetContent = { - AppIconBottomSheet { - coroutineScope.launch { - modalBottomSheetState.hide() + when (modalSheetType) + { + "appIcon"-> AppIconBottomSheet { + coroutineScope.launch { + modalBottomSheetState.hide() + } + } + "colorTheme" -> ThemeSheet { + coroutineScope.launch { modalBottomSheetState.hide() } } + else -> + { + Box(modifier = Modifier.height(1.dp)) + } + } + + }, content = { - Column( + Box( modifier = Modifier - .fillMaxWidth() - .padding(top = 48.dp, start = 16.dp, end = 16.dp) - ) { - Text( - text = "Settings", - color = EateryBlue, - style = EateryBlueTypography.h2, - modifier = Modifier.padding(top = 7.dp, bottom = 7.dp) - ) - SettingsOption( - leadingIcon = { - Icon( - painter = painterResource(id = R.drawable.ic_appdev), - contentDescription = null, - tint = GrayFive, - modifier = Modifier.size(24.dp) - ) - }, - trailingIcon = { - Icon( - imageVector = Icons.Outlined.ChevronRight, - contentDescription = null, - tint = EateryBlue, - ) - }, - title = "About Eatery", - description = "Learn more about Cornell AppDev", - onClick = { - destinations[Routes.ABOUT]?.invoke() - } - ) - SettingsOption( - leadingIcon = { - Icon( - painter = painterResource(id = R.drawable.ic_appicon_settings), - contentDescription = null, - tint = GrayFive, - modifier = Modifier.size(24.dp) - ) - }, - title = "App Icon", - description = "Select the Eatery app icon for your phone", - onClick = { - coroutineScope.launch { - modalBottomSheetState.show() + .fillMaxSize() + .background(currentColors.backgroundDefault) + ) + { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(top = 48.dp, start = 16.dp, end = 16.dp) + + ) { + Text( + text = "Settings", + color = currentColors.backgroundSecondary, + style = EateryBlueTypography.h2, + modifier = Modifier.padding(top = 7.dp, bottom = 7.dp) + ) + SettingsOption( + leadingIcon = { + Icon( + painter = painterResource(id = R.drawable.ic_appdev), + contentDescription = null, + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) + ) + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + }, + title = "About Eatery", + description = "Learn more about Cornell AppDev", + onClick = { + destinations[Routes.ABOUT]?.invoke() } - }, - trailingIcon = { - Text( - text = "Change", - style = EateryBlueTypography.button, - color = EateryBlue, - ) - } - ) - SettingsLineSeparator() - SettingsOption( - leadingIcon = { - Icon( - imageVector = Icons.Outlined.StarOutline, - contentDescription = "Favorites", - tint = GrayFive, - modifier = Modifier.size(24.dp) - ) - }, - trailingIcon = { - Icon( - imageVector = Icons.Outlined.ChevronRight, - contentDescription = null, - tint = EateryBlue, - ) - }, - title = "Favorites", - description = "Manage your favorite eateries and items", - onClick = { - destinations[Routes.FAVORITES]?.invoke() - } - ) - SettingsLineSeparator() - SettingsOption( - leadingIcon = { - Icon( - painter = painterResource(id = R.drawable.ic_bell), - contentDescription = null, - tint = GrayFive, - modifier = Modifier.size(24.dp) - ) - }, - title = "Notifications", - description = "Manage item and promotional notifications", - onClick = { - destinations[Routes.NOTIFICATIONS_SETTING]?.invoke() - }, - trailingIcon = { - Icon( - imageVector = Icons.Outlined.ChevronRight, - contentDescription = null, - tint = EateryBlue, - ) - }, - ) - SettingsLineSeparator() - SettingsOption( - leadingIcon = { - Icon( - imageVector = Icons.Outlined.Lock, - contentDescription = "Privacy", - tint = GrayFive, - modifier = Modifier.size(24.dp) - ) - }, - trailingIcon = { - Icon( - imageVector = Icons.Outlined.ChevronRight, - contentDescription = null, - tint = EateryBlue, - ) - }, - title = "Privacy", - description = "Manage permissions and analytics", - onClick = { - destinations[Routes.PRIVACY]?.invoke() - } - ) - SettingsLineSeparator() - SettingsOption( - leadingIcon = { - Icon( - imageVector = Icons.Outlined.Gavel, - contentDescription = "Legal", - tint = GrayFive, - modifier = Modifier.size(24.dp) - ) - }, - trailingIcon = { - Icon( - imageVector = Icons.Outlined.ChevronRight, - contentDescription = null, - tint = EateryBlue, - ) - }, - title = "Legal", - description = "Find terms, conditions, and privacy policy", - onClick = { - destinations[Routes.LEGAL]?.invoke() - } - ) - SettingsLineSeparator() - SettingsOption( - leadingIcon = { - Icon( - imageVector = Icons.Outlined.HelpOutline, - contentDescription = "Support", - tint = GrayFive, - modifier = Modifier.size(24.dp) - ) - }, - trailingIcon = { - Icon( - imageVector = Icons.Outlined.ChevronRight, - contentDescription = null, - tint = EateryBlue, - ) - }, - title = "Support", - description = "Report issues and contact Cornell Appdev", - onClick = { - destinations[Routes.SUPPORT]?.invoke() - } - ) + ) + SettingsLineSeparator() + SettingsOption( + leadingIcon = { + Icon( + painter = painterResource(id = R.drawable.ic_appicon_settings), + contentDescription = null, + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) + ) + }, + title = "App Icon", + description = "Select the Eatery app icon for your phone", + onClick = { + modalSheetType = "appIcon" + coroutineScope.launch { + modalBottomSheetState.show() + } + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + } + ) + SettingsLineSeparator() + SettingsOption( + leadingIcon = { + Icon( + imageVector = Icons.Outlined.StarOutline, + contentDescription = "Favorites", + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) + ) + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + }, + title = "Favorites", + description = "Manage your favorite eateries and items", + onClick = { + modalSheetType = "colorTheme" + coroutineScope.launch { modalBottomSheetState.show() } - Spacer(modifier = Modifier.weight(1f)) - when (state) { - is LoginViewModel.State.Login -> { - } + } + ) + SettingsLineSeparator() + SettingsOption( + leadingIcon = { + Icon( + painter = painterResource(id = R.drawable.light_mode), + contentDescription = null, + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) - is LoginViewModel.State.Account -> { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 34.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = "Logged in as ${state.user.userName!!.substringBefore('@')}", - style = EateryBlueTypography.h5, - color = GrayFive ) - Button( - onClick = { - loginViewModel.onLogoutPressed() - destinations[Routes.PROFILE]?.invoke() - }, - shape = RoundedCornerShape(25.dp), - colors = ButtonDefaults.buttonColors( - backgroundColor = GrayZero, - contentColor = Color.Black - ) + }, + title = "Display", + description = "Choose a light or dark theme", + onClick = { + modalSheetType = "colorTheme" + coroutineScope.launch { modalBottomSheetState.show() } + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + } + ) + SettingsLineSeparator() + SettingsOption( + leadingIcon = { + Icon( + painter = painterResource(id = R.drawable.ic_bell), + contentDescription = null, + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) + ) + }, + title = "Notifications", + description = "Manage item and promotional notifications", + onClick = { + destinations[Routes.NOTIFICATIONS_SETTING]?.invoke() + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + }, + ) + SettingsLineSeparator() + SettingsOption( + leadingIcon = { + Icon( + imageVector = Icons.Outlined.Lock, + contentDescription = "Privacy", + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) + ) + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + }, + title = "Privacy", + description = "Manage permissions and analytics", + onClick = { + destinations[Routes.PRIVACY]?.invoke() + } + ) + SettingsLineSeparator() + SettingsOption( + leadingIcon = { + Icon( + imageVector = Icons.Outlined.Gavel, + contentDescription = "Legal", + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) + ) + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + }, + title = "Legal", + description = "Find terms, conditions, and privacy policy", + onClick = { + destinations[Routes.LEGAL]?.invoke() + } + ) + SettingsLineSeparator() + SettingsOption( + leadingIcon = { + Icon( + imageVector = Icons.Outlined.HelpOutline, + contentDescription = "Support", + tint = currentColors.textSecondary, + modifier = Modifier.size(24.dp) + ) + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.ChevronRight, + contentDescription = null, + tint = currentColors.backgroundSecondary, + ) + }, + title = "Support", + description = "Report issues and contact Cornell Appdev", + onClick = { + destinations[Routes.SUPPORT]?.invoke() + } + ) + + Spacer(modifier = Modifier.weight(1f)) + + when (state) { + is LoginViewModel.State.Login -> { + } + + is LoginViewModel.State.Account -> { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 34.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically ) { - Icon( - imageVector = Icons.Default.Logout, - contentDescription = Icons.Default.Logout.name, - ) - Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( - text = "Log out", - style = EateryBlueTypography.button + text = "Logged in as ${state.user.userName!!.substringBefore('@')}", + style = EateryBlueTypography.h5, + color = currentColors.textSecondary ) + Button( + onClick = { + loginViewModel.onLogoutPressed() + destinations[Routes.PROFILE]?.invoke() + }, + shape = RoundedCornerShape(25.dp), + colors = ButtonDefaults.buttonColors( + backgroundColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary + ) + ) { + Icon( + imageVector = Icons.Default.Logout, + contentDescription = Icons.Default.Logout.name, + ) + Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) + Text( + text = "Log out", + style = EateryBlueTypography.button + ) + } } } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index 4e091750..e229e6fb 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -53,11 +53,8 @@ import com.cornellappdev.android.eatery.ui.components.settings.Issue import com.cornellappdev.android.eatery.ui.components.settings.ReportBottomSheet import com.cornellappdev.android.eatery.ui.components.settings.SettingsLineSeparator import com.cornellappdev.android.eatery.ui.components.settings.SettingsOption -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.GrayFive -import com.cornellappdev.android.eatery.ui.theme.GraySix -import com.cornellappdev.android.eatery.ui.theme.GrayZero +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.SupportViewModel import kotlinx.coroutines.launch @@ -65,6 +62,7 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalMaterialApi::class) @Composable fun SupportScreen(supportViewModel: SupportViewModel = hiltViewModel()) { + val colors = currentColors val coroutineScope = rememberCoroutineScope() val context = LocalContext.current val modalBottomSheetState = rememberModalBottomSheetState( @@ -102,26 +100,26 @@ fun SupportScreen(supportViewModel: SupportViewModel = hiltViewModel()) { ) { Text( text = "Support", - color = EateryBlue, + color = colors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) Text( text = "Report issues and contact Cornell AppDev", style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = GraySix, + color = colors.textPrimary, modifier = Modifier.padding(top = 7.dp, bottom = 24.dp) ) Text( text = "Make Eatery Better", - color = Color.Black, + color = currentColors.textPrimary, style = EateryBlueTypography.h4, modifier = Modifier.padding(bottom = 12.dp) ) Text( text = "Help us improve Eatery by letting us know what’s wrong.", - color = GrayFive, + color = colors.textSecondary, style = EateryBlueTypography.subtitle2, modifier = Modifier.padding(bottom = 12.dp) ) @@ -136,8 +134,8 @@ fun SupportScreen(supportViewModel: SupportViewModel = hiltViewModel()) { } }, colors = ButtonDefaults.buttonColors( - backgroundColor = EateryBlue, - contentColor = Color.White + backgroundColor = colors.accentPrimary, + contentColor = currentColors.backgroundDefault ) ) { Icon(imageVector = Icons.Default.Report, Icons.Default.Report.name) @@ -161,20 +159,20 @@ fun SupportScreen(supportViewModel: SupportViewModel = hiltViewModel()) { Text( text = "Shoot us an email", style = EateryBlueTypography.button, - color = EateryBlue + color = colors.textPrimary ) Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Icon( Icons.Outlined.ArrowOutward, null, - tint = EateryBlue + tint = colors.backgroundSecondary ) } Text( text = "Frequently Asked Questions", style = EateryBlueTypography.h4, - color = Color.Black, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 20.dp) ) FAQCreation( @@ -224,7 +222,7 @@ fun SupportScreen(supportViewModel: SupportViewModel = hiltViewModel()) { Text( text = "send them an email.", style = EateryBlueTypography.subtitle2, - color = EateryBlue, + color = colors.textPrimary, ) } } @@ -246,13 +244,14 @@ fun SupportScreen(supportViewModel: SupportViewModel = hiltViewModel()) { @Composable private fun ReportButton() { + val colors = currentColors Surface( shape = RoundedCornerShape(17.dp), modifier = Modifier .height(50.dp) .padding(vertical = 8.dp), - color = GrayZero, - contentColor = Color.Black + color = colors.backgroundDefault, + contentColor = currentColors.textPrimary ) { Row( verticalAlignment = Alignment.CenterVertically, @@ -263,7 +262,7 @@ private fun ReportButton() { Text( text = "Report an Issue", style = EateryBlueTypography.button, - color = Color.Black, + color = currentColors.textPrimary, ) } } @@ -277,6 +276,7 @@ fun FAQCreation( action: @Composable () -> Unit, onActionClick: () -> Unit ) { + val colors = currentColors val (expanded, setExpanded) = remember { mutableStateOf(false) } @@ -288,14 +288,14 @@ fun FAQCreation( Icon( imageVector = Icons.Default.ExpandLess, contentDescription = Icons.Default.ExpandLess.name, - tint = EateryBlue, + tint = colors.backgroundSecondary, modifier = Modifier.width(24.dp) ) } else { Icon( imageVector = Icons.Default.ExpandMore, contentDescription = null, - tint = EateryBlue, + tint = colors.backgroundSecondary, modifier = Modifier.width(24.dp) ) } @@ -313,7 +313,7 @@ fun FAQCreation( Text( text = dropdownText, style = EateryBlueTypography.subtitle2, - color = GrayFive, + color = colors.textSecondary, ) Box(modifier = Modifier.clickable { setExpanded(false) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt new file mode 100644 index 00000000..3bc8ae5f --- /dev/null +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt @@ -0,0 +1,172 @@ +package com.cornellappdev.android.eatery.ui.screens + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.Icon +import androidx.compose.material.RadioButton +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material3.ButtonDefaults.buttonColors +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.cornellappdev.android.eatery.R +import com.cornellappdev.android.eatery.ui.components.settings.SettingsLineSeparator +import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography +import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterialApi::class) +@Composable +fun ThemeSheet(viewModel : ThemeViewModel = hiltViewModel(), + onDismiss : () -> Unit) +{ + val coroutineScope = rememberCoroutineScope() + var darkMode by remember { mutableStateOf(false) } + var lightMode by remember { mutableStateOf(false) } + var systemMode by remember { mutableStateOf(false) } + val isSystemDark = isSystemInDarkTheme() + + Column( + modifier = Modifier + .fillMaxWidth() + .background(color = currentColors.backgroundDefault) + .padding( + horizontal = 16.dp, + vertical = 24.dp + ) + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.SpaceAround + ) + { + Text( + "Display", + style = EateryBlueTypography.h4, + color = currentColors.textPrimary, + modifier = Modifier.padding(vertical = 16.dp) + ) + + ThemeRow( + text = "Light", + isSelected = lightMode == true, + iconId = R.drawable.light_mode, + onClick = { + darkMode = false + lightMode = true + systemMode=false + } + ) + SettingsLineSeparator() + ThemeRow( + text = "Dark", + isSelected = darkMode == true, + iconId = R.drawable.dark_mode, + onClick = { + darkMode = true + lightMode = false + systemMode=false + } + ) + SettingsLineSeparator() + ThemeRow( + text = "Device Theme", + isSelected = systemMode == true, + iconId = R.drawable.system_setting, + onClick = { + darkMode = false + lightMode = false + systemMode = true + } + ) + + Button( + onClick = { + if (darkMode) { + viewModel.toggleDarkMode() + } else if (lightMode) { + viewModel.toggleLightMode() + } else if (systemMode) { + viewModel.toggleSystemMode() + } + onDismiss() + }, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(32.dp), + colors = buttonColors( + containerColor = currentColors.backgroundSecondary, + contentColor = currentColors.textPrimary + ) + ) + { + Text( + "Done", fontWeight = FontWeight.Bold, textAlign = TextAlign.Center, + color = currentColors.oppTextPrimary + ) + } + + + } + } + + + + + + +@Composable +fun ThemeRow(text: String, iconId : Int, isSelected : Boolean, onClick : () -> Unit) +{ + Row(modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + .clickable { onClick() }, + verticalAlignment = Alignment.CenterVertically) + + { + Icon( + painter = painterResource(id = iconId), + tint = currentColors.textPrimary, + contentDescription = null, + modifier = Modifier.size(24.dp) + ) + Spacer(modifier = Modifier.width(12.dp)) + Text(text = text, + style = EateryBlueTypography.body1, + color = currentColors.textPrimary, + modifier = Modifier.weight(1f)) + RadioButton(selected = isSelected, + onClick = { + onClick() + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index 5aa0011c..2ad3526a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.animation.AnimatedContent import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -29,11 +30,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color.Companion.White import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -50,8 +51,9 @@ import com.cornellappdev.android.eatery.ui.components.upcoming.MealBottomSheet import com.cornellappdev.android.eatery.ui.components.upcoming.MenuCard import com.cornellappdev.android.eatery.ui.components.upcoming.UpcomingLoadingItem import com.cornellappdev.android.eatery.ui.components.upcoming.UpcomingLoadingItem.Companion.CreateUpcomingLoadingItem -import com.cornellappdev.android.eatery.ui.theme.EateryBlue import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography +import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import com.cornellappdev.android.eatery.ui.viewmodels.UpcomingViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.util.AppStorePopupRepository @@ -85,9 +87,11 @@ fun UpcomingMenuScreen( remember { derivedStateOf { listState.firstVisibleItemIndex > 0 } } val shimmer = rememberShimmer(ShimmerBounds.View) - Box(modifier = Modifier.background(White)) { + Box(modifier = Modifier.background(currentColors.backgroundDefault)) { ModalBottomSheetLayout( sheetState = modalBottomSheetState, + sheetBackgroundColor = currentColors.accentPrimary, + sheetContentColor = currentColors.textPrimary, sheetShape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, @@ -159,7 +163,8 @@ fun UpcomingMenuScreen( Text( modifier = Modifier.padding(start = 6.dp), text = it.header, - style = EateryBlueTypography.h4 + style = EateryBlueTypography.h4, + color = currentColors.textPrimary ) Spacer(modifier = Modifier.height(16.dp)) it.menuCards.forEach { eatery -> @@ -277,7 +282,10 @@ private fun UpcomingFilterRow( selectedFilters: List, onToggleFilterClicked: (Filter) -> Unit, filterRowState: LazyListState, + themeViewModel : ThemeViewModel = hiltViewModel() ) { + val isDarkMode by themeViewModel.isDarkMode.collectAsState() + val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() FilterRow( customItemsBefore = { item { @@ -292,7 +300,8 @@ private fun UpcomingFilterRow( MealFilter.LATE_DINNER -> "Late Dinner" else -> mealFilter.text.first() }, - icon = Icons.Default.ExpandMore + icon = Icons.Default.ExpandMore, + resolvedDarkMode ) } }, @@ -316,7 +325,12 @@ private fun UpcomingLazyColumn( state = innerListState, modifier = Modifier.fillMaxSize() ) { stickyHeader { - upcomingMenuHeader() + Box(modifier = Modifier + .fillMaxWidth() + .background(currentColors.backgroundDefault) + ) { + upcomingMenuHeader() + } } item { calendarWeekSelector() @@ -331,10 +345,11 @@ private fun UpcomingLazyColumn( @Composable @OptIn(ExperimentalAnimationApi::class) private fun UpcomingMenuHeader(isFirstVisible: State) { + val colors = currentColors Column( modifier = Modifier .fillMaxWidth() - .background(EateryBlue) + .background(colors.backgroundSecondary) .then(Modifier.statusBarsPadding()) .padding(bottom = 7.dp), ) { @@ -351,7 +366,7 @@ private fun UpcomingMenuHeader(isFirstVisible: State) { modifier = Modifier.align(Alignment.Center), textAlign = TextAlign.Center, text = "Upcoming Menus", - color = White, + color = currentColors.oppTextPrimary, style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 20.sp @@ -368,7 +383,7 @@ private fun UpcomingMenuHeader(isFirstVisible: State) { ) { Text( text = "Upcoming Menus", - color = White, + color = currentColors.oppTextPrimary, style = EateryBlueTypography.h2 ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt index e666e8a2..6f428aac 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt @@ -2,20 +2,22 @@ package com.cornellappdev.android.eatery.ui.theme import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb - +/* val EateryBlue = Color(0xFF4A90E2) -val GrayZero = Color(0xFFEFF1F4) -val GrayOne = Color(0xFFE1E4E8) -val GrayTwo = Color(0xFFD1D5DA) -val GrayThree = Color(0xFF959da5) -val GrayFive = Color(0xFF586069) -val GraySix = Color(0xFF444D56) +val colors.backgroundDefault = Color(0xFFEFF1F4) +val colors.backgroundSecondary = Color(0xFFE1E4E8) +val backgroundDefault92 = Color(0xFFD1D5DA) +val colors.backgroundDefault10 = Color(0xFF959da5) +val colors.textSecondary = Color(0xFF586069) +val colors.textPrimary = Color(0xFF444D56) val LightBlue = Color(0xFFE8EFF8) val LightRed = Color(0xFFFEF0EF) val Red = Color(0xFFF2655D) val Green = Color(0xFF63C774) -val Yellow = Color(0xFFFEC50E) +val colors.accentPressed = Color(0xFFFEC50E) val Orange = Color(0xFFFF990E) + + */ // Error colors val ErrorLight = Color(0xFFF2655D) val ErrorDark = Color(0xFFF2655D) @@ -40,6 +42,8 @@ val BgDefault92Dark = Color(0xEB141414) // 141414 with 92% opacity val BgSurfaceLight = Color(0xFFFAFAFA) val BgSurfaceDark = Color(0xFF121212) +val OppTextPrimaryLight = Color(0xFFFFFFFF) +val OppTextPrimaryDark = Color(0xFF050505) // Text colors val TextPrimaryLight = Color(0xFF050505) val TextPrimaryDark = Color(0xFFFFFFFF) @@ -89,3 +93,54 @@ fun colorInterp(fraction: Float, color1: Color, color2: Color): Color { private fun interpolate(fraction: Float, a: Float, b: Float): Float { return a + (b - a) * fraction } + +object ColorTheme +{ + val lightMode = ColorMode( + error = ErrorLight, + success = SuccessLight, + backgroundDefault = BgDefaultLight, + backgroundSecondary = BgSecondaryLight, + backgroundDefault10 = BgDefault10Light, + backgroundDefault92 = BgDefault92Light, + backgroundSurface = BgSurfaceLight, + textPrimary = TextPrimaryLight, + oppTextPrimary = OppTextPrimaryLight, + textSecondary = TextSecondaryLight, + accentPrimary = AccentPrimaryLight, + accentPressed = AccentPressedLight, + borderDefault = BorderDefaultLight, + ) + val darkMode = ColorMode( + error = ErrorDark, + success = SuccessDark, + backgroundDefault = BgDefaultDark, + backgroundSecondary = BgSecondaryDark, + backgroundDefault10 = BgDefault10Dark, + backgroundDefault92 = BgDefault92Dark, + backgroundSurface = BgSurfaceDark, + textPrimary = TextPrimaryDark, + oppTextPrimary = OppTextPrimaryDark, + textSecondary = TextSecondaryDark, + accentPrimary = AccentPrimaryDark, + accentPressed = AccentPressedDark, + borderDefault = BorderDefaultDark + ) + +} + +data class ColorMode( + val error : Color, + val success : Color, + val backgroundDefault : Color, + val backgroundSecondary : Color, + val backgroundDefault10 : Color, + val backgroundDefault92 : Color, + val backgroundSurface : Color, + val textPrimary : Color, + val oppTextPrimary : Color, + val textSecondary : Color, + val accentPrimary : Color, + val accentPressed : Color, + val borderDefault : Color +) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt index 4d7265e8..574abdf5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt @@ -7,15 +7,15 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.graphics.Color -val LocalColorMode = staticCompositionLocalOf { ColorTheme.darkMode } +val LocalColorMode = staticCompositionLocalOf { ColorTheme.lightMode } @Composable fun AppColorTheme( - darkTheme: Boolean = isSystemInDarkTheme(), + colorMode: ColorMode , content: @Composable () -> Unit ) { - val colors = if (darkTheme) ColorTheme.darkMode else ColorTheme.lightMode - CompositionLocalProvider(LocalColorMode provides colors) { + + CompositionLocalProvider(LocalColorMode provides colorMode) { content() } } @@ -23,50 +23,3 @@ fun AppColorTheme( val currentColors: ColorMode @Composable get() = LocalColorMode.current -object ColorTheme -{ - val lightMode = ColorMode( - error = ErrorLight, - success = SuccessLight, - backgroundDefault = BgDefaultLight, - backgroundSecondary = BgSecondaryLight, - backgroundDefault10 = BgDefault10Light, - backgroundDefault92 = BgDefault92Light, - backgroundSurface = BgSurfaceLight, - textPrimary = TextPrimaryLight, - textSecondary = TextSecondaryLight, - accentPrimary = AccentPrimaryLight, - accentPressed = AccentPressedLight, - borderDefault = BorderDefaultLight - ) - val darkMode = ColorMode( - error = ErrorDark, - success = SuccessDark, - backgroundDefault = BgDefaultDark, - backgroundSecondary = BgSecondaryDark, - backgroundDefault10 = BgDefault10Dark, - backgroundDefault92 = BgDefault92Dark, - backgroundSurface = BgSurfaceDark, - textPrimary = TextPrimaryDark, - textSecondary = TextSecondaryDark, - accentPrimary = AccentPrimaryDark, - accentPressed = AccentPressedDark, - borderDefault = BorderDefaultDark - ) - -} - -data class ColorMode( - val error : Color, - val success : Color, - val backgroundDefault : Color, - val backgroundSecondary : Color, - val backgroundDefault10 : Color, - val backgroundDefault92 : Color, - val backgroundSurface : Color, - val textPrimary : Color, - val textSecondary : Color, - val accentPrimary : Color, - val accentPressed : Color, - val borderDefault : Color -) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt index 6721cd14..f3b52257 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt @@ -1,6 +1,7 @@ package com.cornellappdev.android.eatery.ui.viewmodels import ItemFavoritesCardViewState +import androidx.compose.ui.graphics.Color import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.cornellappdev.android.eatery.data.models.Eatery @@ -11,8 +12,7 @@ import com.cornellappdev.android.eatery.ui.components.general.Filter import com.cornellappdev.android.eatery.ui.components.general.Filter.FromEateryFilter import com.cornellappdev.android.eatery.ui.components.general.FilterData import com.cornellappdev.android.eatery.ui.components.general.updateFilters -import com.cornellappdev.android.eatery.ui.theme.GrayThree -import com.cornellappdev.android.eatery.ui.theme.Green +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -123,8 +123,8 @@ class FavoritesViewModel @Inject constructor( itemName = itemName, availability = if (eateriesByItem.isEmpty()) EateryStatus( "Not available", - GrayThree - ) else EateryStatus("Available today", Green), + Color.Red + ) else EateryStatus("Available today", Color.Green), mealAvailability = eateriesByItem.groupBy { eatery -> eatery.events?.find { event -> event.menu?.any { @@ -144,7 +144,7 @@ class FavoritesViewModel @Inject constructor( ) "Other" else key }.toSortedMap { s1, s2 -> s1.toSortOrder().compareTo(s2.toSortOrder()) } ) - }.sortedByDescending { it.availability.statusColor == Green } + }.sortedByDescending { it.availability.statusColor == Color.Green } FavoritesScreenViewState.Loaded( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/ThemeViewModel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/ThemeViewModel.kt new file mode 100644 index 00000000..1e1578f9 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/ThemeViewModel.kt @@ -0,0 +1,45 @@ +package com.cornellappdev.android.eatery.ui.viewmodels + +import android.annotation.SuppressLint +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.cornellappdev.android.eatery.data.repositories.UserPreferencesRepository +import com.cornellappdev.android.eatery.data.repositories.UserRepository +import com.cornellappdev.android.eatery.ui.theme.ColorMode +import com.cornellappdev.android.eatery.ui.theme.ColorTheme +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class ThemeViewModel @Inject constructor( + private val repository: UserPreferencesRepository): ViewModel() +{ + val isDarkMode : StateFlow = repository.isDarkModeFlow.stateIn( + viewModelScope, + started = SharingStarted.Eagerly, + initialValue = null) + + fun toggleDarkMode() + { + viewModelScope.launch { repository.setDarkMode(true)} + } + fun toggleLightMode() + { + viewModelScope.launch { repository.setDarkMode(false)} + } + + fun toggleSystemMode() + { + viewModelScope.launch {repository.setSystemMode()} + } + +} + + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt index 1ce69b16..34dd79dc 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.viewmodels +import androidx.compose.ui.graphics.Color import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.cornellappdev.android.eatery.data.models.Eatery @@ -14,9 +15,6 @@ import com.cornellappdev.android.eatery.ui.components.general.MenuItemViewState import com.cornellappdev.android.eatery.ui.components.general.updateFilters import com.cornellappdev.android.eatery.ui.components.upcoming.EateryHours import com.cornellappdev.android.eatery.ui.components.upcoming.MenuCardViewState -import com.cornellappdev.android.eatery.ui.theme.Green -import com.cornellappdev.android.eatery.ui.theme.Orange -import com.cornellappdev.android.eatery.ui.theme.Red import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -106,9 +104,9 @@ class UpcomingViewModel @Inject constructor( } ?: emptyList(), name = name ?: "Unknown Eatery", eateryStatus = when { - isClosed() -> EateryStatus("Closed", Red) - isClosingSoon() -> EateryStatus("Closing Soon", Orange) - else -> EateryStatus("Open", Green) + isClosed() -> EateryStatus("Closed", Color.Red) + isClosingSoon() -> EateryStatus("Closing Soon", Color(0xFFFFA500)) + else -> EateryStatus("Open", Color.Green) }, ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt index 2efbba76..415d70b8 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt @@ -1,20 +1,19 @@ package com.cornellappdev.android.eatery.util import androidx.compose.foundation.background +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import com.cornellappdev.android.eatery.ui.theme.AppColorTheme +import com.cornellappdev.android.eatery.ui.theme.ColorTheme @Composable -fun EateryPreview(modifier: Modifier = Modifier, content: @Composable () -> Unit) { - androidx.compose.material3.MaterialTheme { - Column( - modifier = modifier - .background(Color.White) - ) { - content() - } +fun EateryPreview(content : @Composable () -> Unit) { + AppColorTheme(colorMode = ColorTheme.lightMode) + { + content() } } \ No newline at end of file diff --git a/app/src/main/proto/user_prefs.proto b/app/src/main/proto/user_prefs.proto index b5b4cc6b..97ca533d 100644 --- a/app/src/main/proto/user_prefs.proto +++ b/app/src/main/proto/user_prefs.proto @@ -27,6 +27,8 @@ message UserPreferences { map itemFavorites = 11; + optional bool isDarkMode = 12; + // repeated int32 recentSearches = 2; // string username = 3; // // Must be encrypted / decrypted. diff --git a/app/src/main/res/drawable/dark_mode.xml b/app/src/main/res/drawable/dark_mode.xml new file mode 100644 index 00000000..49f17e10 --- /dev/null +++ b/app/src/main/res/drawable/dark_mode.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_brightness.xml b/app/src/main/res/drawable/ic_brightness.xml new file mode 100644 index 00000000..adc5b467 --- /dev/null +++ b/app/src/main/res/drawable/ic_brightness.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_calendar_selected_dark.xml b/app/src/main/res/drawable/ic_calendar_selected_dark.xml new file mode 100644 index 00000000..b110581b --- /dev/null +++ b/app/src/main/res/drawable/ic_calendar_selected_dark.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_grid_view_selected_dark.xml b/app/src/main/res/drawable/ic_grid_view_selected_dark.xml new file mode 100644 index 00000000..6ad3ef68 --- /dev/null +++ b/app/src/main/res/drawable/ic_grid_view_selected_dark.xml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_grid_view_unselected.xml b/app/src/main/res/drawable/ic_grid_view_unselected.xml index 8e065dc4..24828432 100644 --- a/app/src/main/res/drawable/ic_grid_view_unselected.xml +++ b/app/src/main/res/drawable/ic_grid_view_unselected.xml @@ -26,4 +26,4 @@ android:strokeWidth="1.13513" android:fillColor="#EFF1F4" android:strokeColor="#586069"/> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_grid_view_unselected_dark.xml b/app/src/main/res/drawable/ic_grid_view_unselected_dark.xml new file mode 100644 index 00000000..1a5a0ec0 --- /dev/null +++ b/app/src/main/res/drawable/ic_grid_view_unselected_dark.xml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_home_selected_dark.xml b/app/src/main/res/drawable/ic_home_selected_dark.xml new file mode 100644 index 00000000..17869390 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected_dark.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_list_view_selected_dark.xml b/app/src/main/res/drawable/ic_list_view_selected_dark.xml new file mode 100644 index 00000000..197f7c6b --- /dev/null +++ b/app/src/main/res/drawable/ic_list_view_selected_dark.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_list_view_unselected_dark.xml b/app/src/main/res/drawable/ic_list_view_unselected_dark.xml new file mode 100644 index 00000000..0a49b25d --- /dev/null +++ b/app/src/main/res/drawable/ic_list_view_unselected_dark.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_profile_selected_dark.xml b/app/src/main/res/drawable/ic_profile_selected_dark.xml new file mode 100644 index 00000000..93256ec8 --- /dev/null +++ b/app/src/main/res/drawable/ic_profile_selected_dark.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/light_mode.xml b/app/src/main/res/drawable/light_mode.xml new file mode 100644 index 00000000..a170c665 --- /dev/null +++ b/app/src/main/res/drawable/light_mode.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/system_setting.xml b/app/src/main/res/drawable/system_setting.xml new file mode 100644 index 00000000..66495136 --- /dev/null +++ b/app/src/main/res/drawable/system_setting.xml @@ -0,0 +1,12 @@ + + + + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ce15d423..10af0a65 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Feb 19 18:58:50 EST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From de4c27a14fe179919d1c233b4fef809c0da983b7 Mon Sep 17 00:00:00 2001 From: brianhu72 Date: Wed, 15 Apr 2026 15:01:13 -0400 Subject: [PATCH 03/31] CodeRabbit Changes --- .../eatery/ui/components/comparemenus/CompareMenusFAB.kt | 1 - .../eatery/ui/components/details/ItemFavoritesCard.kt | 2 +- .../eatery/ui/components/general/PermissionRequestDialog.kt | 2 +- .../android/eatery/ui/components/login/AccountPage.kt | 2 -- .../android/eatery/ui/screens/SettingsScreen.kt | 5 +---- 5 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt index a6c9c32d..ef48bd10 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusFAB.kt @@ -5,7 +5,6 @@ import androidx.compose.material.FloatingActionButton import androidx.compose.material.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt index ebcb2418..2c33a999 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt @@ -56,7 +56,7 @@ fun ItemFavoritesCard( Card( modifier = modifier .fillMaxWidth() - .border(BorderStroke(Dp.Hairline, currentColors.backgroundDefault), RoundedCornerShape(8)), + .border(BorderStroke(Dp.Hairline, currentColors.backgroundDefault92), RoundedCornerShape(8)), shape = RoundedCornerShape(8.dp), colors = CardDefaults.cardColors( containerColor = currentColors.backgroundDefault diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt index 5627764e..6aedbb3c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt @@ -74,7 +74,7 @@ fun PermissionRequestDialog( requestingPermission = false } else { Surface( - color = currentColors.textPrimary.copy(alpha = 0.6f), + color = Color.Black.copy(alpha = 0.6f), modifier = Modifier.fillMaxSize() ) { Column( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index 3bb16b4c..ded5b6c5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -81,9 +81,7 @@ fun AccountPage( onSettingsClicked: () -> Unit, getTransactionsOfType: (AccountType, String) -> List, updateAccountFilter: (AccountType) -> Unit, - themeViewModel: ThemeViewModel = hiltViewModel() ) { - val isDarkMode by themeViewModel.isDarkMode.collectAsState() var filterText by remember { mutableStateOf("") } val modalBottomSheetState = rememberModalBottomSheetState( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt index df19ae0d..195487b9 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt @@ -182,10 +182,7 @@ fun SettingsScreen( title = "Favorites", description = "Manage your favorite eateries and items", onClick = { - modalSheetType = "colorTheme" - coroutineScope.launch { modalBottomSheetState.show() } - - + destinations[Routes.FAVORITES]?.invoke() } ) SettingsLineSeparator() From 445328fd6d0db2692dc0967438d1ca996d61d241 Mon Sep 17 00:00:00 2001 From: brianhu72 Date: Wed, 15 Apr 2026 15:10:26 -0400 Subject: [PATCH 04/31] Rabbit Updates --- .../eatery/ui/components/login/AccountPage.kt | 165 +++++++++--------- 1 file changed, 86 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index ded5b6c5..3a7bd370 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -128,6 +128,7 @@ fun AccountPage( .fillMaxSize() .background(currentColors.backgroundDefault) ) + { val innerListState = rememberLazyListState() val isFirstVisible = remember { derivedStateOf { innerListState.firstVisibleItemIndex > 1 } } @@ -136,7 +137,8 @@ fun AccountPage( Column( modifier = Modifier .fillMaxWidth() - ) { + ) + { Column( modifier = Modifier .fillMaxWidth() @@ -172,7 +174,7 @@ fun AccountPage( ) { Icon( modifier = Modifier.size(28.dp), - painter = painterResource(id=R.drawable.system_setting), + painter = painterResource(id = R.drawable.system_setting), contentDescription = Icons.Outlined.Settings.name, tint = currentColors.textPrimary ) @@ -283,80 +285,82 @@ fun AccountPage( stickyHeader { - Row( - modifier = Modifier.padding(top = 12.dp, start = 16.dp, end = 16.dp), - verticalAlignment = Alignment.CenterVertically + Row( + modifier = Modifier.padding(top = 12.dp, start = 16.dp, end = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column( + modifier = Modifier.weight(1f) ) { - Column( - modifier = Modifier.weight(1f) - ) { - Text( - text = when (accountFilter.name) { - "MEALSWIPES" -> "Meal Swipes" - "BRBS" -> "Big Red Bucks" - "LAUNDRY" -> "Laundry" - "CITYBUCKS" -> "City Bucks" - else -> "Account Type" - }, - style = EateryBlueTypography.h4, - color = currentColors.textPrimary - - ) - } - IconButton( - onClick = { - sheetContent = BottomSheetContent.ACCOUNT_TYPE - coroutineScope.launch { - modalBottomSheetState.show() - } + Text( + text = when (accountFilter.name) { + "MEALSWIPES" -> "Meal Swipes" + "BRBS" -> "Big Red Bucks" + "LAUNDRY" -> "Laundry" + "CITYBUCKS" -> "City Bucks" + else -> "Account Type" }, - modifier = Modifier - .padding(start = 8.dp, top = 8.dp, bottom = 8.dp) - .background(color = currentColors.backgroundDefault, shape = CircleShape) - ) { - Icon( - imageVector = Icons.Default.KeyboardArrowDown, - contentDescription = "Change Account Type", - modifier = Modifier - .size(26.dp), - tint = currentColors.accentPrimary - ) - } + style = EateryBlueTypography.h4, + color = currentColors.textPrimary + + ) } - SearchBar( - searchText = filterText, - onSearchTextChange = { filterText = it }, - modifier = Modifier - .padding(bottom = 12.dp, start = 16.dp, end = 16.dp), - placeholderText = "Search for transactions...", - onCancelClicked = { - filterText = "" + IconButton( + onClick = { + sheetContent = BottomSheetContent.ACCOUNT_TYPE + coroutineScope.launch { + modalBottomSheetState.show() + } }, - - ) - Spacer( modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(currentColors.accentPrimary, CircleShape) - .padding(horizontal = 16.dp) + .padding(start = 8.dp, top = 8.dp, bottom = 8.dp) + .background( + color = currentColors.backgroundDefault, + shape = CircleShape + ) + ) { + Icon( + imageVector = Icons.Default.KeyboardArrowDown, + contentDescription = "Change Account Type", + modifier = Modifier + .size(26.dp), + tint = currentColors.accentPrimary + ) + } + } + SearchBar( + searchText = filterText, + onSearchTextChange = { filterText = it }, + modifier = Modifier + .padding(bottom = 12.dp, start = 16.dp, end = 16.dp), + placeholderText = "Search for transactions...", + onCancelClicked = { + filterText = "" + }, ) - Text( - text = "Past 30 Days", - modifier = Modifier.padding(vertical = 12.dp, horizontal = 16.dp), - style = EateryBlueTypography.h5, - color = currentColors.textPrimary - ) - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(currentColors.accentPrimary, CircleShape) - .padding(horizontal = 16.dp) + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(currentColors.accentPrimary, CircleShape) + .padding(horizontal = 16.dp) - ) + ) + Text( + text = "Past 30 Days", + modifier = Modifier.padding(vertical = 12.dp, horizontal = 16.dp), + style = EateryBlueTypography.h5, + color = currentColors.textPrimary + ) + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(currentColors.accentPrimary, CircleShape) + .padding(horizontal = 16.dp) + ) } @@ -377,9 +381,11 @@ fun AccountPage( verticalAlignment = Alignment.CenterVertically ) { Column(modifier = Modifier.weight(1f)) { - Text(text = "${it.location}", + Text( + text = "${it.location}", style = EateryBlueTypography.button, - color = currentColors.textPrimary) + color = currentColors.textPrimary + ) Text( text = outputFormatter.format(dateTime), style = EateryBlueTypography.subtitle2, @@ -387,19 +393,19 @@ fun AccountPage( ) } val (amtString, amtColor) = - when { - it.transactionType == 3 -> { - "+$%.2f".format(it.amount) to currentColors.success - } + when { + it.transactionType == 3 -> { + "+$%.2f".format(it.amount) to currentColors.success + } - it.amount?.toInt() == 0 -> { - "$0.00" to currentColors.textPrimary - } + it.amount?.toInt() == 0 -> { + "$0.00" to currentColors.textPrimary + } - else -> { - "-$%.2f".format(it.amount) to currentColors.error + else -> { + "-$%.2f".format(it.amount) to currentColors.error + } } - } Text( text = amtString, modifier = Modifier.weight(0.2f), @@ -418,6 +424,7 @@ fun AccountPage( } } } + } } } From b48a85aadc2045b893089e6155f3f3ecb14182fd Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Thu, 23 Apr 2026 15:41:58 -0400 Subject: [PATCH 05/31] coderabbit fixes --- app/build.gradle | 1 - .../comparemenus/CompareMenusBottomSheet.kt | 60 ++++--- .../details/EateryHourBottomSheet.kt | 1 - .../general/CalendarWeekSelector.kt | 6 +- .../ui/components/general/CustomTextField.kt | 160 ----------------- .../ui/components/general/FavoriteButton.kt | 3 +- .../eatery/ui/components/general/FilterRow.kt | 24 +-- .../general/PaymentMethodsAvailable.kt | 19 +- .../ui/components/home/AnnouncementsPopUp.kt | 3 +- .../eatery/ui/components/login/AccountPage.kt | 2 +- .../ui/navigation/MainTabbedNavigation.kt | 21 ++- .../eatery/ui/navigation/NavigationItem.kt | 6 +- .../eatery/ui/screens/OnboardingScreen.kt | 11 +- .../android/eatery/ui/screens/SearchScreen.kt | 4 +- .../android/eatery/ui/screens/ThemeSheet.kt | 166 ------------------ .../eatery/ui/screens/UpcomingMenuScreen.kt | 7 - .../android/eatery/ui/theme/Color.kt | 36 ++-- .../android/eatery/util/PreviewData.kt | 8 +- .../android/eatery/util/PreviewUtil.kt | 9 +- 19 files changed, 100 insertions(+), 447 deletions(-) delete mode 100644 app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt delete mode 100644 app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt diff --git a/app/build.gradle b/app/build.gradle index 6cb2926e..d1e621da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,7 +65,6 @@ android { } dependencies { - implementation 'androidx.compose.material3:material3:1.4.0' testImplementation 'junit:junit:4.13.2' implementation 'com.google.android.gms:play-services-location:21.3.0' diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt index 0298650a..55de9ef1 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt @@ -54,7 +54,6 @@ fun CompareMenusBottomSheet( firstEatery: Eatery? = null ) { val compareMenusUIState by compareMenusBottomViewModel.compareMenusUiState.collectAsStateWithLifecycle() - currentColors LaunchedEffect(firstEatery) { compareMenusBottomViewModel.initializedFirstEatery(firstEatery) @@ -92,7 +91,6 @@ fun CompareMenusBottomSheetContent( onFilterClicked: (Filter) -> Unit, onToggleEatery: (Eatery) -> Unit, ) { - val colors = currentColors Column( modifier = Modifier .fillMaxWidth() @@ -113,7 +111,7 @@ fun CompareMenusBottomSheetContent( onClick = onDismiss, modifier = Modifier .size(40.dp) - .background(color = colors.backgroundDefault, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { Icon( Icons.Default.Close, @@ -151,30 +149,31 @@ fun CompareMenusBottomSheetContent( Spacer(modifier = Modifier.height(12.dp)) val coroutineScope = rememberCoroutineScope() + val canCompare = selectedEateries.size >= 2 Button( onClick = { - if (selectedEateries.size >= 2) { - coroutineScope.launch { - delay(100) - onCompareMenusClick(selectedEateries.mapNotNull { it.id }) - } + coroutineScope.launch { + delay(100) + onCompareMenusClick(selectedEateries.mapNotNull { it.id }) } }, + enabled = canCompare, modifier = Modifier .fillMaxWidth() .height(48.dp) .align(Alignment.CenterHorizontally), shape = RoundedCornerShape(100), colors = ButtonDefaults.buttonColors( - containerColor = if (selectedEateries.size < 2) colors.backgroundDefault92 else colors.accentPrimary, - contentColor = if (selectedEateries.size < 2) colors.backgroundDefault else currentColors.backgroundDefault + containerColor = currentColors.accentPrimary, + contentColor = currentColors.backgroundDefault, + disabledContainerColor = currentColors.backgroundDefault92, + disabledContentColor = currentColors.backgroundDefault ) ) { Text( text = if (selectedEateries.size < 2) "Select at least ${2 - selectedEateries.size} more" else "Compare ${selectedEateries.size} now", style = EateryBlueTypography.h5, - color = colors.backgroundDefault ) } } @@ -239,7 +238,7 @@ private fun SelectableEateriesList( } } -@Preview +@Preview(showBackground = true) @Composable fun CompareMenusBottomSheetContentPreview() = EateryPreview { val mockEateries = listOf( @@ -247,21 +246,24 @@ fun CompareMenusBottomSheetContentPreview() = EateryPreview { PreviewData.mockEatery(2).copy(name = "RPCC"), PreviewData.mockEatery(3).copy(name = "Okenshields"), ) - - CompareMenusBottomSheetContent( - onDismiss = {}, - onCompareMenusClick = {}, - filters = listOf(Filter.Selected), - availableFilters = listOf( - Filter.Selected, - Filter.FromEateryFilter.North, - Filter.FromEateryFilter.West, - Filter.FromEateryFilter.Central, - Filter.FromEateryFilter.Under10, - ), - selectedEateries = mockEateries.take(1), - eateries = mockEateries, - onFilterClicked = {}, - onToggleEatery = {}, - ) + Box( + modifier = Modifier.size(400.dp, 600.dp) + ) { + CompareMenusBottomSheetContent( + onDismiss = {}, + onCompareMenusClick = {}, + filters = listOf(Filter.Selected), + availableFilters = listOf( + Filter.Selected, + Filter.FromEateryFilter.North, + Filter.FromEateryFilter.West, + Filter.FromEateryFilter.Central, + Filter.FromEateryFilter.Under10, + ), + selectedEateries = mockEateries.take(1), + eateries = mockEateries, + onFilterClicked = {}, + onToggleEatery = {}, + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt index 6d1919cc..667aab4e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt @@ -143,7 +143,6 @@ fun EateryHourBottomSheet( colors = ButtonDefaults.buttonColors(containerColor = colors.backgroundDefault), shape = RoundedCornerShape(corner = CornerSize(24.dp)), ) { - Text("Close", color = currentColors.textPrimary, fontSize = 18.sp, fontWeight = FontWeight.SemiBold) Text( stringResource(R.string.close), color = currentColors.textPrimary, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt index 9a88572b..f3631224 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt @@ -85,9 +85,9 @@ fun CalendarWeekSelector( modifier = Modifier .size(size = (34 * size).dp) .alpha(size), - color = when { - i == currSelectedDay && currSelectedDay == 0 -> currentColors.accentPrimary - i == currSelectedDay || i == selectedDay -> currentColors.textSecondary + color = when (i) { + currSelectedDay if currSelectedDay == 0 -> currentColors.accentPrimary + currSelectedDay, selectedDay -> currentColors.textSecondary else -> currentColors.textSecondary }, shape = CircleShape diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt deleted file mode 100644 index 46a73c33..00000000 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CustomTextField.kt +++ /dev/null @@ -1,160 +0,0 @@ -package com.cornellappdev.android.eatery.ui.components.general - -import android.view.KeyEvent.KEYCODE_ENTER -import androidx.compose.foundation.background -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Visibility -import androidx.compose.material.icons.filled.VisibilityOff -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.material3.TextFieldDefaults -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.input.key.onKeyEvent -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.text.input.VisualTransformation -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.currentColors - -@Composable -fun CustomTextField( - modifier: Modifier = Modifier, - value: String, - onValueChange: (updated: String) -> Unit, - placeholder: String, - onSubmit: () -> Unit = {}, - backgroundColor: Color = currentColors.backgroundDefault, - enabled: Boolean = true, - focusRequester: FocusRequester? = null, - isPassword: Boolean = false, - singleLine: Boolean = true, - isSentence: Boolean = false, -) { - val interactionSource = remember { MutableInteractionSource() } - var passwordVisible by remember { mutableStateOf(false) } - val passwordVisualTransformation = - if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation() - - Surface( - shape = RoundedCornerShape(8.dp), - ) { - Row( - modifier = Modifier - .background(backgroundColor) - .fillMaxWidth() - .then( - if (singleLine) - Modifier - else - Modifier.fillMaxHeight(.7f) - ), - verticalAlignment = Alignment.CenterVertically - ) { - BasicTextField( - value = value, - onValueChange = { - onValueChange(if (singleLine) it.filter { c -> c != '\n' } else it) - }, - enabled = enabled, - maxLines = 1, - singleLine = singleLine, - visualTransformation = if (isPassword) passwordVisualTransformation else VisualTransformation.None, - textStyle = TextStyle( - color = if (!enabled) currentColors.backgroundDefault10 else currentColors.textPrimary, - fontSize = 16.sp, - fontWeight = FontWeight.Medium - ), - decorationBox = { innerTextField -> - TextFieldDefaults.DecorationBox( - value = value, - innerTextField = innerTextField, - singleLine = singleLine, - enabled = enabled, - visualTransformation = if (isPassword) passwordVisualTransformation else VisualTransformation.None, - trailingIcon = { - if (isPassword) { - IconButton(onClick = { passwordVisible = !passwordVisible }) { - Icon( - imageVector = if (passwordVisible) - Icons.Filled.Visibility - else Icons.Filled.VisibilityOff, - if (passwordVisible) "Hide password" else "Show password" - ) - } - } - }, - placeholder = { - Text( - text = placeholder, - style = EateryBlueTypography.subtitle2, - color = currentColors.textSecondary, - ) - }, - interactionSource = interactionSource, - contentPadding = TextFieldDefaults.textFieldWithoutLabelPadding( - 12.dp, - 12.dp, - 12.dp, - 12.dp - ) - ) - }, - keyboardOptions = KeyboardOptions( - capitalization = if (isSentence) KeyboardCapitalization.Sentences else KeyboardCapitalization.None, - autoCorrect = false, - keyboardType = if (isPassword) KeyboardType.Password else KeyboardType.Text, - ), - keyboardActions = KeyboardActions( - onDone = { - onSubmit() - } - ), - modifier = modifier - .then(Modifier.onKeyEvent { - if (it.nativeKeyEvent.keyCode == KEYCODE_ENTER) { - onSubmit() - true - } else { - false - } - }) - .then( - if (focusRequester != null) - Modifier.focusRequester(focusRequester) - else Modifier - ) - .fillMaxWidth() - .then( - if (singleLine) - Modifier - else - Modifier.fillMaxHeight() - ) - ) - } - } -} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt index a7dd8b3e..a06c8b2e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt @@ -10,7 +10,6 @@ import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R @@ -39,7 +38,7 @@ fun FavoriteButton( fun FavoriteIcon(isFavorite: Boolean, modifier: Modifier = Modifier) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) Color(0xFFFFD700) else currentColors.accentPrimary, + tint = if (isFavorite) currentColors.favorite else currentColors.accentPrimary, modifier = modifier, contentDescription = stringResource( if (isFavorite) R.string.favorite_button_remove else R.string.favorite_button_add diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt index 3146936e..a4ae9178 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt @@ -2,7 +2,6 @@ package com.cornellappdev.android.eatery.ui.components.general import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -20,16 +19,13 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.colorInterp -import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel +import com.cornellappdev.android.eatery.ui.theme.currentColors @Composable fun FilterRow( @@ -39,10 +35,7 @@ fun FilterRow( customItemsBefore: LazyListScope.() -> Unit = {}, customItemsAfter: LazyListScope.() -> Unit = {}, rowState: LazyListState = rememberLazyListState(), - themeViewModel : ThemeViewModel = hiltViewModel() ) { - val isDarkMode by themeViewModel.isDarkMode.collectAsState() - val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() LazyRow( horizontalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(horizontal = 16.dp), @@ -55,7 +48,6 @@ fun FilterRow( onFilterClicked(filter) }, selected = filter in currentFiltersSelected, text = filter.text, - isDarkMode = resolvedDarkMode ) } customItemsAfter() @@ -71,23 +63,15 @@ fun FilterButton( selected: Boolean, text: String, hasExpandIcon: Boolean = false, - isDarkMode: Boolean ) { val progress by animateFloatAsState( targetValue = if (selected) 0f else 1f, label = "Button Color", animationSpec = tween(150) ) - var background = colorInterp(progress, Color.Black, Color(0xFFEFF1F4)) - var contentColor = colorInterp(progress, Color.White, Color.Black) - - if (isDarkMode==true) - { - background = colorInterp(progress, Color.White, Color(0xFF272727)) - contentColor = colorInterp(progress, Color.Black, Color.White) - } - - + val background = colorInterp(progress, currentColors.textPrimary, currentColors.accentPrimary) + val contentColor = + colorInterp(progress, currentColors.oppTextPrimary, currentColors.textPrimary) Button( onClick = onFilterClicked, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index e1c8b9b4..743da4b5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -24,7 +24,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.Placeholder @@ -52,7 +51,12 @@ fun PaymentMethodsAvailable( } else { selectedPaymentMethods.forEachIndexed { index, paymentMethod -> appendInlineContent(id = paymentMethod.name) - pushStyle(SpanStyle(color = paymentMethod.color)) + val paymentMethodColor = when (paymentMethod) { + PaymentMethodsAvailable.BRB -> currentColors.error + PaymentMethodsAvailable.CASH -> currentColors.success + PaymentMethodsAvailable.SWIPES -> currentColors.backgroundSecondary + } + pushStyle(SpanStyle(color = paymentMethodColor)) append(" ${stringResource(paymentMethod.textRes)}") pop() if (index != selectedPaymentMethods.lastIndex) { @@ -127,7 +131,7 @@ fun PaymentMethodsAvailable( Icon( painter = painterResource(id = R.drawable.ic_payment_swipes), contentDescription = stringResource(R.string.payment_methods_meal_swipes), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.SWIPES)) currentColors.backgroundSecondary else currentColors.backgroundDefault92 + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.SWIPES)) currentColors.backgroundSecondary else currentColors.textSecondary ) } } @@ -146,7 +150,7 @@ fun PaymentMethodsAvailable( Icon( painter = painterResource(id = R.drawable.ic_payment_brbs), contentDescription = stringResource(R.string.payment_methods_brbs), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.BRB)) currentColors.error else currentColors.backgroundDefault92 + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.BRB)) currentColors.error else currentColors.textSecondary ) } } @@ -164,7 +168,7 @@ fun PaymentMethodsAvailable( Icon( painter = painterResource(id = R.drawable.ic_payment_cash), contentDescription = stringResource(R.string.payment_methods_cash_or_credit), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.CASH)) currentColors.success else currentColors.backgroundDefault92 + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.CASH)) currentColors.success else currentColors.textSecondary ) } } @@ -199,20 +203,17 @@ fun PaymentMethodsAvailable( } } -enum class PaymentMethodsAvailable(val drawable: Int, val color: Color, val textRes: Int) { +enum class PaymentMethodsAvailable(val drawable: Int, val textRes: Int) { BRB( drawable = R.drawable.ic_small_brbs, - color = Color.Red, textRes = R.string.payment_methods_brbs ), CASH( drawable = R.drawable.ic_small_cash, - color = Color.Green, textRes = R.string.payment_methods_cash_or_credit ), SWIPES( drawable = R.drawable.ic_small_swipes, - color = Color(0xFF808080), textRes = R.string.payment_methods_meal_swipes ); } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt index 03e1c0dd..efebba3b 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/AnnouncementsPopUp.kt @@ -98,7 +98,8 @@ fun AnnouncementsPopUp( Modifier .size(30.dp) .background(currentColors.backgroundDefault, CircleShape) - .clip(CircleShape) + .clip(CircleShape), + tint = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index cc2a5967..02ea4700 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -216,7 +216,7 @@ private fun AccountPageContent( } } -@Preview +@Preview(showBackground = true) @Composable private fun AccountPagePreview() = EateryPreview { AccountPageContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index ba88a515..6524c1e7 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -171,8 +171,7 @@ fun SetupNavHost( modifier: Modifier = Modifier, hasOnboarded: Boolean, navController: NavHostController, - showBottomBar: MutableState, - themeViewModel : ThemeViewModel = hiltViewModel() + showBottomBar: MutableState ) { AppStoreRatingPopup(navigateToSupport = { navController.navigate(Routes.SUPPORT.route) }) @@ -223,7 +222,13 @@ fun SetupNavHost( }, onFavoriteExpand = { navController.navigate(Routes.FAVORITES.route) }, onCompareMenusClick = { selectedEateries -> - navController.navigate("comparemenus/${selectedEateries.joinToString(",") { it.toString() }}") + navController.navigate( + "${Routes.COMPAREMENUS.route}/${ + selectedEateries.joinToString( + "," + ) { it.toString() } + }" + ) }, onNotificationsClick = { navController.navigate("notifications_home") @@ -263,7 +268,13 @@ fun SetupNavHost( }) { EateryDetailScreen( onCompareMenusClick = { selectedEateriesIds -> - navController.navigate("comparemenus/${selectedEateriesIds.joinToString(",") { it.toString() }}") + navController.navigate( + "${Routes.COMPAREMENUS.route}/${ + selectedEateriesIds.joinToString( + "," + ) { it.toString() } + }" + ) } ) } @@ -479,7 +490,7 @@ fun SetupNavHost( SupportScreen() } composable( - route = "comparemenus/{eateryIds}", + route = "${Routes.COMPAREMENUS.route}/{eateryIds}", arguments = listOf(navArgument("eateryIds") { type = NavType.StringType }), enterTransition = { fadeIn(animationSpec = tween(durationMillis = 500)) }, exitTransition = { fadeOut(animationSpec = tween(durationMillis = 500)) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt index 61509fe2..1d64562a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/NavigationItem.kt @@ -53,8 +53,7 @@ sealed class NavigationItem( Routes.FAVORITES.route, Routes.LEGAL.route, Routes.PRIVACY.route, - Routes.SUPPORT.route, - Routes.THEME.route + Routes.SUPPORT.route ) ) @@ -97,6 +96,5 @@ enum class Routes(override var route: String) : NavUnit { LEGAL("legal"), PRIVACY("privacy"), SUPPORT("support"), - COMPAREMENUS("compare_menus"), - THEME("theme") + COMPAREMENUS("comparemenus"), } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt index 5d1ea8bd..bab61c37 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt @@ -62,7 +62,6 @@ fun OnboardingScreenContent( proceedHome: () -> Unit ) { val pagerState = rememberPagerState(pageCount = { 2 }) - val colors = currentColors val coroutineScope = rememberCoroutineScope() var fadePage by rememberSaveable { mutableStateOf(false) } val cornell = stringResource(R.string.onboarding_cornell) @@ -84,7 +83,7 @@ fun OnboardingScreenContent( Icon( painter = painterResource(id = R.drawable.ic_eaterylogo_blue), - tint = colors.backgroundSecondary, + tint = currentColors.backgroundSecondary, modifier = Modifier .width(96.dp) .height(96.dp), @@ -110,7 +109,7 @@ fun OnboardingScreenContent( fadePage = true } }, - colors = ButtonDefaults.buttonColors(containerColor = currentColors.backgroundDefault), + colors = ButtonDefaults.buttonColors(containerColor = currentColors.accentPrimary), elevation = ButtonDefaults.buttonElevation( defaultElevation = 4.dp, pressedElevation = 4.dp, @@ -137,13 +136,13 @@ fun OnboardingScreenContent( painter = painterResource(id = R.drawable.ic_appdev), modifier = Modifier.padding(end = 6.dp), contentDescription = null, - tint = colors.backgroundDefault10 + tint = currentColors.backgroundDefault10 ) Text( buildAnnotatedString { withStyle( style = SpanStyle( - color = colors.backgroundDefault10, + color = currentColors.backgroundDefault10, fontWeight = FontWeight.Normal ) ) { @@ -151,7 +150,7 @@ fun OnboardingScreenContent( } withStyle( style = SpanStyle( - color = colors.backgroundDefault10, + color = currentColors.backgroundDefault10, fontWeight = FontWeight.SemiBold ) ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt index a91868be..1e750be4 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt @@ -240,7 +240,7 @@ private fun SearchScreenContent( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(colors.backgroundDefault) + .background(colors.borderDefault) ) } } @@ -450,7 +450,7 @@ fun FavoriteItem( component = rememberImageComponent { +ShimmerPlugin( Shimmer.Flash( - baseColor = currentColors.backgroundDefault, + baseColor = currentColors.borderDefault, highlightColor = colors.backgroundDefault, duration = 350, dropOff = 0.65f, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt deleted file mode 100644 index 66634623..00000000 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ThemeSheet.kt +++ /dev/null @@ -1,166 +0,0 @@ -package com.cornellappdev.android.eatery.ui.screens - -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults.buttonColors -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.RadioButton -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import com.cornellappdev.android.eatery.R -import com.cornellappdev.android.eatery.ui.components.settings.SettingsLineSeparator -import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography -import com.cornellappdev.android.eatery.ui.theme.currentColors -import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun ThemeSheet(viewModel : ThemeViewModel = hiltViewModel(), - onDismiss : () -> Unit) -{ - rememberCoroutineScope() - var darkMode by remember { mutableStateOf(false) } - var lightMode by remember { mutableStateOf(false) } - var systemMode by remember { mutableStateOf(false) } - isSystemInDarkTheme() - - Column( - modifier = Modifier - .fillMaxWidth() - .background(color = currentColors.backgroundDefault) - .padding( - horizontal = 16.dp, - vertical = 24.dp - ) - .verticalScroll(rememberScrollState()), - verticalArrangement = Arrangement.SpaceAround - ) - { - Text( - "Display", - style = EateryBlueTypography.h4, - color = currentColors.textPrimary, - modifier = Modifier.padding(vertical = 16.dp) - ) - - ThemeRow( - text = "Light", - isSelected = lightMode == true, - iconId = R.drawable.light_mode, - onClick = { - darkMode = false - lightMode = true - systemMode=false - } - ) - SettingsLineSeparator() - ThemeRow( - text = "Dark", - isSelected = darkMode == true, - iconId = R.drawable.dark_mode, - onClick = { - darkMode = true - lightMode = false - systemMode=false - } - ) - SettingsLineSeparator() - ThemeRow( - text = "Device Theme", - isSelected = systemMode == true, - iconId = R.drawable.system_setting, - onClick = { - darkMode = false - lightMode = false - systemMode = true - } - ) - - Button( - onClick = { - if (darkMode) { - viewModel.toggleDarkMode() - } else if (lightMode) { - viewModel.toggleLightMode() - } else if (systemMode) { - viewModel.toggleSystemMode() - } - onDismiss() - }, - modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(32.dp), - colors = buttonColors( - containerColor = currentColors.backgroundSecondary, - contentColor = currentColors.textPrimary - ) - ) - { - Text( - "Done", fontWeight = FontWeight.Bold, textAlign = TextAlign.Center, - color = currentColors.oppTextPrimary - ) - } - - - } - } - - - - - - -@Composable -fun ThemeRow(text: String, iconId : Int, isSelected : Boolean, onClick : () -> Unit) -{ - Row(modifier = Modifier - .fillMaxWidth() - .padding(8.dp) - .clickable { onClick() }, - verticalAlignment = Alignment.CenterVertically) - - { - Icon( - painter = painterResource(id = iconId), - tint = currentColors.textPrimary, - contentDescription = null, - modifier = Modifier.size(24.dp) - ) - Spacer(modifier = Modifier.width(12.dp)) - Text(text = text, - style = EateryBlueTypography.body1, - color = currentColors.textPrimary, - modifier = Modifier.weight(1f)) - RadioButton(selected = isSelected, - onClick = { - onClick() - }) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index 4949aef3..39a4f57e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -4,7 +4,6 @@ import androidx.compose.animation.AnimatedContent import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -25,7 +24,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -55,7 +53,6 @@ import com.cornellappdev.android.eatery.ui.components.upcoming.UpcomingLoadingIt import com.cornellappdev.android.eatery.ui.components.upcoming.UpcomingLoadingItem.Companion.CreateUpcomingLoadingItem import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors -import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import com.cornellappdev.android.eatery.ui.viewmodels.UpcomingMenusViewState import com.cornellappdev.android.eatery.ui.viewmodels.UpcomingViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse @@ -376,10 +373,7 @@ private fun UpcomingFilterRow( selectedFilters: List, onToggleFilterClicked: (Filter) -> Unit, filterRowState: LazyListState, - themeViewModel : ThemeViewModel = hiltViewModel() ) { - val isDarkMode by themeViewModel.isDarkMode.collectAsState() - val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() FilterRow( customItemsBefore = { item { @@ -390,7 +384,6 @@ private fun UpcomingFilterRow( selected = true, text = mealFilter.displayName, hasExpandIcon = true, - isDarkMode = resolvedDarkMode ) } }, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt index 31cc09f0..c4a417c4 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt @@ -2,23 +2,7 @@ package com.cornellappdev.android.eatery.ui.theme import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb -/* -val EateryBlue = Color(0xFF4A90E2) -val colors.backgroundDefault = Color(0xFFEFF1F4) -val colors.backgroundSecondary = Color(0xFFE1E4E8) -val backgroundDefault92 = Color(0xFFD1D5DA) -val colors.backgroundDefault10 = Color(0xFF959da5) -val colors.textSecondary = Color(0xFF586069) -val colors.textPrimary = Color(0xFF444D56) -val LightBlue = Color(0xFFE8EFF8) -val LightRed = Color(0xFFFEF0EF) -val Red = Color(0xFFF2655D) -val Green = Color(0xFF63C774) -val colors.accentPressed = Color(0xFFFEC50E) -val Orange = Color(0xFFFF990E) -val Black = Color(0xFF050505) - */ // Error colors val ErrorLight = Color(0xFFF2655D) val ErrorDark = Color(0xFFF2655D) @@ -27,6 +11,10 @@ val ErrorDark = Color(0xFFF2655D) val SuccessLight = Color(0xFF63C774) val SuccessDark = Color(0xFF76CE85) +// Warning colors (e.g., for "Closing Soon" status) +val WarningLight = Color(0xFFFFA500) +val WarningDark = Color(0xFFFFA500) + // Background colors val BgDefaultLight = Color(0xFFFFFFFF) val BgDefaultDark = Color(0xFF141414) @@ -63,6 +51,10 @@ val AccentPressedDark = Color(0xFF1C1C1C) val BorderDefaultLight = Color(0xFFE1E4E8) val BorderDefaultDark = Color(0xFF282828) +// Favorite colors +val FavoriteLight = Color(0xFFFFD700) +val FavoriteDark = Color(0xFFFFD700) + /** * Interpolates a color between [color1] and [color2] by choosing a color a [fraction] in between. @@ -111,6 +103,8 @@ object ColorTheme accentPrimary = AccentPrimaryLight, accentPressed = AccentPressedLight, borderDefault = BorderDefaultLight, + favorite = FavoriteLight, + warning = WarningLight, ) val darkMode = ColorMode( error = ErrorDark, @@ -125,7 +119,9 @@ object ColorTheme textSecondary = TextSecondaryDark, accentPrimary = AccentPrimaryDark, accentPressed = AccentPressedDark, - borderDefault = BorderDefaultDark + borderDefault = BorderDefaultDark, + favorite = FavoriteDark, + warning = WarningDark, ) } @@ -142,6 +138,8 @@ data class ColorMode( val oppTextPrimary : Color, val textSecondary : Color, val accentPrimary : Color, - val accentPressed : Color, - val borderDefault : Color + val accentPressed: Color, + val borderDefault: Color, + val favorite: Color, + val warning: Color ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewData.kt b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewData.kt index abba05f3..a4e9fe89 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewData.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewData.kt @@ -1,7 +1,5 @@ package com.cornellappdev.android.eatery.util -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Color.Companion.Green import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.data.models.EateryStatus import com.cornellappdev.android.eatery.data.models.Event @@ -12,6 +10,8 @@ import com.cornellappdev.android.eatery.ui.components.general.MenuCategoryViewSt import com.cornellappdev.android.eatery.ui.components.general.MenuItemViewState import com.cornellappdev.android.eatery.ui.components.upcoming.EateryHours import com.cornellappdev.android.eatery.ui.components.upcoming.MenuCardViewState +import com.cornellappdev.android.eatery.ui.theme.SuccessLight +import com.cornellappdev.android.eatery.ui.theme.WarningLight import com.cornellappdev.android.eatery.ui.viewmodels.EateriesSection import com.cornellappdev.android.eatery.ui.viewmodels.UpcomingMenusViewState import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse @@ -81,7 +81,7 @@ object PreviewData { ), eateryStatus = EateryStatus( statusText = "Open", - statusColor = Green + statusColor = SuccessLight ), menu = listOf( MenuCategoryViewState( @@ -113,7 +113,7 @@ object PreviewData { ), eateryStatus = EateryStatus( statusText = "Closing Soon", - statusColor = Color(0xFFFFA500) // Orange + statusColor = WarningLight ), menu = listOf( MenuCategoryViewState( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt index 415d70b8..0d25c5de 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt @@ -1,17 +1,12 @@ package com.cornellappdev.android.eatery.util -import androidx.compose.foundation.background -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import com.cornellappdev.android.eatery.ui.theme.AppColorTheme import com.cornellappdev.android.eatery.ui.theme.ColorTheme @Composable -fun EateryPreview(content : @Composable () -> Unit) { - AppColorTheme(colorMode = ColorTheme.lightMode) +fun EateryPreview(darkMode: Boolean = false, content: @Composable () -> Unit) { + AppColorTheme(colorMode = if (darkMode) ColorTheme.darkMode else ColorTheme.lightMode) { content() } From 3411e2ecb74f7225f6c3695a1d5aa154099393fc Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Fri, 24 Apr 2026 15:55:35 -0400 Subject: [PATCH 06/31] More nit fixes --- .../eatery/ui/navigation/MainTabbedNavigation.kt | 11 +++++------ .../android/eatery/ui/screens/SearchScreen.kt | 8 +++----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index 6524c1e7..05f953e6 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -126,11 +126,10 @@ fun BottomNavigationBar(navController: NavHostController, val currentRoute = currentRoute(navController) tabItems.forEach { item -> val isSelected = item.selectedRoutes.contains(currentRoute) - val iconId = when { - resolvedDarkMode && isSelected -> item.selectedDarkIconId - !resolvedDarkMode && isSelected -> item.selectedIconId - - else -> item.unselectedIconId + val iconId = if (isSelected) { + if (resolvedDarkMode) item.selectedDarkIconId else item.selectedIconId + } else { + item.unselectedIconId } NavigationBarItem( @@ -143,7 +142,7 @@ fun BottomNavigationBar(navController: NavHostController, tint = Color.Unspecified ) }, - selected = item.selectedRoutes.contains(currentRoute), + selected = isSelected, colors = NavigationBarItemDefaults.colors( indicatorColor = Color.Transparent ), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt index 1e750be4..3ccf9a96 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt @@ -137,7 +137,6 @@ private fun SearchScreenContent( onEateryClick: (Eatery) -> Unit, onFavoriteClick: () -> Unit, ) { - val colors = currentColors val selectedPaymentMethodFilters = remember { mutableStateListOf() } val focusRequester = remember { FocusRequester() } val modalBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) @@ -240,7 +239,7 @@ private fun SearchScreenContent( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(colors.borderDefault) + .background(currentColors.borderDefault) ) } } @@ -283,7 +282,7 @@ private fun SearchScreenContent( modifier = Modifier .size(40.dp) .background( - color = colors.backgroundDefault, + color = currentColors.backgroundDefault, shape = CircleShape ) ) { @@ -429,7 +428,6 @@ private fun SearchScreenPreview() = EateryPreview { fun FavoriteItem( eatery: Eatery, onEateryClick: (eatery: Eatery) -> Unit ) { - val colors = currentColors Column( modifier = Modifier .width(96.dp) @@ -451,7 +449,7 @@ fun FavoriteItem( +ShimmerPlugin( Shimmer.Flash( baseColor = currentColors.borderDefault, - highlightColor = colors.backgroundDefault, + highlightColor = currentColors.backgroundDefault, duration = 350, dropOff = 0.65f, tilt = 20f From 1360613996008ef90b5b4364b0032abe318e4d92 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Fri, 24 Apr 2026 16:01:51 -0400 Subject: [PATCH 07/31] Fix preview --- .../ui/navigation/MainTabbedNavigation.kt | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index 05f953e6..1598eb11 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -61,11 +61,16 @@ import com.cornellappdev.android.eatery.util.EateryPreview @OptIn(ExperimentalAnimationApi::class) @Composable -fun NavigationSetup(hasOnboarded: Boolean) { +fun NavigationSetup( + hasOnboarded: Boolean, + themeViewModel: ThemeViewModel = hiltViewModel() +) { val navController = rememberNavController() val showBottomBar = rememberSaveable { mutableStateOf(false) } + val isDarkMode by themeViewModel.isDarkMode.collectAsState() + val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() // Subscribe to navBackStackEntry, required to get current route val navBackStackEntry by navController.currentBackStackEntryAsState() @@ -98,7 +103,11 @@ fun NavigationSetup(hasOnboarded: Boolean) { } ) { state -> if (state) { - BottomNavigationBar(navController, NavigationItem.bottomNavTabList) + BottomNavigationBar( + navController = navController, + tabItems = NavigationItem.bottomNavTabList, + darkMode = resolvedDarkMode + ) } } } @@ -113,21 +122,20 @@ fun NavigationSetup(hasOnboarded: Boolean) { } @Composable -fun BottomNavigationBar(navController: NavHostController, - tabItems: List, - themeViewModel : ThemeViewModel = hiltViewModel()) { +fun BottomNavigationBar( + navController: NavHostController, + tabItems: List, + darkMode: Boolean +) { NavigationBar( containerColor = currentColors.accentPrimary, contentColor = currentColors.accentPressed ) { - val isDarkMode by themeViewModel.isDarkMode.collectAsState() - val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() - val currentRoute = currentRoute(navController) tabItems.forEach { item -> - val isSelected = item.selectedRoutes.contains(currentRoute) + val isSelected = item.selectedRoutes.contains(currentRoute) val iconId = if (isSelected) { - if (resolvedDarkMode) item.selectedDarkIconId else item.selectedIconId + if (darkMode) item.selectedDarkIconId else item.selectedIconId } else { item.unselectedIconId } @@ -160,7 +168,8 @@ fun BottomNavigationBar(navController: NavHostController, private fun BottomNavBarPreview() = EateryPreview { BottomNavigationBar( navController = rememberNavController(), - tabItems = NavigationItem.bottomNavTabList + tabItems = NavigationItem.bottomNavTabList, + darkMode = false ) } From f1c2defb67419c78a52ae96b60d889441b125d63 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Fri, 24 Apr 2026 16:10:36 -0400 Subject: [PATCH 08/31] coderabbit fixes --- .../general/PaymentMethodsAvailable.kt | 2 +- .../eatery/ui/components/login/AccountPage.kt | 74 +++++++++---------- .../eatery/ui/screens/UpcomingMenuScreen.kt | 1 - 3 files changed, 38 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index 743da4b5..63db334e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -190,7 +190,7 @@ fun PaymentMethodsAvailable( .padding(top = 12.dp, bottom = 12.dp) .fillMaxWidth(), colors = ButtonDefaults.buttonColors( - containerColor = currentColors.backgroundDefault, + containerColor = currentColors.backgroundDefault92, contentColor = currentColors.textPrimary ) ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index 02ea4700..5aca6ab2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -216,41 +216,6 @@ private fun AccountPageContent( } } -@Preview(showBackground = true) -@Composable -private fun AccountPagePreview() = EateryPreview { - AccountPageContent( - onSettingsClicked = {}, - accountTypeBalance = AccountBalances( - brbBalance = 25.50, - cityBucksBalance = 10.75, - laundryBalance = 5.00, - mealSwipes = 42 - ), - accountFilter = TransactionAccountType.BRBS, - showBottomSheet = {}, - filterText = "", - setFilterText = {}, - filteredTransactions = listOf( - DisplayTransaction( - id = "2023-10-01T12:30:00.000Z|Cafe Jennie|5.25|BRBS", - amount = 5.25, - accountType = TransactionAccountType.BRBS, - location = "Cafe Jennie", - formattedDate = "12:30 PM · Sunday, October 1" - ), - DisplayTransaction( - id = "2023-10-02T14:00:00.000Z|Morrison Dining|15.0|BRBS", - amount = 15.00, - accountType = TransactionAccountType.BRBS, - location = "Morrison Dining", - formattedDate = "2:00 PM · Monday, October 2" - ) - ), - setSheetContent = {} - ) -} - @Composable private fun TransactionsHeader( accountFilter: TransactionAccountType, @@ -261,7 +226,7 @@ private fun TransactionsHeader( ) { Column( modifier = Modifier - .background(color = Color.White) + .background(color = currentColors.backgroundDefault) ) { Row( modifier = Modifier.padding(top = 12.dp, start = 16.dp, end = 16.dp), @@ -568,7 +533,7 @@ fun AccountTypesSelector( } if (index != selectedPaymentMethod.lastIndex) { HorizontalDivider( - color = currentColors.backgroundDefault, + color = currentColors.accentPrimary, thickness = 1.dp, modifier = Modifier.padding(horizontal = 16.dp) ) @@ -609,3 +574,38 @@ private fun TransactionAccountType.displayNameRes(): Int = when (this) { TransactionAccountType.CITY_BUCKS -> R.string.account_type_city_bucks } + +@Preview(showBackground = true) +@Composable +private fun AccountPagePreview() = EateryPreview { + AccountPageContent( + onSettingsClicked = {}, + accountTypeBalance = AccountBalances( + brbBalance = 25.50, + cityBucksBalance = 10.75, + laundryBalance = 5.00, + mealSwipes = 42 + ), + accountFilter = TransactionAccountType.BRBS, + showBottomSheet = {}, + filterText = "", + setFilterText = {}, + filteredTransactions = listOf( + DisplayTransaction( + id = "2023-10-01T12:30:00.000Z|Cafe Jennie|5.25|BRBS", + amount = 5.25, + accountType = TransactionAccountType.BRBS, + location = "Cafe Jennie", + formattedDate = "12:30 PM · Sunday, October 1" + ), + DisplayTransaction( + id = "2023-10-02T14:00:00.000Z|Morrison Dining|15.0|BRBS", + amount = 15.00, + accountType = TransactionAccountType.BRBS, + location = "Morrison Dining", + formattedDate = "2:00 PM · Monday, October 2" + ) + ), + setSheetContent = {} + ) +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index 39a4f57e..a6e25a2a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -119,7 +119,6 @@ private fun UpcomingMenuScreenContent( if (showMealBottomSheet) { ModalBottomSheet( sheetState = modalBottomSheetState, - containerColor = currentColors.accentPrimary, contentColor = currentColors.textPrimary, onDismissRequest = { showMealBottomSheet = false }, shape = RoundedCornerShape( From 36bb8948b934ccd5a6985e211b89aabbc15a0e25 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Fri, 24 Apr 2026 16:12:08 -0400 Subject: [PATCH 09/31] add previews --- .../general/PaymentMethodsAvailable.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index 63db334e..7ceebe93 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -31,11 +31,13 @@ import androidx.compose.ui.text.PlaceholderVerticalAlign import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.EateryPreview @Composable @@ -217,3 +219,29 @@ enum class PaymentMethodsAvailable(val drawable: Int, val textRes: Int) { textRes = R.string.payment_methods_meal_swipes ); } + +@Preview(name = "Payment methods - all", showBackground = true) +@Composable +private fun PaymentMethodsAvailableAllPreview() { + EateryPreview { + PaymentMethodsAvailable( + selectedPaymentMethods = PaymentMethodsAvailable.entries, + hide = {} + ) + } +} + +@Preview(name = "Payment methods - partial (dark)", showBackground = true) +@Composable +private fun PaymentMethodsAvailablePartialDarkPreview() { + EateryPreview(darkMode = true) { + PaymentMethodsAvailable( + selectedPaymentMethods = listOf( + PaymentMethodsAvailable.BRB, + PaymentMethodsAvailable.CASH + ), + hide = {} + ) + } +} + From f292e3dbfa2c4ce9050542862766a147fd1e4994 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Fri, 24 Apr 2026 16:49:03 -0400 Subject: [PATCH 10/31] Add dark mode previews --- .../comparemenus/CompareMenusBottomSheet.kt | 6 ++--- .../ui/components/details/CalendarButton.kt | 6 ++--- .../ui/components/details/EateryMealTabs.kt | 6 ++--- .../details/EateryMenusBottomSheet.kt | 5 +++-- .../ui/components/details/FavoritesToggle.kt | 6 ++--- .../components/details/ItemFavoritesCard.kt | 6 ++--- .../components/general/AppStoreRatingPopup.kt | 8 +++---- .../ui/components/general/EateryCard.kt | 6 ++--- .../general/PaymentMethodsAvailable.kt | 8 +++---- .../general/PermissionRequestDialog.kt | 5 +++-- .../eatery/ui/components/general/SearchBar.kt | 6 ++--- .../components/home/EateryDetailsLoading.kt | 6 ++--- .../ui/components/home/EateryHomeSection.kt | 5 +++-- .../eatery/ui/components/login/AccountPage.kt | 6 ++--- .../eatery/ui/components/login/LoginPage.kt | 7 +++--- .../onboarding/OnboardingCarousel.kt | 6 ++--- .../components/onboarding/OnboardingHeader.kt | 6 ++--- .../components/onboarding/OnboardingPage.kt | 6 ++--- .../components/settings/ReportBottomSheet.kt | 8 +++---- .../ui/components/upcoming/MealBottomSheet.kt | 5 +++-- .../eatery/ui/components/upcoming/MenuCard.kt | 5 +++-- .../ui/components/upcoming/UpcomingLoading.kt | 5 +++-- .../ui/navigation/MainTabbedNavigation.kt | 5 +++-- .../android/eatery/ui/screens/AboutScreen.kt | 4 ++-- .../eatery/ui/screens/CompareMenusScreen.kt | 4 ++-- .../eatery/ui/screens/EateryDetailScreen.kt | 5 +++-- .../eatery/ui/screens/FavoritesScreen.kt | 8 +++---- .../android/eatery/ui/screens/HomeScreen.kt | 22 +++++++++++-------- .../android/eatery/ui/screens/LegalScreen.kt | 4 ++-- .../eatery/ui/screens/NearestScreen.kt | 6 ++--- .../ui/screens/NotificationsHomeScreen.kt | 4 ++-- .../ui/screens/NotificationsSettingsScreen.kt | 4 ++-- .../eatery/ui/screens/OnboardingScreen.kt | 4 ++-- .../eatery/ui/screens/PrivacyScreen.kt | 4 ++-- .../eatery/ui/screens/ProfileScreen.kt | 6 ++--- .../android/eatery/ui/screens/SearchScreen.kt | 5 +++-- .../eatery/ui/screens/SettingsScreen.kt | 4 ++-- .../eatery/ui/screens/SupportScreen.kt | 4 ++-- .../eatery/ui/screens/UpcomingMenuScreen.kt | 8 +++---- .../android/eatery/util/PreviewUtil.kt | 12 +++++++--- 40 files changed, 132 insertions(+), 114 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt index 55de9ef1..d7d53fed 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt @@ -31,7 +31,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -41,6 +40,7 @@ import com.cornellappdev.android.eatery.ui.components.general.FilterRow import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.CompareMenusBottomViewModel +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import kotlinx.coroutines.delay @@ -238,7 +238,7 @@ private fun SelectableEateriesList( } } -@Preview(showBackground = true) +@DualModePreview @Composable fun CompareMenusBottomSheetContentPreview() = EateryPreview { val mockEateries = listOf( @@ -266,4 +266,4 @@ fun CompareMenusBottomSheetContentPreview() = EateryPreview { onToggleEatery = {}, ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt index a69c36fa..3fc4a265 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt @@ -16,11 +16,11 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @Composable @@ -46,8 +46,8 @@ fun CalendarButton(onClick: () -> Unit) { } } -@Preview +@DualModePreview @Composable private fun CalendarButtonPreview() = EateryPreview { CalendarButton { } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt index 556131a9..6da2eee3 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt @@ -8,10 +8,10 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @@ -51,8 +51,8 @@ fun EateryMealTabs(selectedMealIndex: Int, onSelectMeal: (Int) -> Unit, meals: L } } -@Preview +@DualModePreview @Composable fun EateryMealTabsPreview() = EateryPreview { EateryMealTabs(0, {}, listOf("Breakfast", "Lunch", "Dinner")) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt index aba568ef..189506b2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt @@ -35,7 +35,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R @@ -45,6 +44,7 @@ import com.cornellappdev.android.eatery.data.models.MealTime import com.cornellappdev.android.eatery.ui.components.general.CalendarWeekSelector import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.toMealTypeDisplayName @@ -265,7 +265,7 @@ fun EateryMenusBottomSheet( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun EateryMenusBottomSheetPreview() = EateryPreview { val zoneId = ZoneId.of("America/New_York") @@ -304,3 +304,4 @@ private fun EateryMenusBottomSheetPreview() = EateryPreview { onResetClick = {} ) } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt index 62ce5f1a..e10927e7 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt @@ -19,11 +19,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @Composable @@ -72,11 +72,11 @@ fun ToggleRow(toggle: Boolean, setToggle: (Boolean) -> Unit) { } } - -@Preview +@DualModePreview @Composable private fun FavoritesTogglePreview() = EateryPreview { var active by remember { mutableStateOf(false) } FavoritesToggle({ active = !active }, "Eateries", active) } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt index c796e46d..dcb6a8ec 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt @@ -24,7 +24,6 @@ import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -33,6 +32,7 @@ import com.cornellappdev.android.eatery.data.models.EateryStatus import com.cornellappdev.android.eatery.ui.components.general.FavoriteButton import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.conditional @@ -126,7 +126,7 @@ fun ItemInformation(meal: String, eateryName: List) { } -@Preview +@DualModePreview @Composable private fun FavoritesCardPreview() = EateryPreview { ItemFavoritesCard( @@ -142,4 +142,4 @@ private fun FavoritesCardPreview() = EateryPreview { ), onFavoriteClick = {} ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt index e0767a70..102870a2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt @@ -37,7 +37,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.core.net.toUri @@ -47,6 +46,7 @@ import com.cornellappdev.android.eatery.ui.components.home.EateryDetailLoadingSc import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.AppStorePopupRepository +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.appStorePopupRepository import com.valentinilk.shimmer.ShimmerBounds import com.valentinilk.shimmer.rememberShimmer @@ -134,7 +134,7 @@ private fun ActionPrompt( } } -@Preview +@DualModePreview @Composable private fun ActionPromptPreview() { ActionPrompt(actionText = "Awesome! We'd love to hear more in a review.", @@ -207,8 +207,8 @@ private fun AppStoreRatingCardBorder( @Composable -@Preview +@DualModePreview private fun AppStoreRatingCardPreview() { EateryDetailLoadingScreen(shimmer = rememberShimmer(ShimmerBounds.View)) Dialog(onDismissRequest = {}) { AppStoreRatingDialog(navigateToSupport = {}, onDismiss = {}) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt index 0a252db1..fb89d4b8 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt @@ -48,7 +48,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -59,6 +58,7 @@ import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.colorInterp import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview enum class EateryCardStyle { @@ -411,7 +411,7 @@ fun EateryMenuSummary(eatery: Eatery) { } } -@Preview +@DualModePreview @Composable private fun EateryCardPreview() = EateryPreview { EateryCard( @@ -425,4 +425,4 @@ private fun EateryCardPreview() = EateryPreview { onFavoriteClick = {}, style = EateryCardStyle.DEFAULT ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index 7ceebe93..b7c55aac 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -31,12 +31,12 @@ import androidx.compose.ui.text.PlaceholderVerticalAlign import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @@ -220,7 +220,7 @@ enum class PaymentMethodsAvailable(val drawable: Int, val textRes: Int) { ); } -@Preview(name = "Payment methods - all", showBackground = true) +@DualModePreview @Composable private fun PaymentMethodsAvailableAllPreview() { EateryPreview { @@ -231,10 +231,10 @@ private fun PaymentMethodsAvailableAllPreview() { } } -@Preview(name = "Payment methods - partial (dark)", showBackground = true) +@DualModePreview @Composable private fun PaymentMethodsAvailablePartialDarkPreview() { - EateryPreview(darkMode = true) { + EateryPreview { PaymentMethodsAvailable( selectedPaymentMethods = listOf( PaymentMethodsAvailable.BRB, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt index cf2a6b0b..990849b9 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt @@ -38,11 +38,11 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.content.ContextCompat import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.LocationHandler import com.google.accompanist.permissions.ExperimentalPermissionsApi @@ -162,7 +162,7 @@ private fun Context.openSettings() { startActivity(intent) } -@Preview +@DualModePreview @Composable fun PermissionRequestDialogPreview() = EateryPreview { PermissionRequestDialog( @@ -172,3 +172,4 @@ fun PermissionRequestDialogPreview() = EateryPreview { ) } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt index 63b52d59..1838b6dc 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt @@ -31,12 +31,12 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import kotlinx.coroutines.delay @@ -135,7 +135,7 @@ fun SearchBar( } } -@Preview +@DualModePreview @Composable fun SearchBarPreview() = EateryPreview { SearchBar( @@ -144,4 +144,4 @@ fun SearchBarPreview() = EateryPreview { placeholderText = stringResource(R.string.search_placeholder_menu), onCancelClicked = {} ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt index 4904e347..a0443660 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt @@ -17,9 +17,9 @@ import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.valentinilk.shimmer.Shimmer import com.valentinilk.shimmer.ShimmerBounds @@ -240,8 +240,7 @@ fun PaymentsBlob() { } } - -@Preview(showBackground = true) +@DualModePreview @Composable private fun EateryDetailLoadingScreenPreview() = EateryPreview { val shimmer = rememberShimmer(ShimmerBounds.View) @@ -256,3 +255,4 @@ private fun EateryDetailLoadingScreenPreview() = EateryPreview { enum class BottomSheetContent { PAYMENT_METHODS_AVAILABLE, HOURS, WAIT_TIME, REPORT, ACCOUNT_TYPE, MENUS, COMPARE_MENUS } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt index 2de5fc08..5c2e62da 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt @@ -26,13 +26,13 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.ui.components.general.EateryCard import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.popIn import com.cornellappdev.android.eatery.util.popOut @@ -168,7 +168,7 @@ private fun EaterySectionRow( } } -@Preview +@DualModePreview @Composable private fun EateryHomeSectionPreview() { Column(modifier = Modifier @@ -191,3 +191,4 @@ private fun EateryHomeSectionPreview() { ) } } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index 5aca6ab2..d36cbca5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -50,7 +50,6 @@ import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R @@ -61,6 +60,7 @@ import com.cornellappdev.android.eatery.ui.components.home.BottomSheetContent import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.state.DisplayTransaction +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import kotlin.math.abs @@ -574,8 +574,7 @@ private fun TransactionAccountType.displayNameRes(): Int = when (this) { TransactionAccountType.CITY_BUCKS -> R.string.account_type_city_bucks } - -@Preview(showBackground = true) +@DualModePreview @Composable private fun AccountPagePreview() = EateryPreview { AccountPageContent( @@ -609,3 +608,4 @@ private fun AccountPagePreview() = EateryPreview { setSheetContent = {} ) } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt index 4416e40a..9ffa85f6 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt @@ -39,7 +39,6 @@ import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.viewinterop.AndroidView @@ -48,6 +47,7 @@ import com.cornellappdev.android.eatery.BuildConfig import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.valentinilk.shimmer.ShimmerBounds import com.valentinilk.shimmer.rememberShimmer @@ -271,8 +271,7 @@ private class CustomWebViewClient( } } - -@Preview +@DualModePreview @Composable private fun LoginPagePreview() = EateryPreview { LoginPage( @@ -285,4 +284,4 @@ private fun LoginPagePreview() = EateryPreview { } @Composable -private fun isPreview() = LocalInspectionMode.current \ No newline at end of file +private fun isPreview() = LocalInspectionMode.current diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt index a9333b6c..ab2e62c5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt @@ -31,11 +31,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color.Companion.Black import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @OptIn(ExperimentalAnimationApi::class) @@ -326,7 +326,7 @@ private fun pagerOffsetForPage(state: PagerState, page: Int): Float { return (state.currentPage - page) + state.currentPageOffsetFraction } -@Preview +@DualModePreview @Composable private fun OnboardingCarouselPreview() = EateryPreview { OnboardingCarousel( @@ -334,4 +334,4 @@ private fun OnboardingCarouselPreview() = EateryPreview { onSkipClicked = {}, onProceed = {} ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt index 8e570cc7..1a469956 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingHeader.kt @@ -15,11 +15,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import kotlin.math.absoluteValue import kotlin.math.pow @@ -95,8 +95,8 @@ fun OnboardingHeader( } } -@Preview +@DualModePreview @Composable fun OnboardingHeaderPreview() = EateryPreview { OnboardingHeader(num = 0, pagerOffset = 0f, onSkipClicked = {}) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingPage.kt index e8506e1d..2dd24ff1 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingPage.kt @@ -11,8 +11,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview import com.cornellappdev.android.eatery.R +import com.cornellappdev.android.eatery.util.DualModePreview import kotlin.math.absoluteValue @Composable @@ -68,8 +68,8 @@ fun OnboardingPage( } } -@Preview +@DualModePreview @Composable private fun OnboardingPagePreview() { OnboardingPage(num = 0, pagerOffset = 0f) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt index 4508400a..146a59d3 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt @@ -48,7 +48,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R @@ -58,6 +57,7 @@ import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.state.NetworkAction import com.cornellappdev.android.eatery.ui.viewmodels.state.NetworkUiError import com.cornellappdev.android.eatery.ui.viewmodels.state.ReportUiState +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview enum class Issue(@param:StringRes val optionRes: Int) { @@ -328,7 +328,7 @@ private fun IssueBottomSheet(items: Array, setIssue: (Issue) -> Unit, hid } } -@Preview +@DualModePreview @Composable private fun ReportBottomSheetSuccessPreview() = EateryPreview { ReportBottomSheet( @@ -341,7 +341,7 @@ private fun ReportBottomSheetSuccessPreview() = EateryPreview { ) } -@Preview +@DualModePreview @Composable private fun ReportBottomSheetErrorPreview() = EateryPreview { ReportBottomSheet( @@ -354,4 +354,4 @@ private fun ReportBottomSheetErrorPreview() = EateryPreview { clearReportState = {}, hide = {} ) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt index 2ccd39d4..40c1eef4 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt @@ -30,13 +30,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.components.general.MealFilter import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview /** @@ -323,7 +323,7 @@ fun MealBottomSheet( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun MealBottomSheetPreview() = EateryPreview { MealBottomSheet( @@ -333,3 +333,4 @@ private fun MealBottomSheetPreview() = EateryPreview { hide = {} ) } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt index 052f71a7..c48eb8b9 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt @@ -35,7 +35,6 @@ import androidx.compose.ui.graphics.Color.Companion.Green import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.EateryStatus @@ -45,6 +44,7 @@ import com.cornellappdev.android.eatery.ui.components.general.MenuCategoryViewSt import com.cornellappdev.android.eatery.ui.components.general.MenuItemViewState import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @@ -230,7 +230,7 @@ private fun MenuItemDisplay(item: MenuItemViewState) { } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun MenuCardPreview() = EateryPreview { MenuCard( @@ -266,3 +266,4 @@ private fun MenuCardPreview() = EateryPreview { ) ) } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt index 7279d3ea..0a477b76 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/UpcomingLoading.kt @@ -18,10 +18,10 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.valentinilk.shimmer.Shimmer import com.valentinilk.shimmer.shimmer @@ -130,8 +130,9 @@ sealed class UpcomingLoadingItem { } } -@Preview(showBackground = true) +@DualModePreview @Composable fun DefaultPreview() { EateryBlob2() } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index 1598eb11..6ac81d41 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -27,7 +27,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.NavController import androidx.navigation.NavHostController @@ -57,6 +56,7 @@ import com.cornellappdev.android.eatery.ui.screens.SupportScreen import com.cornellappdev.android.eatery.ui.screens.UpcomingMenuScreen import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @OptIn(ExperimentalAnimationApi::class) @@ -163,7 +163,7 @@ fun BottomNavigationBar( } } -@Preview +@DualModePreview @Composable private fun BottomNavBarPreview() = EateryPreview { BottomNavigationBar( @@ -528,3 +528,4 @@ private fun NavController.isOnBackStack(route: String): Boolean = try { } catch (_: IllegalArgumentException) { false } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt index 2002a7dd..6fb9bb7d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt @@ -45,12 +45,12 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import kotlinx.coroutines.launch @@ -329,7 +329,7 @@ fun CreditsRow(position: TeamPosition) { } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun AboutScreenPreview() = EateryPreview { AboutScreen() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt index a2266a12..655ece63 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt @@ -57,7 +57,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -75,6 +74,7 @@ import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.CompareMenusViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.ReportUiState import com.cornellappdev.android.eatery.util.AppStorePopupRepository +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.appStorePopupRepository @@ -251,7 +251,7 @@ private fun CompareMenusScreenContent( } -@Preview(showBackground = true) +@DualModePreview @Composable private fun CompareMenusScreenPreview() = EateryPreview { val previewState = PreviewData.compareMenusPreviewState() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index bad43844..68ff62bd 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -78,7 +78,6 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.net.toUri @@ -117,6 +116,7 @@ import com.cornellappdev.android.eatery.ui.viewmodels.MealViewState import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.ui.viewmodels.state.ReportUiState import com.cornellappdev.android.eatery.util.AppStorePopupRepository +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.appStorePopupRepository @@ -997,7 +997,7 @@ private fun launchIntentSafely(context: android.content.Context, intent: Intent) private const val EATERY_DETAIL_TAG = "EateryDetailScreen" -@Preview(showBackground = true) +@DualModePreview @Composable private fun EateryDetailScreenPreview() = EateryPreview { val now = LocalDateTime.now() @@ -1044,3 +1044,4 @@ private fun EateryDetailScreenPreview() = EateryPreview { onToggleFavoriteMenuItem = {}, ) } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt index a718ea60..fe01d7dd 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt @@ -38,7 +38,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -55,6 +54,7 @@ import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.FavoritesScreenViewState import com.cornellappdev.android.eatery.ui.viewmodels.FavoritesViewModel +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.valentinilk.shimmer.ShimmerBounds @@ -179,7 +179,7 @@ private fun FavoritesScreenContent( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun FavoritesScreenLoadingPreview() = EateryPreview { FavoritesScreenContent( @@ -194,7 +194,7 @@ private fun FavoritesScreenLoadingPreview() = EateryPreview { ) } -@Preview(showBackground = true) +@DualModePreview @Composable private fun FavoritesScreenLoadedPreview() = EateryPreview { FavoritesScreenContent( @@ -217,7 +217,7 @@ private fun FavoritesScreenLoadedPreview() = EateryPreview { ) } -@Preview(showBackground = true) +@DualModePreview @Composable private fun FavoritesScreenErrorPreview() = EateryPreview { FavoritesScreenContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt index cdb786e1..e217cf8a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt @@ -67,7 +67,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em import androidx.compose.ui.unit.sp @@ -96,6 +95,7 @@ import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.HomeViewModel import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.LocationHandler import com.cornellappdev.android.eatery.util.PreviewData @@ -509,13 +509,13 @@ fun ErrorContent(onTryAgain: () -> Unit) { } } -@Preview +@DualModePreview @Composable private fun PreviewErrorContent() = EateryPreview { ErrorContent(onTryAgain = {}) } -@Preview(showBackground = true) +@DualModePreview @Composable private fun PreviewRegularContent() = EateryPreview { val eateries = listOf( @@ -637,18 +637,22 @@ private fun LazyListScope.regularContent( Icon( contentDescription = stringResource(R.string.a11y_list_view), painter = painterResource(id = - if (isGridView && isDarkMode) { R.drawable.ic_list_view_unselected_dark } - else if (isGridView && !isDarkMode) {R.drawable.ic_list_view_unselected} - else if (!isGridView && isDarkMode) { R.drawable.ic_list_view_selected_dark } + if (isGridView && isDarkMode) { R.drawable.ic_list_view_unselected_dark } else if (isGridView) { + R.drawable.ic_list_view_unselected + } else if (isDarkMode) { + R.drawable.ic_list_view_selected_dark + } else {R.drawable.ic_list_view_unselected}), tint = Color.Unspecified, modifier = Modifier.clickable { onListClick() } ) Icon( contentDescription = stringResource(R.string.a11y_grid_view), - painter = painterResource(if (isGridView && isDarkMode) { R.drawable.ic_grid_view_selected_dark } - else if (isGridView && !isDarkMode) {R.drawable.ic_grid_view_selected} - else if (!isGridView && isDarkMode) { R.drawable.ic_grid_view_unselected_dark } + painter = painterResource(if (isGridView && isDarkMode) { R.drawable.ic_grid_view_selected_dark } else if (isGridView) { + R.drawable.ic_grid_view_selected + } else if (isDarkMode) { + R.drawable.ic_grid_view_unselected_dark + } else {R.drawable.ic_grid_view_unselected}), tint = Color.Unspecified, modifier = Modifier.clickable { onGridClick() } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt index 8381c1cd..50263757 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt @@ -14,7 +14,6 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R @@ -22,6 +21,7 @@ import com.cornellappdev.android.eatery.ui.components.settings.SettingsLineSepar import com.cornellappdev.android.eatery.ui.components.settings.SettingsOption import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @Composable @@ -73,7 +73,7 @@ fun LegalScreen() { } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun LegalScreenPreview() = EateryPreview { LegalScreen() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt index fb16899f..b225785c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt @@ -22,7 +22,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -33,6 +32,7 @@ import com.cornellappdev.android.eatery.ui.components.general.EateryCard import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.NearestViewModel +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.valentinilk.shimmer.ShimmerBounds @@ -144,7 +144,7 @@ private fun NearestScreenContent( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun NearestScreenPreview() = EateryPreview { val eateries = listOf( @@ -161,7 +161,7 @@ private fun NearestScreenPreview() = EateryPreview { ) } -@Preview(showBackground = true) +@DualModePreview @Composable private fun NearestScreenEmptyPreview() = EateryPreview { NearestScreenContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt index 50279323..102c9019 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt @@ -9,12 +9,12 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.components.notifications.FavoriteItemRow import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @Composable @@ -71,7 +71,7 @@ fun NotificationsHomeScreen( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun NotificationsHomeScreenPreview() = EateryPreview { NotificationsHomeScreen() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt index e29ccb2d..c1bc0364 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt @@ -12,13 +12,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.components.settings.SwitchOption import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @Composable @@ -87,7 +87,7 @@ fun NotificationsSettingsScreen() { } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun NotificationsSettingsScreenPreview() = EateryPreview { NotificationsSettingsScreen() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt index bab61c37..b42dd6f9 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.cornellappdev.android.eatery.R @@ -41,6 +40,7 @@ import com.cornellappdev.android.eatery.ui.components.onboarding.OnboardingCarou import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.OnboardingViewModel +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import kotlinx.coroutines.launch @@ -183,7 +183,7 @@ fun OnboardingScreenContent( } } -@Preview +@DualModePreview @Composable private fun OnboardingScreenPreview() = EateryPreview { OnboardingScreenContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt index 118d9ac9..38e4b736 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt @@ -17,7 +17,6 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -28,6 +27,7 @@ import com.cornellappdev.android.eatery.ui.components.settings.SwitchOption import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.PrivacyViewModel +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.google.firebase.analytics.FirebaseAnalytics @@ -147,7 +147,7 @@ private fun PrivacyScreenContent( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun PrivacyScreenPreview() = EateryPreview { PrivacyScreenContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt index 05271242..ad409f5e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt @@ -2,7 +2,6 @@ package com.cornellappdev.android.eatery.ui.screens import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.runtime.Composable -import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.cornellappdev.android.eatery.data.models.AccountBalances @@ -12,6 +11,7 @@ import com.cornellappdev.android.eatery.ui.components.login.AccountPage import com.cornellappdev.android.eatery.ui.components.login.LoginPage import com.cornellappdev.android.eatery.ui.viewmodels.LoginViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.DisplayTransaction +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @@ -86,7 +86,7 @@ private fun ProfileScreenContent( } } -@Preview(name = "Profile - Login", showBackground = true) +@DualModePreview @Composable private fun ProfileScreenLoginPreview() = EateryPreview { ProfileScreenContent( @@ -106,7 +106,7 @@ private fun ProfileScreenLoginPreview() = EateryPreview { ) } -@Preview(name = "Profile - Account", showBackground = true) +@DualModePreview @Composable private fun ProfileScreenAccountPreview() = EateryPreview { ProfileScreenContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt index 3ccf9a96..af947b8f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt @@ -50,7 +50,6 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -67,6 +66,7 @@ import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.SearchViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.ui.viewmodels.state.NetworkUiError +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.popIn @@ -387,7 +387,7 @@ private fun SearchScreenContent( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun SearchScreenPreview() = EateryPreview { SearchScreenContent( @@ -488,3 +488,4 @@ fun FavoriteItem( } } } + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt index 70c7bf5d..4d62a333 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.cornellappdev.android.eatery.R @@ -44,6 +43,7 @@ import com.cornellappdev.android.eatery.ui.navigation.Routes import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.SettingsViewModel +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import kotlinx.coroutines.launch @@ -313,7 +313,7 @@ private fun previewDestinations(): Map Unit> = hashMapOf( Routes.PROFILE to {} ) -@Preview(showBackground = true) +@DualModePreview @Composable private fun SettingsScreenPreview() = EateryPreview { SettingsScreenContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index 755194b2..2c7d5d2c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -43,7 +43,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.net.toUri @@ -58,6 +57,7 @@ import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.SupportViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.ReportUiState +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import kotlinx.coroutines.launch @@ -363,7 +363,7 @@ fun FAQCreation( SettingsLineSeparator() } -@Preview(showBackground = true) +@DualModePreview @Composable private fun SupportScreenPreview() = EateryPreview { SupportScreenContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index a6e25a2a..736afc11 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -57,6 +56,7 @@ import com.cornellappdev.android.eatery.ui.viewmodels.UpcomingMenusViewState import com.cornellappdev.android.eatery.ui.viewmodels.UpcomingViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.util.AppStorePopupRepository +import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.appStorePopupRepository @@ -251,7 +251,7 @@ private fun UpcomingMenuScreenContent( } } -@Preview(showBackground = true) +@DualModePreview @Composable private fun UpcomingMenuScreenPreview() = EateryPreview { val previewState = PreviewData.upcomingMenuPreviewState() @@ -268,7 +268,7 @@ private fun UpcomingMenuScreenPreview() = EateryPreview { ) } -@Preview(showBackground = true) +@DualModePreview @Composable private fun UpcomingMenuScreenEmptyPreview() = EateryPreview { val previewState = PreviewData.upcomingMenuEmptyPreviewState() @@ -285,7 +285,7 @@ private fun UpcomingMenuScreenEmptyPreview() = EateryPreview { ) } -@Preview(showBackground = true) +@DualModePreview @Composable private fun UpcomingMenuScreenErrorPreview() = EateryPreview { val previewState = PreviewData.upcomingMenuErrorPreviewState() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt index 0d25c5de..644afbd7 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt @@ -1,13 +1,19 @@ package com.cornellappdev.android.eatery.util +import android.content.res.Configuration +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview import com.cornellappdev.android.eatery.ui.theme.AppColorTheme import com.cornellappdev.android.eatery.ui.theme.ColorTheme +@Preview(name = "Light", showBackground = true) +@Preview(name = "Dark", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +annotation class DualModePreview + @Composable -fun EateryPreview(darkMode: Boolean = false, content: @Composable () -> Unit) { - AppColorTheme(colorMode = if (darkMode) ColorTheme.darkMode else ColorTheme.lightMode) - { +fun EateryPreview(content: @Composable () -> Unit) { + AppColorTheme(colorMode = if (isSystemInDarkTheme()) ColorTheme.darkMode else ColorTheme.lightMode) { content() } From 9c5834cde151b57af46feeb10daca89c6418a280 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Fri, 24 Apr 2026 19:56:43 -0400 Subject: [PATCH 11/31] coderabbit fixes --- .../android/eatery/MainActivity.kt | 17 +- .../ui/components/details/CalendarButton.kt | 8 +- .../ui/components/details/FavoritesToggle.kt | 2 +- .../ui/components/general/EateryCard.kt | 7 +- .../general/PaymentMethodsAvailable.kt | 41 +++- .../general/PaymentMethodsBottomSheet.kt | 18 +- .../eatery/ui/components/general/SearchBar.kt | 4 + .../components/home/EateryDetailsLoading.kt | 30 +-- .../eatery/ui/components/login/AccountPage.kt | 21 +- .../onboarding/OnboardingCarousel.kt | 7 +- .../ui/navigation/MainTabbedNavigation.kt | 14 +- .../eatery/ui/screens/CompareMenusScreen.kt | 42 ++-- .../eatery/ui/screens/EateryDetailScreen.kt | 10 +- .../android/eatery/ui/screens/HomeScreen.kt | 217 ++++++++++++------ .../eatery/ui/screens/OnboardingScreen.kt | 11 +- .../eatery/ui/screens/PrivacyScreen.kt | 11 +- .../eatery/ui/screens/SupportScreen.kt | 27 +-- .../eatery/ui/screens/UpcomingMenuScreen.kt | 1 + .../android/eatery/ui/theme/Color.kt | 6 + .../android/eatery/ui/theme/Theme.kt | 11 + .../android/eatery/util/PreviewUtil.kt | 8 +- 21 files changed, 314 insertions(+), 199 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt b/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt index 70af2123..8f93dd8a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/MainActivity.kt @@ -7,10 +7,6 @@ import androidx.activity.enableEdgeToEdge import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.IntentSenderRequest import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope @@ -20,7 +16,7 @@ import com.cornellappdev.android.eatery.data.repositories.UserRepository import com.cornellappdev.android.eatery.ui.navigation.NavigationSetup import com.cornellappdev.android.eatery.ui.theme.AppColorTheme import com.cornellappdev.android.eatery.ui.theme.ColorTheme -import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel +import com.cornellappdev.android.eatery.ui.theme.rememberResolvedDarkMode import com.cornellappdev.android.eatery.util.LockScreenOrientation import com.google.android.play.core.appupdate.AppUpdateManagerFactory import com.google.android.play.core.appupdate.AppUpdateOptions @@ -61,15 +57,8 @@ class MainActivity : ComponentActivity() { setContent { LockScreenOrientation() - val themeViewModel: ThemeViewModel = hiltViewModel() - val userPreferenceDark by themeViewModel.isDarkMode.collectAsState() - val isSystemDark = isSystemInDarkTheme() - val activeMode = when (userPreferenceDark) { - true -> ColorTheme.darkMode - false -> ColorTheme.lightMode - null -> if (isSystemDark) ColorTheme.darkMode - else ColorTheme.lightMode - } + val resolvedDarkMode = rememberResolvedDarkMode() + val activeMode = if (resolvedDarkMode) ColorTheme.darkMode else ColorTheme.lightMode AppColorTheme(activeMode) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt index 3fc4a265..4c377c97 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt @@ -39,10 +39,14 @@ fun CalendarButton(onClick: () -> Unit) { Icon( imageVector = ImageVector.vectorResource(id = R.drawable.ic_calendar), contentDescription = stringResource(R.string.change_date), - modifier = Modifier.size(16.dp) + modifier = Modifier.size(16.dp), + tint = colors.textPrimary ) - Text(stringResource(R.string.change_date), style = EateryBlueTypography.button) + Text( + stringResource(R.string.change_date), style = EateryBlueTypography.button, + color = colors.textPrimary + ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt index e10927e7..52a00462 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt @@ -32,7 +32,7 @@ fun FavoritesToggle( label: String, active: Boolean ) { - val detailColor = if (active) Color(0xFFFFD700) else currentColors.accentPrimary + val detailColor = if (active) currentColors.favorite else currentColors.accentPrimary val backgroundColor = if (active) currentColors.backgroundDefault else Color.Transparent Row( modifier = Modifier diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt index fb89d4b8..ed3f37c2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt @@ -40,7 +40,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext @@ -184,8 +183,7 @@ fun EateryCard( .align(Alignment.TopEnd), shape = RoundedCornerShape(100.dp), colors = CardDefaults.cardColors( - containerColor = currentColors.accentPrimary, - contentColor = Color(0xFFFFA500) + containerColor = currentColors.accentPrimary ) ) { Row( @@ -202,7 +200,8 @@ fun EateryCard( Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Text( text = "Closing in $xMinutesUntilClosing min", - style = EateryBlueTypography.button + style = EateryBlueTypography.button, + color = currentColors.warning ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index b7c55aac..40196b83 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -24,6 +24,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.Placeholder @@ -53,12 +54,7 @@ fun PaymentMethodsAvailable( } else { selectedPaymentMethods.forEachIndexed { index, paymentMethod -> appendInlineContent(id = paymentMethod.name) - val paymentMethodColor = when (paymentMethod) { - PaymentMethodsAvailable.BRB -> currentColors.error - PaymentMethodsAvailable.CASH -> currentColors.success - PaymentMethodsAvailable.SWIPES -> currentColors.backgroundSecondary - } - pushStyle(SpanStyle(color = paymentMethodColor)) + pushStyle(SpanStyle(color = paymentMethod.tintColor)) append(" ${stringResource(paymentMethod.textRes)}") pop() if (index != selectedPaymentMethods.lastIndex) { @@ -94,7 +90,8 @@ fun PaymentMethodsAvailable( Text( text = stringResource(R.string.payment_methods_title), style = EateryBlueTypography.h4, - modifier = Modifier.padding(bottom = 12.dp) + modifier = Modifier.padding(bottom = 12.dp), + color = currentColors.textPrimary ) IconButton( @@ -133,7 +130,11 @@ fun PaymentMethodsAvailable( Icon( painter = painterResource(id = R.drawable.ic_payment_swipes), contentDescription = stringResource(R.string.payment_methods_meal_swipes), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.SWIPES)) currentColors.backgroundSecondary else currentColors.textSecondary + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.SWIPES)) { + PaymentMethodsAvailable.SWIPES.tintColor + } else { + currentColors.textSecondary + } ) } } @@ -152,7 +153,11 @@ fun PaymentMethodsAvailable( Icon( painter = painterResource(id = R.drawable.ic_payment_brbs), contentDescription = stringResource(R.string.payment_methods_brbs), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.BRB)) currentColors.error else currentColors.textSecondary + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.BRB)) { + PaymentMethodsAvailable.BRB.tintColor + } else { + currentColors.textSecondary + } ) } } @@ -170,7 +175,11 @@ fun PaymentMethodsAvailable( Icon( painter = painterResource(id = R.drawable.ic_payment_cash), contentDescription = stringResource(R.string.payment_methods_cash_or_credit), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.CASH)) currentColors.success else currentColors.textSecondary + tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.CASH)) { + PaymentMethodsAvailable.CASH.tintColor + } else { + currentColors.textSecondary + } ) } } @@ -179,6 +188,7 @@ fun PaymentMethodsAvailable( Text( text = paymentMethodsAvailableText, style = TextStyle(fontSize = 18.sp), + color = currentColors.textPrimary, inlineContent = inlineContentMap, modifier = Modifier .align(Alignment.CenterHorizontally) @@ -199,6 +209,7 @@ fun PaymentMethodsAvailable( Text( text = stringResource(R.string.payment_methods_close), style = EateryBlueTypography.h5, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 8.dp, bottom = 8.dp) ) } @@ -220,6 +231,14 @@ enum class PaymentMethodsAvailable(val drawable: Int, val textRes: Int) { ); } +val PaymentMethodsAvailable.tintColor: Color + @Composable + get() = when (this) { + PaymentMethodsAvailable.BRB -> currentColors.error + PaymentMethodsAvailable.CASH -> currentColors.success + PaymentMethodsAvailable.SWIPES -> currentColors.backgroundSecondary + } + @DualModePreview @Composable private fun PaymentMethodsAvailableAllPreview() { @@ -233,7 +252,7 @@ private fun PaymentMethodsAvailableAllPreview() { @DualModePreview @Composable -private fun PaymentMethodsAvailablePartialDarkPreview() { +private fun PaymentMethodsAvailablePartialPreview() { EateryPreview { PaymentMethodsAvailable( selectedPaymentMethods = listOf( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt index 3e487931..1ae91be9 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt @@ -85,7 +85,11 @@ fun PaymentMethodsBottomSheet( modifier = Modifier .size(64.dp) .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) currentColors.backgroundSecondary else currentColors.backgroundDefault, + color = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) { + PaymentMethodsAvailable.SWIPES.tintColor + } else { + currentColors.backgroundDefault + }, shape = CircleShape ) ) { @@ -117,7 +121,11 @@ fun PaymentMethodsBottomSheet( modifier = Modifier .size(64.dp) .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) currentColors.error else currentColors.backgroundDefault, + color = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) { + PaymentMethodsAvailable.BRB.tintColor + } else { + currentColors.backgroundDefault + }, shape = CircleShape ) ) { @@ -148,7 +156,11 @@ fun PaymentMethodsBottomSheet( modifier = Modifier .size(64.dp) .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) currentColors.success else currentColors.backgroundDefault, + color = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) { + PaymentMethodsAvailable.CASH.tintColor + } else { + currentColors.backgroundDefault + }, shape = CircleShape ) ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt index 1838b6dc..9b3a0ff4 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt @@ -111,6 +111,10 @@ fun SearchBar( ) }, colors = TextFieldDefaults.colors( + focusedContainerColor = currentColors.backgroundDefault, + unfocusedContainerColor = currentColors.backgroundDefault, + disabledContainerColor = currentColors.backgroundDefault, + cursorColor = currentColors.textPrimary, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, disabledIndicatorColor = Color.Transparent diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt index a0443660..94000e06 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryDetailsLoading.kt @@ -30,7 +30,6 @@ import com.valentinilk.shimmer.shimmer fun EateryDetailLoadingScreen( shimmer: Shimmer ) { - val colors = currentColors Column { Box { @@ -40,7 +39,7 @@ fun EateryDetailLoadingScreen( modifier = Modifier .height(240.dp) .shimmer(shimmer) - .fillMaxWidth(), color = colors.backgroundDefault92 + .fillMaxWidth(), color = currentColors.backgroundDefault92 ) {} } @@ -70,7 +69,7 @@ fun EateryDetailLoadingScreen( .padding(start = 16.dp, top = 16.dp) .shimmer(shimmer) .height(40.dp) - .fillMaxWidth(.6f), color = colors.backgroundDefault92, + .fillMaxWidth(.6f), color = currentColors.backgroundDefault92, shape = RoundedCornerShape(20.dp) ) {} Surface( @@ -80,7 +79,7 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .height(20.dp), shape = RoundedCornerShape(20.dp), - color = colors.backgroundDefault92 + color = currentColors.backgroundDefault92 ) {} Row( @@ -98,7 +97,7 @@ fun EateryDetailLoadingScreen( .padding(horizontal = 16.dp) .weight(0.3f), shape = RoundedCornerShape(100), - color = colors.backgroundDefault92 + color = currentColors.backgroundDefault92 ) { } } @@ -132,7 +131,7 @@ fun EateryDetailLoadingScreen( .align(Alignment.TopEnd) .shimmer(shimmer) .padding(16.dp) - .size(35.dp), color = colors.backgroundDefault92, + .size(35.dp), color = currentColors.backgroundDefault92, shape = CircleShape ) {} @@ -148,7 +147,7 @@ fun EateryDetailLoadingScreen( .fillMaxWidth(.6f) .shimmer(shimmer) .padding(16.dp), - color = colors.backgroundDefault92, + color = currentColors.backgroundDefault92, shape = RoundedCornerShape(100.dp) ) {} @@ -159,7 +158,8 @@ fun EateryDetailLoadingScreen( .fillMaxWidth() .shimmer(shimmer) .padding(horizontal = 16.dp, vertical = 12.dp), - shape = RoundedCornerShape(8.dp), color = colors.backgroundDefault92 + shape = RoundedCornerShape(8.dp), + color = currentColors.backgroundDefault92 ) {} Spacer(modifier = Modifier.height(8.dp)) @@ -169,7 +169,8 @@ fun EateryDetailLoadingScreen( .height(3.dp) .fillMaxWidth() .shimmer(shimmer) - .padding(horizontal = 16.dp), color = colors.backgroundDefault92 + .padding(horizontal = 16.dp), + color = currentColors.backgroundDefault92 ) {} Spacer(modifier = Modifier.height(8.dp)) @@ -180,7 +181,7 @@ fun EateryDetailLoadingScreen( .fillMaxWidth(.6f) .shimmer(shimmer) .padding(horizontal = 16.dp, vertical = 5.dp), - color = colors.backgroundDefault92, + color = currentColors.backgroundDefault92, shape = RoundedCornerShape(100.dp) ) {} @@ -194,7 +195,8 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .fillMaxWidth(.45f) .padding(horizontal = 16.dp, vertical = 3.dp), - shape = RoundedCornerShape(8.dp), color = colors.backgroundDefault92 + shape = RoundedCornerShape(8.dp), + color = currentColors.backgroundDefault92 ) {} Spacer(modifier = Modifier.weight(1f)) @@ -205,7 +207,8 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .fillMaxWidth(.35f) .padding(horizontal = 16.dp, vertical = 3.dp), - shape = RoundedCornerShape(8.dp), color = colors.backgroundDefault92 + shape = RoundedCornerShape(8.dp), + color = currentColors.backgroundDefault92 ) {} } @@ -218,7 +221,8 @@ fun EateryDetailLoadingScreen( .shimmer(shimmer) .fillMaxWidth() .padding(horizontal = 16.dp), - shape = RoundedCornerShape(100.dp), color = colors.backgroundDefault92 + shape = RoundedCornerShape(100.dp), + color = currentColors.backgroundDefault92 ) {} } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index d36cbca5..3ea4658b 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -153,7 +153,8 @@ private fun AccountPageContent( Text( text = stringResource(R.string.account_meal_plan), style = EateryBlueTypography.h4, - modifier = Modifier.padding(top = 16.dp) + modifier = Modifier.padding(top = 16.dp), + color = currentColors.textPrimary ) accountTypeBalance.mealSwipes?.let { AccountBalanceRow( @@ -237,7 +238,8 @@ private fun TransactionsHeader( ) { Text( text = stringResource(accountFilter.displayNameRes()), - style = EateryBlueTypography.h4 + style = EateryBlueTypography.h4, + color = currentColors.textPrimary ) } IconButton( @@ -272,7 +274,8 @@ private fun TransactionsHeader( Text( text = stringResource(R.string.account_past_30_days), modifier = Modifier.padding(vertical = 12.dp, horizontal = 16.dp), - style = EateryBlueTypography.h5 + style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) HorizontalDivider( color = currentColors.accentPrimary, @@ -308,7 +311,7 @@ private fun AccountPageHeader( modifier = Modifier.align(Alignment.Center), textAlign = TextAlign.Center, text = stringResource(R.string.account_title), - color = Color.White, + color = currentColors.oppTextPrimary, style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 20.sp @@ -323,7 +326,7 @@ private fun AccountPageHeader( modifier = Modifier.size(28.dp), imageVector = Icons.Outlined.Settings, contentDescription = stringResource(R.string.a11y_settings), - tint = Color.White + tint = currentColors.oppTextPrimary ) } } @@ -372,7 +375,11 @@ private fun TransactionRow(transaction: DisplayTransaction, isMealSwipes: Boolea verticalAlignment = Alignment.CenterVertically ) { Column(modifier = Modifier.weight(1f)) { - Text(text = transaction.location, style = EateryBlueTypography.button) + Text( + text = transaction.location, + style = EateryBlueTypography.button, + color = currentColors.textPrimary + ) Text( text = transaction.formattedDate, style = EateryBlueTypography.subtitle2, @@ -491,7 +498,7 @@ fun AccountTypesSelector( ) } } - Column( modifier = Modifier.background(currentColors.backgroundDefault)) + Column(modifier = Modifier.background(currentColors.backgroundDefault)) { selectedPaymentMethod.forEachIndexed { index, account -> val accountIsSelected = selected == account diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt index ab2e62c5..381d6822 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/onboarding/OnboardingCarousel.kt @@ -28,13 +28,12 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Color.Companion.Black import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @@ -161,7 +160,7 @@ fun OnboardingCarousel( onClick = { onProceed() }, - colors = ButtonDefaults.buttonColors(containerColor = Color.White), + colors = ButtonDefaults.buttonColors(containerColor = currentColors.backgroundDefault), elevation = ButtonDefaults.buttonElevation( defaultElevation = 4.dp, pressedElevation = 4.dp, @@ -172,7 +171,7 @@ fun OnboardingCarousel( Text( style = EateryBlueTypography.h6, text = "Proceed to Eatery!", - color = Black + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index 6ac81d41..8c78dc99 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -8,7 +8,6 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.animation.togetherWith -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.padding import androidx.compose.material3.Icon @@ -19,7 +18,6 @@ import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -27,7 +25,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.NavController import androidx.navigation.NavHostController import androidx.navigation.NavType @@ -55,22 +52,20 @@ import com.cornellappdev.android.eatery.ui.screens.SettingsScreen import com.cornellappdev.android.eatery.ui.screens.SupportScreen import com.cornellappdev.android.eatery.ui.screens.UpcomingMenuScreen import com.cornellappdev.android.eatery.ui.theme.currentColors -import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel +import com.cornellappdev.android.eatery.ui.theme.rememberResolvedDarkMode import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @OptIn(ExperimentalAnimationApi::class) @Composable fun NavigationSetup( - hasOnboarded: Boolean, - themeViewModel: ThemeViewModel = hiltViewModel() + hasOnboarded: Boolean ) { val navController = rememberNavController() val showBottomBar = rememberSaveable { mutableStateOf(false) } - val isDarkMode by themeViewModel.isDarkMode.collectAsState() - val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() + val resolvedDarkMode = rememberResolvedDarkMode() // Subscribe to navBackStackEntry, required to get current route val navBackStackEntry by navController.currentBackStackEntryAsState() @@ -128,8 +123,7 @@ fun BottomNavigationBar( darkMode: Boolean ) { NavigationBar( - containerColor = currentColors.accentPrimary, - contentColor = currentColors.accentPressed + containerColor = currentColors.accentPrimary ) { val currentRoute = currentRoute(navController) tabItems.forEach { item -> diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt index 655ece63..80ca1862 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt @@ -128,7 +128,6 @@ private fun CompareMenusScreenContent( val modalBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val coroutineScope = rememberCoroutineScope() var showBottomSheet by rememberSaveable { mutableStateOf(false) } - val colors = currentColors var sheetContent by remember { mutableStateOf(BottomSheetContent.HOURS) } val closeBottomSheet: () -> Unit = { coroutineScope.launch { @@ -158,7 +157,7 @@ private fun CompareMenusScreenContent( ) } HorizontalDivider( - color = colors.backgroundDefault, + color = currentColors.borderDefault, modifier = Modifier .fillMaxWidth() .height(1.dp) @@ -281,7 +280,6 @@ private fun MenuPager( onRequestRatingPopup: () -> Unit, onEateryClick: (eatery: Eatery) -> Unit ) { - val colors = currentColors val coroutineScope = rememberCoroutineScope() HorizontalPager( state = firstPagerState, @@ -312,7 +310,7 @@ private fun MenuPager( bottom = 12.dp ) .border( - 1.dp, colors.backgroundDefault, RoundedCornerShape(8.dp) + 1.dp, currentColors.borderDefault, RoundedCornerShape(8.dp) ), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically @@ -333,14 +331,14 @@ private fun MenuPager( Icon( imageVector = Icons.Outlined.Schedule, contentDescription = null, - tint = colors.textSecondary + tint = currentColors.textSecondary ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( text = stringResource(R.string.hours_title), style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 16.sp - ), color = colors.textSecondary + ), color = currentColors.textSecondary ) } val eatery = eateries.getOrNull(page) ?: return@Column @@ -360,9 +358,9 @@ private fun MenuPager( fontWeight = FontWeight.SemiBold, fontSize = 16.sp ), - color = if (openUntil == null) colors.error - else if (eatery.isClosingSoon()) colors.accentPressed - else colors.success + color = if (openUntil == null) currentColors.error + else if (eatery.isClosingSoon()) currentColors.warning + else currentColors.success ) } @@ -387,7 +385,7 @@ private fun MenuPager( if (currentEvent != null) { Box( modifier = Modifier - .background(colors.backgroundDefault) + .background(currentColors.backgroundDefault) .padding( start = 8.dp, end = 8.dp, @@ -439,13 +437,16 @@ private fun MenuPager( modifier = Modifier .fillMaxWidth() .height(1.dp) - .background(colors.backgroundDefault, CircleShape) + .background( + currentColors.borderDefault, + CircleShape + ) ) } if (category.items?.lastIndex == index) { HorizontalDivider( thickness = 10.dp, - color = colors.backgroundDefault + color = currentColors.borderDefault ) } } @@ -454,7 +455,7 @@ private fun MenuPager( item { Row( modifier = Modifier - .background(colors.backgroundSurface) + .background(currentColors.backgroundSurface) .clip( shape = RoundedCornerShape( 12.dp @@ -469,14 +470,14 @@ private fun MenuPager( ) { Text( text = stringResource(R.string.compare_menus_no_menu), - color = colors.textPrimary, + color = currentColors.textPrimary, style = EateryBlueTypography.h5, modifier = Modifier.padding(start = 8.dp), fontWeight = FontWeight(500), ) } HorizontalDivider( - color = colors.backgroundDefault, + color = currentColors.borderDefault, modifier = Modifier .fillMaxWidth() .height(10.dp) @@ -490,7 +491,7 @@ private fun MenuPager( onClick = { onEateryClick(eateries[page]) }, - colors = CardDefaults.cardColors(containerColor = colors.backgroundDefault), + colors = CardDefaults.cardColors(containerColor = currentColors.accentPrimary), modifier = Modifier .fillMaxWidth() .padding( @@ -511,11 +512,11 @@ private fun MenuPager( Icon( painter = painterResource(R.drawable.ic_eatery), contentDescription = null, - tint = colors.textPrimary + tint = currentColors.textPrimary ) Text( text = stringResource(R.string.view_eatery_details), - color = colors.textPrimary, + color = currentColors.textPrimary, modifier = Modifier.padding( start = 8.dp, ), @@ -543,12 +544,11 @@ private fun TitlePager( eateries: List, secondPagerState: PagerState ) { - val colors = currentColors HorizontalPager( state = secondPagerState, modifier = Modifier .fillMaxSize() - .background(colors.backgroundDefault), + .background(currentColors.backgroundDefault), contentPadding = PaddingValues(horizontal = 100.dp), pageSpacing = 2.dp, verticalAlignment = Alignment.CenterVertically, @@ -563,7 +563,7 @@ private fun TitlePager( modifier = Modifier .shadow(2.dp, shape = RoundedCornerShape(8.dp)) .clip(shape = RoundedCornerShape(8.dp)) - .background(colors.backgroundDefault) + .background(currentColors.backgroundDefault) .padding(vertical = 8.dp, horizontal = 16.dp) ) { eateries[page].name?.let { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index 68ff62bd..f5100608 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -639,10 +639,6 @@ fun EateryDetailScreenContent( } ) { Row( - modifier = Modifier.border( - 1.dp, - color = currentColors.accentPrimary - ), verticalAlignment = Alignment.CenterVertically ) { Icon( @@ -679,7 +675,7 @@ fun EateryDetailScreenContent( fontSize = 16.sp ), color = if (openUntil == null) colors.error - else if (eatery.isClosingSoon()) colors.accentPressed + else if (eatery.isClosingSoon()) colors.warning else colors.success ) } @@ -835,7 +831,7 @@ fun EateryDetailScreenContent( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(colors.backgroundDefault) + .background(colors.accentPrimary) ) } } @@ -908,7 +904,7 @@ private fun LazyListScope.menuHeadingItem( text = weekDayIndex.fromOffsetToDayOfWeek() .toReadableFullName(), style = EateryBlueTypography.h4, - color= currentColors.textPrimary + color = currentColors.textPrimary ) if (nextEvent.startTimestamp != null && nextEvent.endTimestamp != null) { Text( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt index e217cf8a..28c5230a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt @@ -47,7 +47,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf @@ -92,8 +91,9 @@ import com.cornellappdev.android.eatery.ui.components.home.MainLoadingItem import com.cornellappdev.android.eatery.ui.components.home.MainLoadingItem.Companion.CreateMainLoadingItem import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.ui.theme.rememberResolvedDarkMode import com.cornellappdev.android.eatery.ui.viewmodels.HomeViewModel -import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel +import com.cornellappdev.android.eatery.ui.viewmodels.HomeViewModel.HomeUiState import com.cornellappdev.android.eatery.ui.viewmodels.state.EateryApiResponse import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview @@ -117,23 +117,11 @@ fun HomeScreen( onEateryClick: (eatery: Eatery) -> Unit, onFavoriteExpand: () -> Unit, onCompareMenusClick: (selectedEateriesIds: List) -> Unit, - onNotificationsClick: () -> Unit, - themeViewModel : ThemeViewModel = hiltViewModel() + onNotificationsClick: () -> Unit ) { - val isDarkMode by themeViewModel.isDarkMode.collectAsState() - val resolvedDarkMode = isDarkMode ?: isSystemInDarkTheme() + val resolvedDarkMode = rememberResolvedDarkMode() val context = LocalContext.current val uiState = homeViewModel.uiState.collectAsStateWithLifecycle().value - val favorites = uiState.favoriteEateries - val nearestEateries = uiState.nearestEateries - val eateriesApiResponse = uiState.eateriesApiResponse - val filters = uiState.selectedFilters - val notificationFlowCompleted = uiState.notificationFlowCompleted - - NetworkErrorToast( - error = uiState.error, - onErrorShown = homeViewModel::clearError - ) val notificationPermissionState = rememberMultiplePermissionsState( @@ -151,6 +139,67 @@ fun HomeScreen( homeViewModel.updateFavoritesIfTokensConfigured() } + HomeScreenContent( + uiState = uiState, + showBottomBar = showBottomBar, + onSearchClick = onSearchClick, + onEateryClick = onEateryClick, + onFavoriteExpand = onFavoriteExpand, + onCompareMenusClick = onCompareMenusClick, + onNotificationsClick = onNotificationsClick, + onFavoriteClick = { eatery, favorite -> + if (eatery.id != null && eatery.name != null) { + if (favorite) { + homeViewModel.addFavoriteEatery(eatery.id, eatery.name) + } else { + homeViewModel.removeFavoriteEatery(eatery.id, eatery.name) + } + } + }, + onFilterClicked = homeViewModel::onToggleFilterPressed, + onResetFilters = homeViewModel::onResetFiltersClicked, + filters = homeViewModel.homeScreenFilters, + onAddPaymentMethodFilters = homeViewModel::addPaymentMethodFilters, + onReload = homeViewModel::pingEateries, + onErrorShown = homeViewModel::clearError, + onUpdateNotificationFlowStatus = homeViewModel::setNotificationFlowCompleted, + isDarkMode = resolvedDarkMode, + showPermissionDialog = FirstTimeShown.firstTimeShown + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun HomeScreenContent( + uiState: HomeUiState, + showBottomBar: MutableState, + onSearchClick: () -> Unit, + onEateryClick: (eatery: Eatery) -> Unit, + onFavoriteExpand: () -> Unit, + onCompareMenusClick: (selectedEateriesIds: List) -> Unit, + onNotificationsClick: () -> Unit, + onFavoriteClick: (Eatery, Boolean) -> Unit, + onFilterClicked: (Filter) -> Unit, + onResetFilters: () -> Unit, + filters: List, + onAddPaymentMethodFilters: (List) -> Unit, + onReload: () -> Unit, + onErrorShown: () -> Unit, + onUpdateNotificationFlowStatus: (Boolean) -> Unit, + isDarkMode: Boolean, + showPermissionDialog: Boolean, +) { + val favorites = uiState.favoriteEateries + val nearestEateries = uiState.nearestEateries + val eateriesApiResponse = uiState.eateriesApiResponse + val selectedFilters = uiState.selectedFilters + val notificationFlowCompleted = uiState.notificationFlowCompleted + + NetworkErrorToast( + error = uiState.error, + onErrorShown = onErrorShown + ) + val selectedPaymentMethodFilters = remember { mutableStateListOf() } val modalBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val coroutineScope = rememberCoroutineScope() @@ -167,7 +216,7 @@ fun HomeScreen( DisposableEffect(Unit) { onDispose { // Handles the case where filters reset as well (by adding an empty list). - homeViewModel.addPaymentMethodFilters(selectedPaymentMethodFilters) + onAddPaymentMethodFilters(selectedPaymentMethodFilters) } } } @@ -252,38 +301,29 @@ fun HomeScreen( eateriesApiResponse = eateriesApiResponse, favorites = favorites, nearestEateries = nearestEateries, - selectedFilters = filters, - onFavoriteClick = { eatery, favorite -> - if (eatery.id != null && eatery.name != null) { - if (favorite) { - homeViewModel.addFavoriteEatery(eatery.id, eatery.name) - } else { - homeViewModel.removeFavoriteEatery(eatery.id, eatery.name) - } - } - }, - onFilterClicked = homeViewModel::onToggleFilterPressed, - onResetFilters = homeViewModel::onResetFiltersClicked, - filters = homeViewModel.homeScreenFilters, + selectedFilters = selectedFilters, + onFavoriteClick = onFavoriteClick, + onFilterClicked = onFilterClicked, + onResetFilters = onResetFilters, + filters = filters, isGridView = isGridView, onListClick = { isGridView = false }, onGridClick = { isGridView = true }, onNotificationsClick = onNotificationsClick, - onReload = homeViewModel::pingEateries, - isDarkMode = resolvedDarkMode + onReload = onReload, + isDarkMode = isDarkMode ) - if (FirstTimeShown.firstTimeShown) { + if (showPermissionDialog) { PermissionRequestDialog( showBottomBar = showBottomBar, notificationFlowStatus = notificationFlowCompleted, - updateNotificationFlowStatus = { - homeViewModel.setNotificationFlowCompleted(it) - } + updateNotificationFlowStatus = onUpdateNotificationFlowStatus ) } } - }) + } + ) } @Composable @@ -333,7 +373,7 @@ private fun HomeScrollableMainContent( onGridClick: () -> Unit, onNotificationsClick: () -> Unit, onReload: () -> Unit, - isDarkMode : Boolean + isDarkMode: Boolean ) { val listState = rememberLazyListState() val filterRowState = rememberLazyListState() @@ -512,12 +552,14 @@ fun ErrorContent(onTryAgain: () -> Unit) { @DualModePreview @Composable private fun PreviewErrorContent() = EateryPreview { - ErrorContent(onTryAgain = {}) + PreviewHomeScreen( + uiState = HomeUiState(eateriesApiResponse = EateryApiResponse.Error) + ) } @DualModePreview @Composable -private fun PreviewRegularContent() = EateryPreview { +private fun PreviewSuccessContent() = EateryPreview { val eateries = listOf( PreviewData.mockEatery(1).copy(name = "Okenshields"), PreviewData.mockEatery(2).copy(name = "Becker House Dining Room"), @@ -525,27 +567,52 @@ private fun PreviewRegularContent() = EateryPreview { ) val favorites = listOf(eateries.first()) - LazyColumn( - modifier = Modifier - .fillMaxSize() - .background(Color.White) - ) { - regularContent( + PreviewHomeScreen( + uiState = HomeUiState( eateriesApiResponse = EateryApiResponse.Success(eateries), - selectedFilters = emptyList(), - favorites = favorites, - onFavoriteClick = { _, _ -> }, - onEateryClick = {}, - onResetFilters = {}, - lastFavorite = favorites.firstOrNull(), - onFavoriteExpand = {}, - isGridView = false, - onListClick = {}, - onGridClick = {}, - nearestEateries = eateries, - isDarkMode = false + favoriteEateries = favorites, + nearestEateries = eateries ) - } + ) +} + +@DualModePreview +@Composable +private fun PreviewPendingContent() = EateryPreview { + PreviewHomeScreen( + uiState = HomeUiState(eateriesApiResponse = EateryApiResponse.Pending) + ) +} + +@Composable +private fun PreviewHomeScreen(uiState: HomeUiState) { + HomeScreenContent( + uiState = uiState, + showBottomBar = remember { mutableStateOf(true) }, + onSearchClick = {}, + onEateryClick = {}, + onFavoriteExpand = {}, + onCompareMenusClick = {}, + onNotificationsClick = {}, + onFavoriteClick = { _, _ -> }, + onFilterClicked = {}, + onResetFilters = {}, + filters = listOf( + Filter.FromEateryFilter.North, + Filter.FromEateryFilter.West, + Filter.FromEateryFilter.Central, + Filter.FromEateryFilter.Swipes, + Filter.FromEateryFilter.BRB, + Filter.RequiresFavoriteEateries.Favorites, + Filter.FromEateryFilter.Under10, + ), + onAddPaymentMethodFilters = {}, + onReload = {}, + onErrorShown = {}, + onUpdateNotificationFlowStatus = {}, + isDarkMode = isSystemInDarkTheme(), + showPermissionDialog = false, + ) } private fun LazyListScope.regularContent( @@ -561,7 +628,7 @@ private fun LazyListScope.regularContent( onListClick: () -> Unit, onGridClick: () -> Unit, nearestEateries: List, - isDarkMode : Boolean + isDarkMode: Boolean ) { val eateries = eateriesApiResponse.data @@ -636,24 +703,27 @@ private fun LazyListScope.regularContent( ) { Icon( contentDescription = stringResource(R.string.a11y_list_view), - painter = painterResource(id = - if (isGridView && isDarkMode) { R.drawable.ic_list_view_unselected_dark } else if (isGridView) { - R.drawable.ic_list_view_unselected - } else if (isDarkMode) { - R.drawable.ic_list_view_selected_dark + painter = painterResource( + id = when { + isGridView && isDarkMode -> R.drawable.ic_list_view_unselected_dark + isGridView -> R.drawable.ic_list_view_unselected + isDarkMode -> R.drawable.ic_list_view_selected_dark + else -> R.drawable.ic_list_view_unselected } - else {R.drawable.ic_list_view_unselected}), + ), tint = Color.Unspecified, modifier = Modifier.clickable { onListClick() } ) Icon( contentDescription = stringResource(R.string.a11y_grid_view), - painter = painterResource(if (isGridView && isDarkMode) { R.drawable.ic_grid_view_selected_dark } else if (isGridView) { - R.drawable.ic_grid_view_selected - } else if (isDarkMode) { - R.drawable.ic_grid_view_unselected_dark - } - else {R.drawable.ic_grid_view_unselected}), + painter = painterResource( + when { + isGridView && isDarkMode -> R.drawable.ic_grid_view_selected_dark + isGridView -> R.drawable.ic_grid_view_selected + isDarkMode -> R.drawable.ic_grid_view_unselected_dark + else -> R.drawable.ic_grid_view_unselected + } + ), tint = Color.Unspecified, modifier = Modifier.clickable { onGridClick() } ) @@ -725,11 +795,10 @@ private fun HomeStickyHeader( onSearchClick: () -> Unit, onNotificationsClick: () -> Unit ) { - val colors = currentColors Column( modifier = Modifier .fillMaxWidth() - .background(colors.backgroundSecondary) + .background(currentColors.backgroundSecondary) .then(Modifier.statusBarsPadding()) .padding(bottom = 7.dp), ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt index b42dd6f9..771c9579 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt @@ -83,7 +83,7 @@ fun OnboardingScreenContent( Icon( painter = painterResource(id = R.drawable.ic_eaterylogo_blue), - tint = currentColors.backgroundSecondary, + tint = currentColors.contentBrand, modifier = Modifier .width(96.dp) .height(96.dp), @@ -92,7 +92,7 @@ fun OnboardingScreenContent( Text( text = stringResource(R.string.onboarding_eatery_title), - color = currentColors.oppTextPrimary, + color = currentColors.contentBrand, style = EateryBlueTypography.h1 ) @@ -120,6 +120,7 @@ fun OnboardingScreenContent( Text( style = EateryBlueTypography.h6, text = stringResource(R.string.onboarding_get_started), + color = currentColors.textPrimary ) } @@ -136,13 +137,13 @@ fun OnboardingScreenContent( painter = painterResource(id = R.drawable.ic_appdev), modifier = Modifier.padding(end = 6.dp), contentDescription = null, - tint = currentColors.backgroundDefault10 + tint = currentColors.contentSubtle ) Text( buildAnnotatedString { withStyle( style = SpanStyle( - color = currentColors.backgroundDefault10, + color = currentColors.contentSubtle, fontWeight = FontWeight.Normal ) ) { @@ -150,7 +151,7 @@ fun OnboardingScreenContent( } withStyle( style = SpanStyle( - color = currentColors.backgroundDefault10, + color = currentColors.contentSubtle, fontWeight = FontWeight.SemiBold ) ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt index 38e4b736..9b344b1e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt @@ -70,7 +70,6 @@ private fun PrivacyScreenContent( onAnalyticsPreferenceChange: (Boolean) -> Unit, onOpenPrivacyPolicy: () -> Unit, ) { - val colors = currentColors Column( modifier = Modifier .padding(horizontal = 16.dp) @@ -79,14 +78,14 @@ private fun PrivacyScreenContent( ) { Text( text = stringResource(R.string.privacy_title), - color = colors.textPrimary, + color = currentColors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) Text( text = stringResource(R.string.privacy_description), style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = colors.textPrimary, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 7.dp, bottom = 24.dp) ) Text( @@ -102,7 +101,7 @@ private fun PrivacyScreenContent( Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = colors.backgroundSecondary, + tint = currentColors.textPrimary, ) }) SettingsLineSeparator() @@ -114,7 +113,7 @@ private fun PrivacyScreenContent( Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = colors.backgroundSecondary, + tint = currentColors.textPrimary, ) } ) @@ -140,7 +139,7 @@ private fun PrivacyScreenContent( Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = colors.backgroundSecondary, + tint = currentColors.textPrimary, ) } ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index 2c7d5d2c..d4acaed2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -64,8 +64,6 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable fun SupportScreen(supportViewModel: SupportViewModel = hiltViewModel()) { - currentColors - rememberCoroutineScope() val context = LocalContext.current val supportRecipient = stringResource(R.string.support_team_email_recipient) val orderFoodRecipient = stringResource(R.string.support_order_food_email_recipient) @@ -118,7 +116,6 @@ private fun SupportScreenContent( ) var showReportSheet by remember { mutableStateOf(false) } var issue by remember { mutableStateOf(null) } - val colors = currentColors if (showReportSheet) { ModalBottomSheet( onDismissRequest = { @@ -160,14 +157,14 @@ private fun SupportScreenContent( Spacer(modifier = Modifier.height(7.dp)) Text( text = stringResource(R.string.support_title), - color = colors.textPrimary, + color = currentColors.textPrimary, style = EateryBlueTypography.h2, ) Spacer(modifier = Modifier.height(7.dp)) Text( text = stringResource(R.string.support_description), style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = colors.textPrimary, + color = currentColors.textPrimary, ) Spacer(modifier = Modifier.height(24.dp)) @@ -179,7 +176,7 @@ private fun SupportScreenContent( Spacer(modifier = Modifier.height(12.dp)) Text( text = stringResource(R.string.support_make_eatery_better_description), - color = colors.textSecondary, + color = currentColors.textSecondary, style = EateryBlueTypography.subtitle2, ) Spacer(modifier = Modifier.height(12.dp)) @@ -193,7 +190,7 @@ private fun SupportScreenContent( showReportSheet = true }, colors = ButtonDefaults.buttonColors( - containerColor = colors.accentPrimary, + containerColor = currentColors.accentPrimary, contentColor = currentColors.backgroundDefault ) ) { @@ -211,13 +208,13 @@ private fun SupportScreenContent( Text( text = stringResource(R.string.support_email_us), style = EateryBlueTypography.button, - color = colors.textPrimary + color = currentColors.textPrimary ) Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Icon( Icons.Outlined.ArrowOutward, null, - tint = colors.backgroundSecondary + tint = currentColors.backgroundSecondary ) } @@ -268,7 +265,7 @@ private fun SupportScreenContent( Text( text = stringResource(R.string.support_faq_order_email_prompt), style = EateryBlueTypography.subtitle2, - color = colors.textPrimary, + color = currentColors.textPrimary, ) } } @@ -280,13 +277,12 @@ private fun SupportScreenContent( @Composable private fun ReportButton() { - val colors = currentColors Surface( shape = RoundedCornerShape(17.dp), modifier = Modifier .height(50.dp) .padding(vertical = 8.dp), - color = colors.backgroundDefault, + color = currentColors.backgroundDefault, contentColor = currentColors.textPrimary ) { Row( @@ -312,7 +308,6 @@ fun FAQCreation( action: @Composable () -> Unit, onActionClick: () -> Unit ) { - val colors = currentColors val (expanded, setExpanded) = remember { mutableStateOf(false) } @@ -324,14 +319,14 @@ fun FAQCreation( Icon( imageVector = Icons.Default.ExpandLess, contentDescription = Icons.Default.ExpandLess.name, - tint = colors.backgroundSecondary, + tint = currentColors.backgroundSecondary, modifier = Modifier.width(24.dp) ) } else { Icon( imageVector = Icons.Default.ExpandMore, contentDescription = null, - tint = colors.backgroundSecondary, + tint = currentColors.backgroundSecondary, modifier = Modifier.width(24.dp) ) } @@ -349,7 +344,7 @@ fun FAQCreation( Text( text = dropdownText, style = EateryBlueTypography.subtitle2, - color = colors.textSecondary, + color = currentColors.textSecondary, ) Box(modifier = Modifier.clickable { setExpanded(false) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index 736afc11..5028dfb3 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -119,6 +119,7 @@ private fun UpcomingMenuScreenContent( if (showMealBottomSheet) { ModalBottomSheet( sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, contentColor = currentColors.textPrimary, onDismissRequest = { showMealBottomSheet = false }, shape = RoundedCornerShape( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt index c4a417c4..1aba676a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt @@ -100,6 +100,8 @@ object ColorTheme textPrimary = TextPrimaryLight, oppTextPrimary = OppTextPrimaryLight, textSecondary = TextSecondaryLight, + contentBrand = BgSecondaryLight, + contentSubtle = BgDefault10Light, accentPrimary = AccentPrimaryLight, accentPressed = AccentPressedLight, borderDefault = BorderDefaultLight, @@ -117,6 +119,8 @@ object ColorTheme textPrimary = TextPrimaryDark, oppTextPrimary = OppTextPrimaryDark, textSecondary = TextSecondaryDark, + contentBrand = BgSecondaryDark, + contentSubtle = BgDefault10Dark, accentPrimary = AccentPrimaryDark, accentPressed = AccentPressedDark, borderDefault = BorderDefaultDark, @@ -137,6 +141,8 @@ data class ColorMode( val textPrimary : Color, val oppTextPrimary : Color, val textSecondary : Color, + val contentBrand: Color, + val contentSubtle: Color, val accentPrimary : Color, val accentPressed: Color, val borderDefault: Color, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt index 2606abc6..c9d8d702 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt @@ -1,8 +1,13 @@ package com.cornellappdev.android.eatery.ui.theme +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.staticCompositionLocalOf +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import com.cornellappdev.android.eatery.ui.viewmodels.ThemeViewModel val LocalColorMode = staticCompositionLocalOf { ColorTheme.lightMode } @@ -20,3 +25,9 @@ fun AppColorTheme( val currentColors: ColorMode @Composable get() = LocalColorMode.current +@Composable +fun rememberResolvedDarkMode(themeViewModel: ThemeViewModel = hiltViewModel()): Boolean { + val isDarkMode by themeViewModel.isDarkMode.collectAsState() + return isDarkMode ?: isSystemInDarkTheme() +} + diff --git a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt index 644afbd7..0ee95cc6 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/util/PreviewUtil.kt @@ -1,11 +1,15 @@ package com.cornellappdev.android.eatery.util import android.content.res.Configuration +import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import com.cornellappdev.android.eatery.ui.theme.AppColorTheme import com.cornellappdev.android.eatery.ui.theme.ColorTheme +import com.cornellappdev.android.eatery.ui.theme.currentColors @Preview(name = "Light", showBackground = true) @Preview(name = "Dark", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) @@ -14,7 +18,9 @@ annotation class DualModePreview @Composable fun EateryPreview(content: @Composable () -> Unit) { AppColorTheme(colorMode = if (isSystemInDarkTheme()) ColorTheme.darkMode else ColorTheme.lightMode) { - content() + Box(modifier = Modifier.background(currentColors.backgroundDefault)) { + content() + } } } \ No newline at end of file From 76b88088b4c757019031b61bf320675932d75805 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Fri, 24 Apr 2026 22:32:30 -0400 Subject: [PATCH 12/31] More fixes --- .../eatery/ui/components/general/EateryCard.kt | 11 ++++++++--- .../android/eatery/ui/components/login/LoginPage.kt | 4 ++-- .../eatery/ui/navigation/MainTabbedNavigation.kt | 1 + .../android/eatery/ui/screens/EateryDetailScreen.kt | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt index ed3f37c2..f3c71bd2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt @@ -44,6 +44,7 @@ import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow @@ -193,13 +194,17 @@ fun EateryCard( ) ) { Icon( - Icons.Outlined.Warning, - contentDescription = "Closing soon", + imageVector = Icons.Outlined.Warning, + tint = currentColors.warning, + contentDescription = stringResource(R.string.closing_soon), modifier = Modifier.size(ButtonDefaults.IconSize) ) Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Text( - text = "Closing in $xMinutesUntilClosing min", + text = stringResource( + R.string.closing_in_minutes, + xMinutesUntilClosing + ), style = EateryBlueTypography.button, color = currentColors.warning ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt index 9ffa85f6..752ce098 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt @@ -190,14 +190,14 @@ private fun LoginPageMainLayer( onLoginPressed() }, colors = ButtonDefaults.buttonColors( - containerColor = if (clickable) currentColors.backgroundSecondary else currentColors.backgroundDefault, + containerColor = currentColors.contentBrand, disabledContainerColor = currentColors.backgroundDefault ), elevation = ButtonDefaults.buttonElevation(defaultElevation = 0.dp) ) { Text( text = if (loading) "Logging in..." else "Log in", - color = if (clickable) currentColors.backgroundDefault else currentColors.backgroundDefault10, + color = currentColors.oppTextPrimary, style = EateryBlueTypography.h5 ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index 8c78dc99..eaf2bf34 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -131,6 +131,7 @@ fun BottomNavigationBar( val iconId = if (isSelected) { if (darkMode) item.selectedDarkIconId else item.selectedIconId } else { + // Same icon for dark and light mode when unselected item.unselectedIconId } NavigationBarItem( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index f5100608..32e370d5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -442,7 +442,7 @@ fun EateryDetailScreenContent( ) { Icon( imageVector = if (viewState.isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (viewState.isFavorite) colors.accentPressed else colors.textSecondary, + tint = if (viewState.isFavorite) colors.favorite else colors.textSecondary, contentDescription = null ) } @@ -969,7 +969,7 @@ fun EateryHeader(eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Uni ) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) colors.accentPressed else colors.textSecondary, + tint = if (isFavorite) colors.favorite else colors.textSecondary, contentDescription = null ) } From 7453abbddd520303676b811572be5073e697d36b Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 13:53:58 -0400 Subject: [PATCH 13/31] Refactor EateryCard modifier --- .../android/eatery/ui/components/general/EateryCard.kt | 4 ++-- .../com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt | 3 +++ .../cornellappdev/android/eatery/ui/screens/NearestScreen.kt | 1 + .../cornellappdev/android/eatery/ui/screens/SearchScreen.kt | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt index f3c71bd2..9639ddce 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt @@ -70,8 +70,7 @@ fun EateryCard( eatery: Eatery, isFavorite: Boolean, onFavoriteClick: (Boolean) -> Unit, - modifier: Modifier = Modifier - .fillMaxWidth(), + modifier: Modifier = Modifier, style: EateryCardStyle = EateryCardStyle.DEFAULT, selectEatery: (eatery: Eatery) -> Unit = {} ) { @@ -427,6 +426,7 @@ private fun EateryCardPreview() = EateryPreview { ), isFavorite = true, onFavoriteClick = {}, + modifier = Modifier.fillMaxWidth(), style = EateryCardStyle.DEFAULT ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt index 28c5230a..b2553fd9 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt @@ -646,6 +646,7 @@ private fun LazyListScope.regularContent( isFavorite = favorites.any { favoriteEatery -> favoriteEatery.id == eatery.id }, + modifier = Modifier.fillMaxWidth(), onFavoriteClick = { onFavoriteClick(eatery, it) } @@ -748,6 +749,7 @@ private fun LazyListScope.regularContent( EateryCard( eatery = eatery, isFavorite = favorites.any { it.id == eatery.id }, + modifier = Modifier.fillMaxWidth(), onFavoriteClick = { isFavorite -> onFavoriteClick(eatery, isFavorite) }, @@ -775,6 +777,7 @@ private fun LazyListScope.regularContent( isFavorite = favorites.any { favoriteEatery -> favoriteEatery.id == eatery.id }, + modifier = Modifier.fillMaxWidth(), onFavoriteClick = { onFavoriteClick(eatery, it) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt index b225785c..66057bee 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt @@ -129,6 +129,7 @@ private fun NearestScreenContent( EateryCard( eatery = eatery, isFavorite = favorites.contains(eatery), + modifier = Modifier.fillMaxWidth(), onFavoriteClick = { onFavoriteClick(eatery, it) }) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt index af947b8f..297cb691 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt @@ -330,6 +330,7 @@ private fun SearchScreenContent( isFavorite = favoriteEateries.any { favoriteEatery -> favoriteEatery.id == eatery.id }, + modifier = Modifier.fillMaxWidth(), onFavoriteClick = { if (eatery.id != null && eatery.name != null) { if (it) { @@ -366,6 +367,7 @@ private fun SearchScreenContent( isFavorite = favoriteEateries.any { favoriteEatery -> favoriteEatery.id == eatery.id }, + modifier = Modifier.fillMaxWidth(), onFavoriteClick = { if (eatery.id != null && eatery.name != null) { if (it) { From 920467b6236a7c8603eed5fae8bbb5c95b0a05eb Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 14:04:19 -0400 Subject: [PATCH 14/31] Remove colors alias --- .../ui/components/details/AlertsSection.kt | 9 ++-- .../ui/components/details/CalendarButton.kt | 7 ++- .../details/EateryDetailsStickyHeader.kt | 3 +- .../details/EateryHourBottomSheet.kt | 9 ++-- .../details/EateryMenusBottomSheet.kt | 3 +- .../android/eatery/ui/screens/AboutScreen.kt | 32 ++++++------- .../eatery/ui/screens/EateryDetailScreen.kt | 45 +++++++++---------- .../eatery/ui/screens/FavoritesScreen.kt | 9 ++-- .../android/eatery/ui/screens/LegalScreen.kt | 9 ++-- .../eatery/ui/screens/NearestScreen.kt | 5 +-- .../ui/screens/NotificationsSettingsScreen.kt | 5 +-- .../eatery/ui/screens/UpcomingMenuScreen.kt | 3 +- 12 files changed, 65 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt index b03bd026..60534ec4 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/AlertsSection.kt @@ -29,7 +29,6 @@ import java.time.LocalDateTime */ @Composable fun AlertsSection(eatery: Eatery) { - val colors = currentColors Column( verticalArrangement = Arrangement.spacedBy(12.dp), modifier = Modifier.padding(top = 12.dp) ) { @@ -47,16 +46,18 @@ fun AlertsSection(eatery: Eatery) { Row( modifier = Modifier .fillMaxWidth() - .background(colors.accentPrimary) + .background(currentColors.accentPrimary) ) { Icon( - Icons.Default.Info, contentDescription = "Warning", tint = colors.backgroundSecondary + Icons.Default.Info, + contentDescription = "Warning", + tint = currentColors.backgroundSecondary ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( text = it.description, style = EateryBlueTypography.body2, - color = colors.textPrimary, + color = currentColors.textPrimary, modifier = Modifier.padding(start = 5.dp) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt index 4c377c97..a59510bb 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt @@ -25,11 +25,10 @@ import com.cornellappdev.android.eatery.util.EateryPreview @Composable fun CalendarButton(onClick: () -> Unit) { - val colors = currentColors Row( modifier = Modifier .clip(RoundedCornerShape(100)) - .background(colors.backgroundDefault) + .background(currentColors.backgroundDefault) .clickable { onClick() } .padding(vertical = 8.dp, horizontal = 12.dp), verticalAlignment = Alignment.CenterVertically, @@ -40,12 +39,12 @@ fun CalendarButton(onClick: () -> Unit) { imageVector = ImageVector.vectorResource(id = R.drawable.ic_calendar), contentDescription = stringResource(R.string.change_date), modifier = Modifier.size(16.dp), - tint = colors.textPrimary + tint = currentColors.textPrimary ) Text( stringResource(R.string.change_date), style = EateryBlueTypography.button, - color = colors.textPrimary + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt index d9555582..7d4079de 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt @@ -43,7 +43,6 @@ fun EateryDetailsStickyHeader( onItemClick: (Int) -> Unit, onRequestRatingPopup: () -> Unit = {}, ) { - val colors = currentColors val rowState = rememberLazyListState() val rowCoroutine = rememberCoroutineScope() val selectedEvent = nextEvent?.menu?.find { category -> @@ -138,7 +137,7 @@ fun EateryDetailsStickyHeader( } HorizontalDivider( - color = colors.backgroundDefault, + color = currentColors.backgroundDefault, thickness = 1.dp ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt index 667aab4e..44c86d97 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt @@ -45,7 +45,6 @@ fun EateryHourBottomSheet( onDismiss: () -> Unit, onReportIssue: () -> Unit ) { - val colors = currentColors Column( modifier = Modifier .fillMaxWidth() @@ -77,7 +76,7 @@ fun EateryHourBottomSheet( }, modifier = Modifier .size(40.dp) - .background(color = colors.backgroundDefault, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { Icon( Icons.Default.Close, @@ -101,7 +100,7 @@ fun EateryHourBottomSheet( fontWeight = FontWeight.SemiBold, fontSize = 16.sp ), color = if (openUntil == null) currentColors.error - else if (eatery.isClosingSoon()) colors.accentPressed + else if (eatery.isClosingSoon()) currentColors.accentPressed else currentColors.success ) @@ -114,7 +113,7 @@ fun EateryHourBottomSheet( Text( text = dayRange, fontSize = 16.sp, - color = colors.textSecondary, + color = currentColors.textSecondary, fontWeight = FontWeight(500) ) hours.forEach { hour -> @@ -140,7 +139,7 @@ fun EateryHourBottomSheet( modifier = Modifier .fillMaxWidth() .height(48.dp), - colors = ButtonDefaults.buttonColors(containerColor = colors.backgroundDefault), + colors = ButtonDefaults.buttonColors(containerColor = currentColors.backgroundDefault), shape = RoundedCornerShape(corner = CornerSize(24.dp)), ) { Text( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt index 189506b2..b94ec4aa 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt @@ -66,7 +66,6 @@ fun EateryMenusBottomSheet( onShowMenuClick: (Int, String, Int) -> Unit, onResetClick: () -> Unit ) { - val colors = currentColors val zoneId: ZoneId? = ZoneId.of("America/New_York") val today = LocalDate.now(zoneId) val currentDay by remember { mutableStateOf(today) } @@ -118,7 +117,7 @@ fun EateryMenusBottomSheet( }, modifier = Modifier .padding(all = 8.dp) - .background(color = colors.backgroundDefault, shape = CircleShape) + .background(color = currentColors.backgroundDefault, shape = CircleShape) ) { Icon( imageVector = Icons.Default.Close, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt index 6fb9bb7d..5be48db5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt @@ -57,7 +57,6 @@ import kotlinx.coroutines.launch @Composable fun AboutScreen() { val uriCurrent = LocalUriHandler.current - val colors = currentColors Column(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier @@ -67,13 +66,13 @@ fun AboutScreen() { ) { Text( text = stringResource(R.string.about_title), - color = colors.textPrimary, + color = currentColors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) Text( text = stringResource(R.string.about_description), - color = colors.textSecondary, + color = currentColors.textSecondary, style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), modifier = Modifier.padding(top = 7.dp, bottom = 24.dp) ) @@ -86,7 +85,7 @@ fun AboutScreen() { Icon( painter = painterResource(id = R.drawable.ic_appdev), contentDescription = null, - tint = colors.textSecondary, + tint = currentColors.textSecondary, modifier = Modifier .height(24.dp) .width(24.dp) @@ -95,7 +94,7 @@ fun AboutScreen() { Text( text = stringResource(R.string.about_designed_and_developed_by), style = EateryBlueTypography.subtitle1, - color = colors.textSecondary, + color = currentColors.textSecondary, modifier = Modifier.padding(top = 12.dp) ) @@ -108,12 +107,12 @@ fun AboutScreen() { Text( text = stringResource(R.string.about_cornell), style = EateryBlueTypography.h2, - color = colors.textPrimary, + color = currentColors.textPrimary, ) Text( text = stringResource(R.string.about_appdev), style = EateryBlueTypography.h2, - color = colors.textPrimary, + color = currentColors.textPrimary, ) } } @@ -139,18 +138,22 @@ fun AboutScreen() { uriCurrent.openUri("https://www.cornellappdev.com/") }, colors = ButtonDefaults.buttonColors( - containerColor = colors.backgroundSecondary, - contentColor = colors.textPrimary + containerColor = currentColors.backgroundSecondary, + contentColor = currentColors.textPrimary ) ) { - Icon(Icons.Default.Language, contentDescription = null, tint = colors.textPrimary) + Icon( + Icons.Default.Language, + contentDescription = null, + tint = currentColors.textPrimary + ) Spacer( Modifier.size(ButtonDefaults.IconSpacing) ) Text( text = stringResource(R.string.about_website_button), style = EateryBlueTypography.h5, - color = colors.textPrimary, + color = currentColors.textPrimary, modifier = Modifier.padding(start = 8.dp) ) } @@ -250,7 +253,6 @@ private val teamRosterMap: HashMap> = hashMapOf( @Composable fun CreditsRow(position: TeamPosition) { // First item in the row is the position, e.g. Android Developer, Pod Leads. - val colors = currentColors val lazyRowList = mutableListOf(position) val names: List = teamRosterMap[position]!! names.forEach { name -> lazyRowList.add(name) } @@ -292,7 +294,7 @@ fun CreditsRow(position: TeamPosition) { Text( text = teamNameMap[item]!!, style = EateryBlueTypography.button, - color = colors.textPrimary, + color = currentColors.textPrimary, modifier = Modifier.padding(start = 15.dp) ) } else { @@ -300,7 +302,7 @@ fun CreditsRow(position: TeamPosition) { modifier = Modifier .height(34.dp) .clip(RoundedCornerShape(17.dp)) - .background(colors.backgroundSecondary) + .background(currentColors.backgroundSecondary) ) { Text( text = item as String, @@ -319,7 +321,7 @@ fun CreditsRow(position: TeamPosition) { Icon( Icons.Filled.Star, contentDescription = null, - tint = colors.backgroundSecondary, + tint = currentColors.backgroundSecondary, modifier = Modifier .height(7.dp) .padding(horizontal = 12.33.dp) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index 32e370d5..0c9cc2f0 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -180,7 +180,6 @@ fun EateryDetailScreenContent( onToggleFavoriteMenuItem: (String) -> Unit, onRequestRatingPopup: () -> Unit = {}, ) { - val colors = currentColors val shimmer = rememberShimmer(ShimmerBounds.View) val context = LocalContext.current val modalBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) @@ -403,8 +402,8 @@ fun EateryDetailScreenContent( .background( colorInterp( progress, - colors.backgroundSecondary, - colors.backgroundDefault10 + currentColors.backgroundSecondary, + currentColors.backgroundDefault10 ) ), contentDescription = null, @@ -442,7 +441,7 @@ fun EateryDetailScreenContent( ) { Icon( imageVector = if (viewState.isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (viewState.isFavorite) colors.favorite else colors.textSecondary, + tint = if (viewState.isFavorite) currentColors.favorite else currentColors.textSecondary, contentDescription = null ) } @@ -483,7 +482,7 @@ fun EateryDetailScreenContent( }, modifier = Modifier.padding(start = 16.dp), style = EateryBlueTypography.subtitle2, - color = colors.textSecondary + color = currentColors.textSecondary ) } item { @@ -542,7 +541,7 @@ fun EateryDetailScreenContent( }, shape = RoundedCornerShape(100), colors = ButtonDefaults.buttonColors( - containerColor = colors.accentPrimary, + containerColor = currentColors.accentPrimary, contentColor = currentColors.backgroundDefault ) ) { @@ -624,7 +623,9 @@ fun EateryDetailScreenContent( .fillMaxWidth() .padding(start = 16.dp, end = 16.dp, bottom = 12.dp) .border( - 1.dp, colors.accentPrimary, RoundedCornerShape(8.dp) + 1.dp, + currentColors.accentPrimary, + RoundedCornerShape(8.dp) ), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically @@ -644,7 +645,7 @@ fun EateryDetailScreenContent( Icon( imageVector = Icons.Outlined.Schedule, contentDescription = null, - tint = colors.textSecondary + tint = currentColors.textSecondary ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( @@ -652,7 +653,7 @@ fun EateryDetailScreenContent( style = TextStyle( fontWeight = FontWeight.SemiBold, fontSize = 16.sp - ), color = colors.textSecondary + ), color = currentColors.textSecondary ) } val openUntil = eatery.getOpenUntil() @@ -674,14 +675,14 @@ fun EateryDetailScreenContent( fontWeight = FontWeight.SemiBold, fontSize = 16.sp ), - color = if (openUntil == null) colors.error - else if (eatery.isClosingSoon()) colors.warning - else colors.success + color = if (openUntil == null) currentColors.error + else if (eatery.isClosingSoon()) currentColors.warning + else currentColors.success ) } HorizontalDivider( - color = colors.accentPrimary, + color = currentColors.accentPrimary, modifier = Modifier .align(Alignment.CenterVertically) .fillMaxHeight(0.5f) @@ -695,7 +696,7 @@ fun EateryDetailScreenContent( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(colors.accentPrimary) + .background(currentColors.accentPrimary) ) } nextEvent.menu?.let { @@ -726,7 +727,7 @@ fun EateryDetailScreenContent( ) .fillMaxWidth() .height(1.dp) - .background(colors.accentPrimary, CircleShape) + .background(currentColors.accentPrimary, CircleShape) ) } eatery.getTypeMeal(viewState.weekdayIndex.fromOffsetToDayOfWeek()) @@ -764,7 +765,7 @@ fun EateryDetailScreenContent( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(colors.accentPrimary) + .background(currentColors.accentPrimary) ) } } @@ -787,7 +788,7 @@ fun EateryDetailScreenContent( text = stringResource(R.string.make_eatery_better_description), style = EateryBlueTypography.body2, modifier = Modifier.padding(bottom = 5.dp), - color = colors.textSecondary + color = currentColors.textSecondary ) @@ -802,7 +803,7 @@ fun EateryDetailScreenContent( openBottomSheet(BottomSheetContent.REPORT) }, colors = ButtonDefaults.buttonColors( - containerColor = colors.backgroundDefault, + containerColor = currentColors.backgroundDefault, ) ) { Icon( @@ -831,7 +832,7 @@ fun EateryDetailScreenContent( modifier = Modifier .fillMaxWidth() .height(16.dp) - .background(colors.accentPrimary) + .background(currentColors.accentPrimary) ) } } @@ -887,7 +888,6 @@ private fun LazyListScope.menuHeadingItem( hoursOnClick: () -> Unit ) { item { - val colors = currentColors Row( modifier = Modifier.padding( top = 16.dp, @@ -918,7 +918,7 @@ private fun LazyListScope.menuHeadingItem( ) }", style = EateryBlueTypography.subtitle2, - color = colors.textSecondary + color = currentColors.textSecondary ) } } @@ -929,7 +929,6 @@ private fun LazyListScope.menuHeadingItem( @Composable fun EateryHeader(eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Unit) { - val colors = currentColors Box( modifier = Modifier .fillMaxWidth() @@ -969,7 +968,7 @@ fun EateryHeader(eatery: Eatery, isFavorite: Boolean, onFavoriteClick: () -> Uni ) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) colors.favorite else colors.textSecondary, + tint = if (isFavorite) currentColors.favorite else currentColors.textSecondary, contentDescription = null ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt index fe01d7dd..94195b4a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt @@ -99,7 +99,6 @@ private fun FavoritesScreenContent( removeFavorite: (eateryId: Int, eateryName: String) -> Unit, removeFavoriteMenuItem: (menuItem: String) -> Unit, ) { - val colors = currentColors val shimmer = rememberShimmer(ShimmerBounds.View) var toggle by remember { mutableStateOf(true) } @@ -133,7 +132,7 @@ private fun FavoritesScreenContent( } Text( text = stringResource(R.string.favorites_title), - color = colors.backgroundSecondary, + color = currentColors.backgroundSecondary, style = EateryBlueTypography.h2, modifier = Modifier.padding(horizontal = 6.dp) ) @@ -330,7 +329,6 @@ private fun ColumnScope.MainScrollableContent( @Composable private fun EateriesEmptyState(message: String) { - val colors = currentColors Box( modifier = Modifier .fillMaxHeight(0.7f) @@ -347,7 +345,7 @@ private fun EateriesEmptyState(message: String) { modifier = Modifier .height(72.dp) .width(72.dp), - tint = colors.backgroundDefault92, + tint = currentColors.backgroundDefault92, ) Text( @@ -369,7 +367,6 @@ private fun EateryBlob( fillMaxWidth: Boolean = true, height: Dp = 186.dp ) { - val colors = currentColors Surface( modifier = Modifier .padding(horizontal = 6.dp) @@ -381,6 +378,6 @@ private fun EateryBlob( ) .then(if (fillMaxWidth) Modifier.fillMaxWidth() else Modifier.width(295.dp)) .height(height), - color = colors.backgroundDefault92 + color = currentColors.backgroundDefault92 ) {} } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt index 50263757..ca2bb43d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt @@ -27,7 +27,6 @@ import com.cornellappdev.android.eatery.util.EateryPreview @Composable fun LegalScreen() { val uriCurrent = LocalUriHandler.current - val colors = currentColors Column( modifier = Modifier .padding(horizontal = 16.dp) @@ -36,14 +35,14 @@ fun LegalScreen() { ) { Text( text = stringResource(R.string.legal_title), - color = colors.textPrimary, + color = currentColors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) Text( text = stringResource(R.string.legal_description), style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = colors.textPrimary, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 7.dp, bottom = 12.dp) ) @@ -54,7 +53,7 @@ fun LegalScreen() { Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = colors.backgroundSecondary, + tint = currentColors.backgroundSecondary, ) } ) @@ -66,7 +65,7 @@ fun LegalScreen() { Icon( imageVector = Icons.Outlined.ArrowOutward, contentDescription = null, - tint = colors.backgroundSecondary, + tint = currentColors.backgroundSecondary, ) } ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt index 66057bee..835d12bc 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt @@ -68,7 +68,6 @@ private fun NearestScreenContent( ) { val nearestEateries = uiState.nearestEateries val favorites = uiState.favoriteEateries - val colors = currentColors Column( modifier = Modifier .padding(horizontal = 16.dp) @@ -77,7 +76,7 @@ private fun NearestScreenContent( ) { Text( text = stringResource(R.string.nearest_title), - color = colors.textPrimary, + color = currentColors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) @@ -102,7 +101,7 @@ private fun NearestScreenContent( modifier = Modifier .height(72.dp) .width(72.dp), - tint = colors.backgroundDefault92, + tint = currentColors.backgroundDefault92, ) Text( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt index c1bc0364..846c6244 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt @@ -23,7 +23,6 @@ import com.cornellappdev.android.eatery.util.EateryPreview @Composable fun NotificationsSettingsScreen() { - val colors = currentColors Column( modifier = Modifier @@ -33,7 +32,7 @@ fun NotificationsSettingsScreen() { ) { Text( text = stringResource(R.string.notifications_title), - color = colors.textPrimary, + color = currentColors.textPrimary, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) @@ -41,7 +40,7 @@ fun NotificationsSettingsScreen() { Text( text = stringResource(R.string.notifications_description), style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), - color = colors.textPrimary, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 7.dp, bottom = 12.dp) ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index 5028dfb3..51fad760 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -427,11 +427,10 @@ private fun UpcomingLazyColumn( @Composable @OptIn(ExperimentalAnimationApi::class) private fun UpcomingMenuHeader(isFirstVisible: State) { - val colors = currentColors Column( modifier = Modifier .fillMaxWidth() - .background(colors.backgroundSecondary) + .background(currentColors.backgroundSecondary) .then(Modifier.statusBarsPadding()) .padding(bottom = 7.dp), ) { From 6a1ec4da3be527e641c047cf72a699cf18db62e6 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 14:11:40 -0400 Subject: [PATCH 15/31] Fix search bar colors --- .../android/eatery/ui/components/general/SearchBar.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt index 9b3a0ff4..378e89bb 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.components.general +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -69,6 +70,7 @@ fun SearchBar( Row( modifier = Modifier .fillMaxWidth() + .background(color = currentColors.accentPrimary) .then(modifier), verticalAlignment = Alignment.CenterVertically ) { @@ -111,9 +113,9 @@ fun SearchBar( ) }, colors = TextFieldDefaults.colors( - focusedContainerColor = currentColors.backgroundDefault, - unfocusedContainerColor = currentColors.backgroundDefault, - disabledContainerColor = currentColors.backgroundDefault, + focusedContainerColor = currentColors.accentPrimary, + unfocusedContainerColor = currentColors.accentPrimary, + disabledContainerColor = currentColors.accentPrimary, cursorColor = currentColors.textPrimary, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, From d49406b87380268b5467946c5db7b67f9f2d5795 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 15:32:01 -0400 Subject: [PATCH 16/31] Background color fixes --- .../android/eatery/ui/components/general/SearchBar.kt | 2 -- .../android/eatery/ui/components/login/AccountPage.kt | 1 + .../android/eatery/ui/components/upcoming/MenuCard.kt | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt index 378e89bb..7029217b 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/SearchBar.kt @@ -1,6 +1,5 @@ package com.cornellappdev.android.eatery.ui.components.general -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -70,7 +69,6 @@ fun SearchBar( Row( modifier = Modifier .fillMaxWidth() - .background(color = currentColors.accentPrimary) .then(modifier), verticalAlignment = Alignment.CenterVertically ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index 3ea4658b..22bc0b93 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -144,6 +144,7 @@ private fun AccountPageContent( Column( modifier = Modifier .fillMaxWidth() + .background(currentColors.backgroundDefault) ) { AccountPageHeader(isFirstVisible, onSettingsClicked) LazyColumn(state = innerListState) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt index c48eb8b9..07fcb6b6 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt @@ -200,6 +200,7 @@ private fun EateryEventMenu(menu: List) { Text( text = category.category, style = EateryBlueTypography.h5, + color = currentColors.textPrimary, modifier = Modifier.padding(top = 8.dp, bottom = 8.dp), ) Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { @@ -222,6 +223,7 @@ private fun MenuItemDisplay(item: MenuItemViewState) { Text( text = item.item.name ?: stringResource(R.string.unknown_item), style = EateryBlueTypography.caption, + color = currentColors.textSecondary, fontWeight = FontWeight.Normal ) if (item.isFavorite) { From 1a05099328cb82d703d3168ccce25aa9004c0a43 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 15:57:39 -0400 Subject: [PATCH 17/31] Fix text colors --- .../comparemenus/CompareMenusBottomSheet.kt | 1 + .../details/EateryMenusBottomSheet.kt | 1 + .../components/details/ItemFavoritesCard.kt | 14 +++++- .../components/general/AppStoreRatingPopup.kt | 9 +++- .../eatery/ui/components/general/FilterRow.kt | 2 +- .../ui/components/general/NoEateryFound.kt | 3 +- .../general/PaymentMethodsBottomSheet.kt | 15 ++++--- .../general/PermissionRequestDialog.kt | 3 +- .../ui/components/home/EateryHomeSection.kt | 1 + .../notifications/FavoriteItemRow.kt | 12 +++-- .../components/settings/AppIconBottomSheet.kt | 3 +- .../ui/components/upcoming/MealBottomSheet.kt | 45 ++++++++++++------- .../eatery/ui/screens/CompareMenusScreen.kt | 12 +++-- .../eatery/ui/screens/EateryDetailScreen.kt | 8 ++-- .../ui/screens/NotificationsHomeScreen.kt | 3 +- .../android/eatery/ui/screens/SearchScreen.kt | 9 ++-- .../eatery/ui/screens/SettingsScreen.kt | 3 +- .../eatery/ui/screens/SupportScreen.kt | 3 +- 18 files changed, 101 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt index d7d53fed..3b6f45ee 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt @@ -174,6 +174,7 @@ fun CompareMenusBottomSheetContent( text = if (selectedEateries.size < 2) "Select at least ${2 - selectedEateries.size} more" else "Compare ${selectedEateries.size} now", style = EateryBlueTypography.h5, + color = currentColors.textPrimary, ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt index b94ec4aa..fc92e614 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt @@ -109,6 +109,7 @@ fun EateryMenusBottomSheet( Text( text = stringResource(R.string.menus_title), style = EateryBlueTypography.h4, + color = currentColors.textPrimary, ) } IconButton( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt index dcb6a8ec..3b4fff36 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt @@ -77,7 +77,12 @@ fun ItemFavoritesCard( modifier = Modifier .fillMaxWidth() ) { - Text(viewState.itemName, fontSize = 20.sp, style = EateryBlueTypography.button) + Text( + viewState.itemName, + fontSize = 20.sp, + style = EateryBlueTypography.button, + color = currentColors.textPrimary + ) FavoriteButton(isFavorite = true, onFavoriteClick = { onFavoriteClick() }) } Row( @@ -118,7 +123,12 @@ fun ItemInformation(meal: String, eateryName: List) { Column( modifier = Modifier.padding(top = 8.dp) ) { - Text(meal, fontSize = 20.sp, style = EateryBlueTypography.button) + Text( + meal, + fontSize = 20.sp, + style = EateryBlueTypography.button, + color = currentColors.textPrimary + ) eateryName.forEach { eatery -> Text(eatery, style = EateryBlueTypography.caption, color = Color(0xff7D8288)) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt index 102870a2..e7268c15 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/AppStoreRatingPopup.kt @@ -118,7 +118,11 @@ private fun ActionPrompt( onDismiss: () -> Unit ) { AppStoreRatingCardBorder(onDismiss) { - Text(actionText, style = EateryBlueTypography.h6) + Text( + actionText, + style = EateryBlueTypography.h6, + color = currentColors.textPrimary + ) Spacer(Modifier.height(12.dp)) Button( onButtonPress, @@ -147,7 +151,8 @@ private fun RatingPrompt(rating: Int, onChangeRating: (Int) -> Unit, onDismiss: Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { Text( stringResource(R.string.app_store_rating_question), - style = EateryBlueTypography.h4 + style = EateryBlueTypography.h4, + color = currentColors.textPrimary ) RatingBar(rating, onChangeRating) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt index a4ae9178..1522407c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt @@ -82,7 +82,7 @@ fun FilterButton( contentColor = contentColor ) ) { - Text(text) + Text(text = text, color = contentColor) if (hasExpandIcon) { Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Icon( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt index ccfb2d0a..ad121cb0 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/NoEateryFound.kt @@ -39,7 +39,8 @@ fun NoEateryFound(modifier: Modifier = Modifier, resetFilters: () -> Unit) { Text( text = stringResource(R.string.no_eatery_found), style = EateryBlueTypography.h5, - modifier = Modifier.padding(top = 12.dp) + modifier = Modifier.padding(top = 12.dp), + color = currentColors.textPrimary ) Button( modifier = Modifier.padding(top = 12.dp), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt index 1ae91be9..f11840e1 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt @@ -46,7 +46,8 @@ fun PaymentMethodsBottomSheet( Text( text = stringResource(R.string.payment_methods_title), style = EateryBlueTypography.h4, - modifier = Modifier.padding(bottom = 12.dp) + modifier = Modifier.padding(bottom = 12.dp), + color = currentColors.textPrimary ) IconButton( @@ -103,7 +104,8 @@ fun PaymentMethodsBottomSheet( Text( text = stringResource(R.string.payment_methods_meal_swipes), style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), - modifier = Modifier.padding(top = 8.dp) + modifier = Modifier.padding(top = 8.dp), + color = currentColors.textPrimary ) } @@ -139,7 +141,8 @@ fun PaymentMethodsBottomSheet( Text( text = stringResource(R.string.payment_methods_brbs), style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), - modifier = Modifier.padding(top = 8.dp) + modifier = Modifier.padding(top = 8.dp), + color = currentColors.textPrimary ) } Column( @@ -174,7 +177,8 @@ fun PaymentMethodsBottomSheet( Text( text = stringResource(R.string.payment_methods_cash_or_credit), style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), - modifier = Modifier.padding(top = 8.dp) + modifier = Modifier.padding(top = 8.dp), + color = currentColors.textPrimary ) } } @@ -193,7 +197,8 @@ fun PaymentMethodsBottomSheet( Text( text = stringResource(R.string.payment_methods_show_results), style = EateryBlueTypography.h5, - modifier = Modifier.padding(top = 8.dp, bottom = 8.dp) + modifier = Modifier.padding(top = 8.dp, bottom = 8.dp), + color = currentColors.textPrimary ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt index 990849b9..ed443158 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PermissionRequestDialog.kt @@ -109,7 +109,8 @@ fun PermissionRequestDialog( } ), textAlign = TextAlign.Center, - fontWeight = FontWeight.Medium + fontWeight = FontWeight.Medium, + color = Color.Black ) Spacer(modifier = Modifier.height(15.dp)) Button( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt index 5c2e62da..300fa2cf 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/home/EateryHomeSection.kt @@ -105,6 +105,7 @@ private fun EateryHomeSectionHeader( Text( text = title, style = EateryBlueTypography.h4, + color = currentColors.textPrimary, ) if (onExpandClick != null) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt index 340a65c8..44d1a538 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/notifications/FavoriteItemRow.kt @@ -53,7 +53,8 @@ fun FavoriteItemRow( Text( text = itemName, style = EateryBlueTypography.h5, - modifier = Modifier.padding(end = 10.dp) + modifier = Modifier.padding(end = 10.dp), + color = currentColors.textPrimary ) Text( text = stringResource(R.string.today), @@ -124,16 +125,19 @@ private fun CondenseEateriesName(eateries: List) { Text( text = "At ", - fontSize = 12.sp + fontSize = 12.sp, + color = currentColors.textSecondary ) Text( text = text, fontWeight = FontWeight(600), - fontSize = 12.sp + fontSize = 12.sp, + color = currentColors.textSecondary ) Text( text = " $suffix", - fontSize = 12.sp + fontSize = 12.sp, + color = currentColors.textSecondary ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt index 786f15db..9e510811 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt @@ -141,7 +141,8 @@ fun AppIconBottomSheet(hide: () -> Unit) { Text( text = stringResource(R.string.done), style = EateryBlueTypography.h5, - modifier = Modifier.padding(top = 8.dp, bottom = 8.dp) + modifier = Modifier.padding(top = 8.dp, bottom = 8.dp), + color = currentColors.textPrimary ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt index 40c1eef4..39071895 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt @@ -3,6 +3,7 @@ package com.cornellappdev.android.eatery.ui.components.upcoming import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -63,7 +64,8 @@ fun MealBottomSheet( Text( text = stringResource(R.string.menus_title), style = EateryBlueTypography.h4, - modifier = Modifier.padding(bottom = 12.dp) + modifier = Modifier.padding(bottom = 12.dp), + color = currentColors.textPrimary ) IconButton( @@ -98,12 +100,14 @@ fun MealBottomSheet( Text( text = MealFilter.BREAKFAST.displayName, modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.h5 + style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) Text( text = stringResource(R.string.meal_time_breakfast), modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.caption + style = EateryBlueTypography.caption, + color = currentColors.textSecondary ) } IconButton( @@ -150,12 +154,14 @@ fun MealBottomSheet( Text( text = MealFilter.LUNCH.displayName, modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.h5 + style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) Text( text = stringResource(R.string.meal_time_lunch), modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.caption + style = EateryBlueTypography.caption, + color = currentColors.textSecondary ) } IconButton( @@ -203,12 +209,14 @@ fun MealBottomSheet( Text( text = MealFilter.DINNER.displayName, modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.h5 + style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) Text( text = stringResource(R.string.meal_time_dinner), modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.caption + style = EateryBlueTypography.caption, + color = currentColors.textSecondary ) } IconButton( @@ -254,12 +262,14 @@ fun MealBottomSheet( Text( text = MealFilter.LATE_DINNER.displayName, modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.h5 + style = EateryBlueTypography.h5, + color = currentColors.textPrimary ) Text( text = stringResource(R.string.meal_time_late_dinner), modifier = Modifier.padding(start = 16.dp), - style = EateryBlueTypography.caption + style = EateryBlueTypography.caption, + color = currentColors.textSecondary ) } IconButton( @@ -302,7 +312,8 @@ fun MealBottomSheet( Text( text = stringResource(R.string.show_menu), style = EateryBlueTypography.h5, - modifier = Modifier.padding(top = 6.dp, bottom = 6.dp) + modifier = Modifier.padding(top = 6.dp, bottom = 6.dp), + color = currentColors.textPrimary ) } @@ -326,11 +337,13 @@ fun MealBottomSheet( @DualModePreview @Composable private fun MealBottomSheetPreview() = EateryPreview { - MealBottomSheet( - isVisible = true, - selectedMeal = MealFilter.LUNCH, - onSubmit = {}, - hide = {} - ) + Box(modifier = Modifier.size(300.dp, 400.dp)) { + MealBottomSheet( + isVisible = true, + selectedMeal = MealFilter.LUNCH, + onSubmit = {}, + hide = {} + ) + } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt index 80ca1862..58eb22f4 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt @@ -153,7 +153,8 @@ private fun CompareMenusScreenContent( text = stringResource(R.string.compare_menus_title), fontSize = 20.sp, style = EateryBlueTypography.h5, - fontWeight = FontWeight(600) + fontWeight = FontWeight(600), + color = currentColors.textPrimary ) } HorizontalDivider( @@ -408,7 +409,8 @@ private fun MenuPager( modifier = Modifier.padding( horizontal = 16.dp, vertical = 12.dp - ) + ), + color = currentColors.textPrimary ) } @@ -428,7 +430,8 @@ private fun MenuPager( Text( text = menuItem.name ?: "Item Name", style = EateryBlueTypography.button, - modifier = Modifier.weight(1f) + modifier = Modifier.weight(1f), + color = currentColors.textPrimary ) } @@ -571,7 +574,8 @@ private fun TitlePager( text = it, style = EateryBlueTypography.button, maxLines = 1, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index 0c9cc2f0..5ec0775c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -240,7 +240,7 @@ fun EateryDetailScreenContent( when (viewState) { is EateryDetailViewState.Error -> { // TODO we should have an error state for this screen lol - Text("Cannot load Eatery Details") + Text("Cannot load Eatery Details", color = currentColors.textPrimary) } is EateryDetailViewState.Loaded -> { @@ -609,7 +609,8 @@ fun EateryDetailScreenContent( modifier = Modifier.padding(vertical = 6.dp), text = stringResource(R.string.get_directions), style = EateryBlueTypography.h5, - maxLines = 1 + maxLines = 1, + color = currentColors.textPrimary ) } } @@ -782,7 +783,8 @@ fun EateryDetailScreenContent( Text( text = stringResource(R.string.make_eatery_better), style = EateryBlueTypography.h5, - modifier = Modifier.padding(vertical = 8.dp) + modifier = Modifier.padding(vertical = 8.dp), + color = currentColors.textPrimary ) Text( text = stringResource(R.string.make_eatery_better_description), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt index 102c9019..459d0447 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt @@ -36,7 +36,8 @@ fun NotificationsHomeScreen( Text( text = stringResource(R.string.notifications_home_favorite_items), style = EateryBlueTypography.h4, - modifier = Modifier.padding(bottom = 20.dp) + modifier = Modifier.padding(bottom = 20.dp), + color = currentColors.textPrimary ) LazyColumn { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt index 297cb691..86860a3a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt @@ -273,7 +273,8 @@ private fun SearchScreenContent( ) { Text( text = stringResource(R.string.search_favorites), - style = EateryBlueTypography.h4 + style = EateryBlueTypography.h4, + color = currentColors.textPrimary ) IconButton( onClick = { @@ -313,7 +314,8 @@ private fun SearchScreenContent( Text( modifier = Modifier.padding(start = 16.dp, top = 12.dp), text = stringResource(R.string.search_recent_searches), - style = EateryBlueTypography.h4 + style = EateryBlueTypography.h4, + color = currentColors.textPrimary ) } items(recentSearches) { eateryId -> @@ -485,7 +487,8 @@ fun FavoriteItem( textAlign = TextAlign.Center, modifier = Modifier .align(Alignment.CenterHorizontally) - .padding(top = 8.dp) + .padding(top = 8.dp), + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt index 4d62a333..b17e5032 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt @@ -295,7 +295,8 @@ private fun SettingsScreenContent( Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Text( text = stringResource(R.string.settings_logout), - style = EateryBlueTypography.button + style = EateryBlueTypography.button, + color = currentColors.textPrimary ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index d4acaed2..3e218a0a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -198,7 +198,8 @@ private fun SupportScreenContent( Text( text = stringResource(R.string.report_an_issue), style = EateryBlueTypography.h5, - modifier = Modifier.padding(start = 8.dp) + modifier = Modifier.padding(start = 8.dp), + color = currentColors.textPrimary ) } From b3a320a3627b728b1b957b0a5d7e78bc52d18d29 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 17:14:11 -0400 Subject: [PATCH 18/31] Fix background colors --- .../comparemenus/CompareMenusBottomSheet.kt | 2 + .../details/EateryHourBottomSheet.kt | 1 + .../details/EateryMenusBottomSheet.kt | 2 + .../general/PaymentMethodsBottomSheet.kt | 1 + .../eatery/ui/components/login/AccountPage.kt | 2 + .../eatery/ui/components/login/LoginPage.kt | 4 + .../components/settings/AppIconBottomSheet.kt | 6 +- .../components/settings/ReportBottomSheet.kt | 6 +- .../ui/components/upcoming/MealBottomSheet.kt | 1 + .../ui/navigation/MainTabbedNavigation.kt | 1 + .../android/eatery/ui/screens/AboutScreen.kt | 6 +- .../eatery/ui/screens/CompareMenusScreen.kt | 8 +- .../eatery/ui/screens/EateryDetailScreen.kt | 4 +- .../eatery/ui/screens/FavoritesScreen.kt | 2 + .../android/eatery/ui/screens/HomeScreen.kt | 8 +- .../android/eatery/ui/screens/LegalScreen.kt | 2 + .../eatery/ui/screens/NearestScreen.kt | 2 + .../ui/screens/NotificationsHomeScreen.kt | 2 + .../ui/screens/NotificationsSettingsScreen.kt | 2 + .../eatery/ui/screens/OnboardingScreen.kt | 7 +- .../eatery/ui/screens/PrivacyScreen.kt | 2 + .../eatery/ui/screens/ProfileScreen.kt | 47 ++-- .../android/eatery/ui/screens/SearchScreen.kt | 9 +- .../eatery/ui/screens/SettingsScreen.kt | 4 + .../eatery/ui/screens/SupportScreen.kt | 6 +- .../eatery/ui/screens/UpcomingMenuScreen.kt | 238 +++++++++--------- 26 files changed, 230 insertions(+), 145 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt index 3b6f45ee..b4910da9 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt @@ -94,6 +94,7 @@ fun CompareMenusBottomSheetContent( Column( modifier = Modifier .fillMaxWidth() + .background(currentColors.backgroundDefault) .padding(top = 14.dp) .padding(16.dp), horizontalAlignment = Alignment.Start @@ -130,6 +131,7 @@ fun CompareMenusBottomSheetContent( Column( modifier = Modifier .fillMaxWidth() + .background(currentColors.backgroundDefault) .padding(16.dp, 10.dp, 16.dp, 16.dp), horizontalAlignment = Alignment.Start ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt index 44c86d97..8a7292d5 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt @@ -48,6 +48,7 @@ fun EateryHourBottomSheet( Column( modifier = Modifier .fillMaxWidth() + .background(currentColors.backgroundDefault) .padding(top = 14.dp) .padding(16.dp), horizontalAlignment = Alignment.Start diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt index fc92e614..26eb9e94 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt @@ -19,6 +19,7 @@ import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -92,6 +93,7 @@ fun EateryMenusBottomSheet( Card( modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp), + colors = CardDefaults.cardColors(containerColor = currentColors.backgroundDefault), ) { Column( modifier = Modifier.padding( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt index f11840e1..8641897d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt @@ -37,6 +37,7 @@ fun PaymentMethodsBottomSheet( ) { Column( modifier = Modifier + .background(currentColors.backgroundDefault) .padding(start = 16.dp, end = 16.dp, top = 24.dp) ) { Row( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index 22bc0b93..d51a3f13 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -96,6 +96,8 @@ fun AccountPage( ModalBottomSheet( onDismissRequest = { showBottomSheet = false }, sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt index 752ce098..34ce3d2f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt @@ -7,6 +7,7 @@ import android.webkit.CookieManager import android.webkit.WebView import android.webkit.WebViewClient import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -87,6 +88,8 @@ fun LoginPage( onModalHidden() }, sheetState = sheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, @@ -125,6 +128,7 @@ private fun LoginPageMainLayer( start = 16.dp, end = 16.dp ) + .background(currentColors.backgroundDefault) .then(Modifier.statusBarsPadding()) ) { Row( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt index 9e510811..78343c77 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/AppIconBottomSheet.kt @@ -54,7 +54,11 @@ fun AppIconBottomSheet(hide: () -> Unit) { val context = LocalContext.current val (selectedAppIcon, setSelectedAppIcon) = remember { mutableStateOf(currentIcon(context)) } val currentIcon = currentIcon(context) - Column(modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 24.dp)) { + Column( + modifier = Modifier + .background(currentColors.backgroundDefault) + .padding(start = 16.dp, end = 16.dp, top = 24.dp) + ) { Row( horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt index 146a59d3..641ee229 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/ReportBottomSheet.kt @@ -101,6 +101,8 @@ fun ReportBottomSheet( ModalBottomSheet( onDismissRequest = { showIssueSheet = false }, sheetState = issueSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, @@ -126,7 +128,7 @@ fun ReportBottomSheet( } } - Column { + Column(modifier = Modifier.background(currentColors.backgroundDefault)) { Row(modifier = Modifier.statusBarsPadding()) { Spacer(Modifier.weight(1f, true)) HorizontalDivider( @@ -217,7 +219,7 @@ fun ReportBottomSheet( Surface( shape = RoundedCornerShape(8.dp), - color = currentColors.textPrimary, + color = currentColors.accentPrimary, modifier = Modifier .fillMaxWidth() .height(220.dp) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt index 39071895..f5d709bb 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MealBottomSheet.kt @@ -55,6 +55,7 @@ fun MealBottomSheet( if (!isVisible) currSelectedMeal.value = selectedMeal Column( modifier = Modifier + .background(currentColors.backgroundDefault) .padding(start = 16.dp, end = 16.dp, top = 24.dp) ) { Row( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt index eaf2bf34..e5dd1271 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/navigation/MainTabbedNavigation.kt @@ -86,6 +86,7 @@ fun NavigationSetup( } Scaffold( + containerColor = currentColors.backgroundDefault, contentWindowInsets = WindowInsets(0, 0, 0, 0), bottomBar = { AnimatedContent( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt index 5be48db5..eaea5060 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt @@ -57,7 +57,11 @@ import kotlinx.coroutines.launch @Composable fun AboutScreen() { val uriCurrent = LocalUriHandler.current - Column(modifier = Modifier.fillMaxSize()) { + Column( + modifier = Modifier + .fillMaxSize() + .background(color = currentColors.backgroundDefault) + ) { Column( modifier = Modifier .padding(horizontal = 16.dp) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt index 58eb22f4..847b2e00 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt @@ -142,7 +142,11 @@ private fun CompareMenusScreenContent( } val issue by remember { mutableStateOf(null) } - Column { + Column( + modifier = Modifier + .fillMaxWidth() + .background(color = currentColors.backgroundDefault) + ) { Row( modifier = Modifier .padding(start = 16.dp, end = 16.dp, top = 56.dp, bottom = 12.dp) @@ -197,6 +201,8 @@ private fun CompareMenusScreenContent( ModalBottomSheet( onDismissRequest = closeBottomSheet, sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index 5ec0775c..57eb5625 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -233,7 +233,7 @@ fun EateryDetailScreenContent( ) { paddingValues -> Box( modifier = Modifier - .background(currentColors.backgroundDefault) + .background(color = currentColors.backgroundDefault) .padding(paddingValues) .fillMaxSize() ) { @@ -278,6 +278,8 @@ fun EateryDetailScreenContent( ModalBottomSheet( onDismissRequest = closeBottomSheet, sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt index 94195b4a..98b18310 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt @@ -3,6 +3,7 @@ package com.cornellappdev.android.eatery.ui.screens import ItemFavoritesCard import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -104,6 +105,7 @@ private fun FavoritesScreenContent( Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .padding(horizontal = 10.dp) .then(Modifier.statusBarsPadding()) .fillMaxSize() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt index b2553fd9..1a11c824 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt @@ -247,7 +247,9 @@ private fun HomeScreenContent( var isGridView: Boolean by remember { mutableStateOf(false) } Scaffold( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .background(currentColors.backgroundDefault), floatingActionButton = { if (eateriesApiResponse is EateryApiResponse.Success && eateriesApiResponse.data.size >= 2) { CompareMenusFAB( @@ -267,14 +269,16 @@ private fun HomeScreenContent( content = { paddingValues -> Box( modifier = Modifier - .background(currentColors.backgroundDefault) .padding(paddingValues) .fillMaxSize() + .background(currentColors.backgroundDefault) ) { if (showBottomSheet) { ModalBottomSheet( onDismissRequest = closeBottomSheet, sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt index ca2bb43d..691f3126 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.screens +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -29,6 +30,7 @@ fun LegalScreen() { val uriCurrent = LocalUriHandler.current Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .padding(horizontal = 16.dp) .then(Modifier.statusBarsPadding()) .fillMaxSize() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt index 835d12bc..5a6238e3 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NearestScreen.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.screens +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -70,6 +71,7 @@ private fun NearestScreenContent( val favorites = uiState.favoriteEateries Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .padding(horizontal = 16.dp) .then(Modifier.statusBarsPadding()) .fillMaxSize() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt index 459d0447..57e6d582 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsHomeScreen.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.screens +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -23,6 +24,7 @@ fun NotificationsHomeScreen( ) { Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .padding(horizontal = 16.dp) .then(Modifier.statusBarsPadding()) .fillMaxSize() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt index 846c6244..e69b457a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.screens +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -26,6 +27,7 @@ fun NotificationsSettingsScreen() { Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .padding(horizontal = 16.dp) .then(Modifier.statusBarsPadding()) .fillMaxSize() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt index 771c9579..678468b8 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/OnboardingScreen.kt @@ -1,6 +1,7 @@ package com.cornellappdev.android.eatery.ui.screens import androidx.activity.compose.BackHandler +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -66,7 +67,11 @@ fun OnboardingScreenContent( var fadePage by rememberSaveable { mutableStateOf(false) } val cornell = stringResource(R.string.onboarding_cornell) val appdev = stringResource(R.string.onboarding_appdev) - Box(modifier = Modifier.fillMaxSize()) { + Box( + modifier = Modifier + .background(color = currentColors.backgroundDefault) + .fillMaxSize() + ) { HorizontalPager( state = pagerState, modifier = Modifier.fillMaxSize(), userScrollEnabled = false diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt index 9b344b1e..7f27d5a8 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt @@ -2,6 +2,7 @@ package com.cornellappdev.android.eatery.ui.screens import android.content.Intent import android.net.Uri +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -72,6 +73,7 @@ private fun PrivacyScreenContent( ) { Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .padding(horizontal = 16.dp) .then(Modifier.statusBarsPadding()) .fillMaxSize() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt index ad409f5e..1b4ac6df 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/ProfileScreen.kt @@ -1,7 +1,11 @@ package com.cornellappdev.android.eatery.ui.screens import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.cornellappdev.android.eatery.data.models.AccountBalances @@ -9,6 +13,7 @@ import com.cornellappdev.android.eatery.data.models.TransactionAccountType import com.cornellappdev.android.eatery.ui.components.general.NetworkErrorToast import com.cornellappdev.android.eatery.ui.components.login.AccountPage import com.cornellappdev.android.eatery.ui.components.login.LoginPage +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.ui.viewmodels.LoginViewModel import com.cornellappdev.android.eatery.ui.viewmodels.state.DisplayTransaction import com.cornellappdev.android.eatery.util.DualModePreview @@ -65,24 +70,30 @@ private fun ProfileScreenContent( onQueryChanged: (String) -> Unit, updateAccountFilter: (TransactionAccountType) -> Unit ) { - if (isLoginState) { - LoginPage( - isLoading = loading, - onLoginPressed = onLoginPressed, - onSuccess = onSuccess, - onBackClick = onBackClick, - onModalHidden = onModalHidden - ) - } else { - AccountPage( - accountFilter = accountFilter, - accountTypeBalance = accountTypeBalance, - onSettingsClicked = onSettingsClicked, - filteredTransactions = filteredTransactions, - filterText = filterText, - onQueryChanged = onQueryChanged, - updateAccountFilter = updateAccountFilter - ) + Box( + modifier = Modifier + .background(color = currentColors.backgroundDefault) + .fillMaxSize() + ) { + if (isLoginState) { + LoginPage( + isLoading = loading, + onLoginPressed = onLoginPressed, + onSuccess = onSuccess, + onBackClick = onBackClick, + onModalHidden = onModalHidden + ) + } else { + AccountPage( + accountFilter = accountFilter, + accountTypeBalance = accountTypeBalance, + onSettingsClicked = onSettingsClicked, + filteredTransactions = filteredTransactions, + filterText = filterText, + onQueryChanged = onQueryChanged, + updateAccountFilter = updateAccountFilter + ) + } } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt index 86860a3a..e26940ed 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SearchScreen.kt @@ -170,6 +170,8 @@ private fun SearchScreenContent( ModalBottomSheet( onDismissRequest = { showPaymentMethodSheet = false }, sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, @@ -189,7 +191,12 @@ private fun SearchScreenContent( val listState = rememberLazyListState() - LazyColumn(state = listState, modifier = Modifier.fillMaxSize()) { + LazyColumn( + state = listState, + modifier = Modifier + .background(color = currentColors.backgroundDefault) + .fillMaxSize() + ) { stickyHeader { Column( modifier = Modifier diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt index b17e5032..63c85c36 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt @@ -1,5 +1,6 @@ package com.cornellappdev.android.eatery.ui.screens +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -80,6 +81,8 @@ private fun SettingsScreenContent( ModalBottomSheet( sheetState = modalBottomSheetState, onDismissRequest = { showAppIconSheet = false }, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, @@ -99,6 +102,7 @@ private fun SettingsScreenContent( Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .fillMaxWidth() .padding(horizontal = 16.dp) .then(Modifier.statusBarsPadding()) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index 3e218a0a..dfe37485 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -2,6 +2,7 @@ package com.cornellappdev.android.eatery.ui.screens import android.content.Intent import android.net.Uri +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -123,6 +124,8 @@ private fun SupportScreenContent( showReportSheet = false }, sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, shape = RoundedCornerShape( bottomStart = 0.dp, bottomEnd = 0.dp, @@ -150,9 +153,10 @@ private fun SupportScreenContent( Column( modifier = Modifier + .background(color = currentColors.backgroundDefault) .padding(horizontal = 16.dp) - .fillMaxSize() .then(Modifier.statusBarsPadding()) + .fillMaxSize() ) { Spacer(modifier = Modifier.height(7.dp)) Text( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index 51fad760..fb2b763c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -115,137 +115,140 @@ private fun UpcomingMenuScreenContent( val coroutineScope = rememberCoroutineScope() val shimmer = rememberShimmer(ShimmerBounds.View) - Box(modifier = Modifier.background(currentColors.backgroundDefault)) { - if (showMealBottomSheet) { - ModalBottomSheet( - sheetState = modalBottomSheetState, - containerColor = currentColors.backgroundDefault, - contentColor = currentColors.textPrimary, - onDismissRequest = { showMealBottomSheet = false }, - shape = RoundedCornerShape( - bottomStart = 0.dp, - bottomEnd = 0.dp, - topStart = 12.dp, - topEnd = 12.dp - ), - ) { - MealBottomSheet( - isVisible = modalBottomSheetState.isVisible, - selectedMeal = viewState.mealFilter, - onSubmit = onMealFilterChanged, - hide = { - coroutineScope.launch { - modalBottomSheetState.hide() - }.invokeOnCompletion { - if (!modalBottomSheetState.isVisible) showMealBottomSheet = false - } + + if (showMealBottomSheet) { + ModalBottomSheet( + sheetState = modalBottomSheetState, + containerColor = currentColors.backgroundDefault, + contentColor = currentColors.textPrimary, + onDismissRequest = { showMealBottomSheet = false }, + shape = RoundedCornerShape( + bottomStart = 0.dp, + bottomEnd = 0.dp, + topStart = 12.dp, + topEnd = 12.dp + ), + ) { + MealBottomSheet( + isVisible = modalBottomSheetState.isVisible, + selectedMeal = viewState.mealFilter, + onSubmit = onMealFilterChanged, + hide = { + coroutineScope.launch { + modalBottomSheetState.hide() + }.invokeOnCompletion { + if (!modalBottomSheetState.isVisible) showMealBottomSheet = false } - ) - } + } + ) } + } - val innerListState = rememberLazyListState() - val filterRowState = rememberLazyListState() - val isFirstVisible = - remember { derivedStateOf { innerListState.firstVisibleItemIndex > 0 } } - when (val menus = viewState.menus) { - is EateryApiResponse.Success -> { - UpcomingMenuShell( - innerListState = innerListState, - isFirstVisible = isFirstVisible, - selectedDay = viewState.selectedDay, - selectDayOffset = onSelectDayOffset, - showModalBottomSheet = { showMealBottomSheet = true }, - mealFilter = viewState.mealFilter, - upcomingMenuFilters = upcomingMenuFilters, - selectedFilters = viewState.selectedFilters, - onToggleFilterClicked = onToggleFilterClicked, - filterRowState = filterRowState - ) { - if (menus.data.isEmpty()) { - item { - Box( - modifier = Modifier - .fillParentMaxHeight(0.7f) - .fillMaxWidth() - ) { - NoEateryFound( - modifier = Modifier.align( - Alignment.Center - ), - resetFilters = onResetFiltersClicked - ) - } - Spacer(modifier = Modifier.height(12.dp)) + val innerListState = rememberLazyListState() + val filterRowState = rememberLazyListState() + val isFirstVisible = + remember { derivedStateOf { innerListState.firstVisibleItemIndex > 0 } } + when (val menus = viewState.menus) { + is EateryApiResponse.Success -> { + UpcomingMenuShell( + innerListState = innerListState, + isFirstVisible = isFirstVisible, + selectedDay = viewState.selectedDay, + selectDayOffset = onSelectDayOffset, + showModalBottomSheet = { showMealBottomSheet = true }, + mealFilter = viewState.mealFilter, + upcomingMenuFilters = upcomingMenuFilters, + selectedFilters = viewState.selectedFilters, + onToggleFilterClicked = onToggleFilterClicked, + filterRowState = filterRowState + ) { + if (menus.data.isEmpty()) { + item { + Box( + modifier = Modifier + .fillParentMaxHeight(0.7f) + .fillMaxWidth() + ) { + NoEateryFound( + modifier = Modifier.align( + Alignment.Center + ), + resetFilters = onResetFiltersClicked + ) } + Spacer(modifier = Modifier.height(12.dp)) } - items(menus.data) { - Column(modifier = Modifier.padding(horizontal = 12.dp)) { - Text( - modifier = Modifier.padding(start = 6.dp), - text = it.header, - style = EateryBlueTypography.h4, - color = currentColors.textPrimary + } + items(menus.data) { + Column(modifier = Modifier.padding(horizontal = 12.dp)) { + Text( + modifier = Modifier.padding(start = 6.dp), + text = it.header, + style = EateryBlueTypography.h4, + color = currentColors.textPrimary + ) + Spacer(modifier = Modifier.height(16.dp)) + it.menuCards.forEach { eatery -> + MenuCard( + menuCardViewState = eatery, + selectEatery = { + onEateryClick(eatery.eateryId) + }, + onEateryCardContract = onEateryCardContract ) - Spacer(modifier = Modifier.height(16.dp)) - it.menuCards.forEach { eatery -> - MenuCard( - menuCardViewState = eatery, - selectEatery = { - onEateryClick(eatery.eateryId) - }, - onEateryCardContract = onEateryCardContract - ) - Spacer(modifier = Modifier.height(12.dp)) - } + Spacer(modifier = Modifier.height(12.dp)) } } } } + } + + is EateryApiResponse.Pending -> { + UpcomingMenuShell( + innerListState = innerListState, + isFirstVisible = isFirstVisible, + selectedDay = viewState.selectedDay, + selectDayOffset = onSelectDayOffset, + showModalBottomSheet = { showMealBottomSheet = true }, + mealFilter = viewState.mealFilter, + upcomingMenuFilters = upcomingMenuFilters, + selectedFilters = viewState.selectedFilters, + onToggleFilterClicked = onToggleFilterClicked, + filterRowState = filterRowState + ) { + items(UpcomingLoadingItem.upcomingItems) { item -> + CreateUpcomingLoadingItem( + item, + shimmer + ) + } + } + } - is EateryApiResponse.Pending -> { - UpcomingMenuShell( - innerListState = innerListState, - isFirstVisible = isFirstVisible, + is EateryApiResponse.Error -> { + Column( + modifier = Modifier + .fillMaxSize() + .background(color = currentColors.backgroundDefault) + ) { + UpcomingMenuHeader(isFirstVisible) + CalendarWeekSelector( selectedDay = viewState.selectedDay, - selectDayOffset = onSelectDayOffset, + selectDayOffset = onSelectDayOffset + ) + UpcomingFilterRow( showModalBottomSheet = { showMealBottomSheet = true }, mealFilter = viewState.mealFilter, upcomingMenuFilters = upcomingMenuFilters, selectedFilters = viewState.selectedFilters, onToggleFilterClicked = onToggleFilterClicked, filterRowState = filterRowState + ) + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center ) { - items(UpcomingLoadingItem.upcomingItems) { item -> - CreateUpcomingLoadingItem( - item, - shimmer - ) - } - } - } - - is EateryApiResponse.Error -> { - Column(modifier = Modifier.fillMaxSize()) { - UpcomingMenuHeader(isFirstVisible) - CalendarWeekSelector( - selectedDay = viewState.selectedDay, - selectDayOffset = onSelectDayOffset - ) - UpcomingFilterRow( - showModalBottomSheet = { showMealBottomSheet = true }, - mealFilter = viewState.mealFilter, - upcomingMenuFilters = upcomingMenuFilters, - selectedFilters = viewState.selectedFilters, - onToggleFilterClicked = onToggleFilterClicked, - filterRowState = filterRowState - ) - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - ErrorContent(onTryAgain = onPingEateries) - } + ErrorContent(onTryAgain = onPingEateries) } } } @@ -404,12 +407,15 @@ private fun UpcomingLazyColumn( content: LazyListScope.() -> Unit ) { LazyColumn( - state = innerListState, modifier = Modifier.fillMaxSize() + state = innerListState, modifier = Modifier + .fillMaxSize() + .background(color = currentColors.backgroundDefault) ) { stickyHeader { - Box(modifier = Modifier - .fillMaxWidth() - .background(currentColors.backgroundDefault) + Box( + modifier = Modifier + .fillMaxWidth() + .background(currentColors.backgroundDefault) ) { upcomingMenuHeader() } From 87b16f799329cdfee446544f57748f55c29dbe47 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 17:44:40 -0400 Subject: [PATCH 19/31] Fix eatery meal tabs --- .../android/eatery/data/models/Eatery.kt | 11 ++++--- .../ui/components/details/EateryMealTabs.kt | 31 ++++++++++--------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/data/models/Eatery.kt b/app/src/main/java/com/cornellappdev/android/eatery/data/models/Eatery.kt index cf3e828c..202ab10e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/data/models/Eatery.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/data/models/Eatery.kt @@ -20,7 +20,7 @@ import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.time.format.TextStyle import java.util.Date -import java.util.Locale +import java.util.Locale.getDefault typealias DayToOperatingHours = Map> typealias OperatingHoursToDays = Map, List> @@ -127,9 +127,12 @@ data class Eatery( */ fun getSelectedEvent(dayIndex: Int, mealDescription: String): Event? { val targetDate = LocalDate.now().plusDays(dayIndex.toLong()) + val formattedMealDescription = + mealDescription.uppercase(getDefault()) + .split(' ').joinToString("_") val ans = events?.find { - it.type.equals(mealDescription, ignoreCase = true) && + it.type.equals(formattedMealDescription, ignoreCase = true) && (it.startTimestamp?.toLocalDate()?.isEqual(targetDate) == true) } return ans @@ -309,7 +312,7 @@ data class Eatery( } var curStrings = mutableListOf() for (i in days.indices) { - val curDay = days[i].getDisplayName(TextStyle.FULL, Locale.getDefault()) + val curDay = days[i].getDisplayName(TextStyle.FULL, getDefault()) if (i == days.size - 1) { curStrings.add(curDay) val formattedString = formatString(curStrings) @@ -329,7 +332,7 @@ data class Eatery( val firstDay = entry.first.split(" to ", " ", limit = 2).first() // Find the matching day and get its sort value DayOfWeek.entries.find { - it.getDisplayName(TextStyle.FULL, Locale.getDefault()) == firstDay + it.getDisplayName(TextStyle.FULL, getDefault()) == firstDay }?.let { (it.value % 7) } ?: Int.MAX_VALUE } return formattedHoursList diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt index 6da2eee3..7f6f3297 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMealTabs.kt @@ -1,13 +1,14 @@ package com.cornellappdev.android.eatery.ui.components.details +import androidx.compose.foundation.background import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.Tab import androidx.compose.material3.TabRowDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors @@ -20,29 +21,31 @@ fun EateryMealTabs(selectedMealIndex: Int, onSelectMeal: (Int) -> Unit, meals: L if (meals.isEmpty()) return val safeSelectedIndex = selectedMealIndex.coerceIn(0, meals.lastIndex) - PrimaryTabRow(selectedTabIndex = safeSelectedIndex, indicator = { - TabRowDefaults.PrimaryIndicator( - modifier = Modifier.tabIndicatorOffset(safeSelectedIndex), - color = Color.Black, - height = 1.dp, - ) - }) { + PrimaryTabRow( + selectedTabIndex = safeSelectedIndex, + containerColor = currentColors.backgroundDefault, + indicator = { + TabRowDefaults.PrimaryIndicator( + modifier = Modifier.tabIndicatorOffset(safeSelectedIndex), + color = currentColors.textPrimary, + height = 1.dp, + ) + }, + divider = @Composable { HorizontalDivider(color = currentColors.borderDefault) } + ) { meals.mapIndexed { index, meal -> Tab( selected = index == safeSelectedIndex, onClick = { onSelectMeal(index) }, + modifier = Modifier.background(color = currentColors.backgroundDefault) ) { Text( meal, style = EateryBlueTypography.button.copy( - color = - if (index == safeSelectedIndex) { - currentColors.textPrimary - } else { - currentColors.textSecondary - } + color = if (index == safeSelectedIndex) currentColors.textPrimary + else currentColors.textSecondary ), modifier = Modifier.padding(horizontal = 10.dp, vertical = 12.dp), ) From 2fb5896f9abe77363498ea0e50fd174d85a1cb83 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 17:49:09 -0400 Subject: [PATCH 20/31] Fix login page text color --- .../eatery/ui/components/login/LoginPage.kt | 17 ++++++++++------- app/src/main/res/values/strings.xml | 7 +++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt index 34ce3d2f..b344fe6d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -123,12 +124,12 @@ private fun LoginPageMainLayer( Column( modifier = Modifier .fillMaxWidth() + .background(currentColors.backgroundDefault) .padding( bottom = 7.dp, start = 16.dp, end = 16.dp ) - .background(currentColors.backgroundDefault) .then(Modifier.statusBarsPadding()) ) { Row( @@ -145,13 +146,13 @@ private fun LoginPageMainLayer( ) { Image( painter = painterResource(R.drawable.ic_left_chevron), - contentDescription = "Back Arrow" + contentDescription = stringResource(R.string.a11y_login_back_arrow) ) } } Text( - text = "Log into Eatery", - color = currentColors.textPrimary, + text = stringResource(R.string.login_title), + color = currentColors.contentBrand, style = EateryBlueTypography.h3 ) val shimmer = rememberShimmer(ShimmerBounds.View) @@ -163,7 +164,7 @@ private fun LoginPageMainLayer( modifier = Modifier.zIndex(1f) ) { Text( - text = "Log in with your Cornell NetID to see your account balance and history", + text = stringResource(R.string.login_description), style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 18.sp), color = currentColors.textPrimary, modifier = Modifier.padding(top = 7.dp) @@ -176,7 +177,7 @@ private fun LoginPageMainLayer( ) { Image( painter = painterResource(id = R.drawable.ic_eaterylogo), - contentDescription = "Eatery logo", + contentDescription = stringResource(R.string.a11y_login_eatery_logo), modifier = Modifier .fillMaxWidth(0.5f) .fillMaxHeight(), @@ -200,7 +201,9 @@ private fun LoginPageMainLayer( elevation = ButtonDefaults.buttonElevation(defaultElevation = 0.dp) ) { Text( - text = if (loading) "Logging in..." else "Log in", + text = if (loading) stringResource(R.string.login_button_logging_in) else stringResource( + R.string.login_button_log_in + ), color = currentColors.oppTextPrimary, style = EateryBlueTypography.h5 ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b2b611f7..9241a7e1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -229,4 +229,11 @@ link account load account information Failed to %1$s: %2$s + + Log into Eatery + Log in with your Cornell NetID to see your account balance and history + Log in + Logging in… + Back Arrow + Eatery logo From 91340bbd9fff41826cfaebdc0b338af11c7911e3 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 18:09:03 -0400 Subject: [PATCH 21/31] Fix calendar week selector --- .../general/CalendarWeekSelector.kt | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt index f3631224..667867b3 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/CalendarWeekSelector.kt @@ -24,6 +24,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview +import com.cornellappdev.android.eatery.util.EateryPreview /** * Reusable UI component that displays today and the next six days @@ -86,7 +88,7 @@ fun CalendarWeekSelector( .size(size = (34 * size).dp) .alpha(size), color = when (i) { - currSelectedDay if currSelectedDay == 0 -> currentColors.accentPrimary + currSelectedDay if currSelectedDay == 0 -> currentColors.contentBrand currSelectedDay, selectedDay -> currentColors.textSecondary else -> currentColors.textSecondary }, @@ -96,10 +98,10 @@ fun CalendarWeekSelector( Text( text = days[i].toString(), color = when { - closedDays?.contains(dayNames[i]) == true -> currentColors.backgroundDefault10 - i != currSelectedDay && i == 0 -> currentColors.accentPrimary + closedDays?.contains(dayNames[i]) == true -> currentColors.textSecondary + i != currSelectedDay && i == 0 -> currentColors.contentBrand i != currSelectedDay && i == selectedDay -> currentColors.textPrimary - i == currSelectedDay -> currentColors.backgroundDefault + i == currSelectedDay -> currentColors.oppTextPrimary else -> currentColors.textPrimary }, style = EateryBlueTypography.h6, @@ -114,3 +116,20 @@ fun CalendarWeekSelector( } } } + +@DualModePreview +@Composable +private fun CalendarWeekSelectorPreview() { + val dayNames = listOf("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") + val days = listOf(1, 2, 3, 4, 5, 6, 7) + EateryPreview { + CalendarWeekSelector( + dayNames = dayNames, + currSelectedDay = 0, + selectedDay = 0, + days = days, + onClick = {}, + closedDays = listOf("Sat", "Sun") + ) + } +} From 0898e16ed396b5c5d76e8315b6e16b540a5ec5fe Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 18:14:03 -0400 Subject: [PATCH 22/31] Fix menu card colors --- .../eatery/ui/components/upcoming/MenuCard.kt | 2 +- .../eatery/ui/screens/UpcomingMenuScreen.kt | 109 +++++++++--------- 2 files changed, 56 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt index 07fcb6b6..aab5d341 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt @@ -72,7 +72,7 @@ fun MenuCard( Card( elevation = CardDefaults.cardElevation(defaultElevation = 5.dp), shape = RoundedCornerShape(10.dp), - colors = CardDefaults.cardColors(containerColor = currentColors.accentPrimary), + colors = CardDefaults.cardColors(containerColor = currentColors.backgroundDefault), modifier = Modifier.clickable { openDropdown = !openDropdown if (!openDropdown) onEateryCardContract() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt index fb2b763c..5559dbd0 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/UpcomingMenuScreen.kt @@ -33,6 +33,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -40,6 +41,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.components.general.CalendarWeekSelector import com.cornellappdev.android.eatery.ui.components.general.Filter import com.cornellappdev.android.eatery.ui.components.general.FilterButton @@ -255,58 +257,6 @@ private fun UpcomingMenuScreenContent( } } -@DualModePreview -@Composable -private fun UpcomingMenuScreenPreview() = EateryPreview { - val previewState = PreviewData.upcomingMenuPreviewState() - UpcomingMenuScreenContent( - viewState = previewState.viewState, - upcomingMenuFilters = previewState.upcomingMenuFilters, - onMealFilterChanged = {}, - onToggleFilterClicked = {}, - onResetFiltersClicked = {}, - onSelectDayOffset = {}, - onPingEateries = {}, - onEateryClick = {}, - onEateryCardContract = {} - ) -} - -@DualModePreview -@Composable -private fun UpcomingMenuScreenEmptyPreview() = EateryPreview { - val previewState = PreviewData.upcomingMenuEmptyPreviewState() - UpcomingMenuScreenContent( - viewState = previewState.viewState, - upcomingMenuFilters = previewState.upcomingMenuFilters, - onMealFilterChanged = {}, - onToggleFilterClicked = {}, - onResetFiltersClicked = {}, - onSelectDayOffset = {}, - onPingEateries = {}, - onEateryClick = {}, - onEateryCardContract = {} - ) -} - -@DualModePreview -@Composable -private fun UpcomingMenuScreenErrorPreview() = EateryPreview { - val previewState = PreviewData.upcomingMenuErrorPreviewState() - UpcomingMenuScreenContent( - viewState = previewState.viewState, - upcomingMenuFilters = previewState.upcomingMenuFilters, - onMealFilterChanged = {}, - onToggleFilterClicked = {}, - onResetFiltersClicked = {}, - onSelectDayOffset = {}, - onPingEateries = {}, - onEateryClick = {}, - onEateryCardContract = {} - ) -} - - @Composable private fun UpcomingMenuShell( innerListState: LazyListState, @@ -452,7 +402,7 @@ private fun UpcomingMenuHeader(isFirstVisible: State) { Text( modifier = Modifier.align(Alignment.Center), textAlign = TextAlign.Center, - text = "Upcoming Menus", + text = stringResource(R.string.upcoming_menus_title), color = currentColors.oppTextPrimary, style = TextStyle( fontWeight = FontWeight.SemiBold, @@ -469,7 +419,7 @@ private fun UpcomingMenuHeader(isFirstVisible: State) { ) ) { Text( - text = "Upcoming Menus", + text = stringResource(R.string.upcoming_menus_title), color = currentColors.oppTextPrimary, style = EateryBlueTypography.h2 ) @@ -478,3 +428,54 @@ private fun UpcomingMenuHeader(isFirstVisible: State) { } } } + +@DualModePreview +@Composable +private fun UpcomingMenuScreenPreview() = EateryPreview { + val previewState = PreviewData.upcomingMenuPreviewState() + UpcomingMenuScreenContent( + viewState = previewState.viewState, + upcomingMenuFilters = previewState.upcomingMenuFilters, + onMealFilterChanged = {}, + onToggleFilterClicked = {}, + onResetFiltersClicked = {}, + onSelectDayOffset = {}, + onPingEateries = {}, + onEateryClick = {}, + onEateryCardContract = {} + ) +} + +@DualModePreview +@Composable +private fun UpcomingMenuScreenEmptyPreview() = EateryPreview { + val previewState = PreviewData.upcomingMenuEmptyPreviewState() + UpcomingMenuScreenContent( + viewState = previewState.viewState, + upcomingMenuFilters = previewState.upcomingMenuFilters, + onMealFilterChanged = {}, + onToggleFilterClicked = {}, + onResetFiltersClicked = {}, + onSelectDayOffset = {}, + onPingEateries = {}, + onEateryClick = {}, + onEateryCardContract = {} + ) +} + +@DualModePreview +@Composable +private fun UpcomingMenuScreenErrorPreview() = EateryPreview { + val previewState = PreviewData.upcomingMenuErrorPreviewState() + UpcomingMenuScreenContent( + viewState = previewState.viewState, + upcomingMenuFilters = previewState.upcomingMenuFilters, + onMealFilterChanged = {}, + onToggleFilterClicked = {}, + onResetFiltersClicked = {}, + onSelectDayOffset = {}, + onPingEateries = {}, + onEateryClick = {}, + onEateryCardContract = {} + ) +} From 488dda45d2c556abb67b1a96dfdf87f1bcb8271f Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 18:19:20 -0400 Subject: [PATCH 23/31] Fix favorites toggle colors --- .../android/eatery/ui/components/details/FavoritesToggle.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt index 52a00462..29e0da7d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt @@ -32,7 +32,7 @@ fun FavoritesToggle( label: String, active: Boolean ) { - val detailColor = if (active) currentColors.favorite else currentColors.accentPrimary + val detailColor = if (active) currentColors.contentBrand else currentColors.textSecondary val backgroundColor = if (active) currentColors.backgroundDefault else Color.Transparent Row( modifier = Modifier @@ -76,7 +76,7 @@ fun ToggleRow(toggle: Boolean, setToggle: (Boolean) -> Unit) { @Composable private fun FavoritesTogglePreview() = EateryPreview { var active by remember { mutableStateOf(false) } - FavoritesToggle({ active = !active }, "Eateries", active) + ToggleRow(toggle = active, setToggle = { active = it }) } From 525b0fdc4d58edd175ddb90581b82b5a284d06e0 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 18:22:05 -0400 Subject: [PATCH 24/31] Fix favorite button color --- .../eatery/ui/components/general/EateryCard.kt | 17 +++++++++++++++++ .../ui/components/general/FavoriteButton.kt | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt index 9639ddce..5c305401 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt @@ -430,3 +430,20 @@ private fun EateryCardPreview() = EateryPreview { style = EateryCardStyle.DEFAULT ) } + +@DualModePreview +@Composable +private fun EateryCardUnfavoritedPreview() = EateryPreview { + EateryCard( + eatery = Eatery( + id = 1, + name = "Test Eatery", + location = "Test Location", + menuSummary = "Test Menu Summary" + ), + isFavorite = false, + onFavoriteClick = {}, + modifier = Modifier.fillMaxWidth(), + style = EateryCardStyle.DEFAULT + ) +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt index a06c8b2e..80441794 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FavoriteButton.kt @@ -38,7 +38,7 @@ fun FavoriteButton( fun FavoriteIcon(isFavorite: Boolean, modifier: Modifier = Modifier) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) currentColors.favorite else currentColors.accentPrimary, + tint = if (isFavorite) currentColors.favorite else currentColors.textSecondary, modifier = modifier, contentDescription = stringResource( if (isFavorite) R.string.favorite_button_remove else R.string.favorite_button_add From edec716e5d41cc3186d89463a922fc3d1dfbc562 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 18:28:56 -0400 Subject: [PATCH 25/31] Fix switchoption color --- .../android/eatery/ui/components/settings/SwitchOption.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt index da894e6e..5bafb57f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/settings/SwitchOption.kt @@ -42,8 +42,8 @@ fun SwitchOption( colors = SwitchDefaults.colors( checkedThumbColor = currentColors.backgroundDefault, uncheckedThumbColor = currentColors.backgroundDefault, - checkedTrackColor = currentColors.accentPrimary, - uncheckedTrackColor = currentColors.backgroundSecondary, + checkedTrackColor = currentColors.contentBrand, + uncheckedTrackColor = currentColors.backgroundDefault, checkedBorderColor = Color.Transparent, uncheckedBorderColor = Color.Transparent, ), From 86938b52eb16d8842ce02fd5d06532e4ad4773cc Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 18:35:51 -0400 Subject: [PATCH 26/31] Fix supportscreen colors --- .../eatery/ui/screens/SupportScreen.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index dfe37485..759e2949 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -194,7 +194,7 @@ private fun SupportScreenContent( showReportSheet = true }, colors = ButtonDefaults.buttonColors( - containerColor = currentColors.accentPrimary, + containerColor = currentColors.contentBrand, contentColor = currentColors.backgroundDefault ) ) { @@ -202,8 +202,7 @@ private fun SupportScreenContent( Text( text = stringResource(R.string.report_an_issue), style = EateryBlueTypography.h5, - modifier = Modifier.padding(start = 8.dp), - color = currentColors.textPrimary + modifier = Modifier.padding(start = 8.dp) ) } @@ -213,13 +212,13 @@ private fun SupportScreenContent( Text( text = stringResource(R.string.support_email_us), style = EateryBlueTypography.button, - color = currentColors.textPrimary + color = currentColors.contentBrand ) Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Icon( Icons.Outlined.ArrowOutward, null, - tint = currentColors.backgroundSecondary + tint = currentColors.contentBrand ) } @@ -292,7 +291,10 @@ private fun ReportButton() { ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(ButtonDefaults.ContentPadding) + modifier = Modifier + .padding(ButtonDefaults.ContentPadding) + .background(color = currentColors.backgroundDefault) + .fillMaxSize(), ) { Icon(imageVector = Icons.Default.Report, Icons.Default.Report.name) Spacer(Modifier.size(ButtonDefaults.IconSpacing)) @@ -344,8 +346,11 @@ fun FAQCreation( onDismissRequest = { setExpanded(false) }, modifier = Modifier .exposedDropdownSize() + .background(color = currentColors.backgroundDefault) ) { - Column(modifier = Modifier.padding(10.dp)) { + Column( + modifier = Modifier.padding(10.dp) + ) { Text( text = dropdownText, style = EateryBlueTypography.subtitle2, From 44030daf2dc9e630179636a7a721fed66d4c6c0b Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 19:02:50 -0400 Subject: [PATCH 27/31] More color fixes --- .../android/eatery/ui/components/details/CalendarButton.kt | 2 +- .../eatery/ui/components/details/EateryMenusBottomSheet.kt | 4 ++-- .../cornellappdev/android/eatery/ui/screens/AboutScreen.kt | 6 +++--- .../android/eatery/ui/screens/FavoritesScreen.kt | 2 +- .../cornellappdev/android/eatery/ui/screens/LegalScreen.kt | 2 +- .../eatery/ui/screens/NotificationsSettingsScreen.kt | 2 +- .../android/eatery/ui/screens/PrivacyScreen.kt | 2 +- .../android/eatery/ui/screens/SettingsScreen.kt | 4 ++-- .../android/eatery/ui/screens/SupportScreen.kt | 4 ++-- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt index a59510bb..2b006d3f 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/CalendarButton.kt @@ -28,7 +28,7 @@ fun CalendarButton(onClick: () -> Unit) { Row( modifier = Modifier .clip(RoundedCornerShape(100)) - .background(currentColors.backgroundDefault) + .background(currentColors.accentPrimary) .clickable { onClick() } .padding(vertical = 8.dp, horizontal = 12.dp), verticalAlignment = Alignment.CenterVertically, diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt index 26eb9e94..b9f8effe 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryMenusBottomSheet.kt @@ -234,8 +234,8 @@ fun EateryMenusBottomSheet( .height(48.dp), shape = RoundedCornerShape(100), colors = ButtonDefaults.buttonColors( - containerColor = currentColors.accentPrimary, - contentColor = currentColors.backgroundDefault + containerColor = currentColors.contentBrand, + contentColor = currentColors.oppTextPrimary ) ) { Text( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt index eaea5060..d2ef1782 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/AboutScreen.kt @@ -142,7 +142,7 @@ fun AboutScreen() { uriCurrent.openUri("https://www.cornellappdev.com/") }, colors = ButtonDefaults.buttonColors( - containerColor = currentColors.backgroundSecondary, + containerColor = currentColors.accentPrimary, contentColor = currentColors.textPrimary ) ) { @@ -306,7 +306,7 @@ fun CreditsRow(position: TeamPosition) { modifier = Modifier .height(34.dp) .clip(RoundedCornerShape(17.dp)) - .background(currentColors.backgroundSecondary) + .background(currentColors.accentPrimary) ) { Text( text = item as String, @@ -325,7 +325,7 @@ fun CreditsRow(position: TeamPosition) { Icon( Icons.Filled.Star, contentDescription = null, - tint = currentColors.backgroundSecondary, + tint = currentColors.accentPrimary, modifier = Modifier .height(7.dp) .padding(horizontal = 12.33.dp) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt index 98b18310..1325184b 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt @@ -134,7 +134,7 @@ private fun FavoritesScreenContent( } Text( text = stringResource(R.string.favorites_title), - color = currentColors.backgroundSecondary, + color = currentColors.contentBrand, style = EateryBlueTypography.h2, modifier = Modifier.padding(horizontal = 6.dp) ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt index 691f3126..372b407c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/LegalScreen.kt @@ -37,7 +37,7 @@ fun LegalScreen() { ) { Text( text = stringResource(R.string.legal_title), - color = currentColors.textPrimary, + color = currentColors.contentBrand, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt index e69b457a..bb1d658c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/NotificationsSettingsScreen.kt @@ -34,7 +34,7 @@ fun NotificationsSettingsScreen() { ) { Text( text = stringResource(R.string.notifications_title), - color = currentColors.textPrimary, + color = currentColors.contentBrand, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt index 7f27d5a8..f3b9e0b2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/PrivacyScreen.kt @@ -80,7 +80,7 @@ private fun PrivacyScreenContent( ) { Text( text = stringResource(R.string.privacy_title), - color = currentColors.textPrimary, + color = currentColors.contentBrand, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp) ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt index 63c85c36..db809525 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SettingsScreen.kt @@ -109,7 +109,7 @@ private fun SettingsScreenContent( ) { Text( text = stringResource(R.string.settings_title), - color = currentColors.backgroundSecondary, + color = currentColors.contentBrand, style = EateryBlueTypography.h2, modifier = Modifier.padding(top = 7.dp, bottom = 7.dp) ) @@ -288,7 +288,7 @@ private fun SettingsScreenContent( }, shape = RoundedCornerShape(25.dp), colors = ButtonDefaults.buttonColors( - containerColor = currentColors.backgroundDefault, + containerColor = currentColors.accentPrimary, contentColor = currentColors.textPrimary ) ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index 759e2949..6ff937db 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -161,7 +161,7 @@ private fun SupportScreenContent( Spacer(modifier = Modifier.height(7.dp)) Text( text = stringResource(R.string.support_title), - color = currentColors.textPrimary, + color = currentColors.contentBrand, style = EateryBlueTypography.h2, ) Spacer(modifier = Modifier.height(7.dp)) @@ -293,7 +293,7 @@ private fun ReportButton() { verticalAlignment = Alignment.CenterVertically, modifier = Modifier .padding(ButtonDefaults.ContentPadding) - .background(color = currentColors.backgroundDefault) + .background(color = currentColors.accentPrimary) .fillMaxSize(), ) { Icon(imageVector = Icons.Default.Report, Icons.Default.Report.name) From 5df9255ca9a5d3bb1af6dfd3b5e3a6dda799d08c Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 19:37:30 -0400 Subject: [PATCH 28/31] Payment methods fixes --- .../ui/components/details/PaymentWidgets.kt | 54 ++++--- .../general/PaymentMethodsAvailable.kt | 148 ++++++++---------- .../general/PaymentMethodsBottomSheet.kt | 144 +++++------------ 3 files changed, 135 insertions(+), 211 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt index 7aba3f8f..ae531c9d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt @@ -12,9 +12,14 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.data.models.Eatery -import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.data.models.PaymentMethod +import com.cornellappdev.android.eatery.ui.components.general.PaymentMethodsAvailable +import com.cornellappdev.android.eatery.ui.components.general.isAcceptedBy +import com.cornellappdev.android.eatery.ui.components.general.tintColor +import com.cornellappdev.android.eatery.util.DualModePreview +import com.cornellappdev.android.eatery.util.EateryPreview +import com.cornellappdev.android.eatery.util.PreviewData /** * Payment widgets that are displayed at the top right region eatery details screen @@ -24,33 +29,36 @@ fun PaymentWidgets(eatery: Eatery, modifier: Modifier = Modifier, onClick: () -> Surface( modifier = modifier.clickable { onClick.invoke() - }, shape = CircleShape, color = currentColors.backgroundDefault + }, shape = CircleShape ) { Row( modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp), horizontalArrangement = Arrangement.spacedBy(ButtonDefaults.IconSpacing) ) { - if (eatery.acceptsMealSwipes()) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_swipes), - contentDescription = "Accepts Swipes", - tint = currentColors.accentPrimary - ) - } - if (eatery.acceptsBRB()) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_brbs), - contentDescription = "Accepts BRBs", - tint = currentColors.error - ) - } - if (eatery.acceptsCash()) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_cash), - contentDescription = "Accepts Cash", - tint = currentColors.success - ) + PaymentMethodsAvailable.entries.forEach { paymentMethod -> + if (paymentMethod.isAcceptedBy(eatery)) { + Icon( + painter = painterResource(id = paymentMethod.drawable), + contentDescription = "Accepts ${paymentMethod.name}", + tint = paymentMethod.tintColor + ) + } } } } } + +@DualModePreview +@Composable +private fun PaymentWidgetsPreview() = EateryPreview { + PaymentWidgets( + eatery = PreviewData.mockEatery().copy( + paymentMethods = listOf( + PaymentMethod.MEAL_SWIPE, + PaymentMethod.BRB, + PaymentMethod.CASH + ) + ), + onClick = {} + ) +} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index 40196b83..cb07ef33 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -35,6 +35,7 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R +import com.cornellappdev.android.eatery.data.models.Eatery import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.DualModePreview @@ -44,7 +45,7 @@ import com.cornellappdev.android.eatery.util.EateryPreview @Composable fun PaymentMethodsAvailable( selectedPaymentMethods: List, - hide: () -> Unit + hide: () -> Unit, ) { val paymentMethodsAvailableText = buildAnnotatedString { append(stringResource(R.string.payment_methods_pay_with)) @@ -63,21 +64,25 @@ fun PaymentMethodsAvailable( } } append(".") - toAnnotatedString() } val inlineContentMap = - PaymentMethodsAvailable.entries.associate { paymentMethod -> - paymentMethod.name to InlineTextContent( - Placeholder(18.sp, 18.sp, PlaceholderVerticalAlign.TextCenter) - ) { - Image( - painter = painterResource(id = paymentMethod.drawable), - modifier = Modifier.fillMaxSize(), - contentDescription = paymentMethod.name - ) + PaymentMethodsAvailable.entries.associateBy( + keySelector = { it.name }, + valueTransform = { paymentMethod -> + InlineTextContent( + Placeholder(18.sp, 18.sp, PlaceholderVerticalAlign.TextCenter) + ) { + Image( + painter = painterResource(id = paymentMethod.drawable), + modifier = Modifier + .fillMaxSize() + .background(color = Color.Transparent), + contentDescription = paymentMethod.name + ) + } } - } + ) Column( modifier = Modifier @@ -116,72 +121,11 @@ fun PaymentMethodsAvailable( .padding(top = 12.dp, bottom = 24.dp, start = 16.dp, end = 16.dp), horizontalArrangement = Arrangement.SpaceEvenly, ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - Surface( - modifier = Modifier - .size(64.dp) - .background( - color = currentColors.backgroundDefault, - shape = CircleShape - ) - ) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_swipes), - contentDescription = stringResource(R.string.payment_methods_meal_swipes), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.SWIPES)) { - PaymentMethodsAvailable.SWIPES.tintColor - } else { - currentColors.textSecondary - } - ) - } - } - - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - Surface( - modifier = Modifier - .size(64.dp) - .background( - color = currentColors.backgroundDefault, - shape = CircleShape - ) - ) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_brbs), - contentDescription = stringResource(R.string.payment_methods_brbs), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.BRB)) { - PaymentMethodsAvailable.BRB.tintColor - } else { - currentColors.textSecondary - } - ) - } - } - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - Surface( - modifier = Modifier - .size(64.dp) - .background( - color = currentColors.backgroundDefault, - shape = CircleShape - ) - ) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_cash), - contentDescription = stringResource(R.string.payment_methods_cash_or_credit), - tint = if (selectedPaymentMethods.contains(PaymentMethodsAvailable.CASH)) { - PaymentMethodsAvailable.CASH.tintColor - } else { - currentColors.textSecondary - } - ) - } + PaymentMethodsAvailable.entries.forEach { paymentMethod -> + PaymentMethodIcon( + paymentMethod = paymentMethod, + isSelected = selectedPaymentMethods.contains(paymentMethod) + ) } } @@ -216,27 +160,61 @@ fun PaymentMethodsAvailable( } } +@Composable +private fun PaymentMethodIcon( + paymentMethod: PaymentMethodsAvailable, + isSelected: Boolean +) { + Surface( + modifier = Modifier.size(64.dp), + color = currentColors.backgroundDefault + ) { + Icon( + painter = painterResource(id = paymentMethod.drawable), + contentDescription = stringResource(paymentMethod.textRes), + tint = if (isSelected) { + paymentMethod.tintColor + } else { + currentColors.textSecondary + } + ) + } +} + enum class PaymentMethodsAvailable(val drawable: Int, val textRes: Int) { + SWIPES( + drawable = R.drawable.ic_payment_swipes, + textRes = R.string.payment_methods_meal_swipes + ), BRB( - drawable = R.drawable.ic_small_brbs, + drawable = R.drawable.ic_payment_brbs, textRes = R.string.payment_methods_brbs ), CASH( - drawable = R.drawable.ic_small_cash, + drawable = R.drawable.ic_payment_cash, textRes = R.string.payment_methods_cash_or_credit - ), - SWIPES( - drawable = R.drawable.ic_small_swipes, - textRes = R.string.payment_methods_meal_swipes ); } val PaymentMethodsAvailable.tintColor: Color @Composable get() = when (this) { + PaymentMethodsAvailable.SWIPES -> currentColors.contentBrand PaymentMethodsAvailable.BRB -> currentColors.error PaymentMethodsAvailable.CASH -> currentColors.success - PaymentMethodsAvailable.SWIPES -> currentColors.backgroundSecondary + } + +fun PaymentMethodsAvailable.isAcceptedBy(eatery: Eatery): Boolean = when (this) { + PaymentMethodsAvailable.SWIPES -> eatery.acceptsMealSwipes() + PaymentMethodsAvailable.BRB -> eatery.acceptsBRB() + PaymentMethodsAvailable.CASH -> eatery.acceptsCash() || eatery.acceptsCard() +} + +val PaymentMethodsAvailable.filter: Filter.FromEateryFilter + get() = when (this) { + PaymentMethodsAvailable.SWIPES -> Filter.FromEateryFilter.Swipes + PaymentMethodsAvailable.BRB -> Filter.FromEateryFilter.BRB + PaymentMethodsAvailable.CASH -> Filter.FromEateryFilter.Cash } @DualModePreview diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt index 8641897d..59e7ddb2 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt @@ -18,6 +18,8 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -29,6 +31,8 @@ import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.R import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors +import com.cornellappdev.android.eatery.util.DualModePreview +import com.cornellappdev.android.eatery.util.EateryPreview @Composable fun PaymentMethodsBottomSheet( @@ -57,7 +61,7 @@ fun PaymentMethodsBottomSheet( }, modifier = Modifier .size(40.dp) - .background(color = currentColors.backgroundDefault, shape = CircleShape) + .background(color = currentColors.accentPrimary, shape = CircleShape) ) { Icon( Icons.Default.Close, @@ -73,114 +77,36 @@ fun PaymentMethodsBottomSheet( .padding(top = 8.dp, bottom = 16.dp, start = 16.dp, end = 16.dp), horizontalArrangement = Arrangement.SpaceEvenly, ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - IconButton( - onClick = { - if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) { - selectedFilters.remove(Filter.FromEateryFilter.Swipes) - } else { - selectedFilters.add(Filter.FromEateryFilter.Swipes) - } - }, - modifier = Modifier - .size(64.dp) - .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) { - PaymentMethodsAvailable.SWIPES.tintColor - } else { - currentColors.backgroundDefault - }, - shape = CircleShape - ) + PaymentMethodsAvailable.entries.forEach { paymentMethod -> + val filter = paymentMethod.filter + val isSelected = selectedFilters.contains(filter) + Column( + horizontalAlignment = Alignment.CenterHorizontally ) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_swipes), - contentDescription = stringResource(R.string.payment_methods_meal_swipes), - tint = if (selectedFilters.contains(Filter.FromEateryFilter.Swipes)) currentColors.backgroundDefault else currentColors.textSecondary - ) - } - - Text( - text = stringResource(R.string.payment_methods_meal_swipes), - style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), - modifier = Modifier.padding(top = 8.dp), - color = currentColors.textPrimary - ) - } - - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - IconButton( - onClick = { - if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) { - selectedFilters.remove(Filter.FromEateryFilter.BRB) - } else { - selectedFilters.add(Filter.FromEateryFilter.BRB) - } - }, - modifier = Modifier - .size(64.dp) - .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) { - PaymentMethodsAvailable.BRB.tintColor + IconButton( + onClick = { + if (isSelected) { + selectedFilters.remove(filter) } else { - currentColors.backgroundDefault - }, - shape = CircleShape + selectedFilters.add(filter) + } + }, + modifier = Modifier.size(64.dp) + ) { + Icon( + painter = painterResource(id = paymentMethod.drawable), + contentDescription = stringResource(paymentMethod.textRes), + tint = if (isSelected) paymentMethod.tintColor else currentColors.textSecondary ) - ) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_brbs), - contentDescription = stringResource(R.string.payment_methods_brbs), - tint = if (selectedFilters.contains(Filter.FromEateryFilter.BRB)) currentColors.backgroundDefault else currentColors.textSecondary - ) - } + } - Text( - text = stringResource(R.string.payment_methods_brbs), - style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), - modifier = Modifier.padding(top = 8.dp), - color = currentColors.textPrimary - ) - } - Column( - horizontalAlignment = Alignment.CenterHorizontally - ) { - IconButton( - onClick = { - if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) { - selectedFilters.remove(Filter.FromEateryFilter.Cash) - } else { - selectedFilters.add(Filter.FromEateryFilter.Cash) - } - }, - modifier = Modifier - .size(64.dp) - .background( - color = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) { - PaymentMethodsAvailable.CASH.tintColor - } else { - currentColors.backgroundDefault - }, - shape = CircleShape - ) - ) { - Icon( - painter = painterResource(id = R.drawable.ic_payment_cash), - contentDescription = stringResource(R.string.payment_methods_cash_or_credit), - tint = if (selectedFilters.contains(Filter.FromEateryFilter.Cash)) currentColors.backgroundDefault else currentColors.textSecondary + Text( + text = stringResource(paymentMethod.textRes), + style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), + modifier = Modifier.padding(top = 8.dp), + color = currentColors.textPrimary ) } - - Text( - text = stringResource(R.string.payment_methods_cash_or_credit), - style = TextStyle(fontWeight = FontWeight.SemiBold, fontSize = 12.sp), - modifier = Modifier.padding(top = 8.dp), - color = currentColors.textPrimary - ) } } @@ -220,3 +146,15 @@ fun PaymentMethodsBottomSheet( } } } + +@DualModePreview +@Composable +private fun PaymentMethodsBottomSheetPreview() = EateryPreview { + val selectedFilters = remember { + mutableStateListOf(Filter.FromEateryFilter.Swipes) + } + PaymentMethodsBottomSheet( + selectedFilters = selectedFilters, + hide = {} + ) +} From 92cadfa10558ccd16b370bfd253c7e1582eed460 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 19:48:20 -0400 Subject: [PATCH 29/31] More payment methods fixes --- .../eatery/ui/components/general/Filter.kt | 5 +++++ .../general/PaymentMethodsAvailable.kt | 19 +++++++++++-------- .../general/PaymentMethodsBottomSheet.kt | 8 ++++---- .../eatery/ui/screens/EateryDetailScreen.kt | 4 +++- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/Filter.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/Filter.kt index 48b2942d..10d14680 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/Filter.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/Filter.kt @@ -92,6 +92,11 @@ sealed class Filter(open val text: String) { override fun passesEateryFilter(eatery: Eatery): Boolean = eatery.acceptsCash() } + + data object Card : FromEateryFilter(text = "Cash") { + override fun passesEateryFilter(eatery: Eatery): Boolean = + eatery.acceptsCard() + } } sealed class RequiresFavoriteEateries(override val text: String) : Filter(text) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt index cb07ef33..2ebf0f8b 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsAvailable.kt @@ -190,7 +190,7 @@ enum class PaymentMethodsAvailable(val drawable: Int, val textRes: Int) { drawable = R.drawable.ic_payment_brbs, textRes = R.string.payment_methods_brbs ), - CASH( + CASH_OR_CARD( drawable = R.drawable.ic_payment_cash, textRes = R.string.payment_methods_cash_or_credit ); @@ -201,20 +201,23 @@ val PaymentMethodsAvailable.tintColor: Color get() = when (this) { PaymentMethodsAvailable.SWIPES -> currentColors.contentBrand PaymentMethodsAvailable.BRB -> currentColors.error - PaymentMethodsAvailable.CASH -> currentColors.success + PaymentMethodsAvailable.CASH_OR_CARD -> currentColors.success } fun PaymentMethodsAvailable.isAcceptedBy(eatery: Eatery): Boolean = when (this) { PaymentMethodsAvailable.SWIPES -> eatery.acceptsMealSwipes() PaymentMethodsAvailable.BRB -> eatery.acceptsBRB() - PaymentMethodsAvailable.CASH -> eatery.acceptsCash() || eatery.acceptsCard() + PaymentMethodsAvailable.CASH_OR_CARD -> eatery.acceptsCash() || eatery.acceptsCard() } -val PaymentMethodsAvailable.filter: Filter.FromEateryFilter +val PaymentMethodsAvailable.filters: Set get() = when (this) { - PaymentMethodsAvailable.SWIPES -> Filter.FromEateryFilter.Swipes - PaymentMethodsAvailable.BRB -> Filter.FromEateryFilter.BRB - PaymentMethodsAvailable.CASH -> Filter.FromEateryFilter.Cash + PaymentMethodsAvailable.SWIPES -> setOf(Filter.FromEateryFilter.Swipes) + PaymentMethodsAvailable.BRB -> setOf(Filter.FromEateryFilter.BRB) + PaymentMethodsAvailable.CASH_OR_CARD -> setOf( + Filter.FromEateryFilter.Cash, + Filter.FromEateryFilter.Card + ) } @DualModePreview @@ -235,7 +238,7 @@ private fun PaymentMethodsAvailablePartialPreview() { PaymentMethodsAvailable( selectedPaymentMethods = listOf( PaymentMethodsAvailable.BRB, - PaymentMethodsAvailable.CASH + PaymentMethodsAvailable.CASH_OR_CARD ), hide = {} ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt index 59e7ddb2..5e4fbd9e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/PaymentMethodsBottomSheet.kt @@ -78,17 +78,17 @@ fun PaymentMethodsBottomSheet( horizontalArrangement = Arrangement.SpaceEvenly, ) { PaymentMethodsAvailable.entries.forEach { paymentMethod -> - val filter = paymentMethod.filter - val isSelected = selectedFilters.contains(filter) + val filters = paymentMethod.filters + val isSelected = selectedFilters.intersect(filters).isNotEmpty() Column( horizontalAlignment = Alignment.CenterHorizontally ) { IconButton( onClick = { if (isSelected) { - selectedFilters.remove(filter) + selectedFilters.removeAll(filters) } else { - selectedFilters.add(filter) + selectedFilters.addAll(filters) } }, modifier = Modifier.size(64.dp) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index 57eb5625..27bd076e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -251,7 +251,9 @@ fun EateryDetailScreenContent( stringResource(R.string.no_maps_app_available_on_this_device) val paymentMethods = remember(eatery) { buildList { - if (eatery.acceptsCash()) add(PaymentMethodsAvailable.CASH) + if (eatery.acceptsCash() || eatery.acceptsCard()) add( + PaymentMethodsAvailable.CASH_OR_CARD + ) if (eatery.acceptsBRB()) add(PaymentMethodsAvailable.BRB) if (eatery.acceptsMealSwipes()) add(PaymentMethodsAvailable.SWIPES) } From bbe407f11f2e42279f8f84b0f94038ddd4f19027 Mon Sep 17 00:00:00 2001 From: Caleb Shim Date: Sat, 25 Apr 2026 20:01:09 -0400 Subject: [PATCH 30/31] Fix map stuff --- app/src/main/AndroidManifest.xml | 11 +++++++++++ .../eatery/ui/screens/EateryDetailScreen.kt | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 515cfaa8..f2f67f45 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,17 @@ + + + + + + + + + + + Date: Mon, 27 Apr 2026 16:44:25 -0400 Subject: [PATCH 31/31] Fix dark mode visual bugs (stacked on Brian_DarkMode) (#252) --- .../comparemenus/CompareMenusBottomSheet.kt | 9 +- .../details/EateryDetailsStickyHeader.kt | 98 +++--- .../details/EateryHourBottomSheet.kt | 2 +- .../ui/components/details/FavoritesToggle.kt | 54 +-- .../components/details/ItemFavoritesCard.kt | 24 +- .../ui/components/details/PaymentWidgets.kt | 5 +- .../ui/components/general/EateryCard.kt | 4 +- .../eatery/ui/components/general/FilterRow.kt | 5 +- .../eatery/ui/components/login/AccountPage.kt | 2 +- .../eatery/ui/components/login/LoginPage.kt | 3 +- .../eatery/ui/components/upcoming/MenuCard.kt | 2 +- .../eatery/ui/screens/CompareMenusScreen.kt | 323 ++++++++---------- .../eatery/ui/screens/EateryDetailScreen.kt | 13 +- .../eatery/ui/screens/FavoritesScreen.kt | 12 +- .../eatery/ui/screens/SupportScreen.kt | 2 +- .../android/eatery/ui/theme/Color.kt | 9 +- .../android/eatery/ui/theme/Theme.kt | 2 +- .../ui/viewmodels/FavoritesViewModel.kt | 71 ++-- .../eatery/ui/viewmodels/UpcomingViewModel.kt | 10 +- 19 files changed, 308 insertions(+), 342 deletions(-) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt index b4910da9..f468fbea 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/comparemenus/CompareMenusBottomSheet.kt @@ -28,7 +28,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -43,8 +42,6 @@ import com.cornellappdev.android.eatery.ui.viewmodels.CompareMenusBottomViewMode import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch @Composable fun CompareMenusBottomSheet( @@ -150,14 +147,10 @@ fun CompareMenusBottomSheetContent( } Spacer(modifier = Modifier.height(12.dp)) - val coroutineScope = rememberCoroutineScope() val canCompare = selectedEateries.size >= 2 Button( onClick = { - coroutineScope.launch { - delay(100) - onCompareMenusClick(selectedEateries.mapNotNull { it.id }) - } + onCompareMenusClick(selectedEateries.mapNotNull { it.id }) }, enabled = canCompare, modifier = Modifier diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt index 7d4079de..25dfd648 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryDetailsStickyHeader.kt @@ -29,7 +29,6 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.cornellappdev.android.eatery.data.models.Event -import com.cornellappdev.android.eatery.data.models.MenuCategory import com.cornellappdev.android.eatery.ui.theme.currentColors import kotlinx.coroutines.launch @@ -45,25 +44,50 @@ fun EateryDetailsStickyHeader( ) { val rowState = rememberLazyListState() val rowCoroutine = rememberCoroutineScope() - val selectedEvent = nextEvent?.menu?.find { category -> - highlightCategory( - category, - listState, - nextEvent, - fullMenuList, - startIndex - ) + + val highlightedCategoryName by remember(nextEvent, fullMenuList, startIndex) { + derivedStateOf { + val menu = nextEvent?.menu ?: return@derivedStateOf null + val visibleItems = listState.layoutInfo.visibleItemsInfo + val canScrollForward = listState.canScrollForward + + if (!canScrollForward && visibleItems.isNotEmpty()) { + // At the bottom of the list: highlight the last visible category so pills + // advance past whichever category is at the top of the viewport. + visibleItems.reversed().firstNotNullOfOrNull { info -> + val idx = info.index - startIndex + fullMenuList.getOrNull(idx)?.takeIf { name -> + menu.any { it.name == name } + } + } + } else { + val firstMenuItemIndex = listState.firstVisibleItemIndex - startIndex + if (firstMenuItemIndex >= 0 && firstMenuItemIndex < fullMenuList.size) { + val item = fullMenuList[firstMenuItemIndex] + val isCategoryName = menu.any { it.name == item } + if (isCategoryName) { + item + } else { + (firstMenuItemIndex - 1 downTo 0).firstNotNullOfOrNull { i -> + fullMenuList.getOrNull(i)?.takeIf { name -> + menu.any { it.name == name } + } + } + } + } else null + } + } } - val selectedIndex: Int = - if (selectedEvent != null) nextEvent.menu.indexOf(selectedEvent) else -1 - // Whenever the selected index changes, scroll to the new item. + val selectedIndex = + nextEvent?.menu?.indexOfFirst { it.name == highlightedCategoryName } ?: -1 + + // Whenever the selected index changes, scroll the pill row to the new item. LaunchedEffect(selectedIndex) { if (selectedIndex != -1) rowCoroutine.launch { if (selectedIndex >= 4) { - // They've scrolled decently far down and have interacted with this menu, we can - // request a review + // They've scrolled decently far down — good time to request a review. onRequestRatingPopup() } rowState.animateScrollToItem(selectedIndex) @@ -76,7 +100,6 @@ fun EateryDetailsStickyHeader( .fillMaxWidth() .background(currentColors.backgroundDefault) ) { - Spacer(modifier = Modifier.height(6.dp)) val filteredItemsList = nextEvent?.menu?.mapNotNull { category -> @@ -103,16 +126,9 @@ fun EateryDetailsStickyHeader( nextEvent?.menu?.forEach { category -> item { val categoryIndex = fullMenuList.indexOf(category.name) - val isHighlighted = highlightCategory( - category, - listState, - nextEvent, - fullMenuList, - startIndex - ) CategoryItem( - category.name ?: "Category", - isHighlighted, + name = category.name ?: "Category", + isHighlighted = category.name == highlightedCategoryName, ) { onItemClick(categoryIndex) } } item { @@ -178,37 +194,3 @@ fun CategoryItem( ) } } - -/** - * Returns true if the given menu category should be highlighted (i.e. it is scrolled to). - */ -@Composable -fun highlightCategory( - category: MenuCategory, - listState: LazyListState, - nextEvent: Event?, - fullMenuList: MutableList, - startIndex: Int -): Boolean { - val firstVisibleState = remember { derivedStateOf { listState.firstVisibleItemIndex } } - // Note: - 5 here assumes that there are 5 UI elements above the menu, which is true currently. - // If that changes, this must be tweaked. - val firstMenuItemIndex = firstVisibleState.value - startIndex - - if (firstMenuItemIndex >= 0 && firstMenuItemIndex < fullMenuList.size) { - val item = fullMenuList[firstMenuItemIndex] - val isCategoryName = nextEvent?.menu?.any { it.name == item } ?: false - - if (isCategoryName) { - return category.name == item - } else { - for (i in firstMenuItemIndex - 1 downTo 0) { - val previousItem = fullMenuList[i] - if (nextEvent?.menu?.any { it.name == previousItem } == true) { - return category.name == previousItem - } - } - } - } - return false -} diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt index 8a7292d5..f9cfd211 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/EateryHourBottomSheet.kt @@ -101,7 +101,7 @@ fun EateryHourBottomSheet( fontWeight = FontWeight.SemiBold, fontSize = 16.sp ), color = if (openUntil == null) currentColors.error - else if (eatery.isClosingSoon()) currentColors.accentPressed + else if (eatery.isClosingSoon()) currentColors.warning else currentColors.success ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt index 29e0da7d..970fe018 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/FavoritesToggle.kt @@ -1,26 +1,22 @@ package com.cornellappdev.android.eatery.ui.components.details import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp + import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.DualModePreview @@ -30,44 +26,48 @@ import com.cornellappdev.android.eatery.util.EateryPreview fun FavoritesToggle( onClick: () -> Unit, label: String, - active: Boolean + active: Boolean, + modifier: Modifier = Modifier ) { - val detailColor = if (active) currentColors.contentBrand else currentColors.textSecondary - val backgroundColor = if (active) currentColors.backgroundDefault else Color.Transparent - Row( - modifier = Modifier - .clip(RoundedCornerShape(8)) - .clickable { onClick() } - .border(BorderStroke(Dp.Hairline, detailColor), RoundedCornerShape(8)) - .background(backgroundColor) - .padding(vertical = 8.dp, horizontal = 10.dp) - .size(width = 160.dp, height = 18.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center // Center content within the Row + val borderColor = if (active) currentColors.borderBlue else currentColors.accentPrimary + val textColor = if (active) currentColors.contentBrand else currentColors.textSecondary + val shape = RoundedCornerShape(8.dp) + Button( + onClick = onClick, + modifier = modifier, + shape = shape, + border = BorderStroke(1.dp, borderColor), + contentPadding = PaddingValues(vertical = 8.dp, horizontal = 10.dp), + colors = ButtonDefaults.buttonColors( + containerColor = currentColors.backgroundDefault, + contentColor = textColor + ) ) { Text( text = label, - color = detailColor, + color = textColor, style = EateryBlueTypography.button ) } - } @Composable fun ToggleRow(toggle: Boolean, setToggle: (Boolean) -> Unit) { Row( - horizontalArrangement = (Arrangement.spacedBy(8.dp)) + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp) ) { FavoritesToggle( onClick = { setToggle(true) }, label = "Eateries", - active = toggle + active = toggle, + modifier = Modifier.weight(1f) ) FavoritesToggle( onClick = { setToggle(false) }, label = "Items", - active = !toggle + active = !toggle, + modifier = Modifier.weight(1f) ) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt index 3b4fff36..8019861d 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/ItemFavoritesCard.kt @@ -1,3 +1,5 @@ +package com.cornellappdev.android.eatery.ui.components.details + import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.BorderStroke @@ -8,6 +10,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults @@ -21,7 +24,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.Dp @@ -57,12 +59,12 @@ fun ItemFavoritesCard( modifier = modifier .fillMaxWidth() .border( - BorderStroke(Dp.Hairline, currentColors.backgroundDefault92), + BorderStroke(Dp.Hairline, currentColors.borderDefault), RoundedCornerShape(8) ), shape = RoundedCornerShape(8.dp), colors = CardDefaults.cardColors( - containerColor = currentColors.backgroundDefault + containerColor = currentColors.accentPrimary ), elevation = CardDefaults.cardElevation(8.dp) ) { @@ -79,9 +81,11 @@ fun ItemFavoritesCard( ) { Text( viewState.itemName, - fontSize = 20.sp, - style = EateryBlueTypography.button, - color = currentColors.textPrimary + style = EateryBlueTypography.h5, + color = currentColors.textPrimary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f) ) FavoriteButton(isFavorite = true, onFavoriteClick = { onFavoriteClick() }) } @@ -103,13 +107,14 @@ fun ItemFavoritesCard( Icon( imageVector = ImageVector.vectorResource(id = R.drawable.ic_down_chevron), contentDescription = "expand", + tint = currentColors.textPrimary, modifier = Modifier.rotate(rotation) ) } } if (isExpanded) { - HorizontalDivider(thickness = Dp.Hairline) + HorizontalDivider(thickness = Dp.Hairline, color = currentColors.borderDefault) viewState.mealAvailability.forEach { availability -> ItemInformation(availability.key, availability.value) } @@ -125,12 +130,11 @@ fun ItemInformation(meal: String, eateryName: List) { ) { Text( meal, - fontSize = 20.sp, - style = EateryBlueTypography.button, + style = EateryBlueTypography.h5, color = currentColors.textPrimary ) eateryName.forEach { eatery -> - Text(eatery, style = EateryBlueTypography.caption, color = Color(0xff7D8288)) + Text(eatery, style = EateryBlueTypography.caption, color = currentColors.textSecondary) } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt index ae531c9d..84f1067e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/details/PaymentWidgets.kt @@ -17,6 +17,7 @@ import com.cornellappdev.android.eatery.data.models.PaymentMethod import com.cornellappdev.android.eatery.ui.components.general.PaymentMethodsAvailable import com.cornellappdev.android.eatery.ui.components.general.isAcceptedBy import com.cornellappdev.android.eatery.ui.components.general.tintColor +import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.DualModePreview import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData @@ -29,7 +30,9 @@ fun PaymentWidgets(eatery: Eatery, modifier: Modifier = Modifier, onClick: () -> Surface( modifier = modifier.clickable { onClick.invoke() - }, shape = CircleShape + }, + shape = CircleShape, + color = currentColors.accentPrimary ) { Row( modifier = Modifier.padding(horizontal = 12.dp, vertical = 8.dp), diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt index 5c305401..4e7e490c 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/EateryCard.kt @@ -271,7 +271,7 @@ fun GridViewFavoriteWidget( ) { Icon( imageVector = if (isFavorite) Icons.Filled.Star else Icons.Outlined.StarOutline, - tint = if (isFavorite) currentColors.accentPressed else currentColors.textSecondary, + tint = if (isFavorite) currentColors.favorite else currentColors.textSecondary, modifier = Modifier .padding(8.dp), contentDescription = null @@ -328,7 +328,7 @@ fun EateryCardSecondaryHeader(eatery: Eatery, style: EateryCardStyle = EateryCar else ("Open until $openUntil"), style = EateryBlueTypography.subtitle2, color = if (openUntil == null) currentColors.error - else if (eatery.isClosingSoon()) currentColors.accentPressed + else if (eatery.isClosingSoon()) currentColors.warning else currentColors.success ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt index 1522407c..7cda4867 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt @@ -5,6 +5,7 @@ import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyListState @@ -35,10 +36,12 @@ fun FilterRow( customItemsBefore: LazyListScope.() -> Unit = {}, customItemsAfter: LazyListScope.() -> Unit = {}, rowState: LazyListState = rememberLazyListState(), + contentPadding: PaddingValues = PaddingValues(horizontal = 16.dp), ) { LazyRow( + modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), - contentPadding = PaddingValues(horizontal = 16.dp), + contentPadding = contentPadding, state = rowState ) { customItemsBefore() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt index d51a3f13..4a021b92 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/AccountPage.kt @@ -349,7 +349,7 @@ private fun AccountPageHeader( modifier = Modifier.size(28.dp), imageVector = Icons.Outlined.Settings, contentDescription = stringResource(R.string.a11y_settings), - tint = currentColors.textPrimary + tint = currentColors.oppTextPrimary ) } Text( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt index b344fe6d..0be75126 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/login/LoginPage.kt @@ -47,6 +47,7 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.zIndex import com.cornellappdev.android.eatery.BuildConfig import com.cornellappdev.android.eatery.R +import com.cornellappdev.android.eatery.ui.theme.BorderBlueLight import com.cornellappdev.android.eatery.ui.theme.EateryBlueTypography import com.cornellappdev.android.eatery.ui.theme.currentColors import com.cornellappdev.android.eatery.util.DualModePreview @@ -181,7 +182,7 @@ private fun LoginPageMainLayer( modifier = Modifier .fillMaxWidth(0.5f) .fillMaxHeight(), - colorFilter = ColorFilter.tint(Color(0xFFB7D3F3)) + colorFilter = ColorFilter.tint(BorderBlueLight) ) } Button( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt index aab5d341..07fcb6b6 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/components/upcoming/MenuCard.kt @@ -72,7 +72,7 @@ fun MenuCard( Card( elevation = CardDefaults.cardElevation(defaultElevation = 5.dp), shape = RoundedCornerShape(10.dp), - colors = CardDefaults.cardColors(containerColor = currentColors.backgroundDefault), + colors = CardDefaults.cardColors(containerColor = currentColors.accentPrimary), modifier = Modifier.clickable { openDropdown = !openDropdown if (!openDropdown) onEateryCardContract() diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt index 847b2e00..24f55841 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/CompareMenusScreen.kt @@ -17,7 +17,10 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.pager.HorizontalPager @@ -25,12 +28,12 @@ import androidx.compose.foundation.pager.PagerDefaults import androidx.compose.foundation.pager.PagerSnapDistance import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Schedule import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card +import androidx.compose.material3.Surface import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider @@ -57,6 +60,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -79,7 +83,6 @@ import com.cornellappdev.android.eatery.util.EateryPreview import com.cornellappdev.android.eatery.util.PreviewData import com.cornellappdev.android.eatery.util.appStorePopupRepository import kotlinx.coroutines.launch -import java.math.BigDecimal @OptIn( ExperimentalFoundationApi::class, @@ -169,34 +172,6 @@ private fun CompareMenusScreenContent( ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) val firstPagerState = rememberPagerState(pageCount = { eateries.size }) - val secondPagerState = rememberPagerState(pageCount = { eateries.size }) - - val scrollingFollowingPair by remember { - derivedStateOf { - if (firstPagerState.isScrollInProgress) { - firstPagerState to secondPagerState - } else if (secondPagerState.isScrollInProgress) { - secondPagerState to firstPagerState - } else null - } - } - LaunchedEffect(scrollingFollowingPair) { - val (scrollingState, followingState) = scrollingFollowingPair - ?: return@LaunchedEffect - snapshotFlow { scrollingState.currentPage + scrollingState.currentPageOffsetFraction } - .collect { pagePart -> - val divideAndRemainder = BigDecimal.valueOf(pagePart.toDouble()) - .divideAndRemainder(BigDecimal.ONE) - val pageOffsetFraction = - if (divideAndRemainder[1].toFloat() > 0.5f) 0.5f else (-0.5f).coerceAtLeast( - divideAndRemainder[1].toFloat() - ) - followingState.scrollToPage( - divideAndRemainder[0].toInt(), - pageOffsetFraction, - ) - } - } if (showBottomSheet) { ModalBottomSheet( onDismissRequest = closeBottomSheet, @@ -249,7 +224,9 @@ private fun CompareMenusScreenContent( onRequestRatingPopup = onRequestRatingPopup, onEateryClick = onEateryClick ) - TitlePager(eateries, secondPagerState) + TitlePager(eateries, firstPagerState) { page -> + coroutineScope.launch { firstPagerState.scrollToPage(page) } + } } } @@ -299,12 +276,10 @@ private fun MenuPager( val listState = rememberLazyListState() Box { val currentEvent = events.getOrNull(page) + // Only category names: one LazyColumn item per category card, so index == category index val fullMenuList = mutableListOf() currentEvent?.menu?.forEach { category -> category.name?.let { fullMenuList.add(it) } - category.items?.forEach { item -> - item.name?.let { fullMenuList.add(it) } - } } Column(modifier = Modifier.fillMaxSize()) { Row( @@ -392,12 +367,8 @@ private fun MenuPager( if (currentEvent != null) { Box( modifier = Modifier - .background(currentColors.backgroundDefault) - .padding( - start = 8.dp, - end = 8.dp, - top = 20.dp - ) + .background(currentColors.accentPrimary) + .padding(8.dp) .fillMaxWidth() .fillMaxHeight() ) { @@ -405,135 +376,105 @@ private fun MenuPager( state = listState, modifier = Modifier .fillMaxSize() - .background(currentColors.backgroundDefault) + .background(currentColors.accentPrimary), + verticalArrangement = Arrangement.spacedBy(8.dp) ) { currentEvent.menu?.forEach { category -> item { - Text( - text = category.name ?: "Category", - style = EateryBlueTypography.h5, - modifier = Modifier.padding( - horizontal = 16.dp, - vertical = 12.dp - ), - color = currentColors.textPrimary - ) - } - - itemsIndexed( - category.items ?: emptyList() - ) { index, menuItem -> - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding( - top = 12.dp, - bottom = 12.dp, - start = 16.dp, - end = 16.dp - ), - horizontalArrangement = Arrangement.SpaceBetween + Surface( + shape = RoundedCornerShape(8.dp), + color = currentColors.backgroundDefault, + modifier = Modifier.fillMaxWidth() ) { - Text( - text = menuItem.name ?: "Item Name", - style = EateryBlueTypography.button, - modifier = Modifier.weight(1f), - color = currentColors.textPrimary - ) + Column { + Text( + text = category.name ?: "Category", + style = EateryBlueTypography.h5, + modifier = Modifier.padding( + horizontal = 16.dp, + vertical = 12.dp + ), + color = currentColors.textPrimary + ) + category.items?.forEachIndexed { index, menuItem -> + if (index > 0) { + HorizontalDivider( + thickness = Dp.Hairline, + color = currentColors.borderDefault + ) + } + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding( + horizontal = 16.dp, + vertical = 12.dp + ), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = menuItem.name ?: "Item Name", + style = EateryBlueTypography.button, + modifier = Modifier.weight(1f), + color = currentColors.textPrimary + ) + } + } + } } - - if (category.items?.lastIndex != index) { - Spacer( + } + } + if (currentEvent.menu.isNullOrEmpty()) { + item { + Surface( + shape = RoundedCornerShape(8.dp), + color = currentColors.backgroundDefault, + modifier = Modifier.fillMaxWidth() + ) { + Row( modifier = Modifier .fillMaxWidth() - .height(1.dp) - .background( - currentColors.borderDefault, - CircleShape - ) - ) - } - if (category.items?.lastIndex == index) { - HorizontalDivider( - thickness = 10.dp, - color = currentColors.borderDefault - ) + .padding(vertical = 12.dp), + horizontalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(R.string.compare_menus_no_menu), + color = currentColors.textPrimary, + style = EateryBlueTypography.h5, + modifier = Modifier.padding(start = 8.dp), + fontWeight = FontWeight(500), + ) + } } } } - if (currentEvent.menu.isNullOrEmpty()) { - item { + item { + Card( + shape = RoundedCornerShape(100.dp), + onClick = { + onEateryClick(eateries[page]) + }, + colors = CardDefaults.cardColors(containerColor = currentColors.backgroundDefault), + modifier = Modifier.fillMaxWidth() + ) { Row( modifier = Modifier - .background(currentColors.backgroundSurface) - .clip( - shape = RoundedCornerShape( - 12.dp - ) - ) .fillMaxWidth() - .padding( - top = 12.dp, - bottom = 12.dp - ), - horizontalArrangement = Arrangement.Center + .padding(horizontal = 10.dp, vertical = 8.dp), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically ) { + Icon( + painter = painterResource(R.drawable.ic_eatery), + contentDescription = null, + tint = currentColors.textPrimary + ) Text( - text = stringResource(R.string.compare_menus_no_menu), + text = stringResource(R.string.view_eatery_details), color = currentColors.textPrimary, - style = EateryBlueTypography.h5, modifier = Modifier.padding(start = 8.dp), - fontWeight = FontWeight(500), + fontWeight = FontWeight.Bold, ) } - HorizontalDivider( - color = currentColors.borderDefault, - modifier = Modifier - .fillMaxWidth() - .height(10.dp) - ) - } - } - item { - Column(modifier = Modifier.background(currentColors.backgroundDefault)) { - Card( - shape = RoundedCornerShape(20.dp), - onClick = { - onEateryClick(eateries[page]) - }, - colors = CardDefaults.cardColors(containerColor = currentColors.accentPrimary), - modifier = Modifier - .fillMaxWidth() - .padding( - top = 12.dp, - bottom = 12.dp, - start = 12.dp, - end = 12.dp - ) - ) { - Row( - modifier = Modifier.padding( - end = 12.dp, - top = 10.dp, - bottom = 10.dp - ), - horizontalArrangement = Arrangement.Center - ) { - Icon( - painter = painterResource(R.drawable.ic_eatery), - contentDescription = null, - tint = currentColors.textPrimary - ) - Text( - text = stringResource(R.string.view_eatery_details), - color = currentColors.textPrimary, - modifier = Modifier.padding( - start = 8.dp, - ), - fontWeight = FontWeight.Bold, - ) - - } - } } } } @@ -551,38 +492,60 @@ private fun MenuPager( @OptIn(ExperimentalFoundationApi::class) private fun TitlePager( eateries: List, - secondPagerState: PagerState + pagerState: PagerState, + onPageSelected: (Int) -> Unit, ) { - HorizontalPager( - state = secondPagerState, + val rowState = rememberLazyListState() + val currentPage by remember { derivedStateOf { pagerState.currentPage } } + + BoxWithConstraints( modifier = Modifier - .fillMaxSize() - .background(currentColors.backgroundDefault), - contentPadding = PaddingValues(horizontal = 100.dp), - pageSpacing = 2.dp, - verticalAlignment = Alignment.CenterVertically, - flingBehavior = PagerDefaults.flingBehavior( - state = secondPagerState, - //pager snap distance literally does nothing - pagerSnapDistance = PagerSnapDistance.atMost(1), - ), - ) { page -> - Column(modifier = Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Center) { - Box( - modifier = Modifier - .shadow(2.dp, shape = RoundedCornerShape(8.dp)) - .clip(shape = RoundedCornerShape(8.dp)) - .background(currentColors.backgroundDefault) - .padding(vertical = 8.dp, horizontal = 16.dp) - ) { - eateries[page].name?.let { - Text( - text = it, - style = EateryBlueTypography.button, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - color = currentColors.textPrimary - ) + .fillMaxWidth() + .background(currentColors.backgroundDefault) + .padding(vertical = 8.dp) + ) { + // Each tab is 45% of viewport width; side padding centers each tab when scrolled to it. + // scrollOffset = -sidePaddingPx in animateScrollToItem positions the item's leading edge + // at sidePadding from the viewport left = centered. + val tabWidth = maxWidth * 0.45f + val sidePadding = (maxWidth - tabWidth) / 2 + + LaunchedEffect(pagerState) { + snapshotFlow { pagerState.currentPage } + .collect { page -> + // contentPadding = sidePadding on both sides, so scrollOffset = 0 places + // each item's leading edge at sidePadding from the viewport = centered. + rowState.animateScrollToItem(index = page, scrollOffset = 0) + } + } + + LazyRow( + state = rowState, + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp), + contentPadding = PaddingValues(horizontal = sidePadding) + ) { + itemsIndexed(eateries) { index, eatery -> + val isSelected = index == currentPage + Box( + modifier = Modifier + .width(tabWidth) + .shadow(if (isSelected) 2.dp else 0.dp, shape = RoundedCornerShape(8.dp)) + .clip(shape = RoundedCornerShape(8.dp)) + .background(currentColors.accentPrimary) + .clickable { onPageSelected(index) } + .padding(vertical = 8.dp, horizontal = 16.dp), + contentAlignment = Alignment.Center + ) { + eatery.name?.let { + Text( + text = it, + style = EateryBlueTypography.button, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + color = if (isSelected) currentColors.textPrimary else currentColors.textSecondary + ) + } } } } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt index 05c7e357..e11ed8ca 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/EateryDetailScreen.kt @@ -67,8 +67,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.scale -import androidx.compose.ui.draw.shadow -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext @@ -813,21 +811,20 @@ fun EateryDetailScreenContent( Spacer(Modifier.height(8.dp)) //reporting button Button( - shape = RoundedCornerShape(24.dp), - modifier = Modifier - .height(35.dp) - .shadow(0.dp), + shape = RoundedCornerShape(100.dp), + modifier = Modifier.height(35.dp), onClick = { openBottomSheet(BottomSheetContent.REPORT) }, colors = ButtonDefaults.buttonColors( - containerColor = currentColors.backgroundDefault, + containerColor = currentColors.accentPrimary, + contentColor = currentColors.textPrimary ) ) { Icon( imageVector = Icons.Default.Report, contentDescription = Icons.Default.Report.name, - tint = Color.Unspecified + tint = currentColors.textPrimary ) Spacer(Modifier.size(ButtonDefaults.IconSpacing)) Text( diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt index 1325184b..392c786a 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/FavoritesScreen.kt @@ -1,10 +1,11 @@ package com.cornellappdev.android.eatery.ui.screens -import ItemFavoritesCard +import com.cornellappdev.android.eatery.ui.components.details.ItemFavoritesCard import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope @@ -106,7 +107,7 @@ private fun FavoritesScreenContent( Column( modifier = Modifier .background(color = currentColors.backgroundDefault) - .padding(horizontal = 10.dp) + .padding(horizontal = 16.dp) .then(Modifier.statusBarsPadding()) .fillMaxSize() ) { @@ -119,7 +120,8 @@ private fun FavoritesScreenContent( ) { Icon( imageVector = ImageVector.vectorResource(id = R.drawable.ic_left_chevron), - contentDescription = stringResource(R.string.back) + contentDescription = stringResource(R.string.back), + tint = currentColors.textPrimary ) } IconButton( @@ -128,6 +130,7 @@ private fun FavoritesScreenContent( Icon( imageVector = ImageVector.vectorResource(id = R.drawable.ic_search), contentDescription = stringResource(R.string.search), + tint = currentColors.textPrimary ) } @@ -271,7 +274,8 @@ private fun ColumnScope.MainScrollableContent( favoritesScreenViewState.eateryFilters } else { favoritesScreenViewState.itemFilters - } + }, + contentPadding = PaddingValues(0.dp) ) } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt index 6ff937db..4673303e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/screens/SupportScreen.kt @@ -195,7 +195,7 @@ private fun SupportScreenContent( }, colors = ButtonDefaults.buttonColors( containerColor = currentColors.contentBrand, - contentColor = currentColors.backgroundDefault + contentColor = currentColors.oppTextPrimary ) ) { Icon(imageVector = Icons.Default.Report, Icons.Default.Report.name) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt index 1aba676a..dfe551b3 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Color.kt @@ -42,7 +42,7 @@ val TextSecondaryDark = Color(0xFF9EA8B5) // Accent colors val AccentPrimaryLight = Color(0xFFEFF1F4) -val AccentPrimaryDark = Color(0xFF272727) +val AccentPrimaryDark = Color(0xFF2E2E2E) val AccentPressedLight = Color(0xFFE8EFF8) val AccentPressedDark = Color(0xFF1C1C1C) @@ -51,6 +51,10 @@ val AccentPressedDark = Color(0xFF1C1C1C) val BorderDefaultLight = Color(0xFFE1E4E8) val BorderDefaultDark = Color(0xFF282828) +// Blue border (active tab/toggle state) +val BorderBlueLight = Color(0xFFB7D3F3) +val BorderBlueDark = Color(0xFF1D4A7A) + // Favorite colors val FavoriteLight = Color(0xFFFFD700) val FavoriteDark = Color(0xFFFFD700) @@ -105,6 +109,7 @@ object ColorTheme accentPrimary = AccentPrimaryLight, accentPressed = AccentPressedLight, borderDefault = BorderDefaultLight, + borderBlue = BorderBlueLight, favorite = FavoriteLight, warning = WarningLight, ) @@ -124,6 +129,7 @@ object ColorTheme accentPrimary = AccentPrimaryDark, accentPressed = AccentPressedDark, borderDefault = BorderDefaultDark, + borderBlue = BorderBlueDark, favorite = FavoriteDark, warning = WarningDark, ) @@ -146,6 +152,7 @@ data class ColorMode( val accentPrimary : Color, val accentPressed: Color, val borderDefault: Color, + val borderBlue: Color, val favorite: Color, val warning: Color ) diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt index c9d8d702..da94761e 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/theme/Theme.kt @@ -13,7 +13,7 @@ val LocalColorMode = staticCompositionLocalOf { ColorTheme.lightMode } @Composable fun AppColorTheme( - colorMode: ColorMode , + colorMode: ColorMode, content: @Composable () -> Unit ) { diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt index 87065a9e..eec426b0 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/FavoritesViewModel.kt @@ -1,7 +1,8 @@ package com.cornellappdev.android.eatery.ui.viewmodels -import ItemFavoritesCardViewState -import androidx.compose.ui.graphics.Color +import com.cornellappdev.android.eatery.ui.components.details.ItemFavoritesCardViewState +import com.cornellappdev.android.eatery.ui.theme.ErrorLight +import com.cornellappdev.android.eatery.ui.theme.SuccessLight import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.cornellappdev.android.eatery.data.models.Eatery @@ -24,7 +25,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import java.time.LocalDateTime +import java.time.LocalDate import javax.inject.Inject private val allEateryFilters = listOf( @@ -105,13 +106,12 @@ class FavoritesViewModel @Inject constructor( ) } + val today = LocalDate.now() val menuItemsToEateries: Map> = favoriteItems.associateWith { itemName -> allEateries.filter { eatery -> val todayEvents = eatery.events?.filter { - (it.endTimestamp ?: LocalDateTime.MAX) < LocalDateTime.now() - .withHour(23) - .withMinute(59) + it.startTimestamp?.toLocalDate() == today } todayEvents?.any { event -> event.menu?.flatMap { it.items ?: emptyList() }?.any { @@ -139,28 +139,24 @@ class FavoritesViewModel @Inject constructor( itemName = itemName, availability = if (eateriesByItem.isEmpty()) EateryStatus( "Not available", - Color.Red - ) else EateryStatus("Available today", Color.Green), - mealAvailability = eateriesByItem.groupBy { eatery -> - eatery.events?.find { event -> - event.menu?.any { - it.items?.any { menuItem -> menuItem.name == itemName } == true - } == true - }?.type - }.mapValues { mapEntry -> - mapEntry.value.mapNotNull { eatery -> eatery.name } - }.mapKeys { (key, _) -> - if (key == null || key !in listOf( - "Breakfast", - "Lunch", - "Late lunch", - "Brunch", - "Dinner" - ) - ) "Other" else key + ErrorLight + ) else EateryStatus("Available today", SuccessLight), + mealAvailability = buildMap> { + eateriesByItem.forEach { eatery -> + eatery.events?.filter { event -> + event.startTimestamp?.toLocalDate() == today && + event.menu?.any { category -> + category.items?.any { menuItem -> menuItem.name == itemName } == true + } == true + }?.forEach { event -> + val mealType = normalizeMealType(event.type ?: "Other") + getOrPut(mealType) { mutableListOf() } + .also { if (eatery.name != null && eatery.name !in it) it.add(eatery.name) } + } + } }.toSortedMap { s1, s2 -> s1.toSortOrder().compareTo(s2.toSortOrder()) } ) - }.sortedByDescending { it.availability.statusColor == Color.Green } + }.sortedByDescending { it.availability.statusColor == SuccessLight } FavoritesScreenViewState.Loaded( @@ -183,12 +179,23 @@ class FavoritesViewModel @Inject constructor( ) }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), FavoritesUiState()) - private fun String.toSortOrder(): Int = when (this) { - "Breakfast" -> 1 - "Brunch" -> 2 - "Lunch" -> 3 - "Late lunch" -> 4 - "Dinner" -> 5 + private fun normalizeMealType(raw: String): String { + val normalized = raw.replace("_", " ").trim().lowercase() + return when (normalized) { + "late night", "late_night" -> "Late Dinner" + else -> normalized.split(" ").joinToString(" ") { w -> + w.replaceFirstChar { it.uppercase() } + } + } + } + + private fun String.toSortOrder(): Int = when (this.lowercase()) { + "breakfast" -> 1 + "brunch" -> 2 + "lunch" -> 3 + "late lunch" -> 4 + "dinner" -> 5 + "late dinner" -> 6 else -> Int.MAX_VALUE } diff --git a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt index e0ba9808..b7455564 100644 --- a/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt +++ b/app/src/main/java/com/cornellappdev/android/eatery/ui/viewmodels/UpcomingViewModel.kt @@ -1,6 +1,8 @@ package com.cornellappdev.android.eatery.ui.viewmodels -import androidx.compose.ui.graphics.Color +import com.cornellappdev.android.eatery.ui.theme.ErrorLight +import com.cornellappdev.android.eatery.ui.theme.SuccessLight +import com.cornellappdev.android.eatery.ui.theme.WarningLight import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.cornellappdev.android.eatery.data.models.Eatery @@ -104,9 +106,9 @@ class UpcomingViewModel @Inject constructor( } ?: emptyList(), name = name ?: "Unknown Eatery", eateryStatus = when { - isClosed() -> EateryStatus("Closed", Color.Red) - isClosingSoon() -> EateryStatus("Closing Soon", Color(0xFFFFA500)) - else -> EateryStatus("Open", Color.Green) + isClosed() -> EateryStatus("Closed", ErrorLight) + isClosingSoon() -> EateryStatus("Closing Soon", WarningLight) + else -> EateryStatus("Open", SuccessLight) }, ) }