This commit is contained in:
Rafal Wisniewski
2026-03-19 15:54:46 +01:00
parent 20370e3906
commit 3ff4afa587
2 changed files with 163 additions and 55 deletions

View File

@@ -18,7 +18,6 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import cc.n0th1ng.tripmoney.data.DatabasePrepopulator
import cc.n0th1ng.tripmoney.navigation.BottomNavigation import cc.n0th1ng.tripmoney.navigation.BottomNavigation
import cc.n0th1ng.tripmoney.navigation.CustomNavigationDrawer import cc.n0th1ng.tripmoney.navigation.CustomNavigationDrawer
import cc.n0th1ng.tripmoney.navigation.Screens import cc.n0th1ng.tripmoney.navigation.Screens
@@ -30,22 +29,14 @@ import cc.n0th1ng.tripmoney.screens.statistics.StatisticsScreen
import cc.n0th1ng.tripmoney.screens.trippicker.TripPickerScreen import cc.n0th1ng.tripmoney.screens.trippicker.TripPickerScreen
import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.theme.TripMoneyTheme
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@Inject
lateinit var databasePrePopulate: DatabasePrepopulator
@RequiresApi(Build.VERSION_CODES.O) @RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
CoroutineScope(Dispatchers.IO).launch {
databasePrePopulate.prepopulate()
}
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
TripMoneyTheme { TripMoneyTheme {

View File

@@ -31,37 +31,29 @@ abstract class TripDatabase : RoomDatabase() {
abstract fun tripDao(): TripDao abstract fun tripDao(): TripDao
abstract fun expenseDao(): ExpenseDao abstract fun expenseDao(): ExpenseDao
abstract fun categoryDao(): CategoryDao abstract fun categoryDao(): CategoryDao
companion object {
@Volatile
private var INSTANCE: TripDatabase? = null
fun getInstance(context: Context): TripDatabase {
return INSTANCE ?: synchronized(this) {
INSTANCE ?: Room.inMemoryDatabaseBuilder(
context,
TripDatabase::class.java
).allowMainThreadQueries().build().also { INSTANCE = it }
}
}
}
} }
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
object DatabaseModule { object DatabaseModule {
@RequiresApi(Build.VERSION_CODES.O)
@Provides @Provides
@Singleton @Singleton
fun provideTripDatabase( fun provideTripDatabase(
@ApplicationContext context: Context @ApplicationContext context: Context
): TripDatabase { ): TripDatabase {
return Room.inMemoryDatabaseBuilder(
context, val db: TripDatabase = Room.inMemoryDatabaseBuilder(
TripDatabase::class.java context, TripDatabase::class.java
) ).allowMainThreadQueries().build()
.allowMainThreadQueries() // Only for in-memory DB, not for production!
.build() CoroutineScope(Dispatchers.IO).launch {
DatabasePrepopulator(
tripDao = db.tripDao(), categoryDao = db.categoryDao(), expenseDao = db.expenseDao()
).prepopulate()
}
return db
} }
@Provides @Provides
@@ -81,20 +73,10 @@ object DatabaseModule {
fun provideCategoryDao(database: TripDatabase): CategoryDao { fun provideCategoryDao(database: TripDatabase): CategoryDao {
return database.categoryDao() return database.categoryDao()
} }
@Provides
@Singleton
fun provideDatabasePrepopulator(
tripDao: TripDao,
categoryDao: CategoryDao,
expenseDao: ExpenseDao
): DatabasePrepopulator {
return DatabasePrepopulator(tripDao, categoryDao, expenseDao)
}
} }
class DatabasePrepopulator @Inject constructor( private class DatabasePrepopulator(
private val tripDao: TripDao, private val tripDao: TripDao,
private val categoryDao: CategoryDao, private val categoryDao: CategoryDao,
private val expenseDao: ExpenseDao private val expenseDao: ExpenseDao
@@ -119,20 +101,155 @@ class DatabasePrepopulator @Inject constructor(
categoryDao.insert(Category(name = "Zakupy8", icon = Icons.GROCERIES, color = "#CFD8DC")) categoryDao.insert(Category(name = "Zakupy8", icon = Icons.GROCERIES, color = "#CFD8DC"))
val now = LocalDateTime.now() val now = LocalDateTime.now()
expenseDao.insert(Expense(amount = 120.50, currency = "PLN", note = "Hotel overnight", datetime = now.minusDays(10).toString(), categoryId = 1, tripId = 1)) expenseDao.insert(
expenseDao.insert(Expense(amount = 45.75, currency = "PLN", note = "Dinner", datetime = now.minusDays(9).toString(), categoryId = 2, tripId = 1)) Expense(
expenseDao.insert(Expense(amount = 15.20, currency = "PLN", note = "Bus ticket", datetime = now.minusDays(8).toString(), categoryId = 3, tripId = 1)) amount = 120.50,
expenseDao.insert(Expense(amount = 89.99, currency = "PLN", note = "Concert tickets", datetime = now.minusDays(7).toString(), categoryId = 4, tripId = 1)) currency = "PLN",
expenseDao.insert(Expense(amount = 32.50, currency = "PLN", note = "Souvenirs", datetime = now.minusDays(6).toString(), categoryId = 5, tripId = 1)) note = "Hotel overnight",
expenseDao.insert(Expense(amount = 180.00, currency = "PLN", note = "Hotel 3 nights", datetime = now.minusDays(5).toString(), categoryId = 1, tripId = 1)) datetime = now.minusDays(10).toString(),
expenseDao.insert(Expense(amount = 67.30, currency = "PLN", note = "Lunch", datetime = now.minusDays(4).toString(), categoryId = 2, tripId = 1)) categoryId = 1,
expenseDao.insert(Expense(amount = 22.00, currency = "PLN", note = "Train ticket", datetime = now.minusDays(3).toString(), categoryId = 3, tripId = 1)) tripId = 1
expenseDao.insert(Expense(amount = 55.00, currency = "PLN", note = "Museum entry", datetime = now.minusDays(2).toString(), categoryId = 4, tripId = 1)) )
expenseDao.insert(Expense(amount = 12.99, currency = "PLN", note = "Snacks", datetime = now.minusDays(1).toString(), categoryId = 2, tripId = 1)) )
expenseDao.insert(Expense(amount = 210.00, currency = "PLN", note = "Hotel 5 nights", datetime = now.toString(), categoryId = 1, tripId = 1)) expenseDao.insert(
expenseDao.insert(Expense(amount = 95.50, currency = "EUR", note = "Dinner for two", datetime = now.minusHours(12).toString(), categoryId = 2, tripId = 1)) Expense(
expenseDao.insert(Expense(amount = 30.00, currency = "EUR", note = "Taxi", datetime = now.minusHours(6).toString(), categoryId = 3, tripId = 1)) amount = 45.75,
expenseDao.insert(Expense(amount = 40.00, currency = "USD", note = "Gifts", datetime = now.minusHours(3).toString(), categoryId = 5, tripId = 1)) currency = "PLN",
expenseDao.insert(Expense(amount = 75.00, currency = "PLN", note = "Sightseeing tour", datetime = now.minusHours(1).toString(), categoryId = 4, tripId = 1)) note = "Dinner",
datetime = now.minusDays(9).toString(),
categoryId = 2,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 15.20,
currency = "PLN",
note = "Bus ticket",
datetime = now.minusDays(8).toString(),
categoryId = 3,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 89.99,
currency = "PLN",
note = "Concert tickets",
datetime = now.minusDays(7).toString(),
categoryId = 4,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 32.50,
currency = "PLN",
note = "Souvenirs",
datetime = now.minusDays(6).toString(),
categoryId = 5,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 180.00,
currency = "PLN",
note = "Hotel 3 nights",
datetime = now.minusDays(5).toString(),
categoryId = 1,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 67.30,
currency = "PLN",
note = "Lunch",
datetime = now.minusDays(4).toString(),
categoryId = 2,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 22.00,
currency = "PLN",
note = "Train ticket",
datetime = now.minusDays(3).toString(),
categoryId = 3,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 55.00,
currency = "PLN",
note = "Museum entry",
datetime = now.minusDays(2).toString(),
categoryId = 4,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 12.99,
currency = "PLN",
note = "Snacks",
datetime = now.minusDays(1).toString(),
categoryId = 2,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 210.00,
currency = "PLN",
note = "Hotel 5 nights",
datetime = now.toString(),
categoryId = 1,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 95.50,
currency = "EUR",
note = "Dinner for two",
datetime = now.minusHours(12).toString(),
categoryId = 2,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 30.00,
currency = "EUR",
note = "Taxi",
datetime = now.minusHours(6).toString(),
categoryId = 3,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 40.00,
currency = "USD",
note = "Gifts",
datetime = now.minusHours(3).toString(),
categoryId = 5,
tripId = 1
)
)
expenseDao.insert(
Expense(
amount = 75.00,
currency = "PLN",
note = "Sightseeing tour",
datetime = now.minusHours(1).toString(),
categoryId = 4,
tripId = 1
)
)
} }
} }