diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index d7c9288d..8250f555 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,10 +4,8 @@
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 0ad17cbd..8978d23d 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 83ce9453..a7a5484a 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -99,6 +99,7 @@ dependencies {
implementation(libs.core.ktx)
implementation(libs.lifecycle.runtime.ktx)
implementation(libs.activity.compose)
+ implementation(libs.androidx.navigation.compose)
testImplementation(libs.junit)
androidTestImplementation(libs.test.core.ktx)
androidTestImplementation(libs.androidx.test.ext.junit)
diff --git a/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/SettingsActivityTest.kt b/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/SettingsActivityTest.kt
index dec7b6df..982a2fb0 100644
--- a/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/SettingsActivityTest.kt
+++ b/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/SettingsActivityTest.kt
@@ -9,7 +9,6 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.test.rule.GrantPermissionRule
import com.lorenzovainigli.foodexpirationdates.R
-import com.lorenzovainigli.foodexpirationdates.view.activity.MainActivity
import com.lorenzovainigli.foodexpirationdates.view.composable.DateFormatDialog
import com.lorenzovainigli.foodexpirationdates.view.composable.DateFormatRow
import org.junit.Rule
diff --git a/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/activity/MainActivityTest.kt b/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/activity/MainActivityTest.kt
index cd2717cb..7ee00c11 100644
--- a/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/activity/MainActivityTest.kt
+++ b/app/src/androidTest/java/com/lorenzovainigli/foodexpirationdates/view/activity/MainActivityTest.kt
@@ -14,6 +14,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.GrantPermissionRule
import com.lorenzovainigli.foodexpirationdates.R
+import com.lorenzovainigli.foodexpirationdates.view.MainActivity
import com.lorenzovainigli.foodexpirationdates.view.composable.FOOD_CARD
import org.junit.Before
import org.junit.Rule
diff --git a/app/src/androidTestFull/java/com/lorenzovainigli/foodexpirationdates/FirebaseTest.kt b/app/src/androidTestFull/java/com/lorenzovainigli/foodexpirationdates/FirebaseTest.kt
index 5c24a64e..d5b4cb0a 100644
--- a/app/src/androidTestFull/java/com/lorenzovainigli/foodexpirationdates/FirebaseTest.kt
+++ b/app/src/androidTestFull/java/com/lorenzovainigli/foodexpirationdates/FirebaseTest.kt
@@ -6,7 +6,7 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import androidx.test.uiautomator.UiDevice
-import com.lorenzovainigli.foodexpirationdates.view.activity.MainActivity
+import com.lorenzovainigli.foodexpirationdates.view.MainActivity
import junit.framework.TestCase.assertTrue
import org.junit.Rule
import org.junit.Test
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2c5997fa..570fba36 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,7 +16,7 @@
android:theme="@style/Theme.FoodExpirationDates"
tools:targetApi="31">
@@ -25,16 +25,6 @@
-
-
-
-
-
-
dueTime)
+ dueTime.add(Calendar.DAY_OF_MONTH, 1)
+ val initialDelay = dueTime.timeInMillis - currentTime.timeInMillis
+ val formattedTime = formatTimeDifference(initialDelay)
+ if (BuildConfig.DEBUG) {
+ Toast.makeText(
+ context,
+ "Notification in $formattedTime",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ val workRequest = PeriodicWorkRequestBuilder(
+ 1, TimeUnit.DAYS
+ )
+ .setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
+ .build()
+ WorkManager.getInstance(context)
+ .enqueueUniquePeriodicWork(
+ CheckExpirationsWorker.workerID,
+ ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
+ workRequest
+ )
+ }
+
+ private fun formatTimeDifference(timeDifference: Long): String {
+ val days = TimeUnit.MILLISECONDS.toDays(timeDifference)
+ val hours = TimeUnit.MILLISECONDS.toHours(timeDifference) % 24
+ val minutes = TimeUnit.MILLISECONDS.toMinutes(timeDifference) % 60
+ val seconds = TimeUnit.MILLISECONDS.toSeconds(timeDifference) % 60
+ val formattedTime = StringBuilder()
+ if (days > 0) {
+ formattedTime.append("$days day${if (days > 1) "s" else ""} ")
+ }
+ if (hours > 0) {
+ formattedTime.append("$hours hour${if (hours > 1) "s" else ""} ")
+ }
+ if (minutes > 0) {
+ formattedTime.append("$minutes minute${if (minutes > 1) "s" else ""} ")
+ }
+ if (seconds > 0) {
+ formattedTime.append("$seconds second${if (seconds > 1) "s" else ""} ")
+ }
+ return formattedTime.toString().trim()
+ }
+
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/model/worker/CheckExpirationsWorker.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/model/worker/CheckExpirationsWorker.kt
index 1f7f3c13..29c95f5c 100644
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/model/worker/CheckExpirationsWorker.kt
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/model/worker/CheckExpirationsWorker.kt
@@ -12,7 +12,7 @@ import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.lorenzovainigli.foodexpirationdates.R
import com.lorenzovainigli.foodexpirationdates.model.repository.ExpirationDateRepository
-import com.lorenzovainigli.foodexpirationdates.view.activity.MainActivity
+import com.lorenzovainigli.foodexpirationdates.view.MainActivity
import kotlinx.coroutines.flow.first
import java.util.Calendar
import javax.inject.Inject
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/ui/theme/Theme.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/ui/theme/Theme.kt
index 61aff0a2..7ae0e857 100644
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/ui/theme/Theme.kt
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/ui/theme/Theme.kt
@@ -5,8 +5,14 @@ import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.collectAsState
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
+import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
+import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.systemuicontroller.rememberSystemUiController
+import com.lorenzovainigli.foodexpirationdates.model.repository.PreferencesRepository
+import com.lorenzovainigli.foodexpirationdates.viewmodel.PreferencesViewModel
private val LightColors = lightColorScheme(
primary = md_theme_light_primary,
@@ -85,16 +91,27 @@ fun FoodExpirationDatesTheme(
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
}
+
darkTheme -> DarkColors
else -> LightColors
}
val systemUiController = rememberSystemUiController()
- //val useDarkIcons = isSystemInDarkTheme()
+ var useDarkIcons: Boolean = !isSystemInDarkTheme()
+ if (LocalViewModelStoreOwner.current != null) {
+ val prefsViewModel: PreferencesViewModel = viewModel()
+ useDarkIcons =
+ when (prefsViewModel.getThemeMode(LocalContext.current).collectAsState().value) {
+ PreferencesRepository.Companion.ThemeMode.LIGHT.ordinal -> true
+ PreferencesRepository.Companion.ThemeMode.DARK.ordinal -> false
+ else -> !isSystemInDarkTheme()
+ }
+ }
SideEffect {
systemUiController.setSystemBarsColor(
- color = colorScheme.surface
+ darkIcons = useDarkIcons,
+ color = Color.Transparent
)
}
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/MainActivity.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/MainActivity.kt
new file mode 100644
index 00000000..64c0f2a1
--- /dev/null
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/MainActivity.kt
@@ -0,0 +1,93 @@
+package com.lorenzovainigli.foodexpirationdates.view
+
+import android.os.Build
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.activity.viewModels
+import androidx.annotation.RequiresApi
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
+import androidx.core.view.WindowCompat
+import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.compose.rememberNavController
+import com.lorenzovainigli.foodexpirationdates.di.AppModule
+import com.lorenzovainigli.foodexpirationdates.di.DaggerAppComponent
+import com.lorenzovainigli.foodexpirationdates.model.NotificationManager
+import com.lorenzovainigli.foodexpirationdates.model.repository.PreferencesRepository
+import com.lorenzovainigli.foodexpirationdates.ui.theme.FoodExpirationDatesTheme
+import com.lorenzovainigli.foodexpirationdates.view.composable.MyScaffold
+import com.lorenzovainigli.foodexpirationdates.viewmodel.ExpirationDatesViewModel
+import com.lorenzovainigli.foodexpirationdates.viewmodel.PreferencesViewModel
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class MainActivity : ComponentActivity() {
+
+ val viewModel: ExpirationDatesViewModel by viewModels()
+ val preferencesViewModel: PreferencesViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+
+ val splashScreen = installSplashScreen()
+ splashScreen.setKeepOnScreenCondition { viewModel.isSplashScreenLoading.value }
+
+ DaggerAppComponent.builder()
+ .appModule(AppModule())
+ .build()
+ NotificationManager.setupNotificationChannel(this)
+ }
+
+ @RequiresApi(Build.VERSION_CODES.O)
+ override fun onResume() {
+ super.onResume()
+ val context = this
+ setContent {
+ val viewModel: ExpirationDatesViewModel = viewModel()
+ val prefsViewModel: PreferencesViewModel = viewModel()
+ val darkThemeState = prefsViewModel.getThemeMode(context).collectAsState().value
+ val dynamicColorsState = prefsViewModel.getDynamicColors(context).collectAsState().value
+ val isInDarkTheme = when (darkThemeState) {
+ PreferencesRepository.Companion.ThemeMode.LIGHT.ordinal -> false
+ PreferencesRepository.Companion.ThemeMode.DARK.ordinal -> true
+ else -> isSystemInDarkTheme()
+ }
+ FoodExpirationDatesTheme(
+ darkTheme = isInDarkTheme,
+ dynamicColor = dynamicColorsState
+ ) {
+ Surface(
+ modifier = Modifier
+ .fillMaxSize(),
+ color = MaterialTheme.colorScheme.background
+ ) {
+ val navController = rememberNavController()
+ val showSnackbar = remember {
+ mutableStateOf(false)
+ }
+ MyScaffold(
+ activity = this,
+ navController = navController,
+ showSnackbar = showSnackbar
+ ) {
+ Navigation(
+ activity = this,
+ navController = navController,
+ showSnackbar = showSnackbar
+ )
+ }
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/Navigation.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/Navigation.kt
new file mode 100644
index 00000000..094ad2bd
--- /dev/null
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/Navigation.kt
@@ -0,0 +1,76 @@
+package com.lorenzovainigli.foodexpirationdates.view
+
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.ui.Modifier
+import androidx.navigation.NavHostController
+import androidx.navigation.NavType
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.navArgument
+import com.lorenzovainigli.foodexpirationdates.view.composable.screen.InfoScreen
+import com.lorenzovainigli.foodexpirationdates.view.composable.screen.InsertScreen
+import com.lorenzovainigli.foodexpirationdates.view.composable.screen.MainScreen
+import com.lorenzovainigli.foodexpirationdates.view.composable.screen.Screen
+import com.lorenzovainigli.foodexpirationdates.view.composable.screen.SettingsScreen
+
+@RequiresApi(Build.VERSION_CODES.O)
+@Composable
+fun Navigation(
+ activity: MainActivity? = null,
+ navController: NavHostController,
+ showSnackbar: MutableState
+) {
+ NavHost(
+ modifier = Modifier.fillMaxSize(),
+ navController = navController,
+ startDestination = Screen.MainScreen.route
+ ) {
+ composable(route = Screen.MainScreen.route) {
+ MainScreen(
+ activity = activity,
+ navController = navController,
+ showSnackbar = showSnackbar
+ )
+ }
+ composable(
+ route = Screen.InsertScreen.route + "?itemId={itemId}",
+ arguments = listOf(
+ navArgument("itemId"){
+ type = NavType.StringType
+ nullable = true
+ }
+ )
+ ){ entry ->
+ InsertScreen(
+ activity = activity,
+ navController = navController,
+ itemId = entry.arguments?.getString("itemId")
+ )
+ }
+ composable(route = Screen.AboutScreen.route){
+ InfoScreen()
+ }
+ composable(route = Screen.SettingsScreen.route){
+ SettingsScreen(activity = activity)
+ }
+ }
+}
+
+//@RequiresApi(Build.VERSION_CODES.O)
+//@Preview
+//@Composable
+//fun NavigationPreview(){
+// FoodExpirationDatesTheme {
+// Surface(modifier = Modifier.fillMaxSize()) {
+// Navigation(
+// navController = rememberNavController(),
+// coroutineScope = rememberCoroutineScope(),
+// snackbarHostState = SnackbarHostState()
+// )
+// }
+// }
+//}
\ No newline at end of file
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/InfoActivity.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/InfoActivity.kt
deleted file mode 100644
index 1b9489ee..00000000
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/InfoActivity.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.lorenzovainigli.foodexpirationdates.view.activity
-
-import android.os.Bundle
-import androidx.activity.ComponentActivity
-import androidx.activity.compose.setContent
-import com.lorenzovainigli.foodexpirationdates.view.composable.activity.InfoActivityLayout
-
-class InfoActivity : ComponentActivity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContent {
- InfoActivityLayout(
- context = this
- )
- }
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/InsertActivity.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/InsertActivity.kt
deleted file mode 100644
index f66534cd..00000000
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/InsertActivity.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.lorenzovainigli.foodexpirationdates.view.activity
-
-import android.app.Activity
-import android.os.Bundle
-import androidx.activity.ComponentActivity
-import androidx.activity.compose.setContent
-import com.lorenzovainigli.foodexpirationdates.di.AppModule
-import com.lorenzovainigli.foodexpirationdates.di.DaggerAppComponent
-import com.lorenzovainigli.foodexpirationdates.view.composable.activity.InsertActivityLayout
-import dagger.hilt.android.AndroidEntryPoint
-
-@AndroidEntryPoint
-class InsertActivity : ComponentActivity() {
-
- private lateinit var activity: Activity
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- activity = this
- val itemId = intent.extras?.getInt("ITEM_ID")
- DaggerAppComponent.builder()
- .appModule(AppModule())
- .build()
- setContent {
- InsertActivityLayout(
- context = this,
- itemId = itemId
- )
- }
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/MainActivity.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/MainActivity.kt
deleted file mode 100644
index 7b0d681a..00000000
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/MainActivity.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.lorenzovainigli.foodexpirationdates.view.activity
-
-import android.os.Bundle
-import androidx.activity.ComponentActivity
-import androidx.activity.compose.setContent
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
-import androidx.lifecycle.viewmodel.compose.viewModel
-import com.lorenzovainigli.foodexpirationdates.di.AppModule
-import com.lorenzovainigli.foodexpirationdates.di.DaggerAppComponent
-import com.lorenzovainigli.foodexpirationdates.model.NotificationManager
-import com.lorenzovainigli.foodexpirationdates.view.composable.activity.MainActivityLayout
-import com.lorenzovainigli.foodexpirationdates.viewmodel.ExpirationDatesViewModel
-import dagger.hilt.android.AndroidEntryPoint
-import androidx.activity.viewModels
-import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
-
-@AndroidEntryPoint
-class MainActivity : ComponentActivity() {
-
- private val viewModel: ExpirationDatesViewModel by viewModels()
-
- override fun onCreate(savedInstanceState: Bundle?) {
-
- val splashScreen = installSplashScreen()
- splashScreen.setKeepOnScreenCondition { viewModel.isSplashScreenLoading.value }
-
- super.onCreate(savedInstanceState)
- DaggerAppComponent.builder()
- .appModule(AppModule())
- .build()
- NotificationManager.setupNotificationChannel(this)
- }
-
- override fun onResume() {
- super.onResume()
- setContent {
- val items by viewModel.getDates().collectAsState(emptyList())
- MainActivityLayout(
- context = this,
- items = items,
- viewModel = viewModel
- )
- }
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/SettingsActivity.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/SettingsActivity.kt
deleted file mode 100644
index 1edec47a..00000000
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/activity/SettingsActivity.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.lorenzovainigli.foodexpirationdates.view.activity
-
-import android.os.Build
-import android.os.Bundle
-import android.widget.Toast
-import androidx.activity.ComponentActivity
-import androidx.activity.compose.setContent
-import androidx.annotation.RequiresApi
-import androidx.work.ExistingPeriodicWorkPolicy
-import androidx.work.PeriodicWorkRequestBuilder
-import androidx.work.WorkManager
-import com.lorenzovainigli.foodexpirationdates.BuildConfig
-import com.lorenzovainigli.foodexpirationdates.model.worker.CheckExpirationsWorker
-import com.lorenzovainigli.foodexpirationdates.view.composable.activity.SettingsActivityLayout
-import dagger.hilt.android.AndroidEntryPoint
-import java.util.Calendar
-import java.util.concurrent.TimeUnit
-
-@AndroidEntryPoint
-class SettingsActivity : ComponentActivity() {
-
- @RequiresApi(Build.VERSION_CODES.O)
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContent {
- SettingsActivityLayout(
- scheduleDailyNotification = ::scheduleDailyNotification
- )
- }
- }
-
- private fun scheduleDailyNotification(hour: Int, minute: Int) {
- val currentTime = Calendar.getInstance()
- val dueTime = Calendar.getInstance().apply {
- set(Calendar.HOUR_OF_DAY, hour)
- set(Calendar.MINUTE, minute)
- set(Calendar.SECOND, 0)
- }
- if (currentTime > dueTime)
- dueTime.add(Calendar.DAY_OF_MONTH, 1)
- val initialDelay = dueTime.timeInMillis - currentTime.timeInMillis
- val formattedTime = formatTimeDifference(initialDelay)
- if (BuildConfig.DEBUG) {
- Toast.makeText(
- applicationContext,
- "Notification in $formattedTime",
- Toast.LENGTH_SHORT
- ).show()
- }
- val workRequest = PeriodicWorkRequestBuilder(
- 1, TimeUnit.DAYS
- )
- .setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
- .build()
- WorkManager.getInstance(applicationContext)
- .enqueueUniquePeriodicWork(
- CheckExpirationsWorker.workerID,
- ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
- workRequest
- )
- }
-
- private fun formatTimeDifference(timeDifference: Long): String {
- val days = TimeUnit.MILLISECONDS.toDays(timeDifference)
- val hours = TimeUnit.MILLISECONDS.toHours(timeDifference) % 24
- val minutes = TimeUnit.MILLISECONDS.toMinutes(timeDifference) % 60
- val seconds = TimeUnit.MILLISECONDS.toSeconds(timeDifference) % 60
- val formattedTime = StringBuilder()
- if (days > 0) {
- formattedTime.append("$days day${if (days > 1) "s" else ""} ")
- }
- if (hours > 0) {
- formattedTime.append("$hours hour${if (hours > 1) "s" else ""} ")
- }
- if (minutes > 0) {
- formattedTime.append("$minutes minute${if (minutes > 1) "s" else ""} ")
- }
- if (seconds > 0) {
- formattedTime.append("$seconds second${if (seconds > 1) "s" else ""} ")
- }
- return formattedTime.toString().trim()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AppIcon.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AppIcon.kt
index 653ce11f..aa98dc9c 100644
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AppIcon.kt
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AppIcon.kt
@@ -18,7 +18,8 @@ import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asComposeColorFilter
import androidx.compose.ui.graphics.drawscope.scale
import androidx.compose.ui.res.imageResource
-import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.tooling.preview.PreviewDynamicColors
+import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.times
@@ -69,7 +70,8 @@ fun AppIcon(
}
}
-@Preview
+@PreviewLightDark
+@PreviewDynamicColors
@Composable
fun AppIconPreview() {
FoodExpirationDatesTheme {
@@ -78,6 +80,8 @@ fun AppIconPreview() {
) {
Column {
AppIcon(size = 48.dp)
+ AppIcon(size = 48.dp, color = MaterialTheme.colorScheme.secondary)
+ AppIcon(size = 48.dp, color = MaterialTheme.colorScheme.tertiary)
}
}
}
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AutoResizedText.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AutoResizedText.kt
index 1819a1d8..770c7af0 100644
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AutoResizedText.kt
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/AutoResizedText.kt
@@ -16,10 +16,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.isUnspecified
import com.lorenzovainigli.foodexpirationdates.ui.theme.FoodExpirationDatesTheme
-import com.lorenzovainigli.foodexpirationdates.view.preview.DefaultPreviews
@Composable
fun AutoResizedText(
@@ -61,7 +61,7 @@ fun AutoResizedText(
)
}
-@DefaultPreviews
+@Preview
@Composable
fun AutoResizedTextPreview(){
FoodExpirationDatesTheme {
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/DateFormatDialog.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/DateFormatDialog.kt
index 86efc1c9..c65a0c2a 100644
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/DateFormatDialog.kt
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/DateFormatDialog.kt
@@ -22,7 +22,6 @@ import androidx.compose.ui.window.Dialog
import com.lorenzovainigli.foodexpirationdates.R
import com.lorenzovainigli.foodexpirationdates.model.repository.PreferencesRepository
import com.lorenzovainigli.foodexpirationdates.ui.theme.FoodExpirationDatesTheme
-import com.lorenzovainigli.foodexpirationdates.view.preview.DefaultPreviews
import com.lorenzovainigli.foodexpirationdates.view.preview.LanguagePreviews
import java.text.SimpleDateFormat
import java.util.Calendar
@@ -105,7 +104,6 @@ fun DateFormatRow(
)
}
-@DefaultPreviews
@LanguagePreviews
@Composable
fun DateFormatDialogPreview(){
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/FoodCard.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/FoodCard.kt
index 24a00020..21bca2bf 100644
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/FoodCard.kt
+++ b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/FoodCard.kt
@@ -35,8 +35,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.lorenzovainigli.foodexpirationdates.R
-import com.lorenzovainigli.foodexpirationdates.model.repository.PreferencesRepository
import com.lorenzovainigli.foodexpirationdates.model.entity.ExpirationDate
+import com.lorenzovainigli.foodexpirationdates.model.repository.PreferencesRepository
import com.lorenzovainigli.foodexpirationdates.ui.theme.DarkOrange
import com.lorenzovainigli.foodexpirationdates.ui.theme.DarkRed
import com.lorenzovainigli.foodexpirationdates.ui.theme.DarkYellow
@@ -44,8 +44,7 @@ import com.lorenzovainigli.foodexpirationdates.ui.theme.LightOrange
import com.lorenzovainigli.foodexpirationdates.ui.theme.LightRed
import com.lorenzovainigli.foodexpirationdates.ui.theme.LightYellow
import com.lorenzovainigli.foodexpirationdates.ui.theme.TonalElevation
-import com.lorenzovainigli.foodexpirationdates.view.composable.activity.getItemsForPreview
-import com.lorenzovainigli.foodexpirationdates.view.preview.DefaultPreviews
+import com.lorenzovainigli.foodexpirationdates.view.composable.screen.getItemsForPreview
import com.lorenzovainigli.foodexpirationdates.view.preview.LanguagePreviews
import java.text.SimpleDateFormat
import java.util.Calendar
@@ -104,7 +103,7 @@ fun FoodCard(
.testTag(FOOD_CARD)
.padding(4.dp)
.clip(RoundedCornerShape(10.dp)),
- tonalElevation = TonalElevation.level5()
+ tonalElevation = TonalElevation.level1()
) {
Row(
modifier = Modifier
@@ -155,7 +154,6 @@ fun FoodCard(
}
}
-@DefaultPreviews
@LanguagePreviews
@Composable
fun FoodCardPreview() {
diff --git a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/MainMenu.kt b/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/MainMenu.kt
deleted file mode 100644
index 1e86aebd..00000000
--- a/app/src/main/java/com/lorenzovainigli/foodexpirationdates/view/composable/MainMenu.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.lorenzovainigli.foodexpirationdates.view.composable
-
-import android.content.Intent
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.Info
-import androidx.compose.material.icons.outlined.MoreVert
-import androidx.compose.material.icons.outlined.Settings
-import androidx.compose.material3.DropdownMenuItem
-import androidx.compose.material3.ExperimentalMaterial3Api
-import androidx.compose.material3.Icon
-import androidx.compose.material3.IconButton
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.ModalBottomSheet
-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.Companion.CenterVertically
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.unit.dp
-import com.lorenzovainigli.foodexpirationdates.R
-import com.lorenzovainigli.foodexpirationdates.view.activity.InfoActivity
-import com.lorenzovainigli.foodexpirationdates.view.activity.SettingsActivity
-
-data class MenuItem(
- val label: String,
- val icon: ImageVector,
- val action: () -> Unit
-)
-
-@Composable
-fun getMenuItems(): List