From 3ff4afa5871f156188bf65ce6bef361cca073f14 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Thu, 19 Mar 2026 15:54:46 +0100 Subject: [PATCH 01/18] init --- .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 9 - .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 209 ++++++++++++++---- 2 files changed, 163 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index 75cda01..e6e26fa 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -18,7 +18,6 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import cc.n0th1ng.tripmoney.data.DatabasePrepopulator import cc.n0th1ng.tripmoney.navigation.BottomNavigation import cc.n0th1ng.tripmoney.navigation.CustomNavigationDrawer 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.theme.TripMoneyTheme import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { - @Inject - lateinit var databasePrePopulate: DatabasePrepopulator @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - CoroutineScope(Dispatchers.IO).launch { - databasePrePopulate.prepopulate() - } enableEdgeToEdge() setContent { TripMoneyTheme { diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index ff7148a..b71b655 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -31,37 +31,29 @@ abstract class TripDatabase : RoomDatabase() { abstract fun tripDao(): TripDao abstract fun expenseDao(): ExpenseDao 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 @InstallIn(SingletonComponent::class) object DatabaseModule { + @RequiresApi(Build.VERSION_CODES.O) @Provides @Singleton fun provideTripDatabase( @ApplicationContext context: Context ): TripDatabase { - return Room.inMemoryDatabaseBuilder( - context, - TripDatabase::class.java - ) - .allowMainThreadQueries() // Only for in-memory DB, not for production! - .build() + + val db: TripDatabase = Room.inMemoryDatabaseBuilder( + context, TripDatabase::class.java + ).allowMainThreadQueries().build() + + CoroutineScope(Dispatchers.IO).launch { + DatabasePrepopulator( + tripDao = db.tripDao(), categoryDao = db.categoryDao(), expenseDao = db.expenseDao() + ).prepopulate() + } + return db } @Provides @@ -81,20 +73,10 @@ object DatabaseModule { fun provideCategoryDao(database: TripDatabase): 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 categoryDao: CategoryDao, private val expenseDao: ExpenseDao @@ -119,20 +101,155 @@ class DatabasePrepopulator @Inject constructor( categoryDao.insert(Category(name = "Zakupy8", icon = Icons.GROCERIES, color = "#CFD8DC")) 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(Expense(amount = 45.75, currency = "PLN", 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)) + expenseDao.insert( + Expense( + amount = 120.50, + currency = "PLN", + note = "Hotel overnight", + datetime = now.minusDays(10).toString(), + categoryId = 1, + tripId = 1 + ) + ) + expenseDao.insert( + Expense( + amount = 45.75, + currency = "PLN", + 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 + ) + ) } } From b074c98f7dc32cb9891aad911f8ebbe338dbe432 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Thu, 19 Mar 2026 15:57:57 +0100 Subject: [PATCH 02/18] test --- app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index b71b655..6c2bcec 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -33,6 +33,7 @@ abstract class TripDatabase : RoomDatabase() { abstract fun categoryDao(): CategoryDao } + @Module @InstallIn(SingletonComponent::class) object DatabaseModule { From f625a6975cc359e2ae717bd6fd525342b8146fa4 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Thu, 19 Mar 2026 21:02:10 +0100 Subject: [PATCH 03/18] init --- .../cc/n0th1ng/tripmoney/data/dao/TripDao.kt | 3 + .../data/repository/TripRepository.kt | 5 + .../addexpense/AddExpenseBottomSheet.kt | 40 +++-- .../listexpense/CategorySelectionDialog.kt | 7 +- .../listexpense/CurrencySelectionDialog.kt | 6 +- .../screens/listexpense/DateTimePicker.kt | 144 +++++++++------- .../screens/listexpense/ListExpenseScreen.kt | 10 +- .../screens/trippicker/AddTripBottomSheet.kt | 125 ++++++++++++++ .../screens/trippicker/TripPickerScreen.kt | 156 ++++++++++++++---- .../cc/n0th1ng/tripmoney/utils/Currencies.kt | 16 ++ .../tripmoney/viewmodel/TripViewModel.kt | 14 ++ app/src/main/res/values-pl/strings.xml | 2 + app/src/main/res/values/strings.xml | 3 +- 13 files changed, 408 insertions(+), 123 deletions(-) create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt index 3ed8e32..89098e6 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt @@ -2,6 +2,7 @@ package cc.n0th1ng.tripmoney.data.dao import androidx.paging.PagingSource import androidx.room.Dao +import androidx.room.Delete import androidx.room.Insert import androidx.room.Query import androidx.room.Upsert @@ -19,4 +20,6 @@ interface TripDao { ) fun tripsPaged(): PagingSource + @Delete + suspend fun delete(trip: Trip) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt index 423c630..d0109ea 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt @@ -22,4 +22,9 @@ class TripRepository @Inject constructor(private val tripDao: TripDao) { pagingSourceFactory = { tripDao.tripsPaged() } ).flow } + + @WorkerThread + suspend fun delete(trip: Trip) { + tripDao.delete(trip) + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index 7fd4d38..9efca80 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.graphics.toColorInt +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.R import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense @@ -46,9 +47,11 @@ import cc.n0th1ng.tripmoney.screens.listexpense.CategorySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.DateTimePicker import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import java.time.LocalDateTime +import java.time.format.DateTimeFormatter @OptIn(ExperimentalMaterial3Api::class) @@ -57,11 +60,10 @@ import java.time.LocalDateTime fun AddExpenseBottomSheet( onSave: (Expense) -> Unit, onDismiss: () -> Unit, - settingsViewModel: SettingsViewModel, categories: List, - expenseAndCategoryViewModel: ExpenseAndCategoryViewModel, expenseDtoToEdit: ExpenseDto? ) { + val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() var amount by remember { mutableStateOf( @@ -70,11 +72,18 @@ fun AddExpenseBottomSheet( } var showCurrencyDialog by remember { mutableStateOf(false) } var showCategoryDialog by remember { mutableStateOf(false) } - var currency by remember { mutableStateOf(expenseDtoToEdit?.expense?.currency ?: "PLN") } + var showDateTimePicker by remember { mutableStateOf(false) } + var currency by remember { + mutableStateOf( + expenseDtoToEdit?.expense?.currency ?: Currencies.PLN.name + ) + } var category by remember { mutableStateOf(expenseDtoToEdit?.category ?: categories[0]) } var datetime by remember { mutableStateOf( - LocalDateTime.parse(expenseDtoToEdit?.expense?.datetime ?: LocalDateTime.now().toString()) + LocalDateTime.parse( + expenseDtoToEdit?.expense?.datetime ?: LocalDateTime.now().toString() + ) ) } var note by remember { mutableStateOf(expenseDtoToEdit?.expense?.note ?: "") } @@ -103,10 +112,12 @@ fun AddExpenseBottomSheet( CurrencyButton(onClick = { showCurrencyDialog = true }, text = currency) } Spacer(Modifier.height(14.dp)) - DateTimePicker( - dateTime = datetime, - onChange = { datetime = it } - ) + OutlinedButton(onClick = { showDateTimePicker = true }) { + Text( + text = datetime.format(DateTimeFormatter.ofPattern("dd.MM HH:mm")), + fontSize = 17.sp + ) + } Spacer(Modifier.height(14.dp)) CategoryButton(onClick = { showCategoryDialog = true }, category = category) Spacer(Modifier.height(14.dp)) @@ -155,7 +166,12 @@ fun AddExpenseBottomSheet( } } - + if (showDateTimePicker) { + DateTimePicker(datetime, onChange = { newDateTime -> + datetime = newDateTime + showDateTimePicker = false + }) + } if (showCurrencyDialog) { CurrencySelectionDialog( @@ -164,8 +180,7 @@ fun AddExpenseBottomSheet( showCurrencyDialog = false currency = selectedCurrency }, - selected = currency, - listOfCurrencies = listOf("PLN", "EUR", "USD") + selected = currency ) } @@ -177,8 +192,7 @@ fun AddExpenseBottomSheet( category = selectedCategory }, selected = category, - categories = categories, - settingsAndCategoryViewModel = expenseAndCategoryViewModel + categories = categories ) } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt index a2f1c09..40dbfc4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.R.* import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.screens.AddCategoryDialog @@ -36,9 +37,9 @@ fun CategorySelectionDialog( onDismiss: () -> Unit, onCategorySelected: (Category) -> Unit, selected: Category, - categories: List, - settingsAndCategoryViewModel: ExpenseAndCategoryViewModel + categories: List ) { + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val listState = rememberLazyListState() var showAddCategoryDialog by remember { mutableStateOf(false) } AlertDialog( @@ -99,7 +100,7 @@ fun CategorySelectionDialog( AddCategoryDialog(onDismiss = { showAddCategoryDialog = false }, onSave = { category -> - settingsAndCategoryViewModel.save(category) + expenseAndCategoryViewModel.save(category) showAddCategoryDialog = false }) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt index 9492974..3d7a6fb 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CurrencySelectionDialog.kt @@ -14,20 +14,20 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import cc.n0th1ng.tripmoney.R +import cc.n0th1ng.tripmoney.utils.Currencies @Composable fun CurrencySelectionDialog( onDismiss: () -> Unit, onCurrencySelected: (String) -> Unit, - selected: String, - listOfCurrencies: List + selected: String ) { AlertDialog( onDismissRequest = onDismiss, title = { Text(stringResource(R.string.pick_currency)) }, text = { Column { - listOfCurrencies.forEach { currency -> + Currencies.names().forEach { currency -> Row( modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt index eacd587..f4f57c9 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt @@ -5,11 +5,13 @@ import androidx.annotation.RequiresApi import androidx.compose.material3.AlertDialog import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePickerDialog +import androidx.compose.material3.DatePickerState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TimePicker +import androidx.compose.material3.TimePickerState import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable @@ -20,11 +22,73 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.sp import cc.n0th1ng.tripmoney.R.* +import java.sql.Time import java.time.Instant +import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime import java.time.ZoneId import java.time.format.DateTimeFormatter +import java.util.Calendar + +@RequiresApi(Build.VERSION_CODES.O) +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DatePicker( + dateTime: LocalDate = LocalDate.now(), + onDismiss: () -> Unit, + onConfirm: (LocalDate) -> Unit +) { + val datePickerState = + rememberDatePickerState(initialSelectedDateMillis = dateTime.toEpochMilli()) + + DatePickerDialog( + onDismissRequest = onDismiss, + confirmButton = { + TextButton(onClick = { + val selectedMillis = datePickerState.selectedDateMillis + if (selectedMillis != null) { + val selectedDate = Instant.ofEpochMilli(selectedMillis) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + onConfirm(selectedDate) + } + }) { + Text("OK") + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) } + } + ) { + DatePicker(state = datePickerState) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TimePicker(onDismiss: () -> Unit, onConfirm: (TimePickerState) -> Unit) { + val currentTime = Calendar.getInstance() + val timePickerState = rememberTimePickerState( + initialHour = currentTime.get(Calendar.HOUR_OF_DAY), + initialMinute = currentTime.get(Calendar.MINUTE), + is24Hour = true + ) + + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = { + TextButton(onClick = { onConfirm(timePickerState) }) { + Text("OK") + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) } + }, + text = { TimePicker(state = timePickerState) } + ) + +} @Composable @RequiresApi(Build.VERSION_CODES.O) @@ -33,76 +97,34 @@ fun DateTimePicker( dateTime: LocalDateTime = LocalDateTime.now(), onChange: (LocalDateTime) -> Unit ) { - val datePickerState = - rememberDatePickerState(initialSelectedDateMillis = dateTime.toEpochMilli()) - val timePickerState = rememberTimePickerState( - initialHour = dateTime.hour, - initialMinute = dateTime.minute - ) - var showDatePicker by remember { mutableStateOf(false) } + var showDatePicker by remember { mutableStateOf(true) } var showTimePicker by remember { mutableStateOf(false) } - - - val formatter = DateTimeFormatter.ofPattern("dd.MM HH:mm") - OutlinedButton(onClick = { showDatePicker = true }) { - Text(text = dateTime.format(formatter), fontSize = 17.sp) - } + var date by remember { mutableStateOf(dateTime.toLocalDate()) } if (showDatePicker) { - DatePickerDialog( - onDismissRequest = { showDatePicker = false }, - confirmButton = { - TextButton(onClick = { - showDatePicker = false - val selectedMillis = datePickerState.selectedDateMillis - if (selectedMillis != null) { - val selectedDate = Instant.ofEpochMilli(selectedMillis) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - // open time picker next - showTimePicker = true - onChange( - LocalDateTime.of( - selectedDate, - dateTime.toLocalTime() - ) - ) - } - }) { - Text("OK") - } - }, - dismissButton = { - TextButton(onClick = { - showDatePicker = false - }) { Text(stringResource(string.cancel)) } - } - ) { - DatePicker(state = datePickerState) - } + DatePicker(onDismiss = { showDatePicker = false }, onConfirm = { newDate -> + date = newDate + }) } if (showTimePicker) { - AlertDialog( - onDismissRequest = { showTimePicker = false }, - confirmButton = { - TextButton(onClick = { - showTimePicker = false - val newTime = LocalTime.of(timePickerState.hour, timePickerState.minute) - onChange(LocalDateTime.of(dateTime.toLocalDate(), newTime)) - }) { - Text("OK") - } - }, - dismissButton = { - TextButton(onClick = { showTimePicker = false }) { Text(stringResource(string.cancel)) } - }, - text = { TimePicker(state = timePickerState) } - ) + TimePicker(onDismiss = { + showTimePicker = false + showDatePicker = true + }, onConfirm = { timePickerState -> + showTimePicker = false + showDatePicker = true + val newTime = LocalTime.of(timePickerState.hour, timePickerState.minute) + onChange(LocalDateTime.of(date, newTime)) + }) } } @RequiresApi(Build.VERSION_CODES.O) fun LocalDateTime.toEpochMilli(): Long = - this.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() \ No newline at end of file + this.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() + +@RequiresApi(Build.VERSION_CODES.O) +fun LocalDate.toEpochMilli(): Long = + this.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index 161e7e4..3f3f864 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -2,7 +2,6 @@ package cc.n0th1ng.tripmoney.screens.listexpense import android.annotation.SuppressLint import android.os.Build -import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -53,7 +52,7 @@ import androidx.compose.ui.unit.sp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.paging.compose.collectAsLazyPagingItems -import cc.n0th1ng.tripmoney.R.* +import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.screens.addexpense.AddExpenseBottomSheet @@ -61,7 +60,6 @@ import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import java.time.LocalDateTime import java.time.format.DateTimeFormatter -import kotlin.getValue @OptIn(ExperimentalMaterial3Api::class) @@ -145,9 +143,7 @@ fun ListExpenseScreen() { expenseDtoToEdit = null showBottomSheet = false }, - settingsViewModel = settingsViewModel, categories = categories, - expenseAndCategoryViewModel = expenseAndCategoryViewModel, expenseDtoToEdit = expenseDtoToEdit ) } @@ -287,8 +283,8 @@ fun ExpenseCard(expenseDto: ExpenseDto, onClick: (ExpenseDto) -> Unit) { .fillMaxHeight() .padding(vertical = 8.dp) ) { - Column( - ) { + Column() + { Text( text = expenseDto.category.name, fontWeight = FontWeight.Bold, diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt new file mode 100644 index 0000000..d0103f1 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt @@ -0,0 +1,125 @@ +package cc.n0th1ng.tripmoney.screens.trippicker + +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Check +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.rememberModalBottomSheetState +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.res.stringResource +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import cc.n0th1ng.tripmoney.R +import cc.n0th1ng.tripmoney.R.string +import cc.n0th1ng.tripmoney.data.entity.Trip +import cc.n0th1ng.tripmoney.screens.addexpense.CurrencyButton +import cc.n0th1ng.tripmoney.screens.addexpense.isDoubleTwoDigitsAboveZero +import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog +import cc.n0th1ng.tripmoney.screens.listexpense.DatePicker +import cc.n0th1ng.tripmoney.screens.listexpense.DateTimePicker +import cc.n0th1ng.tripmoney.utils.Currencies +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@RequiresApi(Build.VERSION_CODES.O) +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AddTripBottomSheet(onDismiss: () -> Unit, onSave: (Trip) -> Unit, tripToEdit: Trip?) { + + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + var name by remember { mutableStateOf(tripToEdit?.name ?: "") } + var startDate by remember { + mutableStateOf( + LocalDate.parse(tripToEdit?.startDate ?: LocalDate.now().toString()) + ) + } + var showCurrencyDialog by remember { mutableStateOf(false) } + var showDatePicker by remember { mutableStateOf(false) } + var currency by remember { mutableStateOf(tripToEdit?.currency ?: Currencies.default().name) } + var enableSave by remember { mutableStateOf(tripToEdit != null) } + + ModalBottomSheet( + onDismissRequest = onDismiss, + sheetState = sheetState, + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = Alignment.Start + ) { + NameInput(name = name, onTextChange = { newText -> + name = newText + enableSave = !name.isEmpty() + }) + CurrencyButton(onClick = {showCurrencyDialog = true}, currency) + OutlinedButton(onClick = { showDatePicker = true }) { + Text( + text = startDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")), + fontSize = 17.sp + ) + } + OutlinedButton( + enabled = enableSave, + onClick = { + onSave(Trip(name = name, startDate = startDate.toString(), currency = currency)) + }) { + Icon( + imageVector = Icons.Filled.Check, + contentDescription = stringResource(R.string.save) + ) + } + } + } + + if (showCurrencyDialog) { + CurrencySelectionDialog( + onDismiss = { showCurrencyDialog = false }, + onCurrencySelected = { selectedCurrency -> + showCurrencyDialog = false + currency = selectedCurrency + }, + selected = currency + ) + } + + if (showDatePicker) { + DatePicker(startDate, onDismiss = {showDatePicker = false}, onConfirm = { newDate -> + startDate = newDate + showDatePicker = false + }) + } +} + +@Composable +fun NameInput(name: String, onTextChange: (String) -> Unit) { + var text by remember { mutableStateOf(name) } + OutlinedTextField( + label = { Text(stringResource(R.string.name)) }, value = name, onValueChange = { newText -> + text = newText + onTextChange(text) + }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) + ) +} + diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt index 00b7b75..4f3450e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt @@ -1,5 +1,9 @@ package cc.n0th1ng.tripmoney.screens.trippicker +import android.annotation.SuppressLint +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -7,74 +11,158 @@ 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.lazy.LazyColumn -import androidx.compose.runtime.Composable -import androidx.paging.compose.LazyPagingItems -import androidx.paging.compose.collectAsLazyPagingItems -import androidx.paging.compose.itemKey -import cc.n0th1ng.tripmoney.data.entity.Trip -import cc.n0th1ng.tripmoney.viewmodel.TripViewModel +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.CardDefaults -import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.FabPosition +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.Text +import androidx.compose.material3.rememberSwipeToDismissBoxState +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.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha -import androidx.compose.ui.layout.ModifierLocalBeyondBoundsLayout +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.NavController +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.collectAsLazyPagingItems +import androidx.paging.compose.itemKey +import cc.n0th1ng.tripmoney.R.string +import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.navigation.Screens +import cc.n0th1ng.tripmoney.screens.addexpense.AddExpenseBottomSheet +import cc.n0th1ng.tripmoney.screens.listexpense.DeleteConfirmationDialog import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import cc.n0th1ng.tripmoney.viewmodel.TripViewModel +@RequiresApi(Build.VERSION_CODES.O) @Composable +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") fun TripPickerScreen( navController: NavController ) { - val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() + var showBottomSheet by remember { mutableStateOf(false) } val trips: LazyPagingItems = tripViewModel.getTrips().collectAsLazyPagingItems() val currentTripId by settingsViewModel.currentTrip.collectAsState() - - LazyColumn( - modifier = Modifier - .padding(horizontal = 15.dp) - .fillMaxSize(), - verticalArrangement = Arrangement.Center - ) { - - items(trips.itemCount, trips.itemKey { it.id }) { i -> - Spacer(Modifier.height(10.dp)) - val trip = trips[i] - if (trip != null) { - TripCard(trip, currentTripId == trip.id, onClick = { - settingsViewModel.setCurrentTrip(trip.id) - navController.navigate(Screens.LIST_EXPENSE) - }) + Scaffold(floatingActionButtonPosition = FabPosition.EndOverlay, floatingActionButton = { + FloatingActionButton( + onClick = { showBottomSheet = true }) { + Icon(Icons.Filled.Add, stringResource(string.add_trip)) + } + }) { paddingValues -> + LazyColumn( + modifier = Modifier + .padding(horizontal = 15.dp) + .fillMaxSize(), + verticalArrangement = Arrangement.Center + ) { + items(trips.itemCount, trips.itemKey { it.id }) { i -> + Spacer(Modifier.height(10.dp)) + val trip = trips[i] + if (trip != null) { + SwipeToDeleteTripCard(trip, onDelete = { + tripViewModel.delete(trip) + }, onClick = { + settingsViewModel.setCurrentTrip(trip.id) + navController.navigate(Screens.LIST_EXPENSE) + }, isSelected = currentTripId == trip.id) + } + Spacer(Modifier.height(10.dp)) } - Spacer(Modifier.height(10.dp)) + } + + if (showBottomSheet) { + AddTripBottomSheet( + onDismiss = { + showBottomSheet = false + }, + onSave = { trip -> + tripViewModel.save(trip) + showBottomSheet = false + }, + null + ) } } - - } +@RequiresApi(Build.VERSION_CODES.O) @Composable -fun TripCard(trip: Trip, isSelected: Boolean, onClick: () -> Unit) { +fun SwipeToDeleteTripCard( + trip: Trip, onDelete: (Trip) -> Unit, onClick: (Trip) -> Unit, isSelected: Boolean +) { + var dismissed by remember { mutableStateOf(false) } + var showDialog by remember { mutableStateOf(false) } + + if (!dismissed) { + val dismissState = rememberSwipeToDismissBoxState( + confirmValueChange = { dismissValue -> + if (dismissValue == SwipeToDismissBoxValue.EndToStart) { + showDialog = true + false + } else { + false + } + }) + if (showDialog) { + DeleteConfirmationDialog(onConfirm = { + showDialog = false + dismissed = true + onDelete(trip) + }, onCancel = { showDialog = false }) + } + + SwipeToDismissBox( + modifier = Modifier.alpha(if (isSelected) 1.0f else 0.7f), + state = dismissState, + enableDismissFromStartToEnd = false, + backgroundContent = { + Box( + Modifier + .clip(CardDefaults.elevatedShape) + .fillMaxSize() + .background(MaterialTheme.colorScheme.onError) + .padding(horizontal = 20.dp), + contentAlignment = Alignment.CenterEnd + ) { + Icon(Icons.Default.Delete, contentDescription = stringResource(string.delete)) + } + }) { + TripCard(trip, isSelected, onClick = onClick) + } + } +} + + +@Composable +fun TripCard(trip: Trip, isSelected: Boolean, onClick: (Trip) -> Unit) { ElevatedCard( modifier = Modifier .height(100.dp) - .clickable(true, onClick = onClick) - .alpha(if (isSelected) 1.0f else 0.7f), + .clickable(true, onClick = { onClick(trip) }), elevation = CardDefaults.cardElevation(defaultElevation = if (isSelected) 7.dp else 0.dp) ) { Row( @@ -83,8 +171,7 @@ fun TripCard(trip: Trip, isSelected: Boolean, onClick: () -> Unit) { verticalAlignment = Alignment.CenterVertically ) { Column( - modifier = Modifier - .padding(16.dp) + modifier = Modifier.padding(16.dp) ) { Text(fontSize = 25.sp, fontWeight = FontWeight.SemiBold, text = trip.name) Text(trip.startDate) @@ -96,6 +183,5 @@ fun TripCard(trip: Trip, isSelected: Boolean, onClick: () -> Unit) { fontWeight = FontWeight.SemiBold ) } - } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt new file mode 100644 index 0000000..4963490 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt @@ -0,0 +1,16 @@ +package cc.n0th1ng.tripmoney.utils + +enum class Currencies { + PLN, + EUR, + USD; + + companion object { + fun default(): Currencies { + return PLN + } + fun names(): List { + return Currencies.entries.map { it.name } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt index 5f4f9d3..3686396 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt @@ -5,10 +5,12 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn +import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.data.repository.TripRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -16,4 +18,16 @@ class TripViewModel @Inject constructor(private val repository: TripRepository) fun getTrips(): Flow> = repository.getTrips().cachedIn(viewModelScope) + fun delete(trip: Trip) { + viewModelScope.launch { + repository.delete(trip) + } + } + + fun save(trip: Trip) { + viewModelScope.launch { + repository.save(trip) + } + } + } \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e1a5d91..2a0a4c3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -16,4 +16,6 @@ Zgodnie z systemem Motyw Ciemny motyw + Dodaj Wycieczkę + Nazwa \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf677c9..c5216a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,5 +16,6 @@ Light theme Pick a theme System settings - + Add Trip + Name \ No newline at end of file From 96cdd056a072a90507fe3371c9652e40e3b6922a Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Fri, 20 Mar 2026 14:32:47 +0100 Subject: [PATCH 04/18] init --- app/build.gradle.kts | 4 + .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 7 +- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 11 +- .../tripmoney/data/dao/ExchangeRateDao.kt | 22 ++ .../cc/n0th1ng/tripmoney/data/dao/TripDao.kt | 1 + .../tripmoney/data/entity/ExchangeRate.kt | 20 + .../data/repository/ExchangeRateRepository.kt | 54 +++ .../addexpense/AddExpenseBottomSheet.kt | 354 ++++++++++++++---- .../screens/listexpense/ListExpenseScreen.kt | 62 +-- .../screens/trippicker/AddTripBottomSheet.kt | 86 +++-- .../screens/trippicker/TripPickerScreen.kt | 39 +- .../tripmoney/service/ExchangeService.kt | 35 ++ .../java/cc/n0th1ng/tripmoney/theme/Theme.kt | 4 +- .../viewmodel/ExpenseAndCategoryViewModel.kt | 15 +- app/src/main/res/values-pl/strings.xml | 4 +- app/src/main/res/values/strings.xml | 2 + 16 files changed, 596 insertions(+), 124 deletions(-) create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExchangeRateDao.kt create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/data/entity/ExchangeRate.kt create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/service/ExchangeService.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 21deee2..4ec2c5c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -98,4 +98,8 @@ dependencies { implementation("com.google.dagger:hilt-android:2.57.1") ksp("com.google.dagger:hilt-android-compiler:2.57.1") implementation("androidx.hilt:hilt-navigation-compose:1.3.0") + + implementation("io.ktor:ktor-client-core:3.4.1") + implementation("io.ktor:ktor-client-okhttp:3.4.1") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.10.0") } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index e6e26fa..f5f1e71 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -11,9 +11,11 @@ import androidx.compose.material3.DrawerValue import androidx.compose.material3.Scaffold import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState @@ -28,6 +30,7 @@ import cc.n0th1ng.tripmoney.screens.settings.SettingsScreen import cc.n0th1ng.tripmoney.screens.statistics.StatisticsScreen import cc.n0th1ng.tripmoney.screens.trippicker.TripPickerScreen import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @@ -49,6 +52,8 @@ class MainActivity : ComponentActivity() { @RequiresApi(Build.VERSION_CODES.O) @Composable fun NavigationDrawer() { + val settingsViewModel: SettingsViewModel = hiltViewModel() + val currentTripId by settingsViewModel.currentTrip.collectAsState() val navController = rememberNavController() val navBackStack by navController.currentBackStackEntryAsState() val current = navBackStack?.destination?.route @@ -74,7 +79,7 @@ fun NavigationDrawer() { bottomBar = { BottomNavigation(navController) }) { innerPadding -> NavHost( navController = navController, - startDestination = Screens.TRIP_PICKER, + startDestination = if(currentTripId == -1) Screens.TRIP_PICKER else Screens.LIST_EXPENSE, modifier = Modifier.padding(innerPadding) ) { composable(Screens.LIST_EXPENSE) { diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index 6c2bcec..a1d072a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -8,9 +8,11 @@ import androidx.room.Room import androidx.room.RoomDatabase import androidx.sqlite.db.SupportSQLiteDatabase import cc.n0th1ng.tripmoney.data.dao.CategoryDao +import cc.n0th1ng.tripmoney.data.dao.ExchangeRateDao import cc.n0th1ng.tripmoney.data.dao.ExpenseDao import cc.n0th1ng.tripmoney.data.dao.TripDao import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.data.entity.ExchangeRate import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.utils.Icons @@ -26,11 +28,12 @@ import java.time.LocalDateTime import javax.inject.Inject import javax.inject.Singleton -@Database(entities = [Trip::class, Expense::class, Category::class], version = 1) +@Database(entities = [Trip::class, Expense::class, Category::class, ExchangeRate::class], version = 1) abstract class TripDatabase : RoomDatabase() { abstract fun tripDao(): TripDao abstract fun expenseDao(): ExpenseDao abstract fun categoryDao(): CategoryDao + abstract fun exchangeRateDao(): ExchangeRateDao } @@ -74,6 +77,12 @@ object DatabaseModule { fun provideCategoryDao(database: TripDatabase): CategoryDao { return database.categoryDao() } + + @Provides + @Singleton + fun provideExchangeRateDao(database: TripDatabase): ExchangeRateDao { + return database.exchangeRateDao() + } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExchangeRateDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExchangeRateDao.kt new file mode 100644 index 0000000..45095a0 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExchangeRateDao.kt @@ -0,0 +1,22 @@ +package cc.n0th1ng.tripmoney.data.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Transaction +import androidx.room.Upsert +import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.data.entity.ExchangeRate +import kotlinx.coroutines.flow.Flow + +@Dao +interface ExchangeRateDao { + @Upsert + suspend fun insert(exchangeRate: ExchangeRate) + + @Query("SELECT * FROM exchange_rate WHERE id = :id") + suspend fun getById(id: String): ExchangeRate? + + @Query("DELETE FROM exchange_rate WHERE DATE(date) < :cutoffDate") + suspend fun deleteOldRates(cutoffDate: String) +} diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt index 89098e6..2edaad8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt @@ -16,6 +16,7 @@ interface TripDao { @Query( """ SELECT * FROM trip + ORDER BY DATE(trip.start_date) DESC """ ) fun tripsPaged(): PagingSource diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/ExchangeRate.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/ExchangeRate.kt new file mode 100644 index 0000000..b2398fa --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/ExchangeRate.kt @@ -0,0 +1,20 @@ +package cc.n0th1ng.tripmoney.data.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("exchange_rate") +data class ExchangeRate( + @PrimaryKey + val id: String, + val base: String, + val target: String, + val rate: Double, + val date: String +) { + companion object { + fun buildKey(base: String, target: String, date: String): String { + return "${base}_${target}_${date}" + } + } +} diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt new file mode 100644 index 0000000..7966010 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt @@ -0,0 +1,54 @@ +package cc.n0th1ng.tripmoney.data.repository + +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.annotation.WorkerThread +import cc.n0th1ng.tripmoney.data.dao.CategoryDao +import cc.n0th1ng.tripmoney.data.dao.ExchangeRateDao +import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.data.entity.ExchangeRate +import cc.n0th1ng.tripmoney.service.ExchangeService +import cc.n0th1ng.tripmoney.utils.Currencies +import kotlinx.coroutines.flow.Flow +import java.time.LocalDate +import javax.inject.Inject + +class ExchangeRateRepository @Inject constructor( + private val exchangeRateDao: ExchangeRateDao, + private val exchangeService: ExchangeService +) { + + @WorkerThread + suspend fun save(exchangeRate: ExchangeRate) { + exchangeRateDao.insert(exchangeRate) + } + + @RequiresApi(Build.VERSION_CODES.O) + suspend fun getRate(base: Currencies, target: Currencies, date: LocalDate): Double { + val id = ExchangeRate.buildKey(base.name, target.name, date.toString()) + val cachedRate = exchangeRateDao.getById(id) + return if (cachedRate != null) { + cachedRate.rate + } else { + val rate = exchangeService.getRate(base, target, date) + exchangeRateDao.insert( + ExchangeRate( + id = id, + base = base.name, + target = target.name, + rate = rate, + date = date.toString() + ) + ) + clearOldRates() + rate + } + } + + + @RequiresApi(Build.VERSION_CODES.O) + private suspend fun clearOldRates(daysToKeep: Int = 180) { + val cutoffDate = LocalDate.now().minusDays(daysToKeep.toLong()).toString() + exchangeRateDao.deleteOldRates(cutoffDate) + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index 9efca80..42f333a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -1,8 +1,13 @@ package cc.n0th1ng.tripmoney.screens.addexpense +import android.annotation.SuppressLint import android.os.Build import androidx.annotation.RequiresApi +import androidx.compose.foundation.clickable +import androidx.compose.foundation.focusable +import androidx.compose.foundation.interaction.MutableInteractionSource 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 @@ -10,16 +15,21 @@ import androidx.compose.foundation.layout.aspectRatio 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.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Check import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.SheetState import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -29,11 +39,17 @@ 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.layout.ModifierLocalBeyondBoundsLayout +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType +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 @@ -50,26 +66,38 @@ import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.time.LocalDateTime import java.time.format.DateTimeFormatter + @OptIn(ExperimentalMaterial3Api::class) @RequiresApi(Build.VERSION_CODES.O) @Composable fun AddExpenseBottomSheet( onSave: (Expense) -> Unit, onDismiss: () -> Unit, - categories: List, - expenseDtoToEdit: ExpenseDto? + expenseDtoToEdit: ExpenseDto?, + state: SheetState, +// categories: List = emptyList() ) { + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() +// val currentTripId = 1 + val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) + if (categories.isEmpty()) { + return + } var amount by remember { mutableStateOf( expenseDtoToEdit?.expense?.amount?.toString() ?: "0.00" ) } + val dummyFocusRequester = remember { FocusRequester() } var showCurrencyDialog by remember { mutableStateOf(false) } var showCategoryDialog by remember { mutableStateOf(false) } var showDateTimePicker by remember { mutableStateOf(false) } @@ -88,21 +116,33 @@ fun AddExpenseBottomSheet( } var note by remember { mutableStateOf(expenseDtoToEdit?.expense?.note ?: "") } var enableSave by remember { mutableStateOf(expenseDtoToEdit != null) } - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + ModalBottomSheet( onDismissRequest = onDismiss, - sheetState = sheetState, + sheetState = state, ) { Column( modifier = Modifier .fillMaxWidth() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally + .padding(0.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) ) { + Text( + modifier = Modifier + .fillMaxWidth() + .padding(start = 15.dp), + text = stringResource(if (expenseDtoToEdit == null) R.string.add_expense else R.string.edit_expense), + fontWeight = FontWeight.Bold, + fontSize = 35.sp, + textAlign = TextAlign.Start + ) + HorizontalDivider(modifier = Modifier.fillMaxWidth()) Row( + modifier = Modifier.fillMaxWidth(0.9f), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(9.dp) + horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = amount.ifEmpty { "0.00" }, @@ -111,41 +151,44 @@ fun AddExpenseBottomSheet( ) CurrencyButton(onClick = { showCurrencyDialog = true }, text = currency) } - Spacer(Modifier.height(14.dp)) - OutlinedButton(onClick = { showDateTimePicker = true }) { - Text( - text = datetime.format(DateTimeFormatter.ofPattern("dd.MM HH:mm")), - fontSize = 17.sp - ) - } - Spacer(Modifier.height(14.dp)) - CategoryButton(onClick = { showCategoryDialog = true }, category = category) - Spacer(Modifier.height(14.dp)) Row( - modifier = Modifier.height(50.dp), + modifier = Modifier.fillMaxWidth(0.9f), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(10.dp) ) { - NoteInput(note = note) { newNote -> note = newNote } - SaveButton( - enabled = enableSave, - onClick = { - val expenseToSave = Expense( - amount = amount.toDouble(), - currency = currency, - note = note, - datetime = datetime.toString(), - categoryId = category.id, - tripId = currentTripId - ) - onSave( - if (expenseDtoToEdit == null) expenseToSave - else expenseToSave.copy(id = expenseDtoToEdit.expense.id) - ) - } + OutlinedButton( + onClick = { showDateTimePicker = true }, + modifier = Modifier.weight(1f) + ) { + Text( + text = datetime.format(DateTimeFormatter.ofPattern("dd.MM HH:mm")), + fontSize = 17.sp + ) + } + CategoryButton( + onClick = { showCategoryDialog = true }, + category = category, + modifier = Modifier.weight(1f) + ) + + } + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + NoteInput( + note = note, + onTextChange = { newNote -> note = newNote }, + modifier = Modifier.fillMaxWidth(0.9f), + focusRequester = dummyFocusRequester ) } - Spacer(Modifier.height(14.dp)) + + Box( + modifier = Modifier + .size(0.dp) + .focusRequester(dummyFocusRequester) + .focusable() + ) NumberKeyboard( onNumberClick = { number -> val newText = (if (amount == "0.00") "" else amount) + number @@ -155,13 +198,28 @@ fun AddExpenseBottomSheet( } else if (amount == "0.00") { enableSave = false } - + dummyFocusRequester.requestFocus() }, onBackspaceClick = { if (amount == "0.00") return@NumberKeyboard amount = amount.safeSubstring(0, amount.length - 1) enableSave = amount.isDoubleTwoDigitsAboveZero() - }) + }, + onSave = { + val expenseToSave = Expense( + amount = amount.toDouble(), + currency = currency, + note = note, + datetime = datetime.toString(), + categoryId = category.id, + tripId = currentTripId + ) + onSave( + if (expenseDtoToEdit == null) expenseToSave + else expenseToSave.copy(id = expenseDtoToEdit.expense.id) + ) + }, enableSave = enableSave + ) } } @@ -210,29 +268,39 @@ fun String.isDoubleTwoDigitsAboveZero(): Boolean { } @Composable -fun NoteInput(note: String, onTextChange: (String) -> Unit) { +fun NoteInput(note: String, onTextChange: (String) -> Unit, modifier: Modifier = Modifier, focusRequester: FocusRequester) { var text by remember { mutableStateOf(note) } OutlinedTextField( + modifier = modifier, label = { Text(stringResource(R.string.note)) }, value = note, onValueChange = { newText -> text = newText onTextChange(text) - }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) + }, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Text, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + focusRequester.requestFocus() + } + ) ) } @Composable -fun CurrencyButton(onClick: () -> Unit, text: String) { - OutlinedButton(onClick = onClick) { +fun CurrencyButton(modifier: Modifier = Modifier, onClick: () -> Unit, text: String) { + OutlinedButton(onClick = onClick, modifier = modifier) { Text(text) } } @Composable -fun CategoryButton(onClick: () -> Unit, category: Category) { +fun CategoryButton(onClick: () -> Unit, category: Category, modifier: Modifier = Modifier) { OutlinedButton( onClick = onClick, - modifier = Modifier.fillMaxWidth(0.5f) + modifier = modifier ) { Icon( modifier = Modifier.padding(end = 10.dp), @@ -258,20 +326,13 @@ fun SaveButton(enabled: Boolean, onClick: () -> Unit) { } } -@Preview -@Composable -fun Preview() { - TripMoneyTheme(darkTheme = true) { - NumberKeyboard(onNumberClick = {}, onBackspaceClick = {}) - } -} - - @Composable fun NumberKeyboard( modifier: Modifier = Modifier, onNumberClick: (String) -> Unit, - onBackspaceClick: () -> Unit + onBackspaceClick: () -> Unit, + onSave: () -> Unit, + enableSave: Boolean ) { val buttonModifier = Modifier .padding(4.dp) @@ -285,91 +346,109 @@ fun NumberKeyboard( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - OutlinedButton( + TextButton( onClick = { onNumberClick("1") }, modifier = buttonModifier.weight(1f) ) { Text("1", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = { onNumberClick("2") }, modifier = buttonModifier.weight(1f) ) { Text("2", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = { onNumberClick("3") }, modifier = buttonModifier.weight(1f) ) { Text("3", fontSize = 20.sp) } + TextButton( + onClick = { onNumberClick("") }, + modifier = buttonModifier.weight(1f) + ) { + Text("+", fontSize = 20.sp) + } } Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - OutlinedButton( + TextButton( onClick = { onNumberClick("4") }, modifier = buttonModifier.weight(1f) ) { Text("4", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = { onNumberClick("5") }, modifier = buttonModifier.weight(1f) ) { Text("5", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = { onNumberClick("6") }, modifier = buttonModifier.weight(1f) ) { Text("6", fontSize = 20.sp) } + TextButton( + onClick = { onNumberClick("") }, + modifier = buttonModifier.weight(1f) + ) { + Text("-", fontSize = 20.sp) + } } Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - OutlinedButton( + TextButton( onClick = { onNumberClick("7") }, modifier = buttonModifier.weight(1f) ) { Text("7", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = { onNumberClick("8") }, modifier = buttonModifier.weight(1f) ) { Text("8", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = { onNumberClick("9") }, modifier = buttonModifier.weight(1f) ) { Text("9", fontSize = 20.sp) } + TextButton( + onClick = { onNumberClick("") }, + modifier = buttonModifier.weight(1f) + ) { + Text("*", fontSize = 20.sp) + } } Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - OutlinedButton( + TextButton( onClick = { onNumberClick(".") }, modifier = buttonModifier.weight(1f) ) { Text(".", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = { onNumberClick("0") }, modifier = buttonModifier.weight(1f) ) { Text("0", fontSize = 20.sp) } - OutlinedButton( + TextButton( onClick = onBackspaceClick, modifier = buttonModifier.weight(1f) ) { @@ -378,6 +457,147 @@ fun NumberKeyboard( contentDescription = stringResource(R.string.backspace) ) } + TextButton( + onClick = onSave, + modifier = buttonModifier.weight(1f), + enabled = enableSave + ) { + Icon( + imageVector = Icons.Default.Check, + contentDescription = stringResource(R.string.backspace) + ) + } } } -} \ No newline at end of file +} + + +//@SuppressLint("CoroutineCreationDuringComposition") +//@RequiresApi(Build.VERSION_CODES.O) +//@OptIn(ExperimentalMaterial3Api::class) +//@Preview +//@Composable +//fun PreviewLight() { +// val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) +// CoroutineScope(Dispatchers.IO).launch { +// sheetState.show() +// } +// +// TripMoneyTheme { +// AddExpenseBottomSheet( +// {}, {}, null, sheetState, +// categories = listOf( +// Category( +// name = "Hotel", +// icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, +// color = "#B3E5FC" +// ), +// Category( +// name = "Jedzenie", +// icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, +// color = "#C8E6C9" +// ), +// Category( +// name = "Transport", +// icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, +// color = "#FFCDD2" +// ), +// Category( +// name = "Rozrywka", +// icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, +// color = "#FFF9C4" +// ), +// Category( +// name = "Zakupy", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#E1BEE7" +// ), +// Category( +// name = "Zakupy1", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#D7CCC8" +// ), +// Category( +// name = "Zakupy2", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#BBDEFB" +// ), +// Category( +// name = "Zakupy3", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#D1C4E9" +// ), +// Category( +// name = "Zakupy4", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#DCEDC8" +// ), +// ) +// ) +// } +//} +// +//@SuppressLint("CoroutineCreationDuringComposition") +//@RequiresApi(Build.VERSION_CODES.O) +//@OptIn(ExperimentalMaterial3Api::class) +//@Preview +//@Composable +//fun PreviewDark() { +// val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) +// CoroutineScope(Dispatchers.IO).launch { +// sheetState.show() +// } +// +// TripMoneyTheme(darkTheme = true) { +// AddExpenseBottomSheet( +// {}, {}, null, sheetState, +// categories = listOf( +// Category( +// name = "Hotel", +// icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, +// color = "#B3E5FC" +// ), +// Category( +// name = "Jedzenie", +// icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, +// color = "#C8E6C9" +// ), +// Category( +// name = "Transport", +// icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, +// color = "#FFCDD2" +// ), +// Category( +// name = "Rozrywka", +// icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, +// color = "#FFF9C4" +// ), +// Category( +// name = "Zakupy", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#E1BEE7" +// ), +// Category( +// name = "Zakupy1", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#D7CCC8" +// ), +// Category( +// name = "Zakupy2", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#BBDEFB" +// ), +// Category( +// name = "Zakupy3", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#D1C4E9" +// ), +// Category( +// name = "Zakupy4", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = "#DCEDC8" +// ), +// ) +// ) +// } +//} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index 3f3f864..7a5da42 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -5,6 +5,7 @@ import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -33,6 +34,7 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SwipeToDismissBox import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberSwipeToDismissBoxState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -56,10 +58,14 @@ import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.screens.addexpense.AddExpenseBottomSheet +import cc.n0th1ng.tripmoney.service.ExchangeService +import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import java.time.LocalDate import java.time.LocalDateTime import java.time.format.DateTimeFormatter +import javax.inject.Inject @OptIn(ExperimentalMaterial3Api::class) @@ -71,8 +77,6 @@ fun ListExpenseScreen() { val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTrip by settingsViewModel.currentTrip.collectAsState() - val categories by expenseAndCategoryViewModel.getCategories() - .collectAsState(initial = emptyList()) val expenses = expenseAndCategoryViewModel.getExpenses(currentTrip).collectAsLazyPagingItems() val listState = rememberLazyListState() var showBottomSheet by remember { mutableStateOf(false) } @@ -98,27 +102,13 @@ fun ListExpenseScreen() { val expenseDto = expenses[index] if (expenseDto != null) { val previousExpense = expenses.itemSnapshotList.items.getOrNull(index - 1) - val showDayDivider = index == 0 || LocalDateTime.parse(previousExpense?.expense?.datetime) .toLocalDate() != LocalDateTime.parse(expenseDto.expense.datetime) .toLocalDate() Spacer(Modifier.height(5.dp)) if (showDayDivider) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Absolute.Center, - verticalAlignment = Alignment.CenterVertically - ) { - HorizontalDivider(modifier = Modifier.weight(1f)) - Text( - LocalDateTime.parse(expenseDto.expense.datetime).format( - DateTimeFormatter.ofPattern("dd EEEE") - ).toString(), - modifier = Modifier.background(Color.White.copy(alpha = 0f)) - ) - HorizontalDivider(modifier = Modifier.weight(1f)) - } + CustomDivider(expenseDto) } Spacer(Modifier.height(5.dp)) SwipeToDeleteExpenseCard( @@ -143,13 +133,32 @@ fun ListExpenseScreen() { expenseDtoToEdit = null showBottomSheet = false }, - categories = categories, - expenseDtoToEdit = expenseDtoToEdit + expenseDtoToEdit = expenseDtoToEdit, + state = rememberModalBottomSheetState(skipPartiallyExpanded = true) ) } } } +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun CustomDivider(expenseDto: ExpenseDto) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Absolute.Center, + verticalAlignment = Alignment.CenterVertically + ) { + HorizontalDivider(modifier = Modifier.weight(1f)) + Text( + LocalDateTime.parse(expenseDto.expense.datetime).format( + DateTimeFormatter.ofPattern("dd EEEE") + ).toString(), + modifier = Modifier.background(Color.White.copy(alpha = 0f)) + ) + HorizontalDivider(modifier = Modifier.weight(1f)) + } +} + @RequiresApi(Build.VERSION_CODES.O) @Composable fun SwipeToDeleteExpenseCard( @@ -257,7 +266,10 @@ fun ExpenseCard(expenseDto: ExpenseDto, onClick: (ExpenseDto) -> Unit) { modifier = Modifier .fillMaxWidth(0.9f) .height(70.dp) - .clickable { onClick(expenseDto) }, + .combinedClickable( + enabled = true, + onClick = { onClick(expenseDto) }, + onLongClick = { onClick(expenseDto) }), elevation = CardDefaults.cardElevation(defaultElevation = 7.dp) ) { Row( @@ -312,8 +324,16 @@ fun ExpenseCard(expenseDto: ExpenseDto, onClick: (ExpenseDto) -> Unit) { fontWeight = FontWeight.Bold ) if (expenseDto.expense.currency.lowercase() != expenseDto.trip.currency.lowercase()) { + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() + val amount by + expenseAndCategoryViewModel.convertAmount( + amount = expenseDto.expense.amount, + base = Currencies.valueOf(expenseDto.expense.currency), + target = Currencies.valueOf(expenseDto.trip.currency), + date = LocalDateTime.parse(expenseDto.expense.datetime).toLocalDate() + ).collectAsState(initial = 0.0) Text( - text = "≈ %.2f ${expenseDto.trip.currency}".format(expenseDto.expense.amount), + text = "≈ %.2f ${expenseDto.trip.currency}".format(amount), fontSize = 12.sp ) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt index d0103f1..9ccef0f 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt @@ -2,20 +2,27 @@ package cc.n0th1ng.tripmoney.screens.trippicker import android.os.Build import androidx.annotation.RequiresApi +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.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Shapes +import androidx.compose.material3.SheetState import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -23,31 +30,32 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import cc.n0th1ng.tripmoney.R -import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.addexpense.CurrencyButton -import cc.n0th1ng.tripmoney.screens.addexpense.isDoubleTwoDigitsAboveZero import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.DatePicker -import cc.n0th1ng.tripmoney.screens.listexpense.DateTimePicker import cc.n0th1ng.tripmoney.utils.Currencies -import java.time.Instant import java.time.LocalDate -import java.time.LocalDateTime -import java.time.ZoneId import java.time.format.DateTimeFormatter @RequiresApi(Build.VERSION_CODES.O) @OptIn(ExperimentalMaterial3Api::class) @Composable -fun AddTripBottomSheet(onDismiss: () -> Unit, onSave: (Trip) -> Unit, tripToEdit: Trip?) { +fun AddTripBottomSheet( + onDismiss: () -> Unit, + onSave: (Trip) -> Unit, + tripToEdit: Trip?, + sheetState: SheetState +) { - val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) var name by remember { mutableStateOf(tripToEdit?.name ?: "") } var startDate by remember { mutableStateOf( @@ -65,31 +73,61 @@ fun AddTripBottomSheet(onDismiss: () -> Unit, onSave: (Trip) -> Unit, tripToEdit ) { Column( modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - horizontalAlignment = Alignment.Start + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) ) { + Text( + modifier = Modifier + .fillMaxWidth() + .padding(start = 15.dp), + text = stringResource(if(tripToEdit == null) R.string.add_trip else R.string.edit_trip), + fontWeight = FontWeight.Bold, + fontSize = 35.sp, + textAlign = TextAlign.Start + ) + HorizontalDivider(modifier = Modifier.fillMaxWidth()) NameInput(name = name, onTextChange = { newText -> name = newText enableSave = !name.isEmpty() }) - CurrencyButton(onClick = {showCurrencyDialog = true}, currency) - OutlinedButton(onClick = { showDatePicker = true }) { - Text( - text = startDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")), - fontSize = 17.sp + Row( + modifier = Modifier.fillMaxWidth(0.9f), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + CurrencyButton( + modifier = Modifier + .weight(1f) + .fillMaxWidth(1f), + onClick = { showCurrencyDialog = true }, text = currency ) + OutlinedButton( + modifier = Modifier + .fillMaxWidth(1f) + .weight(1f), + onClick = { showDatePicker = true }) { + Text( + text = startDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")), + fontSize = 17.sp + ) + } + } - OutlinedButton( + + Button( + modifier = Modifier.fillMaxWidth(0.9f), enabled = enableSave, onClick = { - onSave(Trip(name = name, startDate = startDate.toString(), currency = currency)) - }) { + val trip = Trip(name = name, startDate = startDate.toString(), currency = currency) + + onSave(if(tripToEdit == null) trip else trip.copy(id = tripToEdit.id)) + }) { Icon( imageVector = Icons.Filled.Check, contentDescription = stringResource(R.string.save) ) } + Spacer(Modifier.height(5.dp)) } } @@ -105,7 +143,7 @@ fun AddTripBottomSheet(onDismiss: () -> Unit, onSave: (Trip) -> Unit, tripToEdit } if (showDatePicker) { - DatePicker(startDate, onDismiss = {showDatePicker = false}, onConfirm = { newDate -> + DatePicker(startDate, onDismiss = { showDatePicker = false }, onConfirm = { newDate -> startDate = newDate showDatePicker = false }) @@ -116,10 +154,10 @@ fun AddTripBottomSheet(onDismiss: () -> Unit, onSave: (Trip) -> Unit, tripToEdit fun NameInput(name: String, onTextChange: (String) -> Unit) { var text by remember { mutableStateOf(name) } OutlinedTextField( + modifier = Modifier.fillMaxWidth(0.9f), label = { Text(stringResource(R.string.name)) }, value = name, onValueChange = { newText -> text = newText onTextChange(text) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) ) -} - +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt index 4f3450e..27f207e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt @@ -5,6 +5,7 @@ import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -19,6 +20,7 @@ import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.CardDefaults import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExtendedFloatingActionButton import androidx.compose.material3.FabPosition import androidx.compose.material3.FloatingActionButton @@ -28,6 +30,7 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SwipeToDismissBox import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberSwipeToDismissBoxState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -39,6 +42,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -56,6 +61,7 @@ import cc.n0th1ng.tripmoney.screens.listexpense.DeleteConfirmationDialog import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel +@OptIn(ExperimentalMaterial3Api::class) @RequiresApi(Build.VERSION_CODES.O) @Composable @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @@ -67,6 +73,7 @@ fun TripPickerScreen( var showBottomSheet by remember { mutableStateOf(false) } val trips: LazyPagingItems = tripViewModel.getTrips().collectAsLazyPagingItems() val currentTripId by settingsViewModel.currentTrip.collectAsState() + var tripToEdit by remember { mutableStateOf(null) } Scaffold(floatingActionButtonPosition = FabPosition.EndOverlay, floatingActionButton = { FloatingActionButton( onClick = { showBottomSheet = true }) { @@ -83,12 +90,17 @@ fun TripPickerScreen( Spacer(Modifier.height(10.dp)) val trip = trips[i] if (trip != null) { - SwipeToDeleteTripCard(trip, onDelete = { + SwipeToDeleteTripCard( + trip, onDelete = { tripViewModel.delete(trip) }, onClick = { settingsViewModel.setCurrentTrip(trip.id) navController.navigate(Screens.LIST_EXPENSE) - }, isSelected = currentTripId == trip.id) + }, isSelected = currentTripId == trip.id, + onLongClick = { trip -> + tripToEdit = trip + showBottomSheet = true + }) } Spacer(Modifier.height(10.dp)) } @@ -98,12 +110,15 @@ fun TripPickerScreen( AddTripBottomSheet( onDismiss = { showBottomSheet = false + tripToEdit = null }, onSave = { trip -> tripViewModel.save(trip) showBottomSheet = false + tripToEdit = null }, - null + tripToEdit = tripToEdit, + sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) ) } } @@ -112,7 +127,8 @@ fun TripPickerScreen( @RequiresApi(Build.VERSION_CODES.O) @Composable fun SwipeToDeleteTripCard( - trip: Trip, onDelete: (Trip) -> Unit, onClick: (Trip) -> Unit, isSelected: Boolean + trip: Trip, onDelete: (Trip) -> Unit, onClick: (Trip) -> Unit, isSelected: Boolean, + onLongClick: (Trip) -> Unit ) { var dismissed by remember { mutableStateOf(false) } var showDialog by remember { mutableStateOf(false) } @@ -151,18 +167,27 @@ fun SwipeToDeleteTripCard( Icon(Icons.Default.Delete, contentDescription = stringResource(string.delete)) } }) { - TripCard(trip, isSelected, onClick = onClick) + TripCard(trip, isSelected, onClick = onClick, onLongClick = onLongClick) } } } @Composable -fun TripCard(trip: Trip, isSelected: Boolean, onClick: (Trip) -> Unit) { +fun TripCard( + trip: Trip, + isSelected: Boolean, + onClick: (Trip) -> Unit, + onLongClick: (Trip) -> Unit +) { + val haptics = LocalHapticFeedback.current ElevatedCard( modifier = Modifier .height(100.dp) - .clickable(true, onClick = { onClick(trip) }), + .combinedClickable(enabled = true, onLongClick = { + haptics.performHapticFeedback(HapticFeedbackType.LongPress) + onLongClick(trip) + }, onClick = { onClick(trip) }), elevation = CardDefaults.cardElevation(defaultElevation = if (isSelected) 7.dp else 0.dp) ) { Row( diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/service/ExchangeService.kt b/app/src/main/java/cc/n0th1ng/tripmoney/service/ExchangeService.kt new file mode 100644 index 0000000..88d1f9d --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/service/ExchangeService.kt @@ -0,0 +1,35 @@ +package cc.n0th1ng.tripmoney.service + +import cc.n0th1ng.tripmoney.utils.Currencies +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsText +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.double +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import org.json.JSONObject +import java.time.LocalDate +import javax.inject.Inject + +class ExchangeService @Inject() constructor() { + private val API_URL: String = "https://api.frankfurter.dev" + private val client = HttpClient() + + suspend fun getRate(base: Currencies, target: Currencies, date: LocalDate): Double { + return try { + val response = client.get("$API_URL/v1/$date") { + url { + parameters.append("base", base.name) + parameters.append("symbols", target.name) + } + } + val json = Json + json.parseToJsonElement(response.bodyAsText()).jsonObject["rates"]?.jsonObject[target.name]?.jsonPrimitive?.double + ?: throw Exception("can not find rates") + } catch (e: Exception) { + throw IllegalStateException("Error fetching exchange rate: ${e.message}") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt b/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt index 2a232d6..35317bd 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt @@ -2,13 +2,16 @@ package cc.n0th1ng.tripmoney.theme import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Shapes import androidx.compose.material3.darkColorScheme import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp private val DarkColorScheme = darkColorScheme( primary = Purple80, @@ -44,7 +47,6 @@ fun TripMoneyTheme( val context = LocalContext.current if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) } - darkTheme -> DarkColorScheme else -> LightColorScheme } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index dd0f0e8..de1ea28 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -9,16 +9,23 @@ import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.data.repository.CategoryRepository +import cc.n0th1ng.tripmoney.data.repository.ExchangeRateRepository import cc.n0th1ng.tripmoney.data.repository.ExpenseRepository +import cc.n0th1ng.tripmoney.service.ExchangeService +import cc.n0th1ng.tripmoney.utils.Currencies import dagger.hilt.android.lifecycle.HiltViewModel +import io.ktor.client.request.get import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch +import java.time.LocalDate import javax.inject.Inject @HiltViewModel class ExpenseAndCategoryViewModel @Inject constructor( private val expenseRepo: ExpenseRepository, - private val categoryRepo: CategoryRepository + private val categoryRepo: CategoryRepository, + private val exchangeRateRepository: ExchangeRateRepository ) : ViewModel() { fun getExpenses(tripId: Int): Flow> = @@ -43,4 +50,10 @@ class ExpenseAndCategoryViewModel @Inject constructor( categoryRepo.save(category) } } + + fun convertAmount(amount: Double, base: Currencies, target: Currencies, date: LocalDate): Flow { + return flow { + emit(amount * exchangeRateRepository.getRate(base, target, date)) + } + } } \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2a0a4c3..130d879 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -16,6 +16,8 @@ Zgodnie z systemem Motyw Ciemny motyw - Dodaj Wycieczkę + Dodaj wycieczkę Nazwa + Edytuj wycieczkę + Edytuj wydatek \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c5216a9..82d1395 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,4 +18,6 @@ System settings Add Trip Name + Edit trip + Edit expense \ No newline at end of file From 916481e4e3a2ed7e6bbda01350b5d7f105f543ff Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Mon, 23 Mar 2026 20:14:13 +0100 Subject: [PATCH 05/18] init --- .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 10 +- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 20 +- .../n0th1ng/tripmoney/data/dao/ExpenseDao.kt | 37 ++- .../cc/n0th1ng/tripmoney/data/dao/TripDao.kt | 5 + .../tripmoney/data/dto/SummaryPerCategory.kt | 22 ++ .../data/repository/ExchangeRateRepository.kt | 3 +- .../data/repository/ExpenseRepository.kt | 13 +- .../data/repository/PreferencesRepository.kt | 15 + .../data/repository/TripRepository.kt | 4 + .../cc/n0th1ng/tripmoney/navigation/TopBar.kt | 4 +- .../tripmoney/screens/AddCetegoryDialog.kt | 23 +- .../addexpense/AddExpenseBottomSheet.kt | 9 +- .../screens/listexpense/DateTimePicker.kt | 4 +- .../screens/listexpense/ListExpenseScreen.kt | 264 +++++++++++++++--- .../screens/settings/SettingsScreen.kt | 32 ++- .../screens/statistics/StatisticsScreen.kt | 145 +++++++++- .../screens/trippicker/AddTripBottomSheet.kt | 8 +- .../screens/trippicker/TripPickerScreen.kt | 7 + .../java/cc/n0th1ng/tripmoney/theme/Color.kt | 220 ++++++++++++++- .../java/cc/n0th1ng/tripmoney/theme/Theme.kt | 96 +++++-- .../cc/n0th1ng/tripmoney/utils/AllPreviews.kt | 9 + .../java/cc/n0th1ng/tripmoney/utils/Colors.kt | 50 ++-- .../viewmodel/ExpenseAndCategoryViewModel.kt | 98 ++++++- .../tripmoney/viewmodel/SettingsViewModel.kt | 12 + .../tripmoney/viewmodel/TripViewModel.kt | 2 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 27 files changed, 960 insertions(+), 154 deletions(-) create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/data/dto/SummaryPerCategory.kt create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index f5f1e71..6ae412f 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -30,7 +30,9 @@ import cc.n0th1ng.tripmoney.screens.settings.SettingsScreen import cc.n0th1ng.tripmoney.screens.statistics.StatisticsScreen import cc.n0th1ng.tripmoney.screens.trippicker.TripPickerScreen import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @@ -43,6 +45,8 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { TripMoneyTheme { + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() + expenseAndCategoryViewModel.clearOldRates() NavigationDrawer() } } @@ -53,7 +57,9 @@ class MainActivity : ComponentActivity() { @Composable fun NavigationDrawer() { val settingsViewModel: SettingsViewModel = hiltViewModel() + val tripViewModel: TripViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() + val currentTrip = tripViewModel.getTrip(currentTripId) val navController = rememberNavController() val navBackStack by navController.currentBackStackEntryAsState() val current = navBackStack?.destination?.route @@ -65,7 +71,9 @@ fun NavigationDrawer() { topBar = { if (current == Screens.SETTINGS) TopBarSettings( navController - ) else TopBar(onClick = { + ) else TopBar( + title = currentTrip?.name ?: "", + onClick = { scope.launch { if (drawerState.isClosed) { drawerState.open() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index a1d072a..ccc5de4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -16,6 +16,7 @@ import cc.n0th1ng.tripmoney.data.entity.ExchangeRate import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.utils.Icons +import cc.n0th1ng.tripmoney.utils.colors import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -96,19 +97,12 @@ private class DatabasePrepopulator( tripDao.insert(Trip(name = "Włochy", startDate = "2025-01-01", currency = "PLN")) tripDao.insert(Trip(name = "Szwajcaria", startDate = "2025-03-01", currency = "EUR")) tripDao.insert(Trip(name = "Portugalia", startDate = "2026-03-01", currency = "USD")) - categoryDao.insert(Category(name = "Hotel", icon = Icons.HOTEL, color = "#B3E5FC")) - categoryDao.insert(Category(name = "Jedzenie", icon = Icons.RESTAURANT, color = "#C8E6C9")) - categoryDao.insert(Category(name = "Transport", icon = Icons.FLIGHT, color = "#FFCDD2")) - categoryDao.insert(Category(name = "Rozrywka", icon = Icons.ATTRACTION, color = "#FFF9C4")) - categoryDao.insert(Category(name = "Zakupy", icon = Icons.GROCERIES, color = "#E1BEE7")) - categoryDao.insert(Category(name = "Zakupy1", icon = Icons.GROCERIES, color = "#D7CCC8")) - categoryDao.insert(Category(name = "Zakupy2", icon = Icons.GROCERIES, color = "#BBDEFB")) - categoryDao.insert(Category(name = "Zakupy3", icon = Icons.GROCERIES, color = "#D1C4E9")) - categoryDao.insert(Category(name = "Zakupy4", icon = Icons.GROCERIES, color = "#DCEDC8")) - categoryDao.insert(Category(name = "Zakupy5", icon = Icons.GROCERIES, color = "#F0F4C3")) - categoryDao.insert(Category(name = "Zakupy6", icon = Icons.GROCERIES, color = "#FFE0B2")) - categoryDao.insert(Category(name = "Zakupy7", icon = Icons.GROCERIES, color = "#D7CCC8")) - categoryDao.insert(Category(name = "Zakupy8", icon = Icons.GROCERIES, color = "#CFD8DC")) + categoryDao.insert(Category(name = "Hotel", icon = Icons.HOTEL, color = colors.random())) + categoryDao.insert(Category(name = "Jedzenie", icon = Icons.RESTAURANT, color = colors.random())) + categoryDao.insert(Category(name = "Transport", icon = Icons.FLIGHT, color = colors.random())) + categoryDao.insert(Category(name = "Rozrywka", icon = Icons.ATTRACTION, color = colors.random())) + categoryDao.insert(Category(name = "Zakupy", icon = Icons.GROCERIES,color = colors.random())) + val now = LocalDateTime.now() expenseDao.insert( diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt index 9cb1465..f8d9a7a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt @@ -3,27 +3,58 @@ package cc.n0th1ng.tripmoney.data.dao import androidx.paging.PagingSource import androidx.room.Dao import androidx.room.Delete -import androidx.room.Insert import androidx.room.Query import androidx.room.Transaction import androidx.room.Upsert +import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategoryRaw import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto +import kotlinx.coroutines.flow.Flow @Dao interface ExpenseDao { @Upsert suspend fun insert(expense: Expense) - @Transaction @Query( """ SELECT * FROM expense WHERE trip_id = :tripId ORDER BY DATETIME(expense.datetime) DESC """ ) - fun expenseDto(tripId: Int): PagingSource + fun expenseDtoPaged(tripId: Int): PagingSource + + @Transaction + @Query( + """ + SELECT * FROM expense WHERE trip_id = :tripId + ORDER BY DATETIME(expense.datetime) DESC + """ + ) + fun expenseDto(tripId: Int): Flow> @Delete suspend fun delete(expense: Expense) + + @Query( + """ + SELECT + c.id as categoryId, + c.name as categoryName, + c.icon as icon, + c.color as color, + SUM(e.amount) as amount, + e.currency as currency + FROM + expense e + JOIN + category c ON e.category_id = c.id + WHERE + e.trip_id = :tripId + GROUP BY + c.id, c.name, c.icon, c.color, e.currency + """ + ) + fun summaryPerCategoryRaw(tripId: Int): Flow> + } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt index 2edaad8..e07726b 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt @@ -23,4 +23,9 @@ interface TripDao { @Delete suspend fun delete(trip: Trip) + + @Query( + "SELECT * FROM trip where trip.id = :tripId" + ) + fun trip(tripId: Int): Trip? } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dto/SummaryPerCategory.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dto/SummaryPerCategory.kt new file mode 100644 index 0000000..4a4c399 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dto/SummaryPerCategory.kt @@ -0,0 +1,22 @@ +package cc.n0th1ng.tripmoney.data.dto + +import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.utils.Currencies +import cc.n0th1ng.tripmoney.utils.Icons + +data class SummaryPerCategory( + val category: Category, + val amount: Double, + val percent: Float, + val currency: Currencies +) + +data class SummaryPerCategoryRaw( + val categoryId: Int, + val categoryName: String, + val icon: Icons, + val color: String, + val amount: Double, + val currency: String +) + diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt index 7966010..98c73e4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt @@ -40,14 +40,13 @@ class ExchangeRateRepository @Inject constructor( date = date.toString() ) ) - clearOldRates() rate } } @RequiresApi(Build.VERSION_CODES.O) - private suspend fun clearOldRates(daysToKeep: Int = 180) { + suspend fun clearOldRates(daysToKeep: Int = 180) { val cutoffDate = LocalDate.now().minusDays(daysToKeep.toLong()).toString() exchangeRateDao.deleteOldRates(cutoffDate) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt index ddb482b..74e48bf 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt @@ -5,6 +5,7 @@ import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import cc.n0th1ng.tripmoney.data.dao.ExpenseDao +import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategoryRaw import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import kotlinx.coroutines.flow.Flow @@ -22,10 +23,18 @@ class ExpenseRepository @Inject constructor(private val expenseDao: ExpenseDao) expenseDao.delete(expense) } - fun getExpenses(tripId: Int): Flow> { + fun getExpensesPaged(tripId: Int): Flow> { return Pager( config = PagingConfig(pageSize = 50, enablePlaceholders = false), - pagingSourceFactory = { expenseDao.expenseDto(tripId) } + pagingSourceFactory = { expenseDao.expenseDtoPaged(tripId) } ).flow } + + fun getExpenses(tripId: Int): Flow> { + return expenseDao.expenseDto(tripId) + } + + fun getSummaryPerCategory(tripId: Int): Flow> { + return expenseDao.summaryPerCategoryRaw(tripId) + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt index d1d1347..b4c0b2b 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt @@ -7,9 +7,13 @@ import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore import cc.n0th1ng.tripmoney.data.repository.PreferenceKeys.APP_THEME import cc.n0th1ng.tripmoney.data.repository.PreferenceKeys.CURRENT_TRIP +import cc.n0th1ng.tripmoney.data.repository.PreferenceKeys.DEFAULT_CURRENCY +import cc.n0th1ng.tripmoney.utils.Currencies import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.DEFAULT_CONCURRENCY import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import java.util.Currency import javax.inject.Inject @@ -18,6 +22,7 @@ val Context.preferencesDataStore by preferencesDataStore(name = "app_preferences object PreferenceKeys { val APP_THEME = intPreferencesKey("app_theme") val CURRENT_TRIP = intPreferencesKey("current_trip") + val DEFAULT_CURRENCY = stringPreferencesKey("default_currency") } @@ -34,6 +39,16 @@ class PreferencesRepository @Inject constructor(@ApplicationContext private val prefs[CURRENT_TRIP] ?: -1 } + val defaultCurrencyFlow: Flow = + context.preferencesDataStore.data.map { prefs -> + Currencies.valueOf(prefs[DEFAULT_CURRENCY] ?: Currencies.default().name) + } + + suspend fun saveDefaultCurrency(currency: Currencies) { + context.preferencesDataStore.edit { prefs -> + prefs[DEFAULT_CURRENCY] = currency.name + } + } suspend fun saveCurrentTrip(tripId: Int) { context.preferencesDataStore.edit { prefs -> prefs[CURRENT_TRIP] = tripId diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt index d0109ea..f2456bc 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt @@ -23,6 +23,10 @@ class TripRepository @Inject constructor(private val tripDao: TripDao) { ).flow } + fun getTrip(tripId: Int): Trip? { + return tripDao.trip(tripId) + } + @WorkerThread suspend fun delete(trip: Trip) { tripDao.delete(trip) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt index dad784f..5c2a69a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt @@ -14,9 +14,9 @@ import androidx.navigation.NavHostController @OptIn(ExperimentalMaterial3Api::class) @Composable -fun TopBar(onClick: () -> Unit) { +fun TopBar(onClick: () -> Unit, title: String = "") { TopAppBar( - title = {}, + title = { Text(title) }, navigationIcon = { IconButton(onClick = { onClick() }) { Icon(Icons.Default.Menu, contentDescription = "Menu") diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt index 9159139..34a285c 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt @@ -1,6 +1,5 @@ package cc.n0th1ng.tripmoney.screens -import android.graphics.drawable.Icon import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll @@ -28,19 +27,17 @@ 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.compose.ui.unit.dp import androidx.core.graphics.toColorInt import cc.n0th1ng.tripmoney.data.entity.Category -import cc.n0th1ng.tripmoney.theme.TripMoneyTheme -import cc.n0th1ng.tripmoney.utils.Colors import cc.n0th1ng.tripmoney.utils.Icons +import cc.n0th1ng.tripmoney.utils.colors @Composable fun AddCategoryDialog(onDismiss: () -> Unit, onSave: (Category) -> Unit) { var name by remember { mutableStateOf("") } var icon by remember { mutableStateOf(Icons.entries[0]) } - var color by remember { mutableStateOf(Colors.entries[0].hexString) } + var color by remember { mutableStateOf(colors[0]) } AlertDialog( onDismissRequest = onDismiss, title = { Text("Add new category") }, text = { AlertDialogFill( @@ -48,7 +45,7 @@ fun AddCategoryDialog(onDismiss: () -> Unit, onSave: (Category) -> Unit) { name = newText }, onIconChange = { newIcon -> icon = newIcon }, - onColorChange = {newColor -> color = newColor} + onColorChange = { newColor -> color = newColor } ) }, confirmButton = { Button( @@ -72,10 +69,14 @@ fun AddCategoryDialog(onDismiss: () -> Unit, onSave: (Category) -> Unit) { } @Composable -fun AlertDialogFill(onTextChange: (String) -> Unit, onIconChange: (Icons) -> Unit, onColorChange: (String) -> Unit) { +fun AlertDialogFill( + onTextChange: (String) -> Unit, + onIconChange: (Icons) -> Unit, + onColorChange: (String) -> Unit +) { var text by remember { mutableStateOf("") } var iconId by remember { mutableIntStateOf(Icons.entries[0].resource) } - var colorHex by remember { mutableStateOf(Colors.entries[0].hexString) } + var colorHex by remember { mutableStateOf(colors[0]) } Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { Row( verticalAlignment = Alignment.CenterVertically, @@ -118,16 +119,16 @@ fun AlertDialogFill(onTextChange: (String) -> Unit, onIconChange: (Icons) -> Uni rememberScrollState() ) ) { - Colors.entries.forEach { color -> + colors.forEach { color -> Box( modifier = Modifier .clickable(onClick = { - colorHex = color.hexString + colorHex = color onColorChange(colorHex) }) .size(30.dp) .aspectRatio(1f) - .background(Color(color.hexString.toColorInt())) + .background(Color(color.toColorInt())) ) {} } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index 42f333a..7e0e350 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -66,6 +66,7 @@ import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -81,13 +82,13 @@ fun AddExpenseBottomSheet( onSave: (Expense) -> Unit, onDismiss: () -> Unit, expenseDtoToEdit: ExpenseDto?, - state: SheetState, -// categories: List = emptyList() + state: SheetState ) { + val tripViewModel: TripViewModel = hiltViewModel() val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() -// val currentTripId = 1 + val currentTrip = tripViewModel.getTrip(currentTripId) val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) if (categories.isEmpty()) { return @@ -103,7 +104,7 @@ fun AddExpenseBottomSheet( var showDateTimePicker by remember { mutableStateOf(false) } var currency by remember { mutableStateOf( - expenseDtoToEdit?.expense?.currency ?: Currencies.PLN.name + expenseDtoToEdit?.expense?.currency ?: currentTrip?.currency ?: Currencies.default().name ) } var category by remember { mutableStateOf(expenseDtoToEdit?.category ?: categories[0]) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt index f4f57c9..22434eb 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt @@ -104,7 +104,9 @@ fun DateTimePicker( if (showDatePicker) { DatePicker(onDismiss = { showDatePicker = false }, onConfirm = { newDate -> - date = newDate + date = newDate + showDatePicker = false + showTimePicker = true }) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index 7a5da42..a875eb1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -37,8 +37,10 @@ import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.rememberSwipeToDismissBoxState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -53,34 +55,58 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems import cc.n0th1ng.tripmoney.R.string +import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto +import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.addexpense.AddExpenseBottomSheet -import cc.n0th1ng.tripmoney.service.ExchangeService +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies +import cc.n0th1ng.tripmoney.utils.colors import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel +import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel.ExpenseDtoWithConvertedAmount import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow import java.time.LocalDate import java.time.LocalDateTime +import java.time.ZoneOffset import java.time.format.DateTimeFormatter -import javax.inject.Inject +import kotlin.random.Random +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun ListExpenseScreen() { + val settingsViewModel: SettingsViewModel = hiltViewModel() + val currentTrip by settingsViewModel.currentTrip.collectAsState() + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() + val expensesWithConvertedFlow = expenseAndCategoryViewModel + .getExpensesWithConvertedAmountsPaged(currentTrip) + + ListExpenseScreen( + expensesWithConvertedFlow = expensesWithConvertedFlow, + onSaveExpense = { expenseAndCategoryViewModel.save(it) }, + onDeleteExpense = { expenseAndCategoryViewModel.delete(it) }) +} + @OptIn(ExperimentalMaterial3Api::class) @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @RequiresApi(Build.VERSION_CODES.O) @Composable -fun ListExpenseScreen() { - val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() - val settingsViewModel: SettingsViewModel = hiltViewModel() - - val currentTrip by settingsViewModel.currentTrip.collectAsState() - val expenses = expenseAndCategoryViewModel.getExpenses(currentTrip).collectAsLazyPagingItems() +fun ListExpenseScreen( + expensesWithConvertedFlow: Flow>, + onSaveExpense: (Expense) -> Unit, onDeleteExpense: (Expense) -> Unit +) { + val expensesWithConverted = expensesWithConvertedFlow.collectAsLazyPagingItems() val listState = rememberLazyListState() var showBottomSheet by remember { mutableStateOf(false) } var expenseDtoToEdit: ExpenseDto? = null + val sumMap = remember { mutableStateMapOf() } Scaffold(floatingActionButtonPosition = FabPosition.EndOverlay, floatingActionButton = { ExtendedFloatingActionButton( @@ -90,30 +116,50 @@ fun ListExpenseScreen() { ) }) { + LaunchedEffect(expensesWithConverted.itemSnapshotList.items) { + val items = expensesWithConverted.itemSnapshotList.items + val newSums = items + .groupBy { LocalDateTime.parse(it.expenseDto.expense.datetime).toLocalDate() } + .mapValues { (_, expensesForDay) -> + expensesForDay.sumOf { it.convertedAmount } + } + sumMap.clear() + sumMap.putAll(newSums) + } + LazyColumn( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, state = listState ) { items( - count = expenses.itemCount, - key = { index -> expenses[index]?.expense?.id ?: index } + count = expensesWithConverted.itemCount, + key = { index -> expensesWithConverted[index]?.expenseDto?.expense?.id ?: index } ) { index -> - val expenseDto = expenses[index] - if (expenseDto != null) { - val previousExpense = expenses.itemSnapshotList.items.getOrNull(index - 1) + val expenseDtoWithConverted = expensesWithConverted[index] + val expenseDto = expenseDtoWithConverted?.expenseDto + if (expenseDtoWithConverted != null && expenseDto != null) { + val previousExpense = + expensesWithConverted.itemSnapshotList.items.getOrNull(index - 1)?.expenseDto val showDayDivider = index == 0 || LocalDateTime.parse(previousExpense?.expense?.datetime) .toLocalDate() != LocalDateTime.parse(expenseDto.expense.datetime) .toLocalDate() - Spacer(Modifier.height(5.dp)) + Spacer(Modifier + .height(5.dp) + .background(MaterialTheme.colorScheme.onBackground)) if (showDayDivider) { - CustomDivider(expenseDto) + CustomDivider( + expenseDto, + sumMap.getOrDefault( + LocalDateTime.parse(expenseDto.expense.datetime).toLocalDate(), 0.00 + ) + ) } Spacer(Modifier.height(5.dp)) SwipeToDeleteExpenseCard( - expenseDto = expenseDto, - onDelete = { expense -> expenseAndCategoryViewModel.delete(expense) }, + expenseDtoWithConverted = expenseDtoWithConverted, + onDelete = { expense -> onDeleteExpense(expense) }, onClick = { expenseDto -> expenseDtoToEdit = expenseDto showBottomSheet = true @@ -125,7 +171,7 @@ fun ListExpenseScreen() { if (showBottomSheet) { AddExpenseBottomSheet( onSave = { expense -> - expenseAndCategoryViewModel.save(expense) + onSaveExpense(expense) showBottomSheet = false expenseDtoToEdit = null }, @@ -140,9 +186,10 @@ fun ListExpenseScreen() { } } + @RequiresApi(Build.VERSION_CODES.O) @Composable -fun CustomDivider(expenseDto: ExpenseDto) { +fun CustomDivider(expenseDto: ExpenseDto, sum: Double) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Absolute.Center, @@ -153,16 +200,32 @@ fun CustomDivider(expenseDto: ExpenseDto) { LocalDateTime.parse(expenseDto.expense.datetime).format( DateTimeFormatter.ofPattern("dd EEEE") ).toString(), - modifier = Modifier.background(Color.White.copy(alpha = 0f)) + modifier = Modifier.background(Color.White.copy(alpha = 0f)), + style = MaterialTheme.typography.titleMedium ) - HorizontalDivider(modifier = Modifier.weight(1f)) + Row( + modifier = Modifier + .fillMaxWidth() + .weight(1f), + horizontalArrangement = Arrangement.Absolute.Center, + verticalAlignment = Alignment.CenterVertically + ) { + HorizontalDivider(modifier = Modifier.weight(2f)) + Text( + "%.2f %s".format(sum, expenseDto.trip.currency), + modifier = Modifier.background(Color.White.copy(alpha = 0f)), + style = MaterialTheme.typography.bodyMedium + ) + HorizontalDivider(modifier = Modifier.weight(1f)) + } + } } @RequiresApi(Build.VERSION_CODES.O) @Composable fun SwipeToDeleteExpenseCard( - expenseDto: ExpenseDto, + expenseDtoWithConverted: ExpenseDtoWithConvertedAmount, onDelete: (Expense) -> Unit, onClick: (ExpenseDto) -> Unit ) { @@ -186,7 +249,7 @@ fun SwipeToDeleteExpenseCard( onConfirm = { showDialog = false dismissed = true - onDelete(expenseDto.expense) + onDelete(expenseDtoWithConverted.expenseDto.expense) }, onCancel = { showDialog = false } ) @@ -209,7 +272,7 @@ fun SwipeToDeleteExpenseCard( } } ) { - ExpenseCard(expenseDto, onClick = onClick) + ExpenseCard(expenseDtoWithConverted, onClick = onClick) } } } @@ -226,15 +289,15 @@ fun DeleteConfirmationDialog( Column( Modifier .background( - MaterialTheme.colorScheme.surface, + MaterialTheme.colorScheme.secondaryContainer, shape = MaterialTheme.shapes.medium ) .padding(24.dp) ) { Text( stringResource(string.delete_confirmation), - fontWeight = FontWeight.Bold, - fontSize = 20.sp + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSecondaryContainer ) Row( horizontalArrangement = Arrangement.End, @@ -244,6 +307,8 @@ fun DeleteConfirmationDialog( ) { Text( text = stringResource(string.cancel), + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSecondaryContainer, modifier = Modifier .padding(end = 24.dp) .clickable { onCancel() } @@ -251,7 +316,7 @@ fun DeleteConfirmationDialog( Text( text = stringResource(string.delete), color = MaterialTheme.colorScheme.error, - fontWeight = FontWeight.Bold, + style = MaterialTheme.typography.titleMedium, modifier = Modifier.clickable { onConfirm() } ) } @@ -261,8 +326,14 @@ fun DeleteConfirmationDialog( @RequiresApi(Build.VERSION_CODES.O) @Composable -fun ExpenseCard(expenseDto: ExpenseDto, onClick: (ExpenseDto) -> Unit) { +fun ExpenseCard( + expenseDtoWithConverted: ExpenseDtoWithConvertedAmount, + onClick: (ExpenseDto) -> Unit +) { + val expenseDto = expenseDtoWithConverted.expenseDto ElevatedCard( + colors = CardDefaults.elevatedCardColors() + .copy(containerColor = MaterialTheme.colorScheme.secondaryContainer), modifier = Modifier .fillMaxWidth(0.9f) .height(70.dp) @@ -299,14 +370,14 @@ fun ExpenseCard(expenseDto: ExpenseDto, onClick: (ExpenseDto) -> Unit) { { Text( text = expenseDto.category.name, - fontWeight = FontWeight.Bold, - lineHeight = 5.sp + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSecondaryContainer ) Text( modifier = Modifier.padding(0.dp), text = expenseDto.expense.note, - fontSize = 11.sp, - lineHeight = 5.sp + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSecondaryContainer ) } @@ -314,31 +385,132 @@ fun ExpenseCard(expenseDto: ExpenseDto, onClick: (ExpenseDto) -> Unit) { text = LocalDateTime.parse(expenseDto.expense.datetime).format( DateTimeFormatter.ofPattern("dd MMM HH:mm") ), - fontSize = 12.sp, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSecondaryContainer ) } } Column { Text( text = "- %.2f ${expenseDto.expense.currency}".format(expenseDto.expense.amount), - fontWeight = FontWeight.Bold + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSecondaryContainer + + ) if (expenseDto.expense.currency.lowercase() != expenseDto.trip.currency.lowercase()) { - val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() - val amount by - expenseAndCategoryViewModel.convertAmount( - amount = expenseDto.expense.amount, - base = Currencies.valueOf(expenseDto.expense.currency), - target = Currencies.valueOf(expenseDto.trip.currency), - date = LocalDateTime.parse(expenseDto.expense.datetime).toLocalDate() - ).collectAsState(initial = 0.0) Text( - text = "≈ %.2f ${expenseDto.trip.currency}".format(amount), - fontSize = 12.sp + text = "≈ %.2f ${expenseDto.trip.currency}".format(expenseDtoWithConverted.convertedAmount), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSecondaryContainer ) } } } } -} \ No newline at end of file +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewListExpenseScreen() { + TripMoneyTheme() { + val pagingData = PagingData.from(sampleExpenseDtoWithConvertedAmountList()) + ListExpenseScreen( + expensesWithConvertedFlow = MutableStateFlow(pagingData), + onSaveExpense = {}, + onDeleteExpense = {} + ) + + } +} + +@AllPreviews +@Composable +fun PreviewDeleteConfirmationDialog() { + TripMoneyTheme() { + DeleteConfirmationDialog( + onConfirm = {}, + onCancel = {}) + } +} + + +@RequiresApi(Build.VERSION_CODES.O) +private fun sampleExpenseDtoWithConvertedAmountList(): List { + val sampleCategories = listOf( + Category( + name = "Hotel", + icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, + color = colors.random() + ), + Category( + name = "Jedzenie", + icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, + color = colors.random() + ), + Category( + name = "Transport", + icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, + color = colors.random() + ), + Category( + name = "Rozrywka", + icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, + color = colors.random() + ), + Category( + name = "Zakupy", + icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, + color = colors.random() + ), + ) + + val trip = Trip( + id = 1, + name = "Vacation", + currency = "USD", + startDate = "2026-01-01" + ) + + val startLong = LocalDateTime.now().minusDays(10).toEpochMilli() + val endLong = LocalDateTime.now().toEpochMilli() + + val result: MutableList = mutableListOf() + for (i in 0..15) { + val category = sampleCategories.random() + val datetime = if (i > 4) { + LocalDateTime.ofEpochSecond( + Random.nextLong(startLong, endLong), + 0, + ZoneOffset.UTC + ).toString() + } else LocalDateTime.now().toString() + + val expense = Expense( + id = i, + categoryId = category.id, + tripId = 1, + amount = Random.nextDouble(0.1, 300.0), + currency = Currencies.entries.random().name, + note = if (i % 3 == 0) "Some note" else "", + datetime = datetime + ) + val expenseDto = ExpenseDto( + expense = expense, + category = category, + trip = trip + ) + result.add( + ExpenseDtoWithConvertedAmount( + expenseDto, + convertedAmount = if (Random.nextBoolean()) Random.nextDouble( + 0.1, + 300.0 + ) else expense.amount + ) + ) + } + return result +} diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt index 90a1faa..32e6f8f 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt @@ -33,6 +33,8 @@ import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.R.* import cc.n0th1ng.tripmoney.data.repository.AppTheme +import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog +import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel @RequiresApi(Build.VERSION_CODES.S) @@ -40,8 +42,9 @@ import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel fun SettingsScreen() { val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTheme by settingsViewModel.theme.collectAsState() - var showDialog by remember { mutableStateOf(false) } - val scope = rememberCoroutineScope() + val currentDefaultCurrency by settingsViewModel.defaultCurrency.collectAsState() + var showThemeDialog by remember { mutableStateOf(false) } + var showCurrencyDialog by remember { mutableStateOf(false) } Column( modifier = Modifier .fillMaxWidth() @@ -49,7 +52,7 @@ fun SettingsScreen() { verticalArrangement = Arrangement.spacedBy(10.dp) ) { Card { - SettingsListItem(onClick = { showDialog = true }, stringResource(string.theme)) { + SettingsListItem(onClick = { showThemeDialog = true }, stringResource(string.theme)) { Text( if (isSystemInDarkTheme()) stringResource(string.dark_theme) else stringResource( string.light_theme @@ -58,16 +61,33 @@ fun SettingsScreen() { } } - if (showDialog) { + Card { + SettingsListItem( + onClick = { showCurrencyDialog = true }, + stringResource(string.default_currency) + ) { + Text(currentDefaultCurrency.name) + } + } + + if (showThemeDialog) { ThemeSelectionDialog( - onDismiss = { showDialog = false }, + onDismiss = { showThemeDialog = false }, onThemeSelected = { theme -> settingsViewModel.setTheme(theme) - showDialog = false + showThemeDialog = false }, selected = currentTheme ) } + + if (showCurrencyDialog) { + CurrencySelectionDialog(onDismiss = {showCurrencyDialog = false}, onCurrencySelected = { + currencyString -> + settingsViewModel.setDefaultCurrency(Currencies.valueOf(currencyString)) + showCurrencyDialog = false + }, currentDefaultCurrency.name) + } } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt index 6e1dd5c..6fb4ebe 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt @@ -1,9 +1,150 @@ package cc.n0th1ng.tripmoney.screens.statistics +import android.os.Build +import androidx.annotation.RequiresApi +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.fillMaxHeight +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 +import androidx.compose.material3.Card +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +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.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontStyle +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.graphics.toColorInt +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory +import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.Currencies +import cc.n0th1ng.tripmoney.utils.Icons +import cc.n0th1ng.tripmoney.utils.colors +import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel +import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +@RequiresApi(Build.VERSION_CODES.O) @Composable fun StatisticsScreen() { - Text("TODO") -} \ No newline at end of file + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() + val settingsViewModel: SettingsViewModel = hiltViewModel() + val currentTrip by settingsViewModel.currentTrip.collectAsState() + val summaryPerCategoryList by expenseAndCategoryViewModel.getSummaryPerCategory(currentTrip) + .collectAsState(emptyList()) + + Column(modifier = Modifier.padding(10.dp)) { + SummaryPerCategoryCard(summaryPerCategoryList) + } +} + + +@Composable +fun SummaryPerCategoryCard(summaryPerCategoryList: List) { + Card(modifier = Modifier.fillMaxWidth()) { + Column( + modifier = Modifier.padding(15.dp), + verticalArrangement = Arrangement.spacedBy(5.dp) + ) { +// Text(text = "Summary", fontWeight = FontWeight.Bold, fontSize = 25.sp) + summaryPerCategoryList.forEach { + CategoryCard( + summaryPerCategory = it, modifier = Modifier + .fillMaxWidth() + ) + } + } + } +} + +@Composable +fun CategoryCard(modifier: Modifier = Modifier, summaryPerCategory: SummaryPerCategory) { + Column(modifier = modifier) { + Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(5.dp)) { + Icon( + painter = painterResource(summaryPerCategory.category.icon.resource), + contentDescription = null, + modifier = Modifier.size(MaterialTheme.typography.bodyLarge.fontSize.value.dp), + tint = Color(summaryPerCategory.category.color.toColorInt()) + ) + Text("%s".format(summaryPerCategory.category.name, (summaryPerCategory.percent * 100).toInt()), + style = MaterialTheme.typography.bodyLarge, color = Color(summaryPerCategory.category.color.toColorInt())) + } + + Text("%.2f ${summaryPerCategory.currency}".format(summaryPerCategory.amount), + style = MaterialTheme.typography.bodyMedium) + } + Row(horizontalArrangement = Arrangement.spacedBy(5.dp), verticalAlignment = Alignment.CenterVertically){ + Box( + modifier = Modifier + .height(40.dp) + .fillMaxWidth(0.12f + (0.90f - 0.12f) * summaryPerCategory.percent) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.primary) + ) { + Column(verticalArrangement = Arrangement.Center, modifier = Modifier.fillMaxSize().padding(11.dp)) { + Text("%d%%".format((summaryPerCategory.percent * 100).toInt()), + style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onPrimary) + + } + } +// Text("%d%%".format((summaryPerCategory.percent * 100).toInt()), +// style = MaterialTheme.typography.labelSmall) + } + } +} + +@Preview +@Composable +fun previewLight() { + TripMoneyTheme { + SummaryPerCategoryCard(summaryPerCategoryList) + } +} + +@Preview +@Composable +fun previewDark() { + TripMoneyTheme(darkTheme = true) { + SummaryPerCategoryCard(summaryPerCategoryList) + } +} + +val categories = listOf( + Category(name = "Jedzenie", icon = Icons.RESTAURANT, color = colors.random()), + Category(name = "Transport", icon = Icons.FLIGHT, color = colors.random()), + Category(name = "Rozrywka", icon = Icons.ATTRACTION, color = colors.random()), + Category(name = "Zakupy", icon = Icons.GROCERIES, color = colors.random()), + Category(name = "Zakupy1", icon = Icons.GROCERIES, color = colors.random()), + Category(name = "Zakupy2", icon = Icons.GROCERIES, color = colors.random()), + Category(name = "Zakupy3", icon = Icons.GROCERIES, color = colors.random()) +) + +val summaryPerCategoryList = listOf( + SummaryPerCategory(categories[0], 50.0, 1f, Currencies.PLN), + SummaryPerCategory(categories[1], 120.0, 0.3f, Currencies.PLN), + SummaryPerCategory(categories[2], 80.0, 0.2f, Currencies.PLN), + SummaryPerCategory(categories[3], 50.0, 0.1f, Currencies.PLN), + SummaryPerCategory(categories[4], 120.0, 0.3f, Currencies.PLN), + SummaryPerCategory(categories[5], 50.0, 0.0001f, Currencies.PLN), +) \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt index 9ccef0f..204e6a1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt @@ -24,6 +24,7 @@ import androidx.compose.material3.Shapes import androidx.compose.material3.SheetState import androidx.compose.material3.Text 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 @@ -37,12 +38,15 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.R import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.addexpense.CurrencyButton import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.DatePicker import cc.n0th1ng.tripmoney.utils.Currencies +import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import io.ktor.http.hostIsIp import java.time.LocalDate import java.time.format.DateTimeFormatter @@ -62,9 +66,11 @@ fun AddTripBottomSheet( LocalDate.parse(tripToEdit?.startDate ?: LocalDate.now().toString()) ) } + val settingsViewModel: SettingsViewModel = hiltViewModel() + val defaultCurrency by settingsViewModel.defaultCurrency.collectAsState() var showCurrencyDialog by remember { mutableStateOf(false) } var showDatePicker by remember { mutableStateOf(false) } - var currency by remember { mutableStateOf(tripToEdit?.currency ?: Currencies.default().name) } + var currency by remember { mutableStateOf(tripToEdit?.currency ?: defaultCurrency.name) } var enableSave by remember { mutableStateOf(tripToEdit != null) } ModalBottomSheet( diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt index 27f207e..d9fe28a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt @@ -182,6 +182,13 @@ fun TripCard( ) { val haptics = LocalHapticFeedback.current ElevatedCard( + colors = CardDefaults.elevatedCardColors( + containerColor = if (isSelected) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.secondary + } + ), modifier = Modifier .height(100.dp) .combinedClickable(enabled = true, onLongClick = { diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/theme/Color.kt b/app/src/main/java/cc/n0th1ng/tripmoney/theme/Color.kt index d4d21b1..1a2fac5 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/theme/Color.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/theme/Color.kt @@ -2,10 +2,218 @@ package cc.n0th1ng.tripmoney.theme import androidx.compose.ui.graphics.Color -val Purple80 = Color(0xFFD0BCFF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFFEFB8C8) +val primaryLight = Color(0xFF48672E) +val onPrimaryLight = Color(0xFFFFFFFF) +val primaryContainerLight = Color(0xFFC9EEA7) +val onPrimaryContainerLight = Color(0xFF324E19) +val secondaryLight = Color(0xFF56624A) +val onSecondaryLight = Color(0xFFFFFFFF) +val secondaryContainerLight = Color(0xFFDAE7C9) +val onSecondaryContainerLight = Color(0xFF3F4A34) +val tertiaryLight = Color(0xFF386664) +val onTertiaryLight = Color(0xFFFFFFFF) +val tertiaryContainerLight = Color(0xFFBBECE9) +val onTertiaryContainerLight = Color(0xFF1E4E4D) +val errorLight = Color(0xFFBA1A1A) +val onErrorLight = Color(0xFFFFFFFF) +val errorContainerLight = Color(0xFFFFDAD6) +val onErrorContainerLight = Color(0xFF93000A) +val backgroundLight = Color(0xFFF9FAEF) +val onBackgroundLight = Color(0xFF1A1D16) +val surfaceLight = Color(0xFFF9FAEF) +val onSurfaceLight = Color(0xFF1A1D16) +val surfaceVariantLight = Color(0xFFE0E4D6) +val onSurfaceVariantLight = Color(0xFF44483E) +val outlineLight = Color(0xFF74796D) +val outlineVariantLight = Color(0xFFC4C8BA) +val scrimLight = Color(0xFF000000) +val inverseSurfaceLight = Color(0xFF2E312A) +val inverseOnSurfaceLight = Color(0xFFF0F2E7) +val inversePrimaryLight = Color(0xFFAED18D) +val surfaceDimLight = Color(0xFFD9DBD0) +val surfaceBrightLight = Color(0xFFF9FAEF) +val surfaceContainerLowestLight = Color(0xFFFFFFFF) +val surfaceContainerLowLight = Color(0xFFF3F5EA) +val surfaceContainerLight = Color(0xFFEDEFE4) +val surfaceContainerHighLight = Color(0xFFE7E9DE) +val surfaceContainerHighestLight = Color(0xFFE2E3D9) -val Purple40 = Color(0xFF6650a4) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val primaryLightMediumContrast = Color(0xFF213D08) +val onPrimaryLightMediumContrast = Color(0xFFFFFFFF) +val primaryContainerLightMediumContrast = Color(0xFF57763B) +val onPrimaryContainerLightMediumContrast = Color(0xFFFFFFFF) +val secondaryLightMediumContrast = Color(0xFF2F3925) +val onSecondaryLightMediumContrast = Color(0xFFFFFFFF) +val secondaryContainerLightMediumContrast = Color(0xFF657158) +val onSecondaryContainerLightMediumContrast = Color(0xFFFFFFFF) +val tertiaryLightMediumContrast = Color(0xFF073D3C) +val onTertiaryLightMediumContrast = Color(0xFFFFFFFF) +val tertiaryContainerLightMediumContrast = Color(0xFF477573) +val onTertiaryContainerLightMediumContrast = Color(0xFFFFFFFF) +val errorLightMediumContrast = Color(0xFF740006) +val onErrorLightMediumContrast = Color(0xFFFFFFFF) +val errorContainerLightMediumContrast = Color(0xFFCF2C27) +val onErrorContainerLightMediumContrast = Color(0xFFFFFFFF) +val backgroundLightMediumContrast = Color(0xFFF9FAEF) +val onBackgroundLightMediumContrast = Color(0xFF1A1D16) +val surfaceLightMediumContrast = Color(0xFFF9FAEF) +val onSurfaceLightMediumContrast = Color(0xFF0F120C) +val surfaceVariantLightMediumContrast = Color(0xFFE0E4D6) +val onSurfaceVariantLightMediumContrast = Color(0xFF33382E) +val outlineLightMediumContrast = Color(0xFF4F5449) +val outlineVariantLightMediumContrast = Color(0xFF6A6F63) +val scrimLightMediumContrast = Color(0xFF000000) +val inverseSurfaceLightMediumContrast = Color(0xFF2E312A) +val inverseOnSurfaceLightMediumContrast = Color(0xFFF0F2E7) +val inversePrimaryLightMediumContrast = Color(0xFFAED18D) +val surfaceDimLightMediumContrast = Color(0xFFC5C7BD) +val surfaceBrightLightMediumContrast = Color(0xFFF9FAEF) +val surfaceContainerLowestLightMediumContrast = Color(0xFFFFFFFF) +val surfaceContainerLowLightMediumContrast = Color(0xFFF3F5EA) +val surfaceContainerLightMediumContrast = Color(0xFFE7E9DE) +val surfaceContainerHighLightMediumContrast = Color(0xFFDCDED3) +val surfaceContainerHighestLightMediumContrast = Color(0xFFD1D3C8) + +val primaryLightHighContrast = Color(0xFF183301) +val onPrimaryLightHighContrast = Color(0xFFFFFFFF) +val primaryContainerLightHighContrast = Color(0xFF34511B) +val onPrimaryContainerLightHighContrast = Color(0xFFFFFFFF) +val secondaryLightHighContrast = Color(0xFF252F1B) +val onSecondaryLightHighContrast = Color(0xFFFFFFFF) +val secondaryContainerLightHighContrast = Color(0xFF414D36) +val onSecondaryContainerLightHighContrast = Color(0xFFFFFFFF) +val tertiaryLightHighContrast = Color(0xFF003231) +val onTertiaryLightHighContrast = Color(0xFFFFFFFF) +val tertiaryContainerLightHighContrast = Color(0xFF21504F) +val onTertiaryContainerLightHighContrast = Color(0xFFFFFFFF) +val errorLightHighContrast = Color(0xFF600004) +val onErrorLightHighContrast = Color(0xFFFFFFFF) +val errorContainerLightHighContrast = Color(0xFF98000A) +val onErrorContainerLightHighContrast = Color(0xFFFFFFFF) +val backgroundLightHighContrast = Color(0xFFF9FAEF) +val onBackgroundLightHighContrast = Color(0xFF1A1D16) +val surfaceLightHighContrast = Color(0xFFF9FAEF) +val onSurfaceLightHighContrast = Color(0xFF000000) +val surfaceVariantLightHighContrast = Color(0xFFE0E4D6) +val onSurfaceVariantLightHighContrast = Color(0xFF000000) +val outlineLightHighContrast = Color(0xFF292E24) +val outlineVariantLightHighContrast = Color(0xFF464B40) +val scrimLightHighContrast = Color(0xFF000000) +val inverseSurfaceLightHighContrast = Color(0xFF2E312A) +val inverseOnSurfaceLightHighContrast = Color(0xFFFFFFFF) +val inversePrimaryLightHighContrast = Color(0xFFAED18D) +val surfaceDimLightHighContrast = Color(0xFFB8BAB0) +val surfaceBrightLightHighContrast = Color(0xFFF9FAEF) +val surfaceContainerLowestLightHighContrast = Color(0xFFFFFFFF) +val surfaceContainerLowLightHighContrast = Color(0xFFF0F2E7) +val surfaceContainerLightHighContrast = Color(0xFFE2E3D9) +val surfaceContainerHighLightHighContrast = Color(0xFFD3D5CB) +val surfaceContainerHighestLightHighContrast = Color(0xFFC5C7BD) + +val primaryDark = Color(0xFFAED18D) +val onPrimaryDark = Color(0xFF1C3704) +val primaryContainerDark = Color(0xFF324E19) +val onPrimaryContainerDark = Color(0xFFC9EEA7) +val secondaryDark = Color(0xFFBECBAE) +val onSecondaryDark = Color(0xFF29341F) +val secondaryContainerDark = Color(0xFF3F4A34) +val onSecondaryContainerDark = Color(0xFFDAE7C9) +val tertiaryDark = Color(0xFFA0CFCD) +val onTertiaryDark = Color(0xFF003736) +val tertiaryContainerDark = Color(0xFF1E4E4D) +val onTertiaryContainerDark = Color(0xFFBBECE9) +val errorDark = Color(0xFFFFB4AB) +val onErrorDark = Color(0xFF690005) +val errorContainerDark = Color(0xFF93000A) +val onErrorContainerDark = Color(0xFFFFDAD6) +val backgroundDark = Color(0xFF11140E) +val onBackgroundDark = Color(0xFFE2E3D9) +val surfaceDark = Color(0xFF11140E) +val onSurfaceDark = Color(0xFFE2E3D9) +val surfaceVariantDark = Color(0xFF44483E) +val onSurfaceVariantDark = Color(0xFFC4C8BA) +val outlineDark = Color(0xFF8E9286) +val outlineVariantDark = Color(0xFF44483E) +val scrimDark = Color(0xFF000000) +val inverseSurfaceDark = Color(0xFFE2E3D9) +val inverseOnSurfaceDark = Color(0xFF2E312A) +val inversePrimaryDark = Color(0xFF48672E) +val surfaceDimDark = Color(0xFF11140E) +val surfaceBrightDark = Color(0xFF373A33) +val surfaceContainerLowestDark = Color(0xFF0C0F09) +val surfaceContainerLowDark = Color(0xFF1A1D16) +val surfaceContainerDark = Color(0xFF1E211A) +val surfaceContainerHighDark = Color(0xFF282B24) +val surfaceContainerHighestDark = Color(0xFF33362E) + +val primaryDarkMediumContrast = Color(0xFFC3E8A1) +val onPrimaryDarkMediumContrast = Color(0xFF132B00) +val primaryContainerDarkMediumContrast = Color(0xFF799A5C) +val onPrimaryContainerDarkMediumContrast = Color(0xFF000000) +val secondaryDarkMediumContrast = Color(0xFFD4E1C3) +val onSecondaryDarkMediumContrast = Color(0xFF1E2915) +val secondaryContainerDarkMediumContrast = Color(0xFF89957A) +val onSecondaryContainerDarkMediumContrast = Color(0xFF000000) +val tertiaryDarkMediumContrast = Color(0xFFB5E5E3) +val onTertiaryDarkMediumContrast = Color(0xFF002B2A) +val tertiaryContainerDarkMediumContrast = Color(0xFF6B9997) +val onTertiaryContainerDarkMediumContrast = Color(0xFF000000) +val errorDarkMediumContrast = Color(0xFFFFD2CC) +val onErrorDarkMediumContrast = Color(0xFF540003) +val errorContainerDarkMediumContrast = Color(0xFFFF5449) +val onErrorContainerDarkMediumContrast = Color(0xFF000000) +val backgroundDarkMediumContrast = Color(0xFF11140E) +val onBackgroundDarkMediumContrast = Color(0xFFE2E3D9) +val surfaceDarkMediumContrast = Color(0xFF11140E) +val onSurfaceDarkMediumContrast = Color(0xFFFFFFFF) +val surfaceVariantDarkMediumContrast = Color(0xFF44483E) +val onSurfaceVariantDarkMediumContrast = Color(0xFFDADED0) +val outlineDarkMediumContrast = Color(0xFFAFB4A6) +val outlineVariantDarkMediumContrast = Color(0xFF8E9285) +val scrimDarkMediumContrast = Color(0xFF000000) +val inverseSurfaceDarkMediumContrast = Color(0xFFE2E3D9) +val inverseOnSurfaceDarkMediumContrast = Color(0xFF282B24) +val inversePrimaryDarkMediumContrast = Color(0xFF33501A) +val surfaceDimDarkMediumContrast = Color(0xFF11140E) +val surfaceBrightDarkMediumContrast = Color(0xFF43453E) +val surfaceContainerLowestDarkMediumContrast = Color(0xFF060804) +val surfaceContainerLowDarkMediumContrast = Color(0xFF1C1F18) +val surfaceContainerDarkMediumContrast = Color(0xFF262922) +val surfaceContainerHighDarkMediumContrast = Color(0xFF31342C) +val surfaceContainerHighestDarkMediumContrast = Color(0xFF3C3F37) + +val primaryDarkHighContrast = Color(0xFFD7FCB3) +val onPrimaryDarkHighContrast = Color(0xFF000000) +val primaryContainerDarkHighContrast = Color(0xFFAACD89) +val onPrimaryContainerDarkHighContrast = Color(0xFF040E00) +val secondaryDarkHighContrast = Color(0xFFE8F5D6) +val onSecondaryDarkHighContrast = Color(0xFF000000) +val secondaryContainerDarkHighContrast = Color(0xFFBAC7AA) +val onSecondaryContainerDarkHighContrast = Color(0xFF050E01) +val tertiaryDarkHighContrast = Color(0xFFC9F9F7) +val onTertiaryDarkHighContrast = Color(0xFF000000) +val tertiaryContainerDarkHighContrast = Color(0xFF9CCBC9) +val onTertiaryContainerDarkHighContrast = Color(0xFF000E0D) +val errorDarkHighContrast = Color(0xFFFFECE9) +val onErrorDarkHighContrast = Color(0xFF000000) +val errorContainerDarkHighContrast = Color(0xFFFFAEA4) +val onErrorContainerDarkHighContrast = Color(0xFF220001) +val backgroundDarkHighContrast = Color(0xFF11140E) +val onBackgroundDarkHighContrast = Color(0xFFE2E3D9) +val surfaceDarkHighContrast = Color(0xFF11140E) +val onSurfaceDarkHighContrast = Color(0xFFFFFFFF) +val surfaceVariantDarkHighContrast = Color(0xFF44483E) +val onSurfaceVariantDarkHighContrast = Color(0xFFFFFFFF) +val outlineDarkHighContrast = Color(0xFFEEF2E3) +val outlineVariantDarkHighContrast = Color(0xFFC0C4B6) +val scrimDarkHighContrast = Color(0xFF000000) +val inverseSurfaceDarkHighContrast = Color(0xFFE2E3D9) +val inverseOnSurfaceDarkHighContrast = Color(0xFF000000) +val inversePrimaryDarkHighContrast = Color(0xFF33501A) +val surfaceDimDarkHighContrast = Color(0xFF11140E) +val surfaceBrightDarkHighContrast = Color(0xFF4E5149) +val surfaceContainerLowestDarkHighContrast = Color(0xFF000000) +val surfaceContainerLowDarkHighContrast = Color(0xFF1E211A) +val surfaceContainerDarkHighContrast = Color(0xFF2E312A) +val surfaceContainerHighDarkHighContrast = Color(0xFF393C35) +val surfaceContainerHighestDarkHighContrast = Color(0xFF454840) \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt b/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt index 35317bd..7fa2c9e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/theme/Theme.kt @@ -13,33 +13,87 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 +private val lightScheme = lightColorScheme( + primary = primaryLight, + onPrimary = onPrimaryLight, + primaryContainer = primaryContainerLight, + onPrimaryContainer = onPrimaryContainerLight, + secondary = secondaryLight, + onSecondary = onSecondaryLight, + secondaryContainer = secondaryContainerLight, + onSecondaryContainer = onSecondaryContainerLight, + tertiary = tertiaryLight, + onTertiary = onTertiaryLight, + tertiaryContainer = tertiaryContainerLight, + onTertiaryContainer = onTertiaryContainerLight, + error = errorLight, + onError = onErrorLight, + errorContainer = errorContainerLight, + onErrorContainer = onErrorContainerLight, + background = backgroundLight, + onBackground = onBackgroundLight, + surface = surfaceLight, + onSurface = onSurfaceLight, + surfaceVariant = surfaceVariantLight, + onSurfaceVariant = onSurfaceVariantLight, + outline = outlineLight, + outlineVariant = outlineVariantLight, + scrim = scrimLight, + inverseSurface = inverseSurfaceLight, + inverseOnSurface = inverseOnSurfaceLight, + inversePrimary = inversePrimaryLight, + surfaceDim = surfaceDimLight, + surfaceBright = surfaceBrightLight, + surfaceContainerLowest = surfaceContainerLowestLight, + surfaceContainerLow = surfaceContainerLowLight, + surfaceContainer = surfaceContainerLight, + surfaceContainerHigh = surfaceContainerHighLight, + surfaceContainerHighest = surfaceContainerHighestLight, ) -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 - - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ +private val darkScheme = darkColorScheme( + primary = primaryDark, + onPrimary = onPrimaryDark, + primaryContainer = primaryContainerDark, + onPrimaryContainer = onPrimaryContainerDark, + secondary = secondaryDark, + onSecondary = onSecondaryDark, + secondaryContainer = secondaryContainerDark, + onSecondaryContainer = onSecondaryContainerDark, + tertiary = tertiaryDark, + onTertiary = onTertiaryDark, + tertiaryContainer = tertiaryContainerDark, + onTertiaryContainer = onTertiaryContainerDark, + error = errorDark, + onError = onErrorDark, + errorContainer = errorContainerDark, + onErrorContainer = onErrorContainerDark, + background = backgroundDark, + onBackground = onBackgroundDark, + surface = surfaceDark, + onSurface = onSurfaceDark, + surfaceVariant = surfaceVariantDark, + onSurfaceVariant = onSurfaceVariantDark, + outline = outlineDark, + outlineVariant = outlineVariantDark, + scrim = scrimDark, + inverseSurface = inverseSurfaceDark, + inverseOnSurface = inverseOnSurfaceDark, + inversePrimary = inversePrimaryDark, + surfaceDim = surfaceDimDark, + surfaceBright = surfaceBrightDark, + surfaceContainerLowest = surfaceContainerLowestDark, + surfaceContainerLow = surfaceContainerLowDark, + surfaceContainer = surfaceContainerDark, + surfaceContainerHigh = surfaceContainerHighDark, + surfaceContainerHighest = surfaceContainerHighestDark, ) @Composable fun TripMoneyTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, + dynamicColor: Boolean = false, content: @Composable () -> Unit ) { val colorScheme = when { @@ -47,8 +101,8 @@ fun TripMoneyTheme( val context = LocalContext.current if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) } - darkTheme -> DarkColorScheme - else -> LightColorScheme + darkTheme -> darkScheme + else -> lightScheme } MaterialTheme( diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt new file mode 100644 index 0000000..7449ef9 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt @@ -0,0 +1,9 @@ +package cc.n0th1ng.tripmoney.utils + +import android.content.res.Configuration.UI_MODE_NIGHT_YES +import android.content.res.Configuration.UI_MODE_TYPE_NORMAL +import androidx.compose.ui.tooling.preview.Preview + +@Preview(name = "Light") +@Preview(name = "Dark", uiMode = UI_MODE_NIGHT_YES or UI_MODE_TYPE_NORMAL) +annotation class AllPreviews \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt index b557c93..ab756af 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt @@ -1,25 +1,31 @@ package cc.n0th1ng.tripmoney.utils -enum class Colors(val hexString: String) { - RED("#D53E0F"), - PINK("#FF69B4"), - ORANGE("#FF8C00"), - YELLOW("#FFD700"), - LIME("#32CD32"), - GREEN("#228B22"), - MINT("#98FB98"), - TEAL("#008080"), - CYAN("#00CED1"), - SKY_BLUE("#1E90FF"), - BLUE("#0000FF"), - LAVENDER("#8A2BE2"), - LILAC("#C8A2C8"), - PURPLE("#800080"), - MAUVE("#D8BFD8"), - MAGENTA("#FF00FF"), - VIOLET("#9400D3"), - INDIGO("#4B0082"), - PERIWINKLE("#8A2BE2"), - GRAY("#696969"); -} +val colors: List = listOf( + "#af1b3f", + "#083D77", + "#5998c5", + "#f7934c", + "#ec0b43", + "#87A330", + "#6F8AB7", + "#F26CA7", + "#5E4AE3", + "#2A7F62", + "#0B7189" +) +// GREEN("#228B22"), +// MINT("#98FB98"), +// TEAL("#008080"), +// CYAN("#00CED1"), +// SKY_BLUE("#1E90FF"), +// BLUE("#0000FF"), +// LAVENDER("#8A2BE2"), +// LILAC("#C8A2C8"), +// PURPLE("#800080"), +// MAUVE("#D8BFD8"), +// MAGENTA("#FF00FF"), +// VIOLET("#9400D3"), +// INDIGO("#4B0082"), +// PERIWINKLE("#8A2BE2"); +//} diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index de1ea28..6153d1f 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -1,35 +1,39 @@ package cc.n0th1ng.tripmoney.viewmodel +import android.os.Build +import androidx.annotation.RequiresApi import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn +import androidx.paging.map +import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.data.repository.CategoryRepository import cc.n0th1ng.tripmoney.data.repository.ExchangeRateRepository import cc.n0th1ng.tripmoney.data.repository.ExpenseRepository -import cc.n0th1ng.tripmoney.service.ExchangeService +import cc.n0th1ng.tripmoney.data.repository.TripRepository import cc.n0th1ng.tripmoney.utils.Currencies import dagger.hilt.android.lifecycle.HiltViewModel -import io.ktor.client.request.get import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import java.time.LocalDate +import kotlinx.coroutines.runBlocking +import java.time.LocalDateTime import javax.inject.Inject @HiltViewModel -class ExpenseAndCategoryViewModel @Inject constructor( +open class ExpenseAndCategoryViewModel @Inject constructor( private val expenseRepo: ExpenseRepository, private val categoryRepo: CategoryRepository, - private val exchangeRateRepository: ExchangeRateRepository + private val exchangeRateRepository: ExchangeRateRepository, + private val tripRepo: TripRepository ) : ViewModel() { fun getExpenses(tripId: Int): Flow> = - expenseRepo.getExpenses(tripId).cachedIn(viewModelScope) + expenseRepo.getExpensesPaged(tripId).cachedIn(viewModelScope) fun save(expense: Expense) { viewModelScope.launch { @@ -51,9 +55,81 @@ class ExpenseAndCategoryViewModel @Inject constructor( } } - fun convertAmount(amount: Double, base: Currencies, target: Currencies, date: LocalDate): Flow { - return flow { - emit(amount * exchangeRateRepository.getRate(base, target, date)) + @RequiresApi(Build.VERSION_CODES.O) + fun getSummaryPerCategory(tripId: Int): Flow> { + val tripCurrency = tripRepo.getTrip(tripId)?.currency ?: Currencies.default().name + return getExpensesWithConvertedAmounts(tripId) + .map { list -> + // Compute summary + val sumOfAll = list.sumOf { it.convertedAmount } + list.groupBy { it.expenseDto.category } + .map { (category, expenses) -> + val total = expenses.sumOf { it.convertedAmount } + SummaryPerCategory( + category = category, + amount = total, + percent = (total / sumOfAll).toFloat(), + currency = Currencies.valueOf(tripCurrency) + ) + }.sortedBy { it.percent }.reversed() + } + } + + + @RequiresApi(Build.VERSION_CODES.O) + fun getExpensesWithConvertedAmounts(tripId: Int): Flow> { + return expenseRepo.getExpenses(tripId) + .map { list -> + list.map { expenseDto -> + val convertedAmount = + if (expenseDto.expense.currency != expenseDto.trip.currency) { + runBlocking { + expenseDto.toExpenseDtoWithConvertedAmount() + } + } else { + expenseDto.expense.amount + } + ExpenseDtoWithConvertedAmount(expenseDto, convertedAmount) + } + } + } + + @RequiresApi(Build.VERSION_CODES.O) + fun getExpensesWithConvertedAmountsPaged(tripId: Int): Flow> { + return expenseRepo.getExpensesPaged(tripId) + .map { pagingData -> + pagingData.map { expenseDto -> + val convertedAmount = + if (expenseDto.expense.currency != expenseDto.trip.currency) { + runBlocking { + expenseDto.toExpenseDtoWithConvertedAmount() + } + } else { + expenseDto.expense.amount + } + ExpenseDtoWithConvertedAmount(expenseDto, convertedAmount) + } + } + } + + @RequiresApi(Build.VERSION_CODES.O) + fun clearOldRates() { + viewModelScope.launch { + exchangeRateRepository.clearOldRates() } } + + @RequiresApi(Build.VERSION_CODES.O) + suspend fun ExpenseDto.toExpenseDtoWithConvertedAmount(): Double { + return exchangeRateRepository.getRate( + Currencies.valueOf(this.expense.currency), + Currencies.valueOf(this.trip.currency), + LocalDateTime.parse(this.expense.datetime).toLocalDate() + ) * this.expense.amount + } + + data class ExpenseDtoWithConvertedAmount( + val expenseDto: ExpenseDto, + val convertedAmount: Double + ) } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt index 650e055..e7da36e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import cc.n0th1ng.tripmoney.data.repository.AppTheme import cc.n0th1ng.tripmoney.data.repository.PreferencesRepository +import cc.n0th1ng.tripmoney.utils.Currencies import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.SharingStarted @@ -35,6 +36,17 @@ class SettingsViewModel @Inject constructor( -1 ) + val defaultCurrency = repo.defaultCurrencyFlow.stateIn( + viewModelScope, SharingStarted.WhileSubscribed(5000), + Currencies.default() + ) + + fun setDefaultCurrency(currency: Currencies) { + viewModelScope.launch { + repo.saveDefaultCurrency(currency) + } + } + fun setCurrentTrip(tripId: Int) { viewModelScope.launch { repo.saveCurrentTrip(tripId) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt index 3686396..fdf9ce6 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt @@ -18,6 +18,8 @@ class TripViewModel @Inject constructor(private val repository: TripRepository) fun getTrips(): Flow> = repository.getTrips().cachedIn(viewModelScope) + fun getTrip(tripId: Int): Trip? = repository.getTrip(tripId) + fun delete(trip: Trip) { viewModelScope.launch { repository.delete(trip) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 130d879..508d84a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -20,4 +20,5 @@ Nazwa Edytuj wycieczkę Edytuj wydatek + Domyślna waluta \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 82d1395..f487f89 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,4 +20,5 @@ Name Edit trip Edit expense + Default currency \ No newline at end of file From 160dda3bff6c656b005425f537a6774eac4b5681 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Wed, 25 Mar 2026 14:49:02 +0100 Subject: [PATCH 06/18] init --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 10 + .../navigation/CustomNavigationDrawer.kt | 11 +- .../cc/n0th1ng/tripmoney/navigation/TopBar.kt | 3 +- .../addexpense/AddExpenseBottomSheet.kt | 696 +++++++++--------- .../screens/listexpense/ListExpenseScreen.kt | 5 +- .../screens/settings/SettingsScreen.kt | 210 ++++-- .../screens/statistics/StatisticsScreen.kt | 140 +++- .../screens/trippicker/AddTripBottomSheet.kt | 94 ++- .../cc/n0th1ng/tripmoney/utils/AllPreviews.kt | 11 + .../cc/n0th1ng/tripmoney/utils/CSVUtils.kt | 30 + .../viewmodel/ExpenseAndCategoryViewModel.kt | 40 +- app/src/main/res/values-pl/strings.xml | 6 + app/src/main/res/values/strings.xml | 6 + app/src/main/res/xml/file_paths.xml | 4 + 15 files changed, 818 insertions(+), 449 deletions(-) create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/utils/CSVUtils.kt create mode 100644 app/src/main/res/xml/file_paths.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4ec2c5c..c485d7d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -102,4 +102,5 @@ dependencies { implementation("io.ktor:ktor-client-core:3.4.1") implementation("io.ktor:ktor-client-okhttp:3.4.1") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.10.0") + implementation("org.apache.commons:commons-csv:1.5") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0ad5229..e16262c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt index fe912c8..3ff77a1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import cc.n0th1ng.tripmoney.R.string import com.composables.icons.materialsymbols.outlined.R import kotlinx.coroutines.launch @@ -32,7 +33,7 @@ fun CustomNavigationDrawer( Text("Trip Money", modifier = Modifier.padding(16.dp)) HorizontalDivider() NavigationDrawerItem( - label = { Text(text = "Pick trip") }, + label = { Text(text = stringResource(string.pick_trip)) }, selected = false, onClick = { navController.navigate(Screens.TRIP_PICKER) @@ -48,7 +49,7 @@ fun CustomNavigationDrawer( ) }) NavigationDrawerItem( - label = { Text(text = "List of expenses") }, + label = { Text(text = stringResource(string.list_of_expenses)) }, selected = false, onClick = { navController.navigate(Screens.LIST_EXPENSE) @@ -64,7 +65,7 @@ fun CustomNavigationDrawer( ) }) NavigationDrawerItem( - label = { Text(text = "Statistics") }, + label = { Text(text = stringResource(string.statistics)) }, selected = false, onClick = { navController.navigate(Screens.STATISTICS) @@ -80,7 +81,7 @@ fun CustomNavigationDrawer( ) }) NavigationDrawerItem( - label = { Text(text = "Settings") }, + label = { Text(text = stringResource(string.settings)) }, selected = false, onClick = { navController.navigate(Screens.SETTINGS) @@ -88,7 +89,7 @@ fun CustomNavigationDrawer( drawerState.close() } }, - icon = { Icon(Icons.Default.Settings, contentDescription = "settings") } + icon = { Icon(Icons.Default.Settings, contentDescription = stringResource(string.settings)) } ) } }) { content() } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt index 5c2a69a..fe8eb9e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.navigation.NavHostController +import cc.n0th1ng.tripmoney.R @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -31,7 +32,7 @@ fun TopBar(onClick: () -> Unit, title: String = "") { fun TopBarSettings(navController: NavHostController) { TopAppBar( - title = { Text("Settings") }, + title = { Text(stringResource(R.string.settings)) }, navigationIcon = { IconButton(onClick = { navController.popBackStack() }) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back") diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index 7e0e350..c1802d6 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -1,6 +1,7 @@ package cc.n0th1ng.tripmoney.screens.addexpense import android.annotation.SuppressLint +import android.graphics.drawable.PaintDrawable import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.foundation.clickable @@ -21,9 +22,14 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Check +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DividerDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField @@ -34,6 +40,7 @@ import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableDoubleStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -42,10 +49,13 @@ 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.graphics.painter.Painter import androidx.compose.ui.layout.ModifierLocalBeyondBoundsLayout +import androidx.compose.ui.modifier.modifierLocalMapOf import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.sensitiveContent import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType @@ -59,21 +69,24 @@ import cc.n0th1ng.tripmoney.R import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto +import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.listexpense.CategorySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.DateTimePicker import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies +import cc.n0th1ng.tripmoney.utils.colors import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel +import com.composables.icons.materialsymbols.outlined.R.drawable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.time.LocalDateTime import java.time.format.DateTimeFormatter - - +import kotlin.collections.listOf @OptIn(ExperimentalMaterial3Api::class) @RequiresApi(Build.VERSION_CODES.O) @@ -88,23 +101,48 @@ fun AddExpenseBottomSheet( val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() - val currentTrip = tripViewModel.getTrip(currentTripId) + val currentTrip = tripViewModel.getTrip(currentTripId)!! val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) + AddExpenseBottomSheet( + onSave = onSave, + onDismiss = onDismiss, + expenseDtoToEdit = expenseDtoToEdit, + state = state, + currentTrip = currentTrip, + categories = categories + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun AddExpenseBottomSheet( + onSave: (Expense) -> Unit, + onDismiss: () -> Unit, + expenseDtoToEdit: ExpenseDto?, + state: SheetState, + currentTrip: Trip, + categories: List +) { + val currentTripId = currentTrip.id + if (categories.isEmpty()) { return } + var amount by remember { mutableStateOf( expenseDtoToEdit?.expense?.amount?.toString() ?: "0.00" ) } + var equationResult by remember { mutableDoubleStateOf(0.0) } val dummyFocusRequester = remember { FocusRequester() } var showCurrencyDialog by remember { mutableStateOf(false) } var showCategoryDialog by remember { mutableStateOf(false) } var showDateTimePicker by remember { mutableStateOf(false) } var currency by remember { mutableStateOf( - expenseDtoToEdit?.expense?.currency ?: currentTrip?.currency ?: Currencies.default().name + expenseDtoToEdit?.expense?.currency ?: currentTrip.currency ) } var category by remember { mutableStateOf(expenseDtoToEdit?.category ?: categories[0]) } @@ -122,6 +160,8 @@ fun AddExpenseBottomSheet( ModalBottomSheet( onDismissRequest = onDismiss, sheetState = state, + containerColor = MaterialTheme.colorScheme.surfaceContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer ) { Column( modifier = Modifier @@ -135,96 +175,127 @@ fun AddExpenseBottomSheet( .fillMaxWidth() .padding(start = 15.dp), text = stringResource(if (expenseDtoToEdit == null) R.string.add_expense else R.string.edit_expense), - fontWeight = FontWeight.Bold, - fontSize = 35.sp, + style = MaterialTheme.typography.displaySmall, textAlign = TextAlign.Start ) - HorizontalDivider(modifier = Modifier.fillMaxWidth()) - Row( - modifier = Modifier.fillMaxWidth(0.9f), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween + HorizontalDivider( + modifier = Modifier.fillMaxWidth(), + color = MaterialTheme.colorScheme.onSecondaryContainer + ) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp), + modifier = Modifier.padding(10.dp) ) { - Text( - text = amount.ifEmpty { "0.00" }, - fontSize = 25.sp, - fontWeight = FontWeight.Bold - ) - CurrencyButton(onClick = { showCurrencyDialog = true }, text = currency) - } - Row( - modifier = Modifier.fillMaxWidth(0.9f), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(10.dp) - ) { - OutlinedButton( - onClick = { showDateTimePicker = true }, - modifier = Modifier.weight(1f) + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween ) { - Text( - text = datetime.format(DateTimeFormatter.ofPattern("dd.MM HH:mm")), - fontSize = 17.sp - ) + Column{ + Text( + text = amount.ifEmpty { "0.00" }, + fontSize = 25.sp, + fontWeight = FontWeight.Bold + ) + Text( + text = if(amount.contains(Regex("[+\\/*-]\\d+"))) "%.2f".format(equationResult) else "", + fontSize = 14.sp, + ) + } + CurrencyButton(onClick = { showCurrencyDialog = true }, text = currency) } - CategoryButton( - onClick = { showCategoryDialog = true }, - category = category, - modifier = Modifier.weight(1f) + Box( + modifier = Modifier + .size(0.dp) + .focusRequester(dummyFocusRequester) + .focusable() ) - - } - Row( - verticalAlignment = Alignment.CenterVertically, - ) { NoteInput( note = note, onTextChange = { newNote -> note = newNote }, - modifier = Modifier.fillMaxWidth(0.9f), + modifier = Modifier.fillMaxWidth(), focusRequester = dummyFocusRequester ) - } + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Button( + onClick = { showDateTimePicker = true }, + modifier = Modifier.weight(1f), + shape = MaterialTheme.shapes.medium, - Box( - modifier = Modifier - .size(0.dp) - .focusRequester(dummyFocusRequester) - .focusable() - ) - NumberKeyboard( - onNumberClick = { number -> - val newText = (if (amount == "0.00") "" else amount) + number - if (newText.isDoubleTwoDigitsAboveZero()) { - amount = newText - enableSave = true - } else if (amount == "0.00") { - enableSave = false + ) { + Text( + text = datetime.format(DateTimeFormatter.ofPattern("dd.MM HH:mm")), + fontSize = 17.sp + ) } - dummyFocusRequester.requestFocus() - }, - onBackspaceClick = { - if (amount == "0.00") return@NumberKeyboard - amount = amount.safeSubstring(0, amount.length - 1) - enableSave = amount.isDoubleTwoDigitsAboveZero() - }, - onSave = { - val expenseToSave = Expense( - amount = amount.toDouble(), - currency = currency, - note = note, - datetime = datetime.toString(), - categoryId = category.id, - tripId = currentTripId + CategoryButton( + onClick = { showCategoryDialog = true }, + category = category, + modifier = Modifier.weight(1f) ) - onSave( - if (expenseDtoToEdit == null) expenseToSave - else expenseToSave.copy(id = expenseDtoToEdit.expense.id) - ) - }, enableSave = enableSave - ) + } + + NumberKeyboard( + modifier = Modifier.fillMaxWidth(), + onOperatorClick = { operator -> + if(amount.isDoubleTwoDigitsOrEquation() && amount.contains(Regex("[+\\/*-]\\d+"))) { + amount = evaluate(amount).toString() +// equationResult = 0.0 + } + val newText = amount + operator + if(newText.isDoubleTwoDigitsOrEquation()) { + amount = newText + enableSave = false + } + }, + onNumberClick = { number -> + val newText = (if (amount == "0.00") "" else amount) + number + if (newText.isDoubleTwoDigitsOrEquation()) { + amount = newText + equationResult = evaluate(amount) + enableSave = equationResult > 0 + } else if (amount == "0.00") { + enableSave = false + } + dummyFocusRequester.requestFocus() + }, + onBackspaceClick = { + if (amount == "0.00") return@NumberKeyboard + amount = amount.safeSubstring(0, amount.length - 1) + enableSave = amount.isDoubleTwoDigitsOrEquation() + equationResult = evaluate(amount) + enableSave = amount.isDoubleTwoDigitsOrEquation() && equationResult > 0 + }, + ) + + SaveButton( + modifier = Modifier.fillMaxWidth(), + enabled = enableSave, + onClick = { + val expenseToSave = Expense( + amount = equationResult, + currency = currency, + note = note, + datetime = datetime.toString(), + categoryId = category.id, + tripId = currentTripId + ) + onSave( + if (expenseDtoToEdit == null) expenseToSave + else expenseToSave.copy(id = expenseDtoToEdit.expense.id) + ) + }) + } } } + if (showDateTimePicker) { DateTimePicker(datetime, onChange = { newDateTime -> datetime = newDateTime @@ -264,12 +335,50 @@ fun String.safeSubstring(start: Int, end: Int): String { } } -fun String.isDoubleTwoDigitsAboveZero(): Boolean { - return this.toDoubleOrNull() != null && this.matches(Regex("^\\d*(\\.\\d{0,2})?$")) && this.toDouble() > 0 +private fun evaluate(equation: String): Double { + if (equation.isEmpty()) return 0.0 + + val operatorIndex = equation.indexOfFirstIndexed { i, c -> + i != 0 && c in "+-*/" + } + + if (operatorIndex == -1) return equation.toDouble() + + val leftString = equation.substring(0, operatorIndex) + val rightString = equation.substring(operatorIndex + 1) + + if (leftString.isEmpty() || rightString.isEmpty()) return 0.0 + + val left = leftString.toDouble() + val right = rightString.toDouble() + + return when (equation[operatorIndex]) { + '+' -> left + right + '-' -> left - right + '*' -> left * right + '/' -> left / right + else -> 0.0 + } +} + +private inline fun String.indexOfFirstIndexed(predicate: (index: Int, Char) -> Boolean): Int { + for (i in indices) { + if (predicate(i, this[i])) return i + } + return -1 +} + +private fun String.isDoubleTwoDigitsOrEquation(): Boolean { + return this != "0.00" && this.matches(Regex("^(-?(0\\.?|0\\.\\d{1,2}|[1-9]\\d*(\\.\\d{0,2})?))([+\\/*-](0\\.?|0\\.\\d{1,2}|[1-9]\\d*(\\.\\d{0,2})?)?)?$")) } @Composable -fun NoteInput(note: String, onTextChange: (String) -> Unit, modifier: Modifier = Modifier, focusRequester: FocusRequester) { +fun NoteInput( + note: String, + onTextChange: (String) -> Unit, + modifier: Modifier = Modifier, + focusRequester: FocusRequester +) { var text by remember { mutableStateOf(note) } OutlinedTextField( @@ -292,33 +401,36 @@ fun NoteInput(note: String, onTextChange: (String) -> Unit, modifier: Modifier = @Composable fun CurrencyButton(modifier: Modifier = Modifier, onClick: () -> Unit, text: String) { - OutlinedButton(onClick = onClick, modifier = modifier) { + Button(onClick = onClick, modifier = modifier, shape = MaterialTheme.shapes.medium) { Text(text) } } @Composable fun CategoryButton(onClick: () -> Unit, category: Category, modifier: Modifier = Modifier) { - OutlinedButton( + Button( onClick = onClick, - modifier = modifier + modifier = modifier, + shape = MaterialTheme.shapes.medium, + colors = ButtonDefaults.buttonColors() + .copy(containerColor = Color(category.color.toColorInt()), contentColor = Color.Black) ) { Icon( modifier = Modifier.padding(end = 10.dp), painter = painterResource(category.icon.resource), contentDescription = stringResource(R.string.category), - tint = Color(category.color.toColorInt()) ) - Text(category.name, color = Color(category.color.toColorInt())) + Text(category.name) } } @Composable -fun SaveButton(enabled: Boolean, onClick: () -> Unit) { - OutlinedButton( +fun SaveButton(modifier: Modifier = Modifier, enabled: Boolean, onClick: () -> Unit) { + Button( onClick = onClick, enabled = enabled, - modifier = Modifier + modifier = modifier, + shape = MaterialTheme.shapes.medium ) { Icon( imageVector = Icons.Filled.Check, @@ -332,273 +444,171 @@ fun NumberKeyboard( modifier: Modifier = Modifier, onNumberClick: (String) -> Unit, onBackspaceClick: () -> Unit, - onSave: () -> Unit, - enableSave: Boolean + onOperatorClick: (String) -> Unit ) { - val buttonModifier = Modifier - .padding(4.dp) - .aspectRatio(2f) - Column( modifier = modifier, verticalArrangement = Arrangement.spacedBy(4.dp) ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(4.dp) - ) { - TextButton( - onClick = { onNumberClick("1") }, - modifier = buttonModifier.weight(1f) + keyboard.forEach { row -> + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - Text("1", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("2") }, - modifier = buttonModifier.weight(1f) - ) { - Text("2", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("3") }, - modifier = buttonModifier.weight(1f) - ) { - Text("3", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("") }, - modifier = buttonModifier.weight(1f) - ) { - Text("+", fontSize = 20.sp) - } - } + row.forEach { key -> + when (key) { + "backspace" -> KeyboardButton( + icon = painterResource(drawable.materialsymbols_ic_arrow_left_alt_outlined), + onClick = onBackspaceClick, + modifier = Modifier.weight(1f), + containerColor = MaterialTheme.colorScheme.primary + ) - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(4.dp) - ) { - TextButton( - onClick = { onNumberClick("4") }, - modifier = buttonModifier.weight(1f) - ) { - Text("4", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("5") }, - modifier = buttonModifier.weight(1f) - ) { - Text("5", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("6") }, - modifier = buttonModifier.weight(1f) - ) { - Text("6", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("") }, - modifier = buttonModifier.weight(1f) - ) { - Text("-", fontSize = 20.sp) - } - } + "+", "/", "-", "*" -> KeyboardButton( + text = key, + onClick = { onOperatorClick(key) }, + modifier = Modifier.weight(1f), + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(4.dp) - ) { - TextButton( - onClick = { onNumberClick("7") }, - modifier = buttonModifier.weight(1f) - ) { - Text("7", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("8") }, - modifier = buttonModifier.weight(1f) - ) { - Text("8", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("9") }, - modifier = buttonModifier.weight(1f) - ) { - Text("9", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("") }, - modifier = buttonModifier.weight(1f) - ) { - Text("*", fontSize = 20.sp) - } - } - - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(4.dp) - ) { - TextButton( - onClick = { onNumberClick(".") }, - modifier = buttonModifier.weight(1f) - ) { - Text(".", fontSize = 20.sp) - } - TextButton( - onClick = { onNumberClick("0") }, - modifier = buttonModifier.weight(1f) - ) { - Text("0", fontSize = 20.sp) - } - TextButton( - onClick = onBackspaceClick, - modifier = buttonModifier.weight(1f) - ) { - Icon( - imageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = stringResource(R.string.backspace) - ) - } - TextButton( - onClick = onSave, - modifier = buttonModifier.weight(1f), - enabled = enableSave - ) { - Icon( - imageVector = Icons.Default.Check, - contentDescription = stringResource(R.string.backspace) - ) + else -> KeyboardButton( + text = key, + onClick = { onNumberClick(key) }, + modifier = Modifier.weight(1f), + containerColor = MaterialTheme.colorScheme.secondary, + contentColor = MaterialTheme.colorScheme.onSecondary + ) + } + } } } } } +@Composable +fun KeyboardButton( + text: String? = null, + icon: Painter? = null, + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + containerColor: Color = MaterialTheme.colorScheme.primary, + contentColor: Color = MaterialTheme.colorScheme.onPrimary +) { + Button( + onClick = onClick, + shape = MaterialTheme.shapes.medium, + modifier = modifier + .padding(4.dp) + .aspectRatio(2.5f), + enabled = enabled, + colors = ButtonDefaults.buttonColors( + containerColor = containerColor, + contentColor = contentColor + ) + ) { + when { + text != null -> Text( + text, + style = MaterialTheme.typography.titleMedium + ) -//@SuppressLint("CoroutineCreationDuringComposition") -//@RequiresApi(Build.VERSION_CODES.O) -//@OptIn(ExperimentalMaterial3Api::class) -//@Preview -//@Composable -//fun PreviewLight() { -// val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) -// CoroutineScope(Dispatchers.IO).launch { -// sheetState.show() -// } -// -// TripMoneyTheme { -// AddExpenseBottomSheet( -// {}, {}, null, sheetState, -// categories = listOf( -// Category( -// name = "Hotel", -// icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, -// color = "#B3E5FC" -// ), -// Category( -// name = "Jedzenie", -// icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, -// color = "#C8E6C9" -// ), -// Category( -// name = "Transport", -// icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, -// color = "#FFCDD2" -// ), -// Category( -// name = "Rozrywka", -// icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, -// color = "#FFF9C4" -// ), -// Category( -// name = "Zakupy", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#E1BEE7" -// ), -// Category( -// name = "Zakupy1", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#D7CCC8" -// ), -// Category( -// name = "Zakupy2", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#BBDEFB" -// ), -// Category( -// name = "Zakupy3", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#D1C4E9" -// ), -// Category( -// name = "Zakupy4", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#DCEDC8" -// ), -// ) -// ) -// } -//} -// -//@SuppressLint("CoroutineCreationDuringComposition") -//@RequiresApi(Build.VERSION_CODES.O) -//@OptIn(ExperimentalMaterial3Api::class) -//@Preview -//@Composable -//fun PreviewDark() { -// val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) -// CoroutineScope(Dispatchers.IO).launch { -// sheetState.show() -// } -// -// TripMoneyTheme(darkTheme = true) { -// AddExpenseBottomSheet( -// {}, {}, null, sheetState, -// categories = listOf( -// Category( -// name = "Hotel", -// icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, -// color = "#B3E5FC" -// ), -// Category( -// name = "Jedzenie", -// icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, -// color = "#C8E6C9" -// ), -// Category( -// name = "Transport", -// icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, -// color = "#FFCDD2" -// ), -// Category( -// name = "Rozrywka", -// icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, -// color = "#FFF9C4" -// ), -// Category( -// name = "Zakupy", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#E1BEE7" -// ), -// Category( -// name = "Zakupy1", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#D7CCC8" -// ), -// Category( -// name = "Zakupy2", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#BBDEFB" -// ), -// Category( -// name = "Zakupy3", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#D1C4E9" -// ), -// Category( -// name = "Zakupy4", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = "#DCEDC8" -// ), -// ) -// ) -// } -//} \ No newline at end of file + icon != null -> Icon(painter = icon, contentDescription = null) + } + } +} + +val keyboard = listOf( + listOf("+", "-", "*", "/"), + listOf("1", "2", "3"), + listOf("4", "5", "6"), + listOf("7", "8", "9"), + listOf(".", "0", "backspace") +) + + +@SuppressLint("CoroutineCreationDuringComposition") +@RequiresApi(Build.VERSION_CODES.O) +@OptIn(ExperimentalMaterial3Api::class) +@AllPreviews +@Composable +fun PreviewAddExpenseDisabled() { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + CoroutineScope(Dispatchers.IO).launch { + sheetState.show() + } + + TripMoneyTheme { + AddExpenseBottomSheet( + onSave = {}, + onDismiss = {}, + expenseDtoToEdit = null, + state = sheetState, + currentTrip = Trip(1, "Trip", "2020-01-01", Currencies.entries.random().name), + categories = categoriesToPreview + ) + } + +} + +@SuppressLint("CoroutineCreationDuringComposition") +@RequiresApi(Build.VERSION_CODES.O) +@OptIn(ExperimentalMaterial3Api::class) +@AllPreviews +@Composable +fun PreviewAddExpenseEnabled() { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + CoroutineScope(Dispatchers.IO).launch { + sheetState.show() + } + + TripMoneyTheme { + AddExpenseBottomSheet( + onSave = {}, + onDismiss = {}, + expenseDtoToEdit = ExpenseDto( + Expense( + amount = 10.31, + currency = "PLN", + note = "some note", + datetime = "2025-11-30T10:16:26.939", + categoryId = 1, + tripId = 1 + ), category = categoriesToPreview.get(0), Trip(1, "Włochy", "2025-01-02", "PLN") + ), + state = sheetState, + currentTrip = Trip(1, "Trip", "2020-01-01", Currencies.entries.random().name), + categories = categoriesToPreview + ) + } + +} + +val categoriesToPreview = listOf( + Category( + name = "Hotel", + icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, + color = colors.random() + ), + Category( + name = "Jedzenie", + icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, + color = colors.random() + ), + Category( + name = "Transport", + icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, + color = colors.random() + ), + Category( + name = "Rozrywka", + icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, + color = colors.random() + ), + Category( + name = "Zakupy", + icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, + color = colors.random() + ), +) \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index a875eb1..d126310 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -50,9 +50,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.paging.PagingData @@ -126,7 +124,6 @@ fun ListExpenseScreen( sumMap.clear() sumMap.putAll(newSums) } - LazyColumn( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, @@ -513,4 +510,4 @@ private fun sampleExpenseDtoWithConvertedAmountList(): List Unit, + onCurrencySave: (Currencies) -> Unit, + tripName: String, + onExportToCsv: () -> Unit, +) { + + Scaffold { padding -> + var showThemeDialog by remember { mutableStateOf(false) } + var showCurrencyDialog by remember { mutableStateOf(false) } + Column( + modifier = Modifier + .fillMaxWidth() + .padding(15.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { SettingsListItem( onClick = { showCurrencyDialog = true }, - stringResource(string.default_currency) - ) { - Text(currentDefaultCurrency.name) - } - } - - if (showThemeDialog) { - ThemeSelectionDialog( - onDismiss = { showThemeDialog = false }, - onThemeSelected = { theme -> - settingsViewModel.setTheme(theme) - showThemeDialog = false - }, - selected = currentTheme + headlineText = stringResource(string.default_currency), + supportingText = currentDefaultCurrency.name, + iconResource = R.drawable.materialsymbols_ic_currency_yen_outlined ) - } - if (showCurrencyDialog) { - CurrencySelectionDialog(onDismiss = {showCurrencyDialog = false}, onCurrencySelected = { - currencyString -> - settingsViewModel.setDefaultCurrency(Currencies.valueOf(currencyString)) - showCurrencyDialog = false - }, currentDefaultCurrency.name) + SettingsCard(string.theme) { + SettingsListItem( + onClick = { showThemeDialog = true }, + stringResource(string.theme), + supportingText = if (isSystemInDarkTheme()) stringResource(string.dark_theme) else stringResource( + string.light_theme + ), + iconResource = R.drawable.materialsymbols_ic_format_paint_outlined + ) + SettingsListItem( + onClick = { }, + "Pallete", + supportingText = if (isSystemInDarkTheme()) stringResource(string.dark_theme) else stringResource( + string.light_theme + ), + iconResource = R.drawable.materialsymbols_ic_palette_outlined + ) + } + SettingsListItem( + onClick = onExportToCsv, + stringResource(string.export_to_csv), + supportingText = "Save expenses from %s to a file".format(tripName), + iconResource = R.drawable.materialsymbols_ic_csv_outlined + ) + + if (showThemeDialog) { + ThemeSelectionDialog( + onDismiss = { showThemeDialog = false }, + onThemeSelected = { theme -> + onThemeSave(theme) + showThemeDialog = false + }, + selected = currentTheme + ) + } + + if (showCurrencyDialog) { + CurrencySelectionDialog( + onDismiss = { showCurrencyDialog = false }, + onCurrencySelected = { currencyString -> + onCurrencySave(Currencies.valueOf(currencyString)) + showCurrencyDialog = false + }, + currentDefaultCurrency.name + ) + } } } } @@ -97,7 +176,7 @@ fun SettingsCard(@StringRes title: Int = -1, content: @Composable () -> Unit) { if (title != -1) { Text( text = stringResource(title), - fontSize = 13.sp, + style = MaterialTheme.typography.titleSmall, modifier = Modifier .padding(start = 15.dp, top = 15.dp, end = 15.dp) .alpha(0.6f) @@ -112,16 +191,22 @@ fun SettingsListItem( onClick: () -> Unit, headlineText: String, trailingContent: @Composable () -> Unit = {}, - supportingContent: @Composable () -> Unit + supportingText: String, + iconResource: Int ) { - ListItem( - colors = ListItemDefaults.colors(containerColor = Color.Transparent), - headlineContent = { Text(headlineText) }, - supportingContent = supportingContent, - trailingContent = trailingContent, - modifier = Modifier - .clickable(true, onClick = onClick) - ) + Card { + ListItem( + leadingContent = { + Icon(painter = painterResource(iconResource), contentDescription = null) + }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + headlineContent = { Text(headlineText) }, + supportingContent = { Text(supportingText) }, + trailingContent = trailingContent, + modifier = Modifier + .clickable(true, onClick = onClick) + ) + } } @Composable @@ -165,4 +250,35 @@ fun ThemeSelectionDialog( }, confirmButton = {} ) +} + +@RequiresApi(Build.VERSION_CODES.S) +@AllPreviews +@Composable +fun PreviewSettingsScreen() { + TripMoneyTheme { + SettingsScreen(Currencies.entries.random(), AppTheme.entries.random(), {}, {}, "Włochy", {}) + } +} + +@RequiresApi(Build.VERSION_CODES.S) +@AllPreviews +@Composable +fun PreviewThemeSelectionDialog() { + TripMoneyTheme { + ThemeSelectionDialog(onDismiss = {}, onThemeSelected = {}, AppTheme.SYSTEM) + } +} + +@RequiresApi(Build.VERSION_CODES.S) +@AllPreviews +@Composable +fun PreviewCurrencySelectionDialog() { + TripMoneyTheme { + CurrencySelectionDialog( + onDismiss = {}, + onCurrencySelected = {}, + selected = Currencies.entries.random().name + ) + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt index 6fb4ebe..cdca6da 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt @@ -7,7 +7,6 @@ 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.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -25,38 +24,97 @@ 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.layout.ModifierLocalBeyondBoundsLayout import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.utils.Icons import cc.n0th1ng.tripmoney.utils.colors import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import cc.n0th1ng.tripmoney.viewmodel.TripViewModel +import com.composables.icons.materialsymbols.outlined.R @RequiresApi(Build.VERSION_CODES.O) @Composable fun StatisticsScreen() { val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val settingsViewModel: SettingsViewModel = hiltViewModel() - val currentTrip by settingsViewModel.currentTrip.collectAsState() - val summaryPerCategoryList by expenseAndCategoryViewModel.getSummaryPerCategory(currentTrip) + val tripViewModel: TripViewModel = hiltViewModel() + val currentTripId by settingsViewModel.currentTrip.collectAsState() + val currentTrip = tripViewModel.getTrip(currentTripId) + val summaryPerCategoryList by expenseAndCategoryViewModel.getSummaryPerCategory(currentTripId) .collectAsState(emptyList()) + val summaryAmount by expenseAndCategoryViewModel.getSummaryAmount(currentTripId) + .collectAsState(0.0) + StatisticsScreen( + summaryPerCategoryList, + summaryAmount, + Currencies.valueOf(currentTrip?.currency ?: Currencies.default().name) + ) +} - Column(modifier = Modifier.padding(10.dp)) { +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun StatisticsScreen( + summaryPerCategoryList: List, + summaryAmount: Double, + tripCurrency: Currencies +) { + Column( + modifier = Modifier + .padding(10.dp) + .fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Summary(summaryAmount, tripCurrency.name) SummaryPerCategoryCard(summaryPerCategoryList) } } +@Composable +fun Summary(summaryAmount: Double, currency: String) { + Card( + modifier = Modifier + .fillMaxWidth() + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(15.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Column { + Text(stringResource(cc.n0th1ng.tripmoney.R.string.total_expenses), style = MaterialTheme.typography.titleSmall) + Text( + "%.2f %s".format(summaryAmount, currency), + style = MaterialTheme.typography.headlineLarge + ) + } + Row( + horizontalArrangement = Arrangement.Center + ) + { + Icon( + painter = painterResource(R.drawable.materialsymbols_ic_payment_arrow_down_outlined), + contentDescription = null, + modifier = Modifier.size(45.dp) + ) + + } + } + + } +} @Composable fun SummaryPerCategoryCard(summaryPerCategoryList: List) { @@ -65,7 +123,6 @@ fun SummaryPerCategoryCard(summaryPerCategoryList: List) { modifier = Modifier.padding(15.dp), verticalArrangement = Arrangement.spacedBy(5.dp) ) { -// Text(text = "Summary", fontWeight = FontWeight.Bold, fontSize = 25.sp) summaryPerCategoryList.forEach { CategoryCard( summaryPerCategory = it, modifier = Modifier @@ -80,21 +137,35 @@ fun SummaryPerCategoryCard(summaryPerCategoryList: List) { fun CategoryCard(modifier: Modifier = Modifier, summaryPerCategory: SummaryPerCategory) { Column(modifier = modifier) { Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { - Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(5.dp)) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(5.dp) + ) { Icon( painter = painterResource(summaryPerCategory.category.icon.resource), contentDescription = null, modifier = Modifier.size(MaterialTheme.typography.bodyLarge.fontSize.value.dp), tint = Color(summaryPerCategory.category.color.toColorInt()) ) - Text("%s".format(summaryPerCategory.category.name, (summaryPerCategory.percent * 100).toInt()), - style = MaterialTheme.typography.bodyLarge, color = Color(summaryPerCategory.category.color.toColorInt())) + Text( + "%s".format( + summaryPerCategory.category.name, + (summaryPerCategory.percent * 100).toInt() + ), + style = MaterialTheme.typography.bodyLarge, + color = Color(summaryPerCategory.category.color.toColorInt()) + ) } - Text("%.2f ${summaryPerCategory.currency}".format(summaryPerCategory.amount), - style = MaterialTheme.typography.bodyMedium) + Text( + "%.2f ${summaryPerCategory.currency}".format(summaryPerCategory.amount), + style = MaterialTheme.typography.bodyMedium + ) } - Row(horizontalArrangement = Arrangement.spacedBy(5.dp), verticalAlignment = Alignment.CenterVertically){ + Row( + horizontalArrangement = Arrangement.spacedBy(5.dp), + verticalAlignment = Alignment.CenterVertically + ) { Box( modifier = Modifier .height(40.dp) @@ -102,31 +173,34 @@ fun CategoryCard(modifier: Modifier = Modifier, summaryPerCategory: SummaryPerCa .clip(RoundedCornerShape(16.dp)) .background(MaterialTheme.colorScheme.primary) ) { - Column(verticalArrangement = Arrangement.Center, modifier = Modifier.fillMaxSize().padding(11.dp)) { - Text("%d%%".format((summaryPerCategory.percent * 100).toInt()), - style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onPrimary) + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(11.dp) + ) { + Text( + "%d%%".format((summaryPerCategory.percent * 100).toInt()), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onPrimary + ) } } -// Text("%d%%".format((summaryPerCategory.percent * 100).toInt()), -// style = MaterialTheme.typography.labelSmall) } } } -@Preview +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews @Composable -fun previewLight() { +fun Preview() { TripMoneyTheme { - SummaryPerCategoryCard(summaryPerCategoryList) - } -} - -@Preview -@Composable -fun previewDark() { - TripMoneyTheme(darkTheme = true) { - SummaryPerCategoryCard(summaryPerCategoryList) + StatisticsScreen( + summaryPerCategoryList, + summaryAmount = 125.24, + Currencies.entries.random() + ) } } @@ -143,8 +217,8 @@ val categories = listOf( val summaryPerCategoryList = listOf( SummaryPerCategory(categories[0], 50.0, 1f, Currencies.PLN), SummaryPerCategory(categories[1], 120.0, 0.3f, Currencies.PLN), + SummaryPerCategory(categories[4], 120.0, 0.3f, Currencies.PLN), SummaryPerCategory(categories[2], 80.0, 0.2f, Currencies.PLN), SummaryPerCategory(categories[3], 50.0, 0.1f, Currencies.PLN), - SummaryPerCategory(categories[4], 120.0, 0.3f, Currencies.PLN), SummaryPerCategory(categories[5], 50.0, 0.0001f, Currencies.PLN), ) \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt index 204e6a1..e4474f1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt @@ -1,5 +1,6 @@ package cc.n0th1ng.tripmoney.screens.trippicker +import android.annotation.SuppressLint import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.foundation.layout.Arrangement @@ -17,12 +18,14 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Shapes import androidx.compose.material3.SheetState import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -44,9 +47,14 @@ import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.addexpense.CurrencyButton import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.DatePicker +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import io.ktor.http.hostIsIp +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.time.LocalDate import java.time.format.DateTimeFormatter @@ -59,6 +67,29 @@ fun AddTripBottomSheet( tripToEdit: Trip?, sheetState: SheetState ) { + val settingsViewModel: SettingsViewModel = hiltViewModel() + val defaultCurrency by settingsViewModel.defaultCurrency.collectAsState() + + AddTripBottomSheet( + onDismiss = onDismiss, + onSave = onSave, + tripToEdit = tripToEdit, + sheetState = sheetState, + defaultCurrency = defaultCurrency + ) +} + + +@RequiresApi(Build.VERSION_CODES.O) +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AddTripBottomSheet( + onDismiss: () -> Unit, + onSave: (Trip) -> Unit, + tripToEdit: Trip?, + sheetState: SheetState, + defaultCurrency: Currencies +) { var name by remember { mutableStateOf(tripToEdit?.name ?: "") } var startDate by remember { @@ -66,8 +97,7 @@ fun AddTripBottomSheet( LocalDate.parse(tripToEdit?.startDate ?: LocalDate.now().toString()) ) } - val settingsViewModel: SettingsViewModel = hiltViewModel() - val defaultCurrency by settingsViewModel.defaultCurrency.collectAsState() + var showCurrencyDialog by remember { mutableStateOf(false) } var showDatePicker by remember { mutableStateOf(false) } var currency by remember { mutableStateOf(tripToEdit?.currency ?: defaultCurrency.name) } @@ -87,7 +117,7 @@ fun AddTripBottomSheet( modifier = Modifier .fillMaxWidth() .padding(start = 15.dp), - text = stringResource(if(tripToEdit == null) R.string.add_trip else R.string.edit_trip), + text = stringResource(if (tripToEdit == null) R.string.add_trip else R.string.edit_trip), fontWeight = FontWeight.Bold, fontSize = 35.sp, textAlign = TextAlign.Start @@ -101,32 +131,35 @@ fun AddTripBottomSheet( modifier = Modifier.fillMaxWidth(0.9f), horizontalArrangement = Arrangement.spacedBy(10.dp) ) { - CurrencyButton( - modifier = Modifier - .weight(1f) - .fillMaxWidth(1f), - onClick = { showCurrencyDialog = true }, text = currency - ) - OutlinedButton( + Button( modifier = Modifier .fillMaxWidth(1f) .weight(1f), + shape = MaterialTheme.shapes.medium, onClick = { showDatePicker = true }) { Text( text = startDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")), fontSize = 17.sp ) } + CurrencyButton( + modifier = Modifier + .weight(1f) + .fillMaxWidth(1f), + onClick = { showCurrencyDialog = true }, text = currency + ) } Button( modifier = Modifier.fillMaxWidth(0.9f), enabled = enableSave, + shape = MaterialTheme.shapes.medium, onClick = { - val trip = Trip(name = name, startDate = startDate.toString(), currency = currency) + val trip = + Trip(name = name, startDate = startDate.toString(), currency = currency) - onSave(if(tripToEdit == null) trip else trip.copy(id = tripToEdit.id)) + onSave(if (tripToEdit == null) trip else trip.copy(id = tripToEdit.id)) }) { Icon( imageVector = Icons.Filled.Check, @@ -166,4 +199,41 @@ fun NameInput(name: String, onTextChange: (String) -> Unit) { onTextChange(text) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) ) +} + + +@RequiresApi(Build.VERSION_CODES.O) +@SuppressLint("CoroutineCreationDuringComposition") +@OptIn(ExperimentalMaterial3Api::class) +@AllPreviews +@Composable +fun PreviewAddTripBottomSheet() { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + CoroutineScope(Dispatchers.IO).launch { + sheetState.show() + } + TripMoneyTheme { + AddTripBottomSheet({}, {}, null, sheetState, defaultCurrency = Currencies.entries.random()) + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@SuppressLint("CoroutineCreationDuringComposition") +@OptIn(ExperimentalMaterial3Api::class) +@AllPreviews +@Composable +fun PreviewAddTripBottomSheetEditTrip() { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + CoroutineScope(Dispatchers.IO).launch { + sheetState.show() + } + TripMoneyTheme { + AddTripBottomSheet( + {}, + {}, + Trip(1, "Włochy", "2025-01-02", "PLN"), + sheetState, + defaultCurrency = Currencies.entries.random() + ) + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt index 7449ef9..b94c7d2 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/AllPreviews.kt @@ -2,7 +2,18 @@ package cc.n0th1ng.tripmoney.utils import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.content.res.Configuration.UI_MODE_TYPE_NORMAL +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import cc.n0th1ng.tripmoney.screens.addexpense.PreviewAddExpenseDisabled +import cc.n0th1ng.tripmoney.screens.addexpense.PreviewAddExpenseEnabled +import cc.n0th1ng.tripmoney.screens.settings.PreviewSettingsScreen +import cc.n0th1ng.tripmoney.screens.settings.SettingsScreen +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme @Preview(name = "Light") @Preview(name = "Dark", uiMode = UI_MODE_NIGHT_YES or UI_MODE_TYPE_NORMAL) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/CSVUtils.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/CSVUtils.kt new file mode 100644 index 0000000..e3e03f5 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/CSVUtils.kt @@ -0,0 +1,30 @@ +package cc.n0th1ng.tripmoney.utils + +import android.content.Context +import android.content.Intent +import androidx.core.content.FileProvider +import java.io.File + +fun saveCsv(context: Context, fileName: String, content: String): File { + val file = File(context.cacheDir, "$fileName.csv") + file.writeText(content) + return file +} + +fun shareCsv(context: Context, file: File) { + val uri = FileProvider.getUriForFile( + context, + "${context.packageName}.provider", + file + ) + + val intent = Intent(Intent.ACTION_SEND).apply { + type = "text/csv" + putExtra(Intent.EXTRA_STREAM, uri) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + + context.startActivity( + Intent.createChooser(intent, "Share CSV") + ) +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index 6153d1f..2ab88d2 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -18,12 +18,17 @@ import cc.n0th1ng.tripmoney.data.repository.TripRepository import cc.n0th1ng.tripmoney.utils.Currencies import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import org.apache.commons.csv.CSVFormat +import org.apache.commons.csv.CSVPrinter +import java.io.File import java.time.LocalDateTime import javax.inject.Inject + @HiltViewModel open class ExpenseAndCategoryViewModel @Inject constructor( private val expenseRepo: ExpenseRepository, @@ -55,12 +60,39 @@ open class ExpenseAndCategoryViewModel @Inject constructor( } } + @RequiresApi(Build.VERSION_CODES.O) + suspend fun generateCSVToFile(tripId: Int, file: File) { + file.writer().use { writer -> + CSVPrinter( + writer, + CSVFormat.DEFAULT.withHeader("date", "category", "currency", "amount") + ).use { printer -> + expenseRepo.getExpenses(tripId).first().forEach { expenseDto -> + printer.printRecord( + expenseDto.expense.datetime, + expenseDto.category.name, + expenseDto.expense.currency, + expenseDto.expense.amount + ) + + } + } + } + } + + + @RequiresApi(Build.VERSION_CODES.O) + fun getSummaryAmount(tripId: Int): Flow { + return getExpensesWithConvertedAmounts(tripId).map { list -> + list.sumOf { it.convertedAmount } + } + } + @RequiresApi(Build.VERSION_CODES.O) fun getSummaryPerCategory(tripId: Int): Flow> { val tripCurrency = tripRepo.getTrip(tripId)?.currency ?: Currencies.default().name return getExpensesWithConvertedAmounts(tripId) .map { list -> - // Compute summary val sumOfAll = list.sumOf { it.convertedAmount } list.groupBy { it.expenseDto.category } .map { (category, expenses) -> @@ -84,7 +116,7 @@ open class ExpenseAndCategoryViewModel @Inject constructor( val convertedAmount = if (expenseDto.expense.currency != expenseDto.trip.currency) { runBlocking { - expenseDto.toExpenseDtoWithConvertedAmount() + expenseDto.convertedAmount() } } else { expenseDto.expense.amount @@ -102,7 +134,7 @@ open class ExpenseAndCategoryViewModel @Inject constructor( val convertedAmount = if (expenseDto.expense.currency != expenseDto.trip.currency) { runBlocking { - expenseDto.toExpenseDtoWithConvertedAmount() + expenseDto.convertedAmount() } } else { expenseDto.expense.amount @@ -120,7 +152,7 @@ open class ExpenseAndCategoryViewModel @Inject constructor( } @RequiresApi(Build.VERSION_CODES.O) - suspend fun ExpenseDto.toExpenseDtoWithConvertedAmount(): Double { + suspend fun ExpenseDto.convertedAmount(): Double { return exchangeRateRepository.getRate( Currencies.valueOf(this.expense.currency), Currencies.valueOf(this.trip.currency), diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 508d84a..1fd2749 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -21,4 +21,10 @@ Edytuj wycieczkę Edytuj wydatek Domyślna waluta + Suma wydatków + Ustawienia + Wybierz wycieczkę + Lista wydatków + Statystyki + Eksport do CSV \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f487f89..68bde61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,4 +21,10 @@ Edit trip Edit expense Default currency + Total expenses + Settings + Pick trip + List of expenses + Statistics + Export to CSV \ No newline at end of file diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..af7c742 --- /dev/null +++ b/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From af7c92606040e357e565c252412a3c0dcb336295 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Wed, 25 Mar 2026 15:14:19 +0100 Subject: [PATCH 07/18] init --- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 17 ++++++++++------- .../java/cc/n0th1ng/tripmoney/utils/Colors.kt | 16 ---------------- .../java/cc/n0th1ng/tripmoney/utils/Icons.kt | 16 ++++++---------- 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index ccc5de4..3cfaef2 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -94,14 +94,17 @@ private class DatabasePrepopulator( ) { @RequiresApi(Build.VERSION_CODES.O) suspend fun prepopulate() { - tripDao.insert(Trip(name = "Włochy", startDate = "2025-01-01", currency = "PLN")) + tripDao.insert(Trip(name = "Włochy", startDate = "2026-03-01", currency = "PLN")) tripDao.insert(Trip(name = "Szwajcaria", startDate = "2025-03-01", currency = "EUR")) - tripDao.insert(Trip(name = "Portugalia", startDate = "2026-03-01", currency = "USD")) - categoryDao.insert(Category(name = "Hotel", icon = Icons.HOTEL, color = colors.random())) - categoryDao.insert(Category(name = "Jedzenie", icon = Icons.RESTAURANT, color = colors.random())) - categoryDao.insert(Category(name = "Transport", icon = Icons.FLIGHT, color = colors.random())) - categoryDao.insert(Category(name = "Rozrywka", icon = Icons.ATTRACTION, color = colors.random())) - categoryDao.insert(Category(name = "Zakupy", icon = Icons.GROCERIES,color = colors.random())) + tripDao.insert(Trip(name = "Portugalia", startDate = "2025-03-01", currency = "USD")) + categoryDao.insert(Category(name = "Accomodation", icon = Icons.HOTEL, color = colors.random())) + categoryDao.insert(Category(name = "Transport", icon = Icons.TRANSPORT, color = colors.random())) + categoryDao.insert(Category(name = "Flight", icon = Icons.FLIGHT, color = colors.random())) + categoryDao.insert(Category(name = "Restaurants", icon = Icons.RESTAURANT, color = colors.random())) + categoryDao.insert(Category(name = "Groceries", icon = Icons.GROCERIES, color = colors.random())) + categoryDao.insert(Category(name = "Coffee", icon = Icons.COFFEE,color = colors.random())) + categoryDao.insert(Category(name = "Entertainment", icon = Icons.ENTERTAINMENT,color = colors.random())) + categoryDao.insert(Category(name = "Laundry", icon = Icons.LAUNDRY,color = colors.random())) val now = LocalDateTime.now() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt index ab756af..292c2a6 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Colors.kt @@ -13,19 +13,3 @@ val colors: List = listOf( "#2A7F62", "#0B7189" ) -// GREEN("#228B22"), -// MINT("#98FB98"), -// TEAL("#008080"), -// CYAN("#00CED1"), -// SKY_BLUE("#1E90FF"), -// BLUE("#0000FF"), -// LAVENDER("#8A2BE2"), -// LILAC("#C8A2C8"), -// PURPLE("#800080"), -// MAUVE("#D8BFD8"), -// MAGENTA("#FF00FF"), -// VIOLET("#9400D3"), -// INDIGO("#4B0082"), -// PERIWINKLE("#8A2BE2"); -//} - diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Icons.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Icons.kt index 985447e..d5bb927 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Icons.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Icons.kt @@ -7,16 +7,12 @@ import com.composables.icons.materialsymbols.outlined.R enum class Icons(@DrawableRes val resource: Int) { HOTEL(R.drawable.materialsymbols_ic_hotel_outlined), RESTAURANT(R.drawable.materialsymbols_ic_restaurant_outlined), + TRANSPORT(R.drawable.materialsymbols_ic_local_taxi_outlined), FLIGHT(R.drawable.materialsymbols_ic_flight_outlined), - ATTRACTION(R.drawable.materialsymbols_ic_museum_outlined), + ATTRACTION(R.drawable.materialsymbols_ic_theater_comedy_outlined), GROCERIES(R.drawable.materialsymbols_ic_grocery_outlined), - GROCERIES1(R.drawable.materialsymbols_ic_airline_seat_recline_normal_outlined), - GROCERIES2(R.drawable.materialsymbols_ic_grocery_outlined), - GROCERIES3(R.drawable.materialsymbols_ic_grocery_outlined), - GROCERIES4(R.drawable.materialsymbols_ic_grocery_outlined), - GROCERIES5(R.drawable.materialsymbols_ic_grocery_outlined), - GROCERIES6(R.drawable.materialsymbols_ic_grocery_outlined), - GROCERIES7(R.drawable.materialsymbols_ic_grocery_outlined) - - + COFFEE(R.drawable.materialsymbols_ic_local_cafe_outlined), + GENERAL(R.drawable.materialsymbols_ic_shoppingmode_outlined), + ENTERTAINMENT(R.drawable.materialsymbols_ic_theaters_outlined), + LAUNDRY(R.drawable.materialsymbols_ic_local_laundry_service_outlined) } \ No newline at end of file From 9b19b100e96191d4acdc33951b57ab843b33aea4 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Thu, 26 Mar 2026 22:38:51 +0100 Subject: [PATCH 08/18] init --- .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 3 +- .../cc/n0th1ng/tripmoney/data/Converters.kt | 41 ++ .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 43 +- .../n0th1ng/tripmoney/data/dao/ExpenseDao.kt | 26 +- .../cc/n0th1ng/tripmoney/data/dao/TripDao.kt | 3 +- .../n0th1ng/tripmoney/data/entity/Expense.kt | 12 +- .../cc/n0th1ng/tripmoney/data/entity/Trip.kt | 13 +- .../data/repository/ExchangeRateRepository.kt | 1 + .../data/repository/ExpenseRepository.kt | 31 +- .../data/repository/TripRepository.kt | 12 +- .../addexpense/AddExpenseBottomSheet.kt | 77 +-- .../screens/listexpense/ListExpenseScreen.kt | 440 +++++++++--------- .../screens/settings/SettingsScreen.kt | 3 +- .../screens/statistics/StatisticsScreen.kt | 2 +- .../screens/trippicker/AddTripBottomSheet.kt | 6 +- .../screens/trippicker/TripPickerScreen.kt | 2 +- .../viewmodel/ExpenseAndCategoryViewModel.kt | 159 ++++--- .../tripmoney/viewmodel/TripViewModel.kt | 2 +- 18 files changed, 488 insertions(+), 388 deletions(-) create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/data/Converters.kt diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index 6ae412f..7cc20c8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -20,6 +20,7 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.navigation.BottomNavigation import cc.n0th1ng.tripmoney.navigation.CustomNavigationDrawer import cc.n0th1ng.tripmoney.navigation.Screens @@ -59,7 +60,7 @@ fun NavigationDrawer() { val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() - val currentTrip = tripViewModel.getTrip(currentTripId) + val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) val navController = rememberNavController() val navBackStack by navController.currentBackStackEntryAsState() val current = navBackStack?.destination?.route diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/Converters.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/Converters.kt new file mode 100644 index 0000000..81682db --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/Converters.kt @@ -0,0 +1,41 @@ +package cc.n0th1ng.tripmoney.data + +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.room.TypeConverter +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.ZoneId + +class Converters { + + @RequiresApi(Build.VERSION_CODES.O) + @TypeConverter + fun fromLocalDatetime(value: LocalDateTime): Long { + return value + .atZone(ZoneId.systemDefault()) + .toInstant() + .toEpochMilli() + } + + @RequiresApi(Build.VERSION_CODES.O) + @TypeConverter + fun toLocalDateTime(value: Long): LocalDateTime { + return Instant.ofEpochMilli(value) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime() + } + + @RequiresApi(Build.VERSION_CODES.O) + @TypeConverter + fun fromLocalDate(value: LocalDate): Long { + return value.toEpochDay() + } + + @RequiresApi(Build.VERSION_CODES.O) + @TypeConverter + fun toLocalDate(value: Long): LocalDate { + return LocalDate.ofEpochDay(value) + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index 3cfaef2..bc99cb8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -6,6 +6,7 @@ import androidx.annotation.RequiresApi import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import cc.n0th1ng.tripmoney.data.dao.CategoryDao import cc.n0th1ng.tripmoney.data.dao.ExchangeRateDao @@ -17,6 +18,7 @@ import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.utils.Icons import cc.n0th1ng.tripmoney.utils.colors +import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -25,11 +27,13 @@ import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.time.LocalDate import java.time.LocalDateTime import javax.inject.Inject import javax.inject.Singleton @Database(entities = [Trip::class, Expense::class, Category::class, ExchangeRate::class], version = 1) +@TypeConverters(Converters::class) abstract class TripDatabase : RoomDatabase() { abstract fun tripDao(): TripDao abstract fun expenseDao(): ExpenseDao @@ -46,7 +50,8 @@ object DatabaseModule { @Provides @Singleton fun provideTripDatabase( - @ApplicationContext context: Context + @ApplicationContext context: Context, +// expenseAndCategoryViewModel: ExpenseAndCategoryViewModel ): TripDatabase { val db: TripDatabase = Room.inMemoryDatabaseBuilder( @@ -94,9 +99,9 @@ private class DatabasePrepopulator( ) { @RequiresApi(Build.VERSION_CODES.O) suspend fun prepopulate() { - tripDao.insert(Trip(name = "Włochy", startDate = "2026-03-01", currency = "PLN")) - tripDao.insert(Trip(name = "Szwajcaria", startDate = "2025-03-01", currency = "EUR")) - tripDao.insert(Trip(name = "Portugalia", startDate = "2025-03-01", currency = "USD")) + tripDao.insert(Trip(name = "Włochy", startDate = LocalDate.parse("2026-03-01"), currency = "PLN")) + tripDao.insert(Trip(name = "Szwajcaria", startDate =LocalDate.parse("2025-03-01"), currency = "EUR")) + tripDao.insert(Trip(name = "Portugalia", startDate = LocalDate.parse("2025-03-01"), currency = "USD")) categoryDao.insert(Category(name = "Accomodation", icon = Icons.HOTEL, color = colors.random())) categoryDao.insert(Category(name = "Transport", icon = Icons.TRANSPORT, color = colors.random())) categoryDao.insert(Category(name = "Flight", icon = Icons.FLIGHT, color = colors.random())) @@ -113,7 +118,7 @@ private class DatabasePrepopulator( amount = 120.50, currency = "PLN", note = "Hotel overnight", - datetime = now.minusDays(10).toString(), + datetime = now.minusDays(10), categoryId = 1, tripId = 1 ) @@ -123,7 +128,7 @@ private class DatabasePrepopulator( amount = 45.75, currency = "PLN", note = "Dinner", - datetime = now.minusDays(9).toString(), + datetime = now.minusDays(9), categoryId = 2, tripId = 1 ) @@ -133,7 +138,7 @@ private class DatabasePrepopulator( amount = 15.20, currency = "PLN", note = "Bus ticket", - datetime = now.minusDays(8).toString(), + datetime = now.minusDays(8), categoryId = 3, tripId = 1 ) @@ -143,7 +148,7 @@ private class DatabasePrepopulator( amount = 89.99, currency = "PLN", note = "Concert tickets", - datetime = now.minusDays(7).toString(), + datetime = now.minusDays(7), categoryId = 4, tripId = 1 ) @@ -153,7 +158,7 @@ private class DatabasePrepopulator( amount = 32.50, currency = "PLN", note = "Souvenirs", - datetime = now.minusDays(6).toString(), + datetime = now.minusDays(6), categoryId = 5, tripId = 1 ) @@ -163,7 +168,7 @@ private class DatabasePrepopulator( amount = 180.00, currency = "PLN", note = "Hotel 3 nights", - datetime = now.minusDays(5).toString(), + datetime = now.minusDays(5), categoryId = 1, tripId = 1 ) @@ -173,7 +178,7 @@ private class DatabasePrepopulator( amount = 67.30, currency = "PLN", note = "Lunch", - datetime = now.minusDays(4).toString(), + datetime = now.minusDays(4), categoryId = 2, tripId = 1 ) @@ -183,7 +188,7 @@ private class DatabasePrepopulator( amount = 22.00, currency = "PLN", note = "Train ticket", - datetime = now.minusDays(3).toString(), + datetime = now.minusDays(3), categoryId = 3, tripId = 1 ) @@ -193,7 +198,7 @@ private class DatabasePrepopulator( amount = 55.00, currency = "PLN", note = "Museum entry", - datetime = now.minusDays(2).toString(), + datetime = now.minusDays(2), categoryId = 4, tripId = 1 ) @@ -203,7 +208,7 @@ private class DatabasePrepopulator( amount = 12.99, currency = "PLN", note = "Snacks", - datetime = now.minusDays(1).toString(), + datetime = now.minusDays(1), categoryId = 2, tripId = 1 ) @@ -213,7 +218,7 @@ private class DatabasePrepopulator( amount = 210.00, currency = "PLN", note = "Hotel 5 nights", - datetime = now.toString(), + datetime = now, categoryId = 1, tripId = 1 ) @@ -223,7 +228,7 @@ private class DatabasePrepopulator( amount = 95.50, currency = "EUR", note = "Dinner for two", - datetime = now.minusHours(12).toString(), + datetime = now.minusHours(12), categoryId = 2, tripId = 1 ) @@ -233,7 +238,7 @@ private class DatabasePrepopulator( amount = 30.00, currency = "EUR", note = "Taxi", - datetime = now.minusHours(6).toString(), + datetime = now.minusHours(6), categoryId = 3, tripId = 1 ) @@ -243,7 +248,7 @@ private class DatabasePrepopulator( amount = 40.00, currency = "USD", note = "Gifts", - datetime = now.minusHours(3).toString(), + datetime = now.minusHours(3), categoryId = 5, tripId = 1 ) @@ -253,7 +258,7 @@ private class DatabasePrepopulator( amount = 75.00, currency = "PLN", note = "Sightseeing tour", - datetime = now.minusHours(1).toString(), + datetime = now.minusHours(1), categoryId = 4, tripId = 1 ) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt index f8d9a7a..1b803b8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt @@ -19,7 +19,7 @@ interface ExpenseDao { @Query( """ SELECT * FROM expense WHERE trip_id = :tripId - ORDER BY DATETIME(expense.datetime) DESC + ORDER BY expense.datetime DESC """ ) fun expenseDtoPaged(tripId: Int): PagingSource @@ -28,33 +28,11 @@ interface ExpenseDao { @Query( """ SELECT * FROM expense WHERE trip_id = :tripId - ORDER BY DATETIME(expense.datetime) DESC + ORDER BY expense.datetime DESC """ ) fun expenseDto(tripId: Int): Flow> @Delete suspend fun delete(expense: Expense) - - @Query( - """ - SELECT - c.id as categoryId, - c.name as categoryName, - c.icon as icon, - c.color as color, - SUM(e.amount) as amount, - e.currency as currency - FROM - expense e - JOIN - category c ON e.category_id = c.id - WHERE - e.trip_id = :tripId - GROUP BY - c.id, c.name, c.icon, c.color, e.currency - """ - ) - fun summaryPerCategoryRaw(tripId: Int): Flow> - } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt index e07726b..cbd5c7e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt @@ -7,6 +7,7 @@ import androidx.room.Insert import androidx.room.Query import androidx.room.Upsert import cc.n0th1ng.tripmoney.data.entity.Trip +import kotlinx.coroutines.flow.Flow @Dao interface TripDao { @@ -27,5 +28,5 @@ interface TripDao { @Query( "SELECT * FROM trip where trip.id = :tripId" ) - fun trip(tripId: Int): Trip? + fun trip(tripId: Int): Flow } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt index 3ce313c..e330fb4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt @@ -5,6 +5,7 @@ import androidx.room.Embedded import androidx.room.Entity import androidx.room.PrimaryKey import androidx.room.Relation +import java.time.LocalDateTime @Entity(tableName = "expense") data class Expense( @@ -12,10 +13,15 @@ data class Expense( @ColumnInfo("amount") val amount: Double, @ColumnInfo("currency") val currency: String, @ColumnInfo("note") val note: String, - @ColumnInfo("datetime") val datetime: String, + @ColumnInfo("datetime") val datetime: LocalDateTime, @ColumnInfo("category_id") val categoryId: Int, - @ColumnInfo("trip_id") val tripId: Int -) + @ColumnInfo("trip_id") val tripId: Int, + @ColumnInfo("rate") val rate: Double = 1.0 +) { + fun convertedAmount(): Double { + return this.amount * this.rate + } +} data class ExpenseDto( @Embedded val expense: Expense, diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt index 678b372..c211c5a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt @@ -1,13 +1,22 @@ package cc.n0th1ng.tripmoney.data.entity +import android.os.Build +import androidx.annotation.RequiresApi import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import cc.n0th1ng.tripmoney.utils.Currencies +import java.time.LocalDate @Entity(tableName = "trip") data class Trip( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo("name") val name: String, - @ColumnInfo("start_date") val startDate: String, + @ColumnInfo("start_date") val startDate: LocalDate, @ColumnInfo("currency") val currency: String -) \ No newline at end of file +){ + companion object { + @RequiresApi(Build.VERSION_CODES.O) + val DUMMY = Trip(-1, "dummy", LocalDate.now(), Currencies.default().name) + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt index 98c73e4..a4a62a0 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt @@ -25,6 +25,7 @@ class ExchangeRateRepository @Inject constructor( @RequiresApi(Build.VERSION_CODES.O) suspend fun getRate(base: Currencies, target: Currencies, date: LocalDate): Double { + if(base == target) return 1.0 val id = ExchangeRate.buildKey(base.name, target.name, date.toString()) val cachedRate = exchangeRateDao.getById(id) return if (cachedRate != null) { diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt index 74e48bf..2625cf1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt @@ -1,6 +1,9 @@ package cc.n0th1ng.tripmoney.data.repository +import android.os.Build +import androidx.annotation.RequiresApi import androidx.annotation.WorkerThread +import androidx.lifecycle.viewModelScope import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData @@ -8,10 +11,16 @@ import cc.n0th1ng.tripmoney.data.dao.ExpenseDao import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategoryRaw import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto +import cc.n0th1ng.tripmoney.utils.Currencies import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch import javax.inject.Inject -class ExpenseRepository @Inject constructor(private val expenseDao: ExpenseDao) { +class ExpenseRepository @Inject constructor( + private val expenseDao: ExpenseDao, + private val exchangeRateRepository: ExchangeRateRepository +) { @WorkerThread suspend fun save(expense: Expense) { @@ -23,18 +32,30 @@ class ExpenseRepository @Inject constructor(private val expenseDao: ExpenseDao) expenseDao.delete(expense) } - fun getExpensesPaged(tripId: Int): Flow> { + fun getExpensesDtoPaged(tripId: Int): Flow> { return Pager( config = PagingConfig(pageSize = 50, enablePlaceholders = false), pagingSourceFactory = { expenseDao.expenseDtoPaged(tripId) } ).flow } - fun getExpenses(tripId: Int): Flow> { + fun getExpensesDto(tripId: Int): Flow> { return expenseDao.expenseDto(tripId) } - fun getSummaryPerCategory(tripId: Int): Flow> { - return expenseDao.summaryPerCategoryRaw(tripId) + @RequiresApi(Build.VERSION_CODES.O) + suspend fun recalculateTripExpenses(tripId: Int) { + val expenses = getExpensesDto(tripId).first() + expenses.forEach { expenseDto -> + val newRate = exchangeRateRepository.getRate( + Currencies.valueOf(expenseDto.expense.currency), + Currencies.valueOf(expenseDto.trip.currency), + expenseDto.expense.datetime.toLocalDate() + ) + save( + expenseDto.expense.copy(rate = newRate) + ) + } } + } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt index f2456bc..70b29ae 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt @@ -1,18 +1,26 @@ package cc.n0th1ng.tripmoney.data.repository +import android.os.Build +import androidx.annotation.RequiresApi import androidx.annotation.WorkerThread import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import cc.n0th1ng.tripmoney.data.dao.TripDao import cc.n0th1ng.tripmoney.data.entity.Trip +import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import kotlinx.coroutines.flow.Flow import javax.inject.Inject -class TripRepository @Inject constructor(private val tripDao: TripDao) { +class TripRepository @Inject constructor( + private val tripDao: TripDao, + private val expenseRepository: ExpenseRepository +) { + @RequiresApi(Build.VERSION_CODES.O) @WorkerThread suspend fun save(trip: Trip) { + expenseRepository.recalculateTripExpenses(trip.id) tripDao.insert(trip) } @@ -23,7 +31,7 @@ class TripRepository @Inject constructor(private val tripDao: TripDao) { ).flow } - fun getTrip(tripId: Int): Trip? { + fun getTrip(tripId: Int): Flow { return tripDao.trip(tripId) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index c1802d6..c956796 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -1,43 +1,38 @@ package cc.n0th1ng.tripmoney.screens.addexpense import android.annotation.SuppressLint -import android.graphics.drawable.PaintDrawable import android.os.Build +import android.util.Log import androidx.annotation.RequiresApi -import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.focusable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.PressInteraction 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.aspectRatio 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.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Check import androidx.compose.material3.Button -import androidx.compose.material3.ButtonColors import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.DividerDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.SheetState import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableDoubleStateOf @@ -50,17 +45,13 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.layout.ModifierLocalBeyondBoundsLayout -import androidx.compose.ui.modifier.modifierLocalMapOf -import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.sensitiveContent import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType 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.core.graphics.toColorInt @@ -83,10 +74,12 @@ import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import com.composables.icons.materialsymbols.outlined.R.drawable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import java.time.LocalDate import java.time.LocalDateTime import java.time.format.DateTimeFormatter -import kotlin.collections.listOf @OptIn(ExperimentalMaterial3Api::class) @RequiresApi(Build.VERSION_CODES.O) @@ -101,14 +94,15 @@ fun AddExpenseBottomSheet( val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() - val currentTrip = tripViewModel.getTrip(currentTripId)!! + val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) + val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) AddExpenseBottomSheet( onSave = onSave, onDismiss = onDismiss, expenseDtoToEdit = expenseDtoToEdit, state = state, - currentTrip = currentTrip, + currentTrip = currentTrip!!, categories = categories ) } @@ -148,9 +142,7 @@ fun AddExpenseBottomSheet( var category by remember { mutableStateOf(expenseDtoToEdit?.category ?: categories[0]) } var datetime by remember { mutableStateOf( - LocalDateTime.parse( - expenseDtoToEdit?.expense?.datetime ?: LocalDateTime.now().toString() - ) + expenseDtoToEdit?.expense?.datetime ?: LocalDateTime.now() ) } var note by remember { mutableStateOf(expenseDtoToEdit?.expense?.note ?: "") } @@ -192,14 +184,16 @@ fun AddExpenseBottomSheet( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { - Column{ + Column { Text( text = amount.ifEmpty { "0.00" }, fontSize = 25.sp, fontWeight = FontWeight.Bold ) Text( - text = if(amount.contains(Regex("[+\\/*-]\\d+"))) "%.2f".format(equationResult) else "", + text = if (amount.contains(Regex("[+\\/*-]\\d+"))) "%.2f".format( + equationResult + ) else "", fontSize = 14.sp, ) } @@ -244,12 +238,11 @@ fun AddExpenseBottomSheet( NumberKeyboard( modifier = Modifier.fillMaxWidth(), onOperatorClick = { operator -> - if(amount.isDoubleTwoDigitsOrEquation() && amount.contains(Regex("[+\\/*-]\\d+"))) { + if (amount.isDoubleTwoDigitsOrEquation() && amount.contains(Regex("[+\\/*-]\\d+"))) { amount = evaluate(amount).toString() -// equationResult = 0.0 } val newText = amount + operator - if(newText.isDoubleTwoDigitsOrEquation()) { + if (newText.isDoubleTwoDigitsOrEquation()) { amount = newText enableSave = false } @@ -282,7 +275,7 @@ fun AddExpenseBottomSheet( amount = equationResult, currency = currency, note = note, - datetime = datetime.toString(), + datetime = datetime, categoryId = category.id, tripId = currentTripId ) @@ -330,7 +323,7 @@ fun AddExpenseBottomSheet( fun String.safeSubstring(start: Int, end: Int): String { return try { this.substring(start, end) - } catch (e: Exception) { + } catch (_: Exception) { "0.00" } } @@ -460,7 +453,8 @@ fun NumberKeyboard( "backspace" -> KeyboardButton( icon = painterResource(drawable.materialsymbols_ic_arrow_left_alt_outlined), onClick = onBackspaceClick, - modifier = Modifier.weight(1f), + modifier = Modifier + .weight(1f), containerColor = MaterialTheme.colorScheme.primary ) @@ -488,19 +482,20 @@ fun NumberKeyboard( @Composable fun KeyboardButton( + modifier: Modifier = Modifier, text: String? = null, icon: Painter? = null, onClick: () -> Unit, - modifier: Modifier = Modifier, enabled: Boolean = true, containerColor: Color = MaterialTheme.colorScheme.primary, contentColor: Color = MaterialTheme.colorScheme.onPrimary ) { + Button( onClick = onClick, shape = MaterialTheme.shapes.medium, modifier = modifier - .padding(4.dp) + .padding(2.dp) .aspectRatio(2.5f), enabled = enabled, colors = ButtonDefaults.buttonColors( @@ -545,7 +540,12 @@ fun PreviewAddExpenseDisabled() { onDismiss = {}, expenseDtoToEdit = null, state = sheetState, - currentTrip = Trip(1, "Trip", "2020-01-01", Currencies.entries.random().name), + currentTrip = Trip( + 1, + "Trip", + LocalDate.parse("2020-01-01"), + Currencies.entries.random().name + ), categories = categoriesToPreview ) } @@ -572,13 +572,20 @@ fun PreviewAddExpenseEnabled() { amount = 10.31, currency = "PLN", note = "some note", - datetime = "2025-11-30T10:16:26.939", + datetime = LocalDateTime.now(), categoryId = 1, tripId = 1 - ), category = categoriesToPreview.get(0), Trip(1, "Włochy", "2025-01-02", "PLN") + ), + category = categoriesToPreview[0], + Trip(1, "Włochy", LocalDate.parse("2025-01-02"), "PLN") ), state = sheetState, - currentTrip = Trip(1, "Trip", "2020-01-01", Currencies.entries.random().name), + currentTrip = Trip( + 1, + "Trip", + LocalDate.parse("2020-01-01"), + Currencies.entries.random().name + ), categories = categoriesToPreview ) } @@ -611,4 +618,4 @@ val categoriesToPreview = listOf( icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, color = colors.random() ), -) \ No newline at end of file +) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index d126310..a709b17 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.CardDefaults +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExtendedFloatingActionButton @@ -40,7 +41,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -53,43 +53,39 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.paging.LoadState import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems +import androidx.paging.compose.itemKey import cc.n0th1ng.tripmoney.R.string -import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.addexpense.AddExpenseBottomSheet -import cc.n0th1ng.tripmoney.theme.TripMoneyTheme -import cc.n0th1ng.tripmoney.utils.AllPreviews -import cc.n0th1ng.tripmoney.utils.Currencies -import cc.n0th1ng.tripmoney.utils.colors import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel -import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel.ExpenseDtoWithConvertedAmount +import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel.ExpenseListItemUi import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel +import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow import java.time.LocalDate -import java.time.LocalDateTime -import java.time.ZoneOffset import java.time.format.DateTimeFormatter -import kotlin.random.Random @RequiresApi(Build.VERSION_CODES.O) @Composable fun ListExpenseScreen() { val settingsViewModel: SettingsViewModel = hiltViewModel() - val currentTrip by settingsViewModel.currentTrip.collectAsState() + val tripViewModel: TripViewModel = hiltViewModel() + val currentTripId by settingsViewModel.currentTrip.collectAsState() + val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() - val expensesWithConvertedFlow = expenseAndCategoryViewModel - .getExpensesWithConvertedAmountsPaged(currentTrip) + val expensesFlow = expenseAndCategoryViewModel.getExpensesWithHeadersPaged(currentTripId) ListExpenseScreen( - expensesWithConvertedFlow = expensesWithConvertedFlow, - onSaveExpense = { expenseAndCategoryViewModel.save(it) }, - onDeleteExpense = { expenseAndCategoryViewModel.delete(it) }) + expensesFlow = expensesFlow, + onSaveExpense = { expenseAndCategoryViewModel.save(it, currentTrip!!) }, + onDeleteExpense = { expenseAndCategoryViewModel.delete(it) }, + ) } @OptIn(ExperimentalMaterial3Api::class) @@ -97,14 +93,15 @@ fun ListExpenseScreen() { @RequiresApi(Build.VERSION_CODES.O) @Composable fun ListExpenseScreen( - expensesWithConvertedFlow: Flow>, + expensesFlow: Flow>, onSaveExpense: (Expense) -> Unit, onDeleteExpense: (Expense) -> Unit ) { - val expensesWithConverted = expensesWithConvertedFlow.collectAsLazyPagingItems() + + val items = expensesFlow.collectAsLazyPagingItems() val listState = rememberLazyListState() var showBottomSheet by remember { mutableStateOf(false) } - var expenseDtoToEdit: ExpenseDto? = null - val sumMap = remember { mutableStateMapOf() } + var expenseDtoToEdit by remember { mutableStateOf(null) } + var itemToDelete by remember { mutableStateOf(null) } Scaffold(floatingActionButtonPosition = FabPosition.EndOverlay, floatingActionButton = { ExtendedFloatingActionButton( @@ -114,57 +111,71 @@ fun ListExpenseScreen( ) }) { - LaunchedEffect(expensesWithConverted.itemSnapshotList.items) { - val items = expensesWithConverted.itemSnapshotList.items - val newSums = items - .groupBy { LocalDateTime.parse(it.expenseDto.expense.datetime).toLocalDate() } - .mapValues { (_, expensesForDay) -> - expensesForDay.sumOf { it.convertedAmount } - } - sumMap.clear() - sumMap.putAll(newSums) + if (items.loadState.refresh == LoadState.Loading) { + // Show loading indicator + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + CircularProgressIndicator() + } } - LazyColumn( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - state = listState - ) { - items( - count = expensesWithConverted.itemCount, - key = { index -> expensesWithConverted[index]?.expenseDto?.expense?.id ?: index } - ) { index -> - val expenseDtoWithConverted = expensesWithConverted[index] - val expenseDto = expenseDtoWithConverted?.expenseDto - if (expenseDtoWithConverted != null && expenseDto != null) { - val previousExpense = - expensesWithConverted.itemSnapshotList.items.getOrNull(index - 1)?.expenseDto - val showDayDivider = - index == 0 || LocalDateTime.parse(previousExpense?.expense?.datetime) - .toLocalDate() != LocalDateTime.parse(expenseDto.expense.datetime) - .toLocalDate() - Spacer(Modifier - .height(5.dp) - .background(MaterialTheme.colorScheme.onBackground)) - if (showDayDivider) { - CustomDivider( - expenseDto, - sumMap.getOrDefault( - LocalDateTime.parse(expenseDto.expense.datetime).toLocalDate(), 0.00 - ) - ) + else { + LazyColumn( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + state = listState + ) { + items( + count = items.itemCount, + key = items.itemKey { item -> + when (item) { + is ExpenseListItemUi.Item -> item.expenseDto.expense.id + is ExpenseListItemUi.Header -> "header_${item.date}" + } + } + ) { index -> + + when (val item = items[index]) { + + is ExpenseListItemUi.Header -> { + CustomDivider( + date = item.date, + sum = item.sum, + currency = item.currency + ) + } + + is ExpenseListItemUi.Item -> { + SwipeToDeleteExpenseCard( + expenseDto = item.expenseDto, + onDelete = { expense -> itemToDelete = expense }, + onClick = { expenseDto -> + expenseDtoToEdit = expenseDto + showBottomSheet = true + } + ) + } + + null -> {} + + } + Spacer(Modifier.height(10.dp)) + } - Spacer(Modifier.height(5.dp)) - SwipeToDeleteExpenseCard( - expenseDtoWithConverted = expenseDtoWithConverted, - onDelete = { expense -> onDeleteExpense(expense) }, - onClick = { expenseDto -> - expenseDtoToEdit = expenseDto - showBottomSheet = true - }) + } } + if (itemToDelete != null) { + DeleteConfirmationDialog( + onConfirm = { + onDeleteExpense(itemToDelete!!) + itemToDelete = null + }, + onCancel = { + itemToDelete = null + } + ) } + if (showBottomSheet) { AddExpenseBottomSheet( onSave = { expense -> @@ -186,7 +197,7 @@ fun ListExpenseScreen( @RequiresApi(Build.VERSION_CODES.O) @Composable -fun CustomDivider(expenseDto: ExpenseDto, sum: Double) { +fun CustomDivider(date: LocalDate, sum: Double, currency: String) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Absolute.Center, @@ -194,7 +205,7 @@ fun CustomDivider(expenseDto: ExpenseDto, sum: Double) { ) { HorizontalDivider(modifier = Modifier.weight(1f)) Text( - LocalDateTime.parse(expenseDto.expense.datetime).format( + date.format( DateTimeFormatter.ofPattern("dd EEEE") ).toString(), modifier = Modifier.background(Color.White.copy(alpha = 0f)), @@ -209,7 +220,7 @@ fun CustomDivider(expenseDto: ExpenseDto, sum: Double) { ) { HorizontalDivider(modifier = Modifier.weight(2f)) Text( - "%.2f %s".format(sum, expenseDto.trip.currency), + "%.2f %s".format(sum, currency), modifier = Modifier.background(Color.White.copy(alpha = 0f)), style = MaterialTheme.typography.bodyMedium ) @@ -222,55 +233,44 @@ fun CustomDivider(expenseDto: ExpenseDto, sum: Double) { @RequiresApi(Build.VERSION_CODES.O) @Composable fun SwipeToDeleteExpenseCard( - expenseDtoWithConverted: ExpenseDtoWithConvertedAmount, + expenseDto: ExpenseDto, onDelete: (Expense) -> Unit, onClick: (ExpenseDto) -> Unit ) { - var dismissed by remember { mutableStateOf(false) } - var showDialog by remember { mutableStateOf(false) } - - if (!dismissed) { - val dismissState = rememberSwipeToDismissBoxState( - confirmValueChange = { dismissValue -> - if (dismissValue == SwipeToDismissBoxValue.EndToStart - ) { - showDialog = true - false - } else { - false - } + val dismissState = rememberSwipeToDismissBoxState( + confirmValueChange = { dismissValue -> + if (dismissValue == SwipeToDismissBoxValue.EndToStart) { + onDelete(expenseDto.expense) + false + } else { + false } + } + ) + + SwipeToDismissBox( + state = dismissState, + enableDismissFromStartToEnd = false, + backgroundContent = { + Box( + Modifier + .clip(CardDefaults.elevatedShape) + .fillMaxSize() + .background(MaterialTheme.colorScheme.onError) + .padding(horizontal = 20.dp), + contentAlignment = Alignment.CenterEnd + ) { + Icon( + Icons.Default.Delete, + contentDescription = stringResource(string.delete) + ) + } + } + ) { + ExpenseCard( + expenseDto = expenseDto, + onClick = onClick ) - if (showDialog) { - DeleteConfirmationDialog( - onConfirm = { - showDialog = false - dismissed = true - onDelete(expenseDtoWithConverted.expenseDto.expense) - }, - onCancel = { showDialog = false } - ) - } - - SwipeToDismissBox( - modifier = Modifier, - state = dismissState, - enableDismissFromStartToEnd = false, - backgroundContent = { - Box( - Modifier - .clip(CardDefaults.elevatedShape) - .fillMaxSize() - .background(MaterialTheme.colorScheme.onError) - .padding(horizontal = 20.dp), - contentAlignment = Alignment.CenterEnd - ) { - Icon(Icons.Default.Delete, contentDescription = stringResource(string.delete)) - } - } - ) { - ExpenseCard(expenseDtoWithConverted, onClick = onClick) - } } } @@ -324,10 +324,9 @@ fun DeleteConfirmationDialog( @RequiresApi(Build.VERSION_CODES.O) @Composable fun ExpenseCard( - expenseDtoWithConverted: ExpenseDtoWithConvertedAmount, + expenseDto: ExpenseDto, onClick: (ExpenseDto) -> Unit ) { - val expenseDto = expenseDtoWithConverted.expenseDto ElevatedCard( colors = CardDefaults.elevatedCardColors() .copy(containerColor = MaterialTheme.colorScheme.secondaryContainer), @@ -379,7 +378,7 @@ fun ExpenseCard( } Text( - text = LocalDateTime.parse(expenseDto.expense.datetime).format( + text = expenseDto.expense.datetime.format( DateTimeFormatter.ofPattern("dd MMM HH:mm") ), style = MaterialTheme.typography.labelSmall, @@ -397,7 +396,7 @@ fun ExpenseCard( ) if (expenseDto.expense.currency.lowercase() != expenseDto.trip.currency.lowercase()) { Text( - text = "≈ %.2f ${expenseDto.trip.currency}".format(expenseDtoWithConverted.convertedAmount), + text = "≈ %.2f ${expenseDto.trip.currency}".format(expenseDto.expense.convertedAmount()), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSecondaryContainer ) @@ -408,106 +407,107 @@ fun ExpenseCard( } } -@RequiresApi(Build.VERSION_CODES.O) -@AllPreviews -@Composable -fun PreviewListExpenseScreen() { - TripMoneyTheme() { - val pagingData = PagingData.from(sampleExpenseDtoWithConvertedAmountList()) - ListExpenseScreen( - expensesWithConvertedFlow = MutableStateFlow(pagingData), - onSaveExpense = {}, - onDeleteExpense = {} - ) - - } -} - -@AllPreviews -@Composable -fun PreviewDeleteConfirmationDialog() { - TripMoneyTheme() { - DeleteConfirmationDialog( - onConfirm = {}, - onCancel = {}) - } -} - - -@RequiresApi(Build.VERSION_CODES.O) -private fun sampleExpenseDtoWithConvertedAmountList(): List { - val sampleCategories = listOf( - Category( - name = "Hotel", - icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, - color = colors.random() - ), - Category( - name = "Jedzenie", - icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, - color = colors.random() - ), - Category( - name = "Transport", - icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, - color = colors.random() - ), - Category( - name = "Rozrywka", - icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, - color = colors.random() - ), - Category( - name = "Zakupy", - icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, - color = colors.random() - ), - ) - - val trip = Trip( - id = 1, - name = "Vacation", - currency = "USD", - startDate = "2026-01-01" - ) - - val startLong = LocalDateTime.now().minusDays(10).toEpochMilli() - val endLong = LocalDateTime.now().toEpochMilli() - - val result: MutableList = mutableListOf() - for (i in 0..15) { - val category = sampleCategories.random() - val datetime = if (i > 4) { - LocalDateTime.ofEpochSecond( - Random.nextLong(startLong, endLong), - 0, - ZoneOffset.UTC - ).toString() - } else LocalDateTime.now().toString() - - val expense = Expense( - id = i, - categoryId = category.id, - tripId = 1, - amount = Random.nextDouble(0.1, 300.0), - currency = Currencies.entries.random().name, - note = if (i % 3 == 0) "Some note" else "", - datetime = datetime - ) - val expenseDto = ExpenseDto( - expense = expense, - category = category, - trip = trip - ) - result.add( - ExpenseDtoWithConvertedAmount( - expenseDto, - convertedAmount = if (Random.nextBoolean()) Random.nextDouble( - 0.1, - 300.0 - ) else expense.amount - ) - ) - } - return result -} \ No newline at end of file +//@RequiresApi(Build.VERSION_CODES.O) +//@AllPreviews +//@Composable +//fun PreviewListExpenseScreen() { +// TripMoneyTheme() { +// val pagingData = PagingData.from(sampleExpenseDtoWithConvertedAmountList()) +// ListExpenseScreen( +// expensesDtoFlow = MutableStateFlow(pagingData), +// onSaveExpense = {}, +// onDeleteExpense = {}, +// dailySums = emptyMap() +// ) +// +// } +//} +// +//@AllPreviews +//@Composable +//fun PreviewDeleteConfirmationDialog() { +// TripMoneyTheme() { +// DeleteConfirmationDialog( +// onConfirm = {}, +// onCancel = {}) +// } +//} +// +// +//@RequiresApi(Build.VERSION_CODES.O) +//private fun sampleExpenseDtoWithConvertedAmountList(): List { +// val sampleCategories = listOf( +// Category( +// name = "Hotel", +// icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, +// color = colors.random() +// ), +// Category( +// name = "Jedzenie", +// icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, +// color = colors.random() +// ), +// Category( +// name = "Transport", +// icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, +// color = colors.random() +// ), +// Category( +// name = "Rozrywka", +// icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, +// color = colors.random() +// ), +// Category( +// name = "Zakupy", +// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, +// color = colors.random() +// ), +// ) +// +// val trip = Trip( +// id = 1, +// name = "Vacation", +// currency = "USD", +// startDate = LocalDate.parse("2026-01-01") +// ) +// +// val startLong = LocalDateTime.now().minusDays(10).toEpochMilli() +// val endLong = LocalDateTime.now().toEpochMilli() +// +// val result: MutableList = mutableListOf() +// for (i in 0..15) { +// val category = sampleCategories.random() +// val datetime = if (i > 4) { +// LocalDateTime.ofEpochSecond( +// Random.nextLong(startLong, endLong), +// 0, +// ZoneOffset.UTC +// ) +// } else LocalDateTime.now() +// +// val expense = Expense( +// id = i, +// categoryId = category.id, +// tripId = 1, +// amount = Random.nextDouble(0.1, 300.0), +// currency = Currencies.entries.random().name, +// note = if (i % 3 == 0) "Some note" else "", +// datetime = datetime, +// rate = if (Random.nextBoolean()) Random.nextDouble( +// 0.1, +// 5.0 +// ) else 1.0 +// ) +// +// +// val expenseDto = ExpenseDto( +// expense = expense, +// category = category, +// trip = trip +// ) +// result.add( +// expenseDto +// ) +// } +// return result +//} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt index 50aa428..2d73a2e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.unit.sp import androidx.core.content.FileProvider import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.R.* +import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.data.repository.AppTheme import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog import cc.n0th1ng.tripmoney.theme.TripMoneyTheme @@ -66,7 +67,7 @@ fun SettingsScreen() { val currentTripId by settingsViewModel.currentTrip.collectAsState() val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() - val currentTrip = tripViewModel.getTrip(currentTripId) + val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) val context = LocalContext.current val tripName = currentTrip?.name ?: "" val scope = rememberCoroutineScope() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt index cdca6da..44710d7 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt @@ -50,7 +50,7 @@ fun StatisticsScreen() { val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() - val currentTrip = tripViewModel.getTrip(currentTripId) + val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) val summaryPerCategoryList by expenseAndCategoryViewModel.getSummaryPerCategory(currentTripId) .collectAsState(emptyList()) val summaryAmount by expenseAndCategoryViewModel.getSummaryAmount(currentTripId) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt index e4474f1..c00c932 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt @@ -94,7 +94,7 @@ fun AddTripBottomSheet( var name by remember { mutableStateOf(tripToEdit?.name ?: "") } var startDate by remember { mutableStateOf( - LocalDate.parse(tripToEdit?.startDate ?: LocalDate.now().toString()) + tripToEdit?.startDate ?: LocalDate.now() ) } @@ -157,7 +157,7 @@ fun AddTripBottomSheet( shape = MaterialTheme.shapes.medium, onClick = { val trip = - Trip(name = name, startDate = startDate.toString(), currency = currency) + Trip(name = name, startDate = startDate, currency = currency) onSave(if (tripToEdit == null) trip else trip.copy(id = tripToEdit.id)) }) { @@ -231,7 +231,7 @@ fun PreviewAddTripBottomSheetEditTrip() { AddTripBottomSheet( {}, {}, - Trip(1, "Włochy", "2025-01-02", "PLN"), + Trip(1, "Włochy", LocalDate.parse("2025-01-02"), "PLN"), sheetState, defaultCurrency = Currencies.entries.random() ) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt index d9fe28a..e3e69f5 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt @@ -206,7 +206,7 @@ fun TripCard( modifier = Modifier.padding(16.dp) ) { Text(fontSize = 25.sp, fontWeight = FontWeight.SemiBold, text = trip.name) - Text(trip.startDate) + Text(trip.startDate.toString()) } Text( trip.currency.uppercase(), diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index 2ab88d2..ce01167 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -6,11 +6,13 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn +import androidx.paging.insertSeparators import androidx.paging.map import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto +import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.data.repository.CategoryRepository import cc.n0th1ng.tripmoney.data.repository.ExchangeRateRepository import cc.n0th1ng.tripmoney.data.repository.ExpenseRepository @@ -18,15 +20,16 @@ import cc.n0th1ng.tripmoney.data.repository.TripRepository import cc.n0th1ng.tripmoney.utils.Currencies import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import org.apache.commons.csv.CSVFormat import org.apache.commons.csv.CSVPrinter import java.io.File -import java.time.LocalDateTime +import java.time.LocalDate import javax.inject.Inject +import kotlin.collections.mapValues @HiltViewModel @@ -37,15 +40,63 @@ open class ExpenseAndCategoryViewModel @Inject constructor( private val tripRepo: TripRepository ) : ViewModel() { - fun getExpenses(tripId: Int): Flow> = - expenseRepo.getExpensesPaged(tripId).cachedIn(viewModelScope) + fun getExpensesDtoPaged(tripId: Int): Flow> = + expenseRepo.getExpensesDtoPaged(tripId).cachedIn(viewModelScope) - fun save(expense: Expense) { + @RequiresApi(Build.VERSION_CODES.O) + fun getExpensesWithHeadersPaged( + tripId: Int + ): Flow> { + val pagingFlow = getExpensesDtoPaged(tripId) + val sumsFlow = getDailySums(tripId) + val tripFlow = tripRepo.getTrip(tripId) + return combine(pagingFlow, sumsFlow, tripFlow) { pagingData, sums, trip -> + val currency = trip?.currency ?: "" + pagingData + .map { + ExpenseListItemUi.Item(it) + } + .insertSeparators { before, after -> + if (after == null) return@insertSeparators null + val afterItem = after as ExpenseListItemUi.Item + val afterDate = afterItem.expenseDto.expense.datetime.toLocalDate() + val beforeDate = (before as? ExpenseListItemUi.Item) + ?.expenseDto + ?.expense + ?.datetime + ?.toLocalDate() + + if (before == null || beforeDate != afterDate) { + ExpenseListItemUi.Header( + date = afterDate, + sum = sums[afterDate] ?: 0.0, + currency = currency + ) + } else { + null + } + } + + }.cachedIn(viewModelScope) + } + + fun getExpensesDto(tripId: Int): Flow> = + expenseRepo.getExpensesDto(tripId) + + @RequiresApi(Build.VERSION_CODES.O) + fun save(expense: Expense, trip: Trip) { viewModelScope.launch { - expenseRepo.save(expense) + val rate = exchangeRateRepository.getRate( + Currencies.valueOf(expense.currency), + Currencies.valueOf(trip.currency), + expense.datetime.toLocalDate() + ) + expenseRepo.save(expense.copy(rate = rate)) } } + + fun delete(expense: Expense) { viewModelScope.launch { expenseRepo.delete(expense) @@ -67,7 +118,7 @@ open class ExpenseAndCategoryViewModel @Inject constructor( writer, CSVFormat.DEFAULT.withHeader("date", "category", "currency", "amount") ).use { printer -> - expenseRepo.getExpenses(tripId).first().forEach { expenseDto -> + expenseRepo.getExpensesDto(tripId).first().forEach { expenseDto -> printer.printRecord( expenseDto.expense.datetime, expenseDto.category.name, @@ -80,68 +131,45 @@ open class ExpenseAndCategoryViewModel @Inject constructor( } } + @RequiresApi(Build.VERSION_CODES.O) + fun getDailySums(tripId: Int): Flow> { + return getExpensesDto(tripId) + .map { expenses -> + expenses.groupBy { it.expense.datetime.toLocalDate() } + .mapValues { (_, list) -> + list.sumOf { it.expense.amount * it.expense.rate } + } + } + } @RequiresApi(Build.VERSION_CODES.O) fun getSummaryAmount(tripId: Int): Flow { - return getExpensesWithConvertedAmounts(tripId).map { list -> - list.sumOf { it.convertedAmount } + return getExpensesDto(tripId).map { list -> + list.sumOf { it.expense.amount * it.expense.rate } } } @RequiresApi(Build.VERSION_CODES.O) fun getSummaryPerCategory(tripId: Int): Flow> { - val tripCurrency = tripRepo.getTrip(tripId)?.currency ?: Currencies.default().name - return getExpensesWithConvertedAmounts(tripId) - .map { list -> - val sumOfAll = list.sumOf { it.convertedAmount } - list.groupBy { it.expenseDto.category } - .map { (category, expenses) -> - val total = expenses.sumOf { it.convertedAmount } - SummaryPerCategory( - category = category, - amount = total, - percent = (total / sumOfAll).toFloat(), - currency = Currencies.valueOf(tripCurrency) - ) - }.sortedBy { it.percent }.reversed() - } - } + val tripFlow = tripRepo.getTrip(tripId) + val expensesFlow = getExpensesDto(tripId) + return tripFlow.combine(expensesFlow) { trip, expenses -> + val tripCurrency = trip?.currency ?: Currencies.default().name + val sumOfAll = expenses.sumOf { it.expense.convertedAmount() } - @RequiresApi(Build.VERSION_CODES.O) - fun getExpensesWithConvertedAmounts(tripId: Int): Flow> { - return expenseRepo.getExpenses(tripId) - .map { list -> - list.map { expenseDto -> - val convertedAmount = - if (expenseDto.expense.currency != expenseDto.trip.currency) { - runBlocking { - expenseDto.convertedAmount() - } - } else { - expenseDto.expense.amount - } - ExpenseDtoWithConvertedAmount(expenseDto, convertedAmount) + expenses.groupBy { it.category } + .map { (category, expensesForCategory) -> + val total = expensesForCategory.sumOf { it.expense.convertedAmount() } + SummaryPerCategory( + category = category, + amount = total, + percent = (total / sumOfAll).toFloat(), + currency = Currencies.valueOf(tripCurrency) + ) } - } - } - - @RequiresApi(Build.VERSION_CODES.O) - fun getExpensesWithConvertedAmountsPaged(tripId: Int): Flow> { - return expenseRepo.getExpensesPaged(tripId) - .map { pagingData -> - pagingData.map { expenseDto -> - val convertedAmount = - if (expenseDto.expense.currency != expenseDto.trip.currency) { - runBlocking { - expenseDto.convertedAmount() - } - } else { - expenseDto.expense.amount - } - ExpenseDtoWithConvertedAmount(expenseDto, convertedAmount) - } - } + .sortedByDescending { it.percent } + } } @RequiresApi(Build.VERSION_CODES.O) @@ -152,16 +180,9 @@ open class ExpenseAndCategoryViewModel @Inject constructor( } @RequiresApi(Build.VERSION_CODES.O) - suspend fun ExpenseDto.convertedAmount(): Double { - return exchangeRateRepository.getRate( - Currencies.valueOf(this.expense.currency), - Currencies.valueOf(this.trip.currency), - LocalDateTime.parse(this.expense.datetime).toLocalDate() - ) * this.expense.amount + sealed class ExpenseListItemUi { + data class Item(val expenseDto: ExpenseDto) : ExpenseListItemUi() + data class Header(val date: LocalDate, val sum: Double, val currency: String) : ExpenseListItemUi() } +} - data class ExpenseDtoWithConvertedAmount( - val expenseDto: ExpenseDto, - val convertedAmount: Double - ) -} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt index fdf9ce6..766c7af 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt @@ -18,7 +18,7 @@ class TripViewModel @Inject constructor(private val repository: TripRepository) fun getTrips(): Flow> = repository.getTrips().cachedIn(viewModelScope) - fun getTrip(tripId: Int): Trip? = repository.getTrip(tripId) + fun getTrip(tripId: Int): Flow = repository.getTrip(tripId) fun delete(trip: Trip) { viewModelScope.launch { From c4c9868698d23d58e19864ef18b65323f6b0ddff Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Tue, 31 Mar 2026 15:31:01 +0200 Subject: [PATCH 09/18] init --- app/build.gradle.kts | 6 +- .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 46 +- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 285 +++++------- .../n0th1ng/tripmoney/data/dao/CategoryDao.kt | 14 +- .../n0th1ng/tripmoney/data/dao/ExpenseDao.kt | 26 +- .../cc/n0th1ng/tripmoney/data/dao/TripDao.kt | 2 +- .../n0th1ng/tripmoney/data/entity/Category.kt | 5 +- .../n0th1ng/tripmoney/data/entity/Expense.kt | 14 +- .../cc/n0th1ng/tripmoney/data/entity/Trip.kt | 7 +- .../data/repository/CategoryRepository.kt | 9 + .../data/repository/ExchangeRateRepository.kt | 1 - .../data/repository/ExpenseRepository.kt | 11 +- .../data/repository/TripRepository.kt | 5 +- .../tripmoney/navigation/BottomNavigation.kt | 4 +- .../navigation/CustomNavigationDrawer.kt | 1 + .../cc/n0th1ng/tripmoney/navigation/TopBar.kt | 123 ++++- .../tripmoney/screens/AddCetegoryDialog.kt | 134 ++++-- .../addexpense/AddExpenseBottomSheet.kt | 77 +++- .../listexpense/CategorySelectionDialog.kt | 5 +- .../screens/listexpense/ListExpenseScreen.kt | 371 ++++++++------- .../ManageCategoriesScreen.kt | 431 ++++++++++++++++++ .../screens/settings/SettingsScreen.kt | 31 +- .../screens/statistics/StatisticsScreen.kt | 39 +- .../screens/trippicker/TripPickerScreen.kt | 98 +++- .../viewmodel/ExpenseAndCategoryViewModel.kt | 42 +- .../tripmoney/viewmodel/TripViewModel.kt | 23 +- app/src/main/res/values-pl/strings.xml | 7 +- app/src/main/res/values/strings.xml | 11 +- baselineprofile/.gitignore | 1 + baselineprofile/build.gradle.kts | 52 +++ baselineprofile/src/main/AndroidManifest.xml | 1 + .../BaselineProfileGenerator.kt | 40 ++ .../baselineprofile/StartupBenchmarks.kt | 76 +++ build.gradle.kts | 2 + gradle.properties | 3 +- gradle/libs.versions.toml | 9 + settings.gradle.kts | 2 +- 37 files changed, 1539 insertions(+), 475 deletions(-) create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/screens/managecategories/ManageCategoriesScreen.kt create mode 100644 baselineprofile/.gitignore create mode 100644 baselineprofile/build.gradle.kts create mode 100644 baselineprofile/src/main/AndroidManifest.xml create mode 100644 baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt create mode 100644 baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c485d7d..bf3193c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.kotlin.compose) id("com.google.devtools.ksp") id("com.google.dagger.hilt.android") + alias(libs.plugins.baselineprofile) } android { @@ -22,7 +23,8 @@ android { buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true + isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -54,11 +56,13 @@ dependencies { implementation(libs.androidx.compose.material3) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.compose.foundation.layout) + implementation(libs.androidx.profileinstaller) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.compose.ui.test.junit4) + "baselineProfile"(project(":baselineprofile")) debugImplementation(libs.androidx.compose.ui.tooling) debugImplementation(libs.androidx.compose.ui.test.manifest) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index 7cc20c8..db70c55 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -13,13 +13,19 @@ import androidx.compose.material3.rememberDrawerState 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.Modifier +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import androidx.paging.compose.collectAsLazyPagingItems import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.navigation.BottomNavigation import cc.n0th1ng.tripmoney.navigation.CustomNavigationDrawer @@ -27,6 +33,7 @@ import cc.n0th1ng.tripmoney.navigation.Screens import cc.n0th1ng.tripmoney.navigation.TopBar import cc.n0th1ng.tripmoney.navigation.TopBarSettings import cc.n0th1ng.tripmoney.screens.listexpense.ListExpenseScreen +import cc.n0th1ng.tripmoney.screens.managecategories.ManageCategoriesScreen import cc.n0th1ng.tripmoney.screens.settings.SettingsScreen import cc.n0th1ng.tripmoney.screens.statistics.StatisticsScreen import cc.n0th1ng.tripmoney.screens.trippicker.TripPickerScreen @@ -40,21 +47,25 @@ import kotlinx.coroutines.launch @AndroidEntryPoint class MainActivity : ComponentActivity() { - @RequiresApi(Build.VERSION_CODES.O) + @RequiresApi(Build.VERSION_CODES.S) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { TripMoneyTheme { + val settingsViewModel: SettingsViewModel = hiltViewModel() + val currentTripId by settingsViewModel.currentTrip.collectAsState() val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() expenseAndCategoryViewModel.clearOldRates() + expenseAndCategoryViewModel.getExpensesWithHeadersPaged(currentTripId) + .collectAsLazyPagingItems() NavigationDrawer() } } } } -@RequiresApi(Build.VERSION_CODES.O) +@RequiresApi(Build.VERSION_CODES.S) @Composable fun NavigationDrawer() { val settingsViewModel: SettingsViewModel = hiltViewModel() @@ -66,33 +77,39 @@ fun NavigationDrawer() { val current = navBackStack?.destination?.route val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() + var filter by remember { mutableStateOf("") } CustomNavigationDrawer(navController, drawerState) { Scaffold( + modifier = Modifier.semantics { + testTagsAsResourceId = true + }, topBar = { if (current == Screens.SETTINGS) TopBarSettings( navController ) else TopBar( title = currentTrip?.name ?: "", - onClick = { - scope.launch { - if (drawerState.isClosed) { - drawerState.open() - } else { - drawerState.close() + onDrawerClick = { + scope.launch { + if (drawerState.isClosed) { + drawerState.open() + } else { + drawerState.close() + } } - } - }) + }, + isSearchable = current == Screens.LIST_EXPENSE, + onFilterChange = { newFilter -> filter = newFilter}) }, bottomBar = { BottomNavigation(navController) }) { innerPadding -> NavHost( navController = navController, - startDestination = if(currentTripId == -1) Screens.TRIP_PICKER else Screens.LIST_EXPENSE, + startDestination = if (currentTripId == -1) Screens.TRIP_PICKER else Screens.LIST_EXPENSE, modifier = Modifier.padding(innerPadding) ) { composable(Screens.LIST_EXPENSE) { - ListExpenseScreen() + ListExpenseScreen(filter) } composable(Screens.TRIP_PICKER) { TripPickerScreen(navController) @@ -101,7 +118,10 @@ fun NavigationDrawer() { StatisticsScreen() } composable(Screens.SETTINGS) { - SettingsScreen() + SettingsScreen(navController) + } + composable(Screens.MANAGE_CATEGORIES) { + ManageCategoriesScreen() } } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index bc99cb8..597409c 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -7,7 +7,6 @@ import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters -import androidx.sqlite.db.SupportSQLiteDatabase import cc.n0th1ng.tripmoney.data.dao.CategoryDao import cc.n0th1ng.tripmoney.data.dao.ExchangeRateDao import cc.n0th1ng.tripmoney.data.dao.ExpenseDao @@ -15,24 +14,34 @@ import cc.n0th1ng.tripmoney.data.dao.TripDao import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.ExchangeRate import cc.n0th1ng.tripmoney.data.entity.Expense +import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.data.entity.Trip +import cc.n0th1ng.tripmoney.screens.listexpense.toEpochMilli +import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.utils.Icons import cc.n0th1ng.tripmoney.utils.colors -import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Delay import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime -import javax.inject.Inject +import java.time.ZoneOffset import javax.inject.Singleton +import kotlin.random.Random +import kotlin.random.nextInt -@Database(entities = [Trip::class, Expense::class, Category::class, ExchangeRate::class], version = 1) +@Database( + entities = [Trip::class, Expense::class, Category::class, ExchangeRate::class], + version = 1 +) @TypeConverters(Converters::class) abstract class TripDatabase : RoomDatabase() { abstract fun tripDao(): TripDao @@ -46,21 +55,28 @@ abstract class TripDatabase : RoomDatabase() { @InstallIn(SingletonComponent::class) object DatabaseModule { + @RequiresApi(Build.VERSION_CODES.O) @Provides @Singleton fun provideTripDatabase( - @ApplicationContext context: Context, -// expenseAndCategoryViewModel: ExpenseAndCategoryViewModel + @ApplicationContext context: Context ): TripDatabase { - val db: TripDatabase = Room.inMemoryDatabaseBuilder( - context, TripDatabase::class.java - ).allowMainThreadQueries().build() +// val db: TripDatabase = Room.databaseBuilder( +// name = "tripmoney_db", + context = context, + klass = TripDatabase::class.java, + ) + .allowMainThreadQueries() // TODO Remove in production! + .fallbackToDestructiveMigration() // TODO Handle schema changes during dev + .build() CoroutineScope(Dispatchers.IO).launch { DatabasePrepopulator( - tripDao = db.tripDao(), categoryDao = db.categoryDao(), expenseDao = db.expenseDao() + tripDao = db.tripDao(), + categoryDao = db.categoryDao(), + expenseDao = db.expenseDao() ).prepopulate() } return db @@ -99,169 +115,92 @@ private class DatabasePrepopulator( ) { @RequiresApi(Build.VERSION_CODES.O) suspend fun prepopulate() { - tripDao.insert(Trip(name = "Włochy", startDate = LocalDate.parse("2026-03-01"), currency = "PLN")) - tripDao.insert(Trip(name = "Szwajcaria", startDate =LocalDate.parse("2025-03-01"), currency = "EUR")) - tripDao.insert(Trip(name = "Portugalia", startDate = LocalDate.parse("2025-03-01"), currency = "USD")) - categoryDao.insert(Category(name = "Accomodation", icon = Icons.HOTEL, color = colors.random())) - categoryDao.insert(Category(name = "Transport", icon = Icons.TRANSPORT, color = colors.random())) - categoryDao.insert(Category(name = "Flight", icon = Icons.FLIGHT, color = colors.random())) - categoryDao.insert(Category(name = "Restaurants", icon = Icons.RESTAURANT, color = colors.random())) - categoryDao.insert(Category(name = "Groceries", icon = Icons.GROCERIES, color = colors.random())) - categoryDao.insert(Category(name = "Coffee", icon = Icons.COFFEE,color = colors.random())) - categoryDao.insert(Category(name = "Entertainment", icon = Icons.ENTERTAINMENT,color = colors.random())) - categoryDao.insert(Category(name = "Laundry", icon = Icons.LAUNDRY,color = colors.random())) + + tripDao.insert( + Trip( + name = "Włochy", + startDate = LocalDate.parse("2026-03-01"), + currency = "PLN" + ) + ) + tripDao.insert( + Trip( + name = "Szwajcaria", + startDate = LocalDate.parse("2025-03-01"), + currency = "EUR" + ) + ) + tripDao.insert( + Trip( + name = "Portugalia", + startDate = LocalDate.parse("2025-03-01"), + currency = "USD" + ) + ) + for (category in sampleCategories) { + categoryDao.insert(category) + } + for (expense in sampleExpenses) { + expenseDao.insert(expense) + } - val now = LocalDateTime.now() - expenseDao.insert( - Expense( - amount = 120.50, - currency = "PLN", - note = "Hotel overnight", - datetime = now.minusDays(10), - categoryId = 1, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 45.75, - currency = "PLN", - note = "Dinner", - datetime = now.minusDays(9), - categoryId = 2, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 15.20, - currency = "PLN", - note = "Bus ticket", - datetime = now.minusDays(8), - categoryId = 3, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 89.99, - currency = "PLN", - note = "Concert tickets", - datetime = now.minusDays(7), - categoryId = 4, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 32.50, - currency = "PLN", - note = "Souvenirs", - datetime = now.minusDays(6), - categoryId = 5, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 180.00, - currency = "PLN", - note = "Hotel 3 nights", - datetime = now.minusDays(5), - categoryId = 1, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 67.30, - currency = "PLN", - note = "Lunch", - datetime = now.minusDays(4), - categoryId = 2, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 22.00, - currency = "PLN", - note = "Train ticket", - datetime = now.minusDays(3), - categoryId = 3, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 55.00, - currency = "PLN", - note = "Museum entry", - datetime = now.minusDays(2), - categoryId = 4, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 12.99, - currency = "PLN", - note = "Snacks", - datetime = now.minusDays(1), - categoryId = 2, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 210.00, - currency = "PLN", - note = "Hotel 5 nights", - datetime = now, - categoryId = 1, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 95.50, - currency = "EUR", - note = "Dinner for two", - datetime = now.minusHours(12), - categoryId = 2, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 30.00, - currency = "EUR", - note = "Taxi", - datetime = now.minusHours(6), - categoryId = 3, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 40.00, - currency = "USD", - note = "Gifts", - datetime = now.minusHours(3), - categoryId = 5, - tripId = 1 - ) - ) - expenseDao.insert( - Expense( - amount = 75.00, - currency = "PLN", - note = "Sightseeing tour", - datetime = now.minusHours(1), - categoryId = 4, - tripId = 1 - ) - ) } -} + + val sampleCategories = listOf( + Category( + name = "Hotel", + icon = Icons.HOTEL, + color = colors.random() + ), + Category( + name = "Jedzenie", + icon = Icons.RESTAURANT, + color = colors.random() + ), + Category( + name = "Transport", + icon = Icons.FLIGHT, + color = colors.random() + ), + Category( + name = "Rozrywka", + icon = Icons.ATTRACTION, + color = colors.random() + ), + Category( + name = "Zakupy", + icon = Icons.GROCERIES, + color = colors.random() + ), + ) + + @RequiresApi(Build.VERSION_CODES.O) + val sampleExpenses = (0..150).map { i -> + + val datetime = if (i > 4) { + val now = LocalDateTime.now() + val min = now.minusDays(10).toInstant(ZoneOffset.UTC).toEpochMilli() + val max = now.toInstant(ZoneOffset.UTC).toEpochMilli() + val randomMillis = Random.nextLong(min, max) + LocalDateTime.ofInstant(Instant.ofEpochMilli(randomMillis), ZoneOffset.UTC) + } else { + LocalDateTime.now() + } + + + val expense = Expense( + categoryId = Random.nextInt(1, 5), + tripId = 1, + amount = Random.nextDouble(0.1, 300.0), + currency = Currencies.entries.random().name, + note = if (i % 3 == 0) "Some note" else "", + datetime = datetime, + rate = if (Random.nextBoolean()) Random.nextDouble( + 0.1, + 5.0 + ) else 1.0 + ) + expense + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/CategoryDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/CategoryDao.kt index dea2912..a8057f4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/CategoryDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/CategoryDao.kt @@ -1,6 +1,7 @@ package cc.n0th1ng.tripmoney.data.dao import androidx.room.Dao +import androidx.room.Delete import androidx.room.Insert import androidx.room.Query import androidx.room.Transaction @@ -14,12 +15,23 @@ interface CategoryDao { suspend fun insert(category: Category) + @Delete + suspend fun delete(category: Category) + @Transaction @Query( """ - SELECT * FROM category + SELECT * FROM category WHERE archived is 0 """ ) fun categories(): Flow> + @Transaction + @Query( + """ + SELECT * FROM category WHERE archived is 1 + """ + ) + fun archivedCategories(): Flow> + } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt index 1b803b8..7368c89 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt @@ -16,22 +16,38 @@ interface ExpenseDao { @Upsert suspend fun insert(expense: Expense) + @Query( """ - SELECT * FROM expense WHERE trip_id = :tripId + SELECT expense.*, category.* + FROM expense + JOIN category ON expense.category_id = category.id + WHERE expense.trip_id = :tripId + AND + ( + (:filter IS NULL OR category.name LIKE '%' || :filter || '%') + OR (:filter IS NULL OR expense.note LIKE '%' || :filter || '%') + ) ORDER BY expense.datetime DESC - """ + """ ) - fun expenseDtoPaged(tripId: Int): PagingSource + fun expenseDtoPaged(tripId: Int, filter: String): PagingSource @Transaction @Query( """ - SELECT * FROM expense WHERE trip_id = :tripId + SELECT * FROM expense + JOIN category ON expense.category_id = category.id + WHERE trip_id = :tripId + AND + ( + (:filter IS NULL OR category.name LIKE '%' || :filter || '%') + OR (:filter IS NULL OR expense.note LIKE '%' || :filter || '%') + ) ORDER BY expense.datetime DESC """ ) - fun expenseDto(tripId: Int): Flow> + fun expenseDto(tripId: Int, filter: String): Flow> @Delete suspend fun delete(expense: Expense) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt index cbd5c7e..3c95cf7 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/TripDao.kt @@ -17,7 +17,7 @@ interface TripDao { @Query( """ SELECT * FROM trip - ORDER BY DATE(trip.start_date) DESC + ORDER BY trip.start_date DESC """ ) fun tripsPaged(): PagingSource diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Category.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Category.kt index a5f0bd8..a73efe1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Category.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Category.kt @@ -1,14 +1,17 @@ package cc.n0th1ng.tripmoney.data.entity +import androidx.compose.runtime.Immutable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import cc.n0th1ng.tripmoney.utils.Icons @Entity(tableName = "category") +@Immutable data class Category( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo("name") val name: String, @ColumnInfo("icon") val icon: Icons, - @ColumnInfo("color") val color: String + @ColumnInfo("color") val color: String, + @ColumnInfo("archived") val archived: Boolean = false ) \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt index e330fb4..c4894ab 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt @@ -1,13 +1,25 @@ package cc.n0th1ng.tripmoney.data.entity +import androidx.compose.runtime.Immutable import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Entity +import androidx.room.ForeignKey import androidx.room.PrimaryKey import androidx.room.Relation import java.time.LocalDateTime -@Entity(tableName = "expense") +@Entity( + tableName = "expense", + foreignKeys = [ForeignKey( + entity = Category::class, + parentColumns = arrayOf("id"), + childColumns = arrayOf("category_id"), + onUpdate = ForeignKey.CASCADE, + onDelete = ForeignKey.CASCADE + )] +) +@Immutable data class Expense( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo("amount") val amount: Double, diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt index c211c5a..2efc7c4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt @@ -2,6 +2,7 @@ package cc.n0th1ng.tripmoney.data.entity import android.os.Build import androidx.annotation.RequiresApi +import androidx.compose.runtime.Immutable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey @@ -9,14 +10,16 @@ import cc.n0th1ng.tripmoney.utils.Currencies import java.time.LocalDate @Entity(tableName = "trip") +@Immutable data class Trip( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo("name") val name: String, @ColumnInfo("start_date") val startDate: LocalDate, - @ColumnInfo("currency") val currency: String + @ColumnInfo("currency") val currency: String, + @ColumnInfo("budget") val budget: Double ){ companion object { @RequiresApi(Build.VERSION_CODES.O) - val DUMMY = Trip(-1, "dummy", LocalDate.now(), Currencies.default().name) + val DUMMY = Trip(-1, "", LocalDate.now(), Currencies.default().name, budget = 0.0) } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/CategoryRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/CategoryRepository.kt index b16f5ca..785175e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/CategoryRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/CategoryRepository.kt @@ -13,7 +13,16 @@ class CategoryRepository @Inject constructor(private val categoryDao: CategoryDa categoryDao.insert(category) } + @WorkerThread + suspend fun delete(category: Category) { + categoryDao.delete(category) + } + fun getCategories(): Flow> { return categoryDao.categories() } + + fun getArchivedCategories(): Flow> { + return categoryDao.archivedCategories() + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt index a4a62a0..82f16d2 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExchangeRateRepository.kt @@ -45,7 +45,6 @@ class ExchangeRateRepository @Inject constructor( } } - @RequiresApi(Build.VERSION_CODES.O) suspend fun clearOldRates(daysToKeep: Int = 180) { val cutoffDate = LocalDate.now().minusDays(daysToKeep.toLong()).toString() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt index 2625cf1..7e259c9 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt @@ -12,8 +12,11 @@ import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategoryRaw import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.utils.Currencies +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject @@ -32,15 +35,15 @@ class ExpenseRepository @Inject constructor( expenseDao.delete(expense) } - fun getExpensesDtoPaged(tripId: Int): Flow> { + fun getExpensesDtoPaged(tripId: Int, filter: String): Flow> { return Pager( config = PagingConfig(pageSize = 50, enablePlaceholders = false), - pagingSourceFactory = { expenseDao.expenseDtoPaged(tripId) } + pagingSourceFactory = { expenseDao.expenseDtoPaged(tripId, filter) } ).flow } - fun getExpensesDto(tripId: Int): Flow> { - return expenseDao.expenseDto(tripId) + fun getExpensesDto(tripId: Int, filter: String = ""): Flow> { + return expenseDao.expenseDto(tripId, filter) } @RequiresApi(Build.VERSION_CODES.O) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt index 70b29ae..1ff0370 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/TripRepository.kt @@ -9,7 +9,10 @@ import androidx.paging.PagingData import cc.n0th1ng.tripmoney.data.dao.TripDao import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch import javax.inject.Inject class TripRepository @Inject constructor( @@ -18,9 +21,7 @@ class TripRepository @Inject constructor( ) { @RequiresApi(Build.VERSION_CODES.O) - @WorkerThread suspend fun save(trip: Trip) { - expenseRepository.recalculateTripExpenses(trip.id) tripDao.insert(trip) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/BottomNavigation.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/BottomNavigation.kt index 7c05e28..2c5e83a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/BottomNavigation.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/BottomNavigation.kt @@ -7,6 +7,8 @@ import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.navigation.NavController import androidx.navigation.compose.currentBackStackEntryAsState @@ -37,7 +39,7 @@ fun BottomNavigation(navController: NavController) { painter = painterResource( R.drawable.materialsymbols_ic_list_outlined, ), - null + "list screen" ) } ) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt index 3ff77a1..b778602 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/CustomNavigationDrawer.kt @@ -100,4 +100,5 @@ object Screens { const val TRIP_PICKER = "trip_picker" const val STATISTICS = "statistics" const val SETTINGS = "settings" + const val MANAGE_CATEGORIES = "manage_categories" } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt index fe8eb9e..dc2ae7c 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt @@ -1,27 +1,130 @@ package cc.n0th1ng.tripmoney.navigation +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldColors +import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +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.platform.LocalFocusManager +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import cc.n0th1ng.tripmoney.R +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews +import com.composables.icons.materialsymbols.outlined.R.drawable +import kotlinx.coroutines.delay @OptIn(ExperimentalMaterial3Api::class) @Composable -fun TopBar(onClick: () -> Unit, title: String = "") { +fun TopBar( + onDrawerClick: () -> Unit, + title: String = "", + isSearchable: Boolean = false, + onFilterChange: (String) -> Unit +) { + var isSearch by remember { mutableStateOf(false) } + var value by remember { mutableStateOf("") } + val focusRequester = remember { FocusRequester() } TopAppBar( - title = { Text(title) }, + title = { + if (isSearch && isSearchable) { + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + OutlinedTextField( + textStyle = MaterialTheme.typography.bodyMedium, + shape = MaterialTheme.shapes.medium, + modifier = Modifier.fillMaxWidth(0.9f).focusRequester(focusRequester), + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + disabledContainerColor = Color.Transparent, + errorContainerColor = Color.Transparent + ), + value = value, + onValueChange = { newText -> + value = newText + }, + singleLine = true, + trailingIcon = { + Icon( + modifier = Modifier.clickable(onClick = { + isSearch = false + value = "" + onFilterChange("") + }), + imageVector = Icons.Default.Close, + contentDescription = null + ) + } + ) + LaunchedEffect(key1 = value) { + delay(1000) + onFilterChange(value) + } + } else { + Text(title) + } + }, navigationIcon = { - IconButton(onClick = { onClick() }) { + IconButton(onClick = { onDrawerClick() }) { Icon(Icons.Default.Menu, contentDescription = "Menu") } + }, + actions = { + if (!isSearch && isSearchable) { + Row( + modifier = Modifier.padding(end = 13.dp), + horizontalArrangement = Arrangement.spacedBy(15.dp) + ) { + Icon( + tint = MaterialTheme.colorScheme.primary, + painter = painterResource(drawable.materialsymbols_ic_filter_alt_outlined), + contentDescription = null, + modifier = Modifier.clickable(onClick = {}) + ) + Icon( + tint = MaterialTheme.colorScheme.primary, + painter = painterResource(drawable.materialsymbols_ic_search_outlined), + contentDescription = null, + modifier = Modifier.clickable(onClick = { + isSearch = true + }) + ) + + } + } + } ) } @@ -39,4 +142,16 @@ fun TopBarSettings(navController: NavHostController) { } } ) -} \ No newline at end of file +} + +@AllPreviews +@Composable +fun PreviewTopBar() { + TripMoneyTheme { + TopBar( + onDrawerClick = {}, + title = "Essa", + onFilterChange = {} + ) + } +} diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt index 34a285c..de2e0a1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/AddCetegoryDialog.kt @@ -1,5 +1,8 @@ package cc.n0th1ng.tripmoney.screens +import android.graphics.drawable.Icon +import android.os.Build +import androidx.annotation.RequiresApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll @@ -8,14 +11,17 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Checkbox import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -27,44 +33,68 @@ 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.unit.dp import androidx.core.graphics.toColorInt +import cc.n0th1ng.tripmoney.R import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Icons import cc.n0th1ng.tripmoney.utils.colors @Composable -fun AddCategoryDialog(onDismiss: () -> Unit, onSave: (Category) -> Unit) { - var name by remember { mutableStateOf("") } - var icon by remember { mutableStateOf(Icons.entries[0]) } - var color by remember { mutableStateOf(colors[0]) } +fun AddCategoryDialog( + onDismiss: () -> Unit, + onSave: (Category) -> Unit, + categoryToEdit: Category? = null +) { + var name by remember { mutableStateOf(categoryToEdit?.name ?: "") } + var icon by remember { mutableStateOf(categoryToEdit?.icon ?: Icons.entries[0]) } + var color by remember { mutableStateOf(categoryToEdit?.color ?: colors[0]) } + var isArchived by remember { mutableStateOf(categoryToEdit?.archived ?: false) } AlertDialog( - onDismissRequest = onDismiss, title = { Text("Add new category") }, text = { + onDismissRequest = onDismiss, + title = { Text(stringResource(if (categoryToEdit == null) R.string.add_new_category else R.string.edit_category)) }, + text = { AlertDialogFill( onTextChange = { newText -> name = newText }, onIconChange = { newIcon -> icon = newIcon }, - onColorChange = { newColor -> color = newColor } + onColorChange = { newColor -> color = newColor }, + onArchivedChange = { newArchived -> + isArchived = newArchived + }, + name = name, + icon = icon, + color = color, + isArchived = isArchived ) - }, confirmButton = { + }, + confirmButton = { Button( enabled = !name.isEmpty(), onClick = { - onSave( - Category( - name = name, - icon = icon, - color = color - ) + val categoryToSave = Category( + name = name, + icon = icon, + color = color, + archived = isArchived ) - }) { Text("Save") } + onSave( + if (categoryToEdit != null) categoryToSave.copy(id = categoryToEdit.id) else categoryToSave + ) + }) { Text(stringResource(R.string.save)) } }, dismissButton = { - Button( - colors = ButtonDefaults.buttonColors(MaterialTheme.colorScheme.error), - onClick = onDismiss - ) { Text("close") } + Row() { + Button( + colors = ButtonDefaults.buttonColors(MaterialTheme.colorScheme.secondary), + onClick = onDismiss + ) { Text(stringResource(R.string.cancel)) } + } + }) } @@ -72,24 +102,26 @@ fun AddCategoryDialog(onDismiss: () -> Unit, onSave: (Category) -> Unit) { fun AlertDialogFill( onTextChange: (String) -> Unit, onIconChange: (Icons) -> Unit, - onColorChange: (String) -> Unit + onColorChange: (String) -> Unit, + onArchivedChange: (Boolean) -> Unit, + name: String, + icon: Icons, + color: String, + isArchived: Boolean ) { - var text by remember { mutableStateOf("") } - var iconId by remember { mutableIntStateOf(Icons.entries[0].resource) } - var colorHex by remember { mutableStateOf(colors[0]) } Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(10.dp) ) { Icon( modifier = Modifier.size(30.dp), - painter = painterResource(iconId), contentDescription = null, - tint = Color(colorHex.toColorInt()) + painter = painterResource(icon.resource), contentDescription = null, + tint = Color(color.toColorInt()) ) - OutlinedTextField(label = { Text("Name") }, value = text, onValueChange = { newText -> - text = newText - onTextChange(text) + OutlinedTextField(label = { Text("Name") }, value = name, onValueChange = { newText -> + onTextChange(newText) }) } @@ -104,7 +136,6 @@ fun AlertDialogFill( modifier = Modifier .size(30.dp) .clickable(onClick = { - iconId = icon.resource onIconChange(icon) }), painter = painterResource(icon.resource), @@ -123,8 +154,7 @@ fun AlertDialogFill( Box( modifier = Modifier .clickable(onClick = { - colorHex = color - onColorChange(colorHex) + onColorChange(color) }) .size(30.dp) .aspectRatio(1f) @@ -132,5 +162,49 @@ fun AlertDialogFill( ) {} } } + Row( + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Switch( + checked = isArchived, + onCheckedChange = onArchivedChange + ) + Text( + text = "Archived", + style = MaterialTheme.typography.titleMedium + ) + + } + + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewAddCategoryDialog() { + TripMoneyTheme { + AddCategoryDialog( + onDismiss = {}, + onSave = {}) + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewEditCategoryDialog() { + TripMoneyTheme { + AddCategoryDialog( + onDismiss = {}, + onSave = {}, + categoryToEdit = Category( + 0, "Hotel", + icon = cc.n0th1ng.tripmoney.utils.Icons.entries.random(), + color = colors.random(), + archived = true + ) + ) } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index c956796..6a048b8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.os.Build import android.util.Log import androidx.annotation.RequiresApi +import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.focusable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -11,6 +12,7 @@ import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth @@ -224,7 +226,7 @@ fun AddExpenseBottomSheet( ) { Text( text = datetime.format(DateTimeFormatter.ofPattern("dd.MM HH:mm")), - fontSize = 17.sp + style = MaterialTheme.typography.titleMedium ) } CategoryButton( @@ -265,6 +267,11 @@ fun AddExpenseBottomSheet( equationResult = evaluate(amount) enableSave = amount.isDoubleTwoDigitsOrEquation() && equationResult > 0 }, + onLongBackspaceClick = { + amount = "0.00" + equationResult = evaluate(amount) + enableSave = false + } ) SaveButton( @@ -394,7 +401,13 @@ fun NoteInput( @Composable fun CurrencyButton(modifier: Modifier = Modifier, onClick: () -> Unit, text: String) { - Button(onClick = onClick, modifier = modifier, shape = MaterialTheme.shapes.medium) { + Button( + onClick = onClick, + modifier = modifier, + shape = MaterialTheme.shapes.medium, + colors = ButtonDefaults.buttonColors() + .copy(containerColor = MaterialTheme.colorScheme.secondary) + ) { Text(text) } } @@ -402,18 +415,35 @@ fun CurrencyButton(modifier: Modifier = Modifier, onClick: () -> Unit, text: Str @Composable fun CategoryButton(onClick: () -> Unit, category: Category, modifier: Modifier = Modifier) { Button( + contentPadding = PaddingValues(0.dp), onClick = onClick, modifier = modifier, shape = MaterialTheme.shapes.medium, colors = ButtonDefaults.buttonColors() - .copy(containerColor = Color(category.color.toColorInt()), contentColor = Color.Black) + .copy( + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary + ) ) { +// Row(modifier = modifier.fillMaxWidth()) { Icon( - modifier = Modifier.padding(end = 10.dp), + tint = Color(category.color.toColorInt()), + modifier = Modifier + .size(30.dp) +// .background( +// color = MaterialTheme.colorScheme.prima, +// shape = MaterialTheme.shapes.small +// ) + .padding(end = 10.dp), painter = painterResource(category.icon.resource), contentDescription = stringResource(R.string.category), ) - Text(category.name) + Text( + text = category.name, + style = MaterialTheme.typography.titleMedium + ) + +// } } } @@ -437,7 +467,8 @@ fun NumberKeyboard( modifier: Modifier = Modifier, onNumberClick: (String) -> Unit, onBackspaceClick: () -> Unit, - onOperatorClick: (String) -> Unit + onOperatorClick: (String) -> Unit, + onLongBackspaceClick: () -> Unit, ) { Column( modifier = modifier, @@ -455,22 +486,23 @@ fun NumberKeyboard( onClick = onBackspaceClick, modifier = Modifier .weight(1f), - containerColor = MaterialTheme.colorScheme.primary + containerColor = Color.Transparent, + onLongClick = onLongBackspaceClick ) "+", "/", "-", "*" -> KeyboardButton( text = key, onClick = { onOperatorClick(key) }, modifier = Modifier.weight(1f), - containerColor = MaterialTheme.colorScheme.secondaryContainer, - contentColor = MaterialTheme.colorScheme.onSecondaryContainer + containerColor = MaterialTheme.colorScheme.tertiaryContainer, + contentColor = MaterialTheme.colorScheme.onTertiaryContainer ) else -> KeyboardButton( text = key, onClick = { onNumberClick(key) }, modifier = Modifier.weight(1f), - containerColor = MaterialTheme.colorScheme.secondary, + containerColor = Color.Transparent, contentColor = MaterialTheme.colorScheme.onSecondary ) } @@ -487,26 +519,24 @@ fun KeyboardButton( icon: Painter? = null, onClick: () -> Unit, enabled: Boolean = true, + onLongClick: () -> Unit = {}, containerColor: Color = MaterialTheme.colorScheme.primary, contentColor: Color = MaterialTheme.colorScheme.onPrimary ) { - Button( - onClick = onClick, - shape = MaterialTheme.shapes.medium, + Box( + contentAlignment = Alignment.Center, modifier = modifier .padding(2.dp) - .aspectRatio(2.5f), - enabled = enabled, - colors = ButtonDefaults.buttonColors( - containerColor = containerColor, - contentColor = contentColor - ) - ) { + .aspectRatio(2.5f) + .combinedClickable(onClick = onClick, onLongClick = onLongClick) + .background(containerColor, shape = MaterialTheme.shapes.medium), + + ) { when { text != null -> Text( text, - style = MaterialTheme.typography.titleMedium + style = MaterialTheme.typography.headlineMedium ) icon != null -> Icon(painter = icon, contentDescription = null) @@ -594,26 +624,31 @@ fun PreviewAddExpenseEnabled() { val categoriesToPreview = listOf( Category( + 1, name = "Hotel", icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, color = colors.random() ), Category( + 2, name = "Jedzenie", icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, color = colors.random() ), Category( + 3, name = "Transport", icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, color = colors.random() ), Category( + 4, name = "Rozrywka", icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, color = colors.random() ), Category( + 5, name = "Zakupy", icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, color = colors.random() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt index 40dbfc4..a7ecf30 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/CategorySelectionDialog.kt @@ -28,7 +28,6 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.R.* import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.screens.AddCategoryDialog -import cc.n0th1ng.tripmoney.utils.Icons import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import com.composables.icons.materialsymbols.outlined.R @@ -37,7 +36,7 @@ fun CategorySelectionDialog( onDismiss: () -> Unit, onCategorySelected: (Category) -> Unit, selected: Category, - categories: List + categories: List, ) { val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val listState = rememberLazyListState() @@ -91,7 +90,7 @@ fun CategorySelectionDialog( contentDescription = stringResource(string.category) ) Text( - text = stringResource(string.add_new_category), modifier = Modifier.padding(start = 8.dp), + text = stringResource(string.add_new), modifier = Modifier.padding(start = 8.dp), ) } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index a709b17..0546af4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -23,7 +23,6 @@ import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.CardDefaults -import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExtendedFloatingActionButton @@ -47,6 +46,7 @@ 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.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -58,33 +58,46 @@ import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemKey import cc.n0th1ng.tripmoney.R.string +import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.addexpense.AddExpenseBottomSheet +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews +import cc.n0th1ng.tripmoney.utils.Currencies +import cc.n0th1ng.tripmoney.utils.colors import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel.ExpenseListItemUi import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.filter import java.time.LocalDate +import java.time.LocalDateTime +import java.time.ZoneOffset import java.time.format.DateTimeFormatter +import kotlin.random.Random @RequiresApi(Build.VERSION_CODES.O) @Composable -fun ListExpenseScreen() { +fun ListExpenseScreen(filter: String) { val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() - val expensesFlow = expenseAndCategoryViewModel.getExpensesWithHeadersPaged(currentTripId) + val expensesFlow = + expenseAndCategoryViewModel.getExpensesWithHeadersPaged(currentTripId, filter) + val isRecalculatingRate by tripViewModel.isRecalculating.collectAsState() ListExpenseScreen( expensesFlow = expensesFlow, onSaveExpense = { expenseAndCategoryViewModel.save(it, currentTrip!!) }, onDeleteExpense = { expenseAndCategoryViewModel.delete(it) }, + isRecalculatingRate = isRecalculatingRate ) } @@ -94,7 +107,8 @@ fun ListExpenseScreen() { @Composable fun ListExpenseScreen( expensesFlow: Flow>, - onSaveExpense: (Expense) -> Unit, onDeleteExpense: (Expense) -> Unit + onSaveExpense: (Expense) -> Unit, onDeleteExpense: (Expense) -> Unit, + isRecalculatingRate: Boolean ) { val items = expensesFlow.collectAsLazyPagingItems() @@ -111,58 +125,52 @@ fun ListExpenseScreen( ) }) { - if (items.loadState.refresh == LoadState.Loading) { - // Show loading indicator - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - CircularProgressIndicator() - } - } - else { - LazyColumn( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - state = listState - ) { - items( - count = items.itemCount, - key = items.itemKey { item -> - when (item) { - is ExpenseListItemUi.Item -> item.expenseDto.expense.id - is ExpenseListItemUi.Header -> "header_${item.date}" - } + Box { + LazyColumn( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + state = listState + ) { + items( + count = items.itemCount, + key = items.itemKey { item -> + when (item) { + is ExpenseListItemUi.Item -> item.expenseDto.expense.id + is ExpenseListItemUi.Header -> "header_${item.date}" } - ) { index -> + } + ) { index -> - when (val item = items[index]) { - - is ExpenseListItemUi.Header -> { - CustomDivider( - date = item.date, - sum = item.sum, - currency = item.currency - ) - } - - is ExpenseListItemUi.Item -> { - SwipeToDeleteExpenseCard( - expenseDto = item.expenseDto, - onDelete = { expense -> itemToDelete = expense }, - onClick = { expenseDto -> - expenseDtoToEdit = expenseDto - showBottomSheet = true - } - ) - } - - null -> {} + when (val item = items[index]) { + is ExpenseListItemUi.Header -> { + CustomDivider( + date = item.date, + sum = item.sum, + currency = item.currency + ) } - Spacer(Modifier.height(10.dp)) + + is ExpenseListItemUi.Item -> { + SwipeToDeleteExpenseCard( + expenseDto = item.expenseDto, + onDelete = { expense -> itemToDelete = expense }, + onClick = { expenseDto -> + expenseDtoToEdit = expenseDto + showBottomSheet = true + } + ) + } + + null -> {} } + Spacer(Modifier.height(10.dp)) } + } + } if (itemToDelete != null) { DeleteConfirmationDialog( @@ -208,7 +216,7 @@ fun CustomDivider(date: LocalDate, sum: Double, currency: String) { date.format( DateTimeFormatter.ofPattern("dd EEEE") ).toString(), - modifier = Modifier.background(Color.White.copy(alpha = 0f)), + modifier = Modifier.padding(horizontal = 5.dp).background(Color.White.copy(alpha = 0f)), style = MaterialTheme.typography.titleMedium ) Row( @@ -221,8 +229,14 @@ fun CustomDivider(date: LocalDate, sum: Double, currency: String) { HorizontalDivider(modifier = Modifier.weight(2f)) Text( "%.2f %s".format(sum, currency), - modifier = Modifier.background(Color.White.copy(alpha = 0f)), - style = MaterialTheme.typography.bodyMedium + modifier = Modifier + .background( + MaterialTheme.colorScheme.tertiaryContainer, + shape = MaterialTheme.shapes.small + ) + .padding(5.dp), + color = MaterialTheme.colorScheme.onTertiaryContainer, + style = MaterialTheme.typography.bodySmall ) HorizontalDivider(modifier = Modifier.weight(1f)) } @@ -256,7 +270,7 @@ fun SwipeToDeleteExpenseCard( Modifier .clip(CardDefaults.elevatedShape) .fillMaxSize() - .background(MaterialTheme.colorScheme.onError) + .background(MaterialTheme.colorScheme.errorContainer) .padding(horizontal = 20.dp), contentAlignment = Alignment.CenterEnd ) { @@ -329,7 +343,7 @@ fun ExpenseCard( ) { ElevatedCard( colors = CardDefaults.elevatedCardColors() - .copy(containerColor = MaterialTheme.colorScheme.secondaryContainer), + .copy(containerColor = MaterialTheme.colorScheme.surfaceContainer), modifier = Modifier .fillMaxWidth(0.9f) .height(70.dp) @@ -344,14 +358,29 @@ fun ExpenseCard( horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier .fillMaxSize() + //TODO +// .background( +// Brush.horizontalGradient( +// colorStops = arrayOf( +// 1f to Color(expenseDto.category.color.toColorInt()), +// 4f to MaterialTheme.colorScheme.surfaceDim +// ) +// ) +// ) .padding(horizontal = 16.dp) ) { Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(15.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.fillMaxHeight() ) { Icon( + modifier = Modifier + .background( + color = MaterialTheme.colorScheme.surfaceDim, + shape = MaterialTheme.shapes.small + ) + .padding(10.dp), painter = painterResource(expenseDto.category.icon.resource), contentDescription = "Category", tint = Color(expenseDto.category.color.toColorInt()) @@ -367,13 +396,13 @@ fun ExpenseCard( Text( text = expenseDto.category.name, style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSurface ) Text( modifier = Modifier.padding(0.dp), text = expenseDto.expense.note, style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSurface ) } @@ -382,7 +411,7 @@ fun ExpenseCard( DateTimeFormatter.ofPattern("dd MMM HH:mm") ), style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSurfaceVariant ) } } @@ -390,7 +419,7 @@ fun ExpenseCard( Text( text = "- %.2f ${expenseDto.expense.currency}".format(expenseDto.expense.amount), style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSurface ) @@ -398,7 +427,7 @@ fun ExpenseCard( Text( text = "≈ %.2f ${expenseDto.trip.currency}".format(expenseDto.expense.convertedAmount()), style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSecondaryContainer + color = MaterialTheme.colorScheme.onSurface ) } @@ -407,107 +436,125 @@ fun ExpenseCard( } } -//@RequiresApi(Build.VERSION_CODES.O) -//@AllPreviews -//@Composable -//fun PreviewListExpenseScreen() { -// TripMoneyTheme() { -// val pagingData = PagingData.from(sampleExpenseDtoWithConvertedAmountList()) -// ListExpenseScreen( -// expensesDtoFlow = MutableStateFlow(pagingData), -// onSaveExpense = {}, -// onDeleteExpense = {}, -// dailySums = emptyMap() -// ) -// -// } -//} -// -//@AllPreviews -//@Composable -//fun PreviewDeleteConfirmationDialog() { -// TripMoneyTheme() { -// DeleteConfirmationDialog( -// onConfirm = {}, -// onCancel = {}) -// } -//} -// -// -//@RequiresApi(Build.VERSION_CODES.O) -//private fun sampleExpenseDtoWithConvertedAmountList(): List { -// val sampleCategories = listOf( -// Category( -// name = "Hotel", -// icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, -// color = colors.random() -// ), -// Category( -// name = "Jedzenie", -// icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, -// color = colors.random() -// ), -// Category( -// name = "Transport", -// icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, -// color = colors.random() -// ), -// Category( -// name = "Rozrywka", -// icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, -// color = colors.random() -// ), -// Category( -// name = "Zakupy", -// icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, -// color = colors.random() -// ), -// ) -// -// val trip = Trip( -// id = 1, -// name = "Vacation", -// currency = "USD", -// startDate = LocalDate.parse("2026-01-01") -// ) -// -// val startLong = LocalDateTime.now().minusDays(10).toEpochMilli() -// val endLong = LocalDateTime.now().toEpochMilli() -// -// val result: MutableList = mutableListOf() -// for (i in 0..15) { -// val category = sampleCategories.random() -// val datetime = if (i > 4) { -// LocalDateTime.ofEpochSecond( -// Random.nextLong(startLong, endLong), -// 0, -// ZoneOffset.UTC -// ) -// } else LocalDateTime.now() -// -// val expense = Expense( -// id = i, -// categoryId = category.id, -// tripId = 1, -// amount = Random.nextDouble(0.1, 300.0), -// currency = Currencies.entries.random().name, -// note = if (i % 3 == 0) "Some note" else "", -// datetime = datetime, -// rate = if (Random.nextBoolean()) Random.nextDouble( -// 0.1, -// 5.0 -// ) else 1.0 -// ) -// -// -// val expenseDto = ExpenseDto( -// expense = expense, -// category = category, -// trip = trip -// ) -// result.add( -// expenseDto -// ) -// } -// return result -//} \ No newline at end of file +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewListExpenseScreen() { + TripMoneyTheme() { + val pagingData = PagingData.from(sampleExpenseDtoWithConvertedAmountList()) + ListExpenseScreen( + expensesFlow = MutableStateFlow(pagingData), + onSaveExpense = {}, + onDeleteExpense = {}, + true + ) + + } +} + +@AllPreviews +@Composable +fun PreviewDeleteConfirmationDialog() { + TripMoneyTheme() { + DeleteConfirmationDialog( + onConfirm = {}, + onCancel = {}) + } +} + + +@RequiresApi(Build.VERSION_CODES.O) +private fun sampleExpenseDtoWithConvertedAmountList(): List { + val sampleCategories = listOf( + Category( + name = "Hotel", + icon = cc.n0th1ng.tripmoney.utils.Icons.HOTEL, + color = colors.random() + ), + Category( + name = "Jedzenie", + icon = cc.n0th1ng.tripmoney.utils.Icons.RESTAURANT, + color = colors.random() + ), + Category( + name = "Transport", + icon = cc.n0th1ng.tripmoney.utils.Icons.FLIGHT, + color = colors.random() + ), + Category( + name = "Rozrywka", + icon = cc.n0th1ng.tripmoney.utils.Icons.ATTRACTION, + color = colors.random() + ), + Category( + name = "Zakupy", + icon = cc.n0th1ng.tripmoney.utils.Icons.GROCERIES, + color = colors.random() + ), + ) + + val trip = Trip( + id = 1, + name = "Vacation", + currency = "USD", + startDate = LocalDate.parse("2026-01-01") + ) + + val startLong = LocalDateTime.now().minusDays(10).toEpochMilli() + val endLong = LocalDateTime.now().toEpochMilli() + + val result: MutableList = mutableListOf() + result.add( + ExpenseListItemUi.Header( + LocalDateTime.ofEpochSecond( + Random.nextLong(startLong, endLong), + 0, + ZoneOffset.UTC + ).toLocalDate(), Random.nextDouble(0.1, 300.0), Currencies.entries.random().name + ) + ) + for (i in 0..15) { + val category = sampleCategories.random() + val datetime = if (i > 4) { + LocalDateTime.ofEpochSecond( + Random.nextLong(startLong, endLong), + 0, + ZoneOffset.UTC + ) + } else LocalDateTime.now() + + val expense = Expense( + id = i, + categoryId = category.id, + tripId = 1, + amount = Random.nextDouble(0.1, 300.0), + currency = Currencies.entries.random().name, + note = if (i % 3 == 0) "Some note" else "", + datetime = datetime, + rate = if (Random.nextBoolean()) Random.nextDouble( + 0.1, + 5.0 + ) else 1.0 + ) + + + val expenseDto = ExpenseDto( + expense = expense, + category = category, + trip = trip + ) + result.add( + ExpenseListItemUi.Item(expenseDto) + ) + if (i % 5 == 0) { + result.add( + ExpenseListItemUi.Header( + datetime.toLocalDate(), + Random.nextDouble(0.1, 300.0), + Currencies.entries.random().name + ) + ) + } + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/managecategories/ManageCategoriesScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/managecategories/ManageCategoriesScreen.kt new file mode 100644 index 0000000..5e30ae1 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/managecategories/ManageCategoriesScreen.kt @@ -0,0 +1,431 @@ +package cc.n0th1ng.tripmoney.screens.managecategories + +import android.annotation.SuppressLint +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +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.fillMaxHeight +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.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.BasicAlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.FabPosition +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.SwipeToDismissBoxValue +import androidx.compose.material3.Text +import androidx.compose.material3.rememberSwipeToDismissBoxState +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.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ModifierLocalBeyondBoundsLayout +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.core.graphics.toColorInt +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import cc.n0th1ng.tripmoney.R.string +import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.screens.AddCategoryDialog +import cc.n0th1ng.tripmoney.screens.addexpense.categoriesToPreview +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews +import cc.n0th1ng.tripmoney.utils.colors +import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel +import com.composables.icons.materialsymbols.outlined.R +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import kotlin.collections.emptyList + +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun ManageCategoriesScreen() { + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() + val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) + val archivedCategories by expenseAndCategoryViewModel.getArchivedCategories() + .collectAsState(emptyList()) + ManageCategoriesScreen( + categories = categories, + archivedCategories = archivedCategories, + onSaveCategory = { expenseAndCategoryViewModel.save(it) }, + onDeleteCategory = { + expenseAndCategoryViewModel.delete(it) + }, + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun ManageCategoriesScreen( + categories: List, + archivedCategories: List, + onSaveCategory: (Category) -> Unit, + onDeleteCategory: (Category) -> Unit, +) { + + var categoryToEdit by remember { mutableStateOf(null) } + var showAddCategoryDialog by remember { mutableStateOf(false) } + var itemToDelete by remember { mutableStateOf(null) } + var itemToArchive by remember { mutableStateOf(null) } + + Scaffold(floatingActionButtonPosition = FabPosition.EndOverlay, floatingActionButton = { + ExtendedFloatingActionButton( + onClick = { showAddCategoryDialog = true }, + icon = { Icon(Icons.Filled.Add, stringResource(string.add_new)) }, + text = { Text(text = stringResource(string.add_new)) }, + ) + }) + { + LazyColumn(modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) { + items(categories, key = { it.id }) { category -> + SwipeToDeleteExpenseCard( + category = category, + onDelete = { itemToArchive = category }, + onClick = { + categoryToEdit = category + showAddCategoryDialog = true + } + ) + Spacer(Modifier.height(10.dp)) + } + + if (archivedCategories.isNotEmpty()) { + item { + CustomDivider() + Spacer(modifier = Modifier.height(10.dp)) + } + } + + items(archivedCategories, key = { it.id }) { archivedCategory -> + SwipeToDeleteExpenseCard( + category = archivedCategory, + onDelete = { itemToDelete = archivedCategory }, + onClick = { + categoryToEdit = archivedCategory + showAddCategoryDialog = true + }, + isArchived = true + ) + Spacer(Modifier.height(10.dp)) + } + + } + if (showAddCategoryDialog) { + AddCategoryDialog( + onDismiss = { + showAddCategoryDialog = false + }, onSave = { category -> + onSaveCategory(category) + showAddCategoryDialog = false + }, + categoryToEdit = categoryToEdit + ) + } + + + } + + if (itemToDelete != null) { + DeleteConfirmationDialog( + bodyText = stringResource(string.delete_category_info), + onConfirm = { + onDeleteCategory(itemToDelete!!) + itemToDelete = null + }, + onCancel = { + itemToDelete = null + } + ) + } + + if (itemToArchive != null) { + DeleteConfirmationDialog( + title = stringResource(string.you_want_archive), + buttonText = stringResource(string.archive), + bodyText = stringResource(string.archive_category_info), + onConfirm = { + onSaveCategory(itemToArchive!!.copy(archived = true)) + itemToArchive = null + }, + onCancel = { + itemToArchive = null + } + ) + } +} + + +@RequiresApi(Build.VERSION_CODES.O) +@Composable +private fun CustomDivider() { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Absolute.Center, + verticalAlignment = Alignment.CenterVertically + ) { + HorizontalDivider(modifier = Modifier.weight(1f)) + Text( + "Archived", + modifier = Modifier + .padding(horizontal = 5.dp) + .background(Color.White.copy(alpha = 0f)), + style = MaterialTheme.typography.titleMedium + ) + HorizontalDivider(modifier = Modifier.weight(1f)) + + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun SwipeToDeleteExpenseCard( + category: Category, + onDelete: (Category) -> Unit, + onClick: (Category) -> Unit, + isArchived: Boolean = false +) { + + val dismissState = rememberSwipeToDismissBoxState( + confirmValueChange = { dismissValue -> + if (dismissValue == SwipeToDismissBoxValue.EndToStart) { + onDelete(category) + false + } else { + false + } + } + ) + + SwipeToDismissBox( + state = dismissState, + enableDismissFromStartToEnd = false, + backgroundContent = { + Box( + Modifier + .clip(CardDefaults.elevatedShape) + .fillMaxSize() + .background(MaterialTheme.colorScheme.onError) + .padding(horizontal = 20.dp), + contentAlignment = Alignment.CenterEnd + ) { + Icon( + painter = painterResource( + if (isArchived) R.drawable.materialsymbols_ic_delete_outlined + else R.drawable.materialsymbols_ic_archive_outlined + ), + contentDescription = stringResource(string.delete) + ) + } + } + ) { + CategoryCard( + category = category, + onClick = onClick, + isArchived = isArchived + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DeleteConfirmationDialog( + title: String = stringResource(string.delete_confirmation), + buttonText: String = stringResource(string.delete), + bodyText: String = "", + onConfirm: () -> Unit, + onCancel: () -> Unit +) { + BasicAlertDialog( + onDismissRequest = { onCancel() } + ) { + Column( + Modifier + .background( + MaterialTheme.colorScheme.secondaryContainer, + shape = MaterialTheme.shapes.medium + ) + .padding(24.dp) + ) { + Text( + title, + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSecondaryContainer + ) + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = bodyText, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSecondaryContainer + ) + Row( + horizontalArrangement = Arrangement.End, + modifier = Modifier + .fillMaxWidth() + .padding(top = 24.dp) + ) { + Button( + onClick = onCancel, + colors = ButtonDefaults.buttonColors().copy(containerColor = MaterialTheme.colorScheme.secondary), + modifier = Modifier + .padding(end = 10.dp) + ){ + Text(text = stringResource(string.cancel), + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSecondary) + } + Button( + onClick = onConfirm, + colors = ButtonDefaults.buttonColors().copy(containerColor = MaterialTheme.colorScheme.error), + ){ + Text(text = buttonText, + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onError) + } + } + } + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@Composable +fun CategoryCard( + category: Category, + onClick: (Category) -> Unit, + isArchived: Boolean = false +) { + ElevatedCard( + colors = CardDefaults.elevatedCardColors() + .copy(containerColor = MaterialTheme.colorScheme.surfaceContainer), + modifier = Modifier + .fillMaxWidth(0.9f) + .height(70.dp) + .combinedClickable( + enabled = true, + onClick = { onClick(category) }, + onLongClick = { onClick(category) }), + elevation = CardDefaults.cardElevation(defaultElevation = 7.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxSize() + .alpha(if (isArchived) 0.6f else 1f) + .padding(horizontal = 16.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(15.dp), + modifier = Modifier.fillMaxHeight() + ) { + Icon( + modifier = Modifier + .background( + color = MaterialTheme.colorScheme.surfaceDim, + shape = MaterialTheme.shapes.small + ) + .padding(10.dp), + painter = painterResource(category.icon.resource), + contentDescription = "Category", + tint = Color(category.color.toColorInt()) + ) + + Column() + { + Text( + text = category.name, + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onSurface + ) + } + + } + } + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewManageCategoriesScreen() { + TripMoneyTheme { + ManageCategoriesScreen(categories = categoriesToPreview.subList(0,2), categoriesToPreview.subList(3,5), {}, {}) + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewAddCategoryDialog() { + TripMoneyTheme { + AddCategoryDialog( + onDismiss = {}, + onSave = {}) + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewEditCategoryDialog() { + TripMoneyTheme { + AddCategoryDialog( + onDismiss = {}, + onSave = {}, + categoryToEdit = Category( + 0, "Hotel", + icon = cc.n0th1ng.tripmoney.utils.Icons.entries.random(), + color = colors.random(), + archived = false + ) + ) + } +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewDeleteConfirmationDialog() { + TripMoneyTheme { + DeleteConfirmationDialog( + onConfirm = {}, + onCancel = {}, + bodyText = "Your all expenses with category Hotel will be removed.", + title = "Do you want to delete?", + buttonText = "Delete" + ) + } +} + diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt index 2d73a2e..ff4465d 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt @@ -38,10 +38,16 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.FileProvider import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController import cc.n0th1ng.tripmoney.R.* +import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.data.repository.AppTheme +import cc.n0th1ng.tripmoney.navigation.Screens +import cc.n0th1ng.tripmoney.screens.listexpense.CategorySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog +import cc.n0th1ng.tripmoney.screens.statistics.categories import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies @@ -60,7 +66,7 @@ import java.nio.file.Files @RequiresApi(Build.VERSION_CODES.S) @Composable -fun SettingsScreen() { +fun SettingsScreen(navController: NavHostController) { val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTheme by settingsViewModel.theme.collectAsState() val currentDefaultCurrency by settingsViewModel.defaultCurrency.collectAsState() @@ -68,6 +74,7 @@ fun SettingsScreen() { val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) + val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) val context = LocalContext.current val tripName = currentTrip?.name ?: "" val scope = rememberCoroutineScope() @@ -90,7 +97,8 @@ fun SettingsScreen() { e.printStackTrace() } } - } + }, + onCategoriesClick = {navController.navigate(Screens.MANAGE_CATEGORIES)} ) } @@ -103,11 +111,13 @@ fun SettingsScreen( onCurrencySave: (Currencies) -> Unit, tripName: String, onExportToCsv: () -> Unit, + onCategoriesClick: () -> Unit ) { Scaffold { padding -> var showThemeDialog by remember { mutableStateOf(false) } var showCurrencyDialog by remember { mutableStateOf(false) } + var showCategoriesDialog by remember { mutableStateOf(false) } Column( modifier = Modifier .fillMaxWidth() @@ -142,9 +152,15 @@ fun SettingsScreen( SettingsListItem( onClick = onExportToCsv, stringResource(string.export_to_csv), - supportingText = "Save expenses from %s to a file".format(tripName), + supportingText = stringResource(string.export_csv_subttext).format(tripName), iconResource = R.drawable.materialsymbols_ic_csv_outlined ) + SettingsListItem( + onClick = onCategoriesClick, + stringResource(string.categories), + supportingText = stringResource(string.manage_categories), + iconResource = R.drawable.materialsymbols_ic_label_outlined + ) if (showThemeDialog) { ThemeSelectionDialog( @@ -258,7 +274,14 @@ fun ThemeSelectionDialog( @Composable fun PreviewSettingsScreen() { TripMoneyTheme { - SettingsScreen(Currencies.entries.random(), AppTheme.entries.random(), {}, {}, "Włochy", {}) + SettingsScreen( + Currencies.entries.random(), + AppTheme.entries.random(), + {}, + {}, + "Włochy", + {}, + {}) } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt index 44710d7..b29fde8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt @@ -1,5 +1,6 @@ package cc.n0th1ng.tripmoney.screens.statistics +import android.annotation.SuppressLint import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.foundation.background @@ -13,9 +14,15 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.filled.Add import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.FabPosition +import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -30,6 +37,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Trip @@ -82,9 +90,10 @@ fun StatisticsScreen( @Composable fun Summary(summaryAmount: Double, currency: String) { - Card( - modifier = Modifier - .fillMaxWidth() + ElevatedCard( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.elevatedCardColors() + .copy(containerColor = MaterialTheme.colorScheme.surfaceContainer) ) { Row( modifier = Modifier @@ -94,7 +103,10 @@ fun Summary(summaryAmount: Double, currency: String) { horizontalArrangement = Arrangement.SpaceBetween ) { Column { - Text(stringResource(cc.n0th1ng.tripmoney.R.string.total_expenses), style = MaterialTheme.typography.titleSmall) + Text( + stringResource(cc.n0th1ng.tripmoney.R.string.total_expenses), + style = MaterialTheme.typography.titleSmall + ) Text( "%.2f %s".format(summaryAmount, currency), style = MaterialTheme.typography.headlineLarge @@ -118,7 +130,11 @@ fun Summary(summaryAmount: Double, currency: String) { @Composable fun SummaryPerCategoryCard(summaryPerCategoryList: List) { - Card(modifier = Modifier.fillMaxWidth()) { + ElevatedCard( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.elevatedCardColors() + .copy(containerColor = MaterialTheme.colorScheme.surfaceContainer) + ) { Column( modifier = Modifier.padding(15.dp), verticalArrangement = Arrangement.spacedBy(5.dp) @@ -191,16 +207,19 @@ fun CategoryCard(modifier: Modifier = Modifier, summaryPerCategory: SummaryPerCa } } +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @RequiresApi(Build.VERSION_CODES.O) @AllPreviews @Composable fun Preview() { TripMoneyTheme { - StatisticsScreen( - summaryPerCategoryList, - summaryAmount = 125.24, - Currencies.entries.random() - ) + Scaffold { + StatisticsScreen( + summaryPerCategoryList, + summaryAmount = 125.24, + Currencies.entries.random() + ) + } } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt index e3e69f5..63954f9 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -21,7 +20,6 @@ import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.CardDefaults import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ExtendedFloatingActionButton import androidx.compose.material3.FabPosition import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon @@ -50,16 +48,21 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.NavController +import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemKey import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.navigation.Screens -import cc.n0th1ng.tripmoney.screens.addexpense.AddExpenseBottomSheet import cc.n0th1ng.tripmoney.screens.listexpense.DeleteConfirmationDialog +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import java.time.LocalDate @OptIn(ExperimentalMaterial3Api::class) @RequiresApi(Build.VERSION_CODES.O) @@ -70,9 +73,38 @@ fun TripPickerScreen( ) { val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() - var showBottomSheet by remember { mutableStateOf(false) } - val trips: LazyPagingItems = tripViewModel.getTrips().collectAsLazyPagingItems() + val tripsFlow = tripViewModel.getTrips() val currentTripId by settingsViewModel.currentTrip.collectAsState() + + TripPickerScreen( + tripsFlow = tripsFlow, + currentTripId = currentTripId, + onDelete = { trip -> tripViewModel.delete(trip) }, + onClick = { trip -> + settingsViewModel.setCurrentTrip(trip.id) + navController.navigate(Screens.LIST_EXPENSE) + }, + onSave = { trip -> + tripViewModel.save(trip) + } + + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@RequiresApi(Build.VERSION_CODES.O) +@Composable +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +fun TripPickerScreen( + tripsFlow: Flow>, + currentTripId: Int, + onDelete: (Trip) -> Unit, + onClick: (Trip) -> Unit, + onSave: (Trip) -> Unit +) { + var showBottomSheet by remember { mutableStateOf(false) } + val trips: LazyPagingItems = tripsFlow.collectAsLazyPagingItems() + var tripToEdit by remember { mutableStateOf(null) } Scaffold(floatingActionButtonPosition = FabPosition.EndOverlay, floatingActionButton = { FloatingActionButton( @@ -91,12 +123,12 @@ fun TripPickerScreen( val trip = trips[i] if (trip != null) { SwipeToDeleteTripCard( - trip, onDelete = { - tripViewModel.delete(trip) - }, onClick = { - settingsViewModel.setCurrentTrip(trip.id) - navController.navigate(Screens.LIST_EXPENSE) - }, isSelected = currentTripId == trip.id, + trip = trip, + onDelete = { + onDelete(trip) + }, onClick = { + onClick(trip) + }, isSelected = currentTripId == trip.id, onLongClick = { trip -> tripToEdit = trip showBottomSheet = true @@ -113,7 +145,7 @@ fun TripPickerScreen( tripToEdit = null }, onSave = { trip -> - tripViewModel.save(trip) + onSave(trip) showBottomSheet = false tripToEdit = null }, @@ -152,7 +184,6 @@ fun SwipeToDeleteTripCard( } SwipeToDismissBox( - modifier = Modifier.alpha(if (isSelected) 1.0f else 0.7f), state = dismissState, enableDismissFromStartToEnd = false, backgroundContent = { @@ -160,7 +191,7 @@ fun SwipeToDeleteTripCard( Modifier .clip(CardDefaults.elevatedShape) .fillMaxSize() - .background(MaterialTheme.colorScheme.onError) + .background(MaterialTheme.colorScheme.errorContainer) .padding(horizontal = 20.dp), contentAlignment = Alignment.CenterEnd ) { @@ -186,7 +217,7 @@ fun TripCard( containerColor = if (isSelected) { MaterialTheme.colorScheme.primary } else { - MaterialTheme.colorScheme.secondary + MaterialTheme.colorScheme.surfaceContainer } ), modifier = Modifier @@ -195,7 +226,7 @@ fun TripCard( haptics.performHapticFeedback(HapticFeedbackType.LongPress) onLongClick(trip) }, onClick = { onClick(trip) }), - elevation = CardDefaults.cardElevation(defaultElevation = if (isSelected) 7.dp else 0.dp) + elevation = CardDefaults.cardElevation(defaultElevation = 7.dp) ) { Row( horizontalArrangement = Arrangement.SpaceBetween, @@ -216,4 +247,39 @@ fun TripCard( ) } } +} + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun PreviewTripPickerScreen() { + val tripsToPreview = listOf( + Trip( + 1, + name = "Włochy", + startDate = LocalDate.parse("2026-03-01"), + currency = "PLN" + ), + Trip( + 2, + name = "Szwajcaria", + startDate = LocalDate.parse("2025-03-01"), + currency = "EUR" + ), + Trip( + 3, + name = "Portugalia", + startDate = LocalDate.parse("2025-03-01"), + currency = "USD" + ) + ) + TripMoneyTheme { + TripPickerScreen( + tripsFlow = MutableStateFlow(PagingData.from(tripsToPreview)), + currentTripId = 1, + onDelete = {}, + onClick = {}, + onSave = {} + ) + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index ce01167..269acb8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -40,15 +40,28 @@ open class ExpenseAndCategoryViewModel @Inject constructor( private val tripRepo: TripRepository ) : ViewModel() { - fun getExpensesDtoPaged(tripId: Int): Flow> = - expenseRepo.getExpensesDtoPaged(tripId).cachedIn(viewModelScope) + fun archiveCategory(category: Category) { + viewModelScope.launch { + categoryRepo.save(category.copy(archived = true)) + } + } + + fun deArchiveCategory(category: Category) { + viewModelScope.launch { + categoryRepo.save(category.copy(archived = false)) + } + } + + fun getExpensesDtoPaged(tripId: Int, filter: String = ""): Flow> = + expenseRepo.getExpensesDtoPaged(tripId, filter).cachedIn(viewModelScope) @RequiresApi(Build.VERSION_CODES.O) fun getExpensesWithHeadersPaged( - tripId: Int + tripId: Int, + filter: String = "" ): Flow> { - val pagingFlow = getExpensesDtoPaged(tripId) - val sumsFlow = getDailySums(tripId) + val pagingFlow = getExpensesDtoPaged(tripId, filter) + val sumsFlow = getDailySums(tripId, filter) val tripFlow = tripRepo.getTrip(tripId) return combine(pagingFlow, sumsFlow, tripFlow) { pagingData, sums, trip -> val currency = trip?.currency ?: "" @@ -80,8 +93,8 @@ open class ExpenseAndCategoryViewModel @Inject constructor( }.cachedIn(viewModelScope) } - fun getExpensesDto(tripId: Int): Flow> = - expenseRepo.getExpensesDto(tripId) + fun getExpensesDto(tripId: Int, filter: String = ""): Flow> = + expenseRepo.getExpensesDto(tripId, filter) @RequiresApi(Build.VERSION_CODES.O) fun save(expense: Expense, trip: Trip) { @@ -96,14 +109,20 @@ open class ExpenseAndCategoryViewModel @Inject constructor( } - fun delete(expense: Expense) { viewModelScope.launch { expenseRepo.delete(expense) } } + fun delete(category: Category) { + viewModelScope.launch { + categoryRepo.delete(category) + } + } + fun getCategories(): Flow> = categoryRepo.getCategories() + fun getArchivedCategories(): Flow> = categoryRepo.getArchivedCategories() fun save(category: Category) { viewModelScope.launch { @@ -132,8 +151,8 @@ open class ExpenseAndCategoryViewModel @Inject constructor( } @RequiresApi(Build.VERSION_CODES.O) - fun getDailySums(tripId: Int): Flow> { - return getExpensesDto(tripId) + fun getDailySums(tripId: Int, filter: String): Flow> { + return getExpensesDto(tripId, filter) .map { expenses -> expenses.groupBy { it.expense.datetime.toLocalDate() } .mapValues { (_, list) -> @@ -182,7 +201,8 @@ open class ExpenseAndCategoryViewModel @Inject constructor( @RequiresApi(Build.VERSION_CODES.O) sealed class ExpenseListItemUi { data class Item(val expenseDto: ExpenseDto) : ExpenseListItemUi() - data class Header(val date: LocalDate, val sum: Double, val currency: String) : ExpenseListItemUi() + data class Header(val date: LocalDate, val sum: Double, val currency: String) : + ExpenseListItemUi() } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt index 766c7af..b6b8b9e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/TripViewModel.kt @@ -1,21 +1,30 @@ package cc.n0th1ng.tripmoney.viewmodel +import android.os.Build +import androidx.annotation.RequiresApi import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn -import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.Trip +import cc.n0th1ng.tripmoney.data.repository.ExpenseRepository import cc.n0th1ng.tripmoney.data.repository.TripRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject @HiltViewModel -class TripViewModel @Inject constructor(private val repository: TripRepository) : ViewModel() { - +class TripViewModel @Inject constructor( + private val repository: TripRepository, + private val expenseRepository: ExpenseRepository +) : ViewModel() { + private val _isRecalculating = MutableStateFlow(false) + val isRecalculating: StateFlow = _isRecalculating fun getTrips(): Flow> = repository.getTrips().cachedIn(viewModelScope) fun getTrip(tripId: Int): Flow = repository.getTrip(tripId) @@ -26,9 +35,15 @@ class TripViewModel @Inject constructor(private val repository: TripRepository) } } + @RequiresApi(Build.VERSION_CODES.O) fun save(trip: Trip) { viewModelScope.launch { repository.save(trip) + _isRecalculating.value = true + withContext(Dispatchers.IO) { + expenseRepository.recalculateTripExpenses(trip.id) + } + _isRecalculating.value = false } } diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 1fd2749..c19f565 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -5,7 +5,7 @@ Zapisz Usuń Wybierz kategorie - dodaj nową + dodaj nową Wybierz kategorie Anuluj Dodaj wydatek @@ -27,4 +27,9 @@ Lista wydatków Statystyki Eksport do CSV + Zarządzaj kategoriami + Kategorie + Zapisz wydatki z %s do pliku + Dodaj kategorie + Edytuj kategorie \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 68bde61..59ee799 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,7 +5,7 @@ Save Backspace Pick a category - Add new + Add new Pick a currency Cancel Add expense @@ -27,4 +27,13 @@ List of expenses Statistics Export to CSV + Save expenses from %s to a file + Manage categories + Categories + Add category + Edit category + Archive + Do you want to archive? + No expense will be deleted. + Your all expenses with category Hotel will be removed. \ No newline at end of file diff --git a/baselineprofile/.gitignore b/baselineprofile/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/baselineprofile/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/baselineprofile/build.gradle.kts b/baselineprofile/build.gradle.kts new file mode 100644 index 0000000..1f81fc5 --- /dev/null +++ b/baselineprofile/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + alias(libs.plugins.android.test) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.baselineprofile) +} + +android { + namespace = "cc.n0th1ng.baselineprofile" + compileSdk = 36 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = "11" + } + + defaultConfig { + minSdk = 28 + targetSdk = 36 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + targetProjectPath = ":app" + +} + +// This is the configuration block for the Baseline Profile plugin. +// You can specify to run the generators on a managed devices or connected devices. +baselineProfile { + useConnectedDevices = true +} + +dependencies { + implementation(libs.androidx.junit) + implementation(libs.androidx.espresso.core) + implementation(libs.androidx.uiautomator) + implementation(libs.androidx.benchmark.macro.junit4) +} + +androidComponents { + onVariants { v -> + val artifactsLoader = v.artifacts.getBuiltArtifactsLoader() + v.instrumentationRunnerArguments.put( + "targetAppId", + v.testedApks.map { artifactsLoader.load(it)?.applicationId } + ) + } +} \ No newline at end of file diff --git a/baselineprofile/src/main/AndroidManifest.xml b/baselineprofile/src/main/AndroidManifest.xml new file mode 100644 index 0000000..227314e --- /dev/null +++ b/baselineprofile/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt new file mode 100644 index 0000000..52d45e7 --- /dev/null +++ b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt @@ -0,0 +1,40 @@ +package cc.n0th1ng.baselineprofile + +import android.R.attr.contentDescription +import androidx.benchmark.macro.MacrobenchmarkScope +import androidx.benchmark.macro.junit4.BaselineProfileRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.By +import androidx.test.uiautomator.Direction +import androidx.test.uiautomator.Until +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@LargeTest +class BaselineProfileGenerator { + + @get:Rule + val rule = BaselineProfileRule() + + @Test + fun generate() { + rule.collect( + packageName = "cc.n0th1ng.tripmoney", + includeInStartupProfile = true + ) { + pressHome() + startActivityAndWait() + + + // Give Compose time to render + Thread.sleep(500) + + val listNav = device.wait(Until.findObject(By.desc("listExpenseScreen")), 10000) + listNav?.click() ?: throw RuntimeException("listExpenseScreen not found or not clickable") + } + } +} \ No newline at end of file diff --git a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt new file mode 100644 index 0000000..851db23 --- /dev/null +++ b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt @@ -0,0 +1,76 @@ +package cc.n0th1ng.baselineprofile + +import androidx.benchmark.macro.BaselineProfileMode +import androidx.benchmark.macro.CompilationMode +import androidx.benchmark.macro.StartupMode +import androidx.benchmark.macro.StartupTimingMetric +import androidx.benchmark.macro.junit4.MacrobenchmarkRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/** + * This test class benchmarks the speed of app startup. + * Run this benchmark to verify how effective a Baseline Profile is. + * It does this by comparing [CompilationMode.None], which represents the app with no Baseline + * Profiles optimizations, and [CompilationMode.Partial], which uses Baseline Profiles. + * + * Run this benchmark to see startup measurements and captured system traces for verifying + * the effectiveness of your Baseline Profiles. You can run it directly from Android + * Studio as an instrumentation test, or run all benchmarks for a variant, for example benchmarkRelease, + * with this Gradle task: + * ``` + * ./gradlew :baselineprofile:connectedBenchmarkReleaseAndroidTest + * ``` + * + * You should run the benchmarks on a physical device, not an Android emulator, because the + * emulator doesn't represent real world performance and shares system resources with its host. + * + * For more information, see the [Macrobenchmark documentation](https://d.android.com/macrobenchmark#create-macrobenchmark) + * and the [instrumentation arguments documentation](https://d.android.com/topic/performance/benchmarking/macrobenchmark-instrumentation-args). + **/ +@RunWith(AndroidJUnit4::class) +@LargeTest +class StartupBenchmarks { + + @get:Rule + val rule = MacrobenchmarkRule() + + @Test + fun startupCompilationNone() = + benchmark(CompilationMode.None()) + + @Test + fun startupCompilationBaselineProfiles() = + benchmark(CompilationMode.Partial(BaselineProfileMode.Require)) + + private fun benchmark(compilationMode: CompilationMode) { + // The application id for the running build variant is read from the instrumentation arguments. + rule.measureRepeated( + packageName = InstrumentationRegistry.getArguments().getString("targetAppId") + ?: throw Exception("targetAppId not passed as instrumentation runner arg"), + metrics = listOf(StartupTimingMetric()), + compilationMode = compilationMode, + startupMode = StartupMode.COLD, + iterations = 10, + setupBlock = { + pressHome() + }, + measureBlock = { + startActivityAndWait() + + // TODO Add interactions to wait for when your app is fully drawn. + // The app is fully drawn when Activity.reportFullyDrawn is called. + // For Jetpack Compose, you can use ReportDrawn, ReportDrawnWhen and ReportDrawnAfter + // from the AndroidX Activity library. + + // Check the UiAutomator documentation for more information on how to + // interact with the app. + // https://d.android.com/training/testing/other-components/ui-automator + } + ) + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 6d3e77f..2eeeb8d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,4 +6,6 @@ plugins { id("com.google.devtools.ksp") version "2.2.21-2.0.5" apply false id("com.google.dagger.hilt.android") version "2.57.1" apply false + alias(libs.plugins.android.test) apply false + alias(libs.plugins.baselineprofile) apply false } diff --git a/gradle.properties b/gradle.properties index 20e2a01..316a8ed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,5 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +org.gradle.configuration-cache=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7616298..1b29632 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,6 +10,10 @@ activityCompose = "1.8.0" composeBom = "2024.09.00" navigationCompose = "2.9.7" foundationLayout = "1.10.5" +uiautomator = "2.3.0" +benchmarkMacroJunit4 = "1.2.4" +baselineprofile = "1.2.4" +profileinstaller = "1.3.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -28,9 +32,14 @@ androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-te androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout", version.ref = "foundationLayout" } +androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } +androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" } +androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "profileinstaller" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +android-test = { id = "com.android.test", version.ref = "agp" } +baselineprofile = { id = "androidx.baselineprofile", version.ref = "baselineprofile" } diff --git a/settings.gradle.kts b/settings.gradle.kts index ec9298e..e638d04 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,4 +21,4 @@ dependencyResolutionManagement { rootProject.name = "tripMoney" include(":app") - \ No newline at end of file +include(":baselineprofile") From 767d54e8f65da68b4313079d2dbabe0b50cdabc7 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Thu, 2 Apr 2026 10:46:41 +0200 Subject: [PATCH 10/18] init --- app/build.gradle.kts | 2 +- .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 24 ++--- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 3 + .../n0th1ng/tripmoney/data/dao/ExpenseDao.kt | 8 ++ .../cc/n0th1ng/tripmoney/data/entity/Trip.kt | 12 ++- .../data/repository/ExpenseRepository.kt | 4 + .../data/repository/PreferencesRepository.kt | 16 ++++ .../addexpense/AddExpenseBottomSheet.kt | 31 ++++--- .../screens/listexpense/DateTimePicker.kt | 48 +++++++++- .../screens/listexpense/ListExpenseScreen.kt | 39 +++++--- .../screens/settings/SettingsScreen.kt | 43 ++++++--- .../screens/statistics/StatisticsScreen.kt | 91 ++++++++++++------- .../screens/trippicker/AddTripBottomSheet.kt | 85 ++++++++++++++--- .../screens/trippicker/TripPickerScreen.kt | 43 +++++++-- .../cc/n0th1ng/tripmoney/utils/DateUtils.kt | 11 +++ .../viewmodel/ExpenseAndCategoryViewModel.kt | 12 +-- .../tripmoney/viewmodel/SettingsViewModel.kt | 30 +++++- app/src/main/res/values/colors.xml | 9 +- app/src/main/res/values/strings.xml | 3 + gradle/libs.versions.toml | 2 + 20 files changed, 381 insertions(+), 135 deletions(-) create mode 100644 app/src/main/java/cc/n0th1ng/tripmoney/utils/DateUtils.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bf3193c..d582721 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -97,7 +97,7 @@ dependencies { implementation("androidx.paging:paging-compose:3.4.2") implementation("androidx.datastore:datastore-preferences:1.2.1") - implementation("com.composables:icons-material-symbols-outlined-android:2.2.1") + implementation(libs.icons.material.symbols.outlined.android) implementation("com.google.dagger:hilt-android:2.57.1") ksp("com.google.dagger:hilt-android-compiler:2.57.1") diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index db70c55..a344b1b 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -16,15 +16,18 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import androidx.navigation.navArgument import androidx.paging.compose.collectAsLazyPagingItems import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.navigation.BottomNavigation @@ -42,7 +45,9 @@ import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking @AndroidEntryPoint class MainActivity : ComponentActivity() { @@ -53,12 +58,6 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { TripMoneyTheme { - val settingsViewModel: SettingsViewModel = hiltViewModel() - val currentTripId by settingsViewModel.currentTrip.collectAsState() - val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() - expenseAndCategoryViewModel.clearOldRates() - expenseAndCategoryViewModel.getExpensesWithHeadersPaged(currentTripId) - .collectAsLazyPagingItems() NavigationDrawer() } } @@ -78,12 +77,12 @@ fun NavigationDrawer() { val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() var filter by remember { mutableStateOf("") } + val autoOpenPref by settingsViewModel.autoOpenStartupPref.collectAsState() + var hasHandledStartupOpen by rememberSaveable { mutableStateOf(false) } + val shouldTriggerAutoOpen = autoOpenPref == true && !hasHandledStartupOpen CustomNavigationDrawer(navController, drawerState) { Scaffold( - modifier = Modifier.semantics { - testTagsAsResourceId = true - }, topBar = { if (current == Screens.SETTINGS) TopBarSettings( navController @@ -99,7 +98,7 @@ fun NavigationDrawer() { } }, isSearchable = current == Screens.LIST_EXPENSE, - onFilterChange = { newFilter -> filter = newFilter}) + onFilterChange = { newFilter -> filter = newFilter }) }, bottomBar = { BottomNavigation(navController) }) { innerPadding -> @@ -109,7 +108,10 @@ fun NavigationDrawer() { modifier = Modifier.padding(innerPadding) ) { composable(Screens.LIST_EXPENSE) { - ListExpenseScreen(filter) + ListExpenseScreen( + filter, + initialAutoOpen = shouldTriggerAutoOpen, + onAutoOpenConsumed = { hasHandledStartupOpen = true }) } composable(Screens.TRIP_PICKER) { TripPickerScreen(navController) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index 597409c..bf57ea5 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -120,6 +120,7 @@ private class DatabasePrepopulator( Trip( name = "Włochy", startDate = LocalDate.parse("2026-03-01"), + endDate = LocalDate.parse("2026-03-15"), currency = "PLN" ) ) @@ -127,6 +128,7 @@ private class DatabasePrepopulator( Trip( name = "Szwajcaria", startDate = LocalDate.parse("2025-03-01"), + endDate = LocalDate.parse("2025-03-15"), currency = "EUR" ) ) @@ -134,6 +136,7 @@ private class DatabasePrepopulator( Trip( name = "Portugalia", startDate = LocalDate.parse("2025-03-01"), + endDate = LocalDate.parse("2025-03-15"), currency = "USD" ) ) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt index 7368c89..7485d66 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt @@ -49,6 +49,14 @@ interface ExpenseDao { ) fun expenseDto(tripId: Int, filter: String): Flow> + @Query(""" + SELECT trip.budget - IFNULL(SUM(expense.amount * expense.rate), 0) + FROM trip + LEFT JOIN expense ON expense.trip_id = trip.id + WHERE trip.id = :tripId + """) + fun budgetLeft(tripId: Int): Double + @Delete suspend fun delete(expense: Expense) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt index 2efc7c4..e2e7225 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Trip.kt @@ -15,11 +15,17 @@ data class Trip( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo("name") val name: String, @ColumnInfo("start_date") val startDate: LocalDate, + @ColumnInfo("end_date") val endDate: LocalDate, @ColumnInfo("currency") val currency: String, - @ColumnInfo("budget") val budget: Double -){ + @ColumnInfo("budget") val budget: Double = 0.0 +) { companion object { @RequiresApi(Build.VERSION_CODES.O) - val DUMMY = Trip(-1, "", LocalDate.now(), Currencies.default().name, budget = 0.0) + val DUMMY = Trip( + -1, + "", + LocalDate.now(), + endDate = LocalDate.now(), Currencies.default().name, budget = 0.0, + ) } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt index 7e259c9..bf77bb1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt @@ -25,6 +25,10 @@ class ExpenseRepository @Inject constructor( private val exchangeRateRepository: ExchangeRateRepository ) { + fun getBudgetLeft(tripId: Int): Double { + return expenseDao.budgetLeft(tripId) + } + @WorkerThread suspend fun save(expense: Expense) { expenseDao.insert(expense) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt index b4c0b2b..b37a5c8 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/PreferencesRepository.kt @@ -1,10 +1,12 @@ package cc.n0th1ng.tripmoney.data.repository import android.content.Context +import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore +import cc.n0th1ng.tripmoney.data.repository.PreferenceKeys.ADD_EXPENSE_SWITCH import cc.n0th1ng.tripmoney.data.repository.PreferenceKeys.APP_THEME import cc.n0th1ng.tripmoney.data.repository.PreferenceKeys.CURRENT_TRIP import cc.n0th1ng.tripmoney.data.repository.PreferenceKeys.DEFAULT_CURRENCY @@ -23,6 +25,7 @@ object PreferenceKeys { val APP_THEME = intPreferencesKey("app_theme") val CURRENT_TRIP = intPreferencesKey("current_trip") val DEFAULT_CURRENCY = stringPreferencesKey("default_currency") + val ADD_EXPENSE_SWITCH = booleanPreferencesKey("add_expense_switch") } @@ -34,6 +37,13 @@ class PreferencesRepository @Inject constructor(@ApplicationContext private val AppTheme.fromValue(value) } + val currentAddExpenseSwitchFlow: Flow = + context.preferencesDataStore.data.map { prefs -> + val value = prefs[ADD_EXPENSE_SWITCH] + ?: false + value + } + val currentTripFlow: Flow = context.preferencesDataStore.data.map { prefs -> prefs[CURRENT_TRIP] ?: -1 @@ -61,6 +71,12 @@ class PreferencesRepository @Inject constructor(@ApplicationContext private val } } + suspend fun saveAddExpenseSwitch(value: Boolean) { + context.preferencesDataStore.edit { prefs -> + prefs[ADD_EXPENSE_SWITCH] = value + } + } + } enum class AppTheme(val value: Int) { diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index 6a048b8..0092cfd 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -2,13 +2,10 @@ package cc.n0th1ng.tripmoney.screens.addexpense import android.annotation.SuppressLint import android.os.Build -import android.util.Log import androidx.annotation.RequiresApi import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.focusable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -34,7 +31,6 @@ import androidx.compose.material3.SheetState import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableDoubleStateOf @@ -47,7 +43,6 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -76,8 +71,6 @@ import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import com.composables.icons.materialsymbols.outlined.R.drawable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import java.time.LocalDate import java.time.LocalDateTime @@ -104,7 +97,7 @@ fun AddExpenseBottomSheet( onDismiss = onDismiss, expenseDtoToEdit = expenseDtoToEdit, state = state, - currentTrip = currentTrip!!, + currentTrip = currentTrip ?: Trip.DUMMY, categories = categories ) } @@ -128,10 +121,14 @@ fun AddExpenseBottomSheet( var amount by remember { mutableStateOf( - expenseDtoToEdit?.expense?.amount?.toString() ?: "0.00" + "%.2f".format(expenseDtoToEdit?.expense?.amount ?: 0.00) + ) + } + var equationResult by remember { + mutableDoubleStateOf( + expenseDtoToEdit?.expense?.amount ?: 0.00 ) } - var equationResult by remember { mutableDoubleStateOf(0.0) } val dummyFocusRequester = remember { FocusRequester() } var showCurrencyDialog by remember { mutableStateOf(false) } var showCategoryDialog by remember { mutableStateOf(false) } @@ -193,7 +190,7 @@ fun AddExpenseBottomSheet( fontWeight = FontWeight.Bold ) Text( - text = if (amount.contains(Regex("[+\\/*-]\\d+"))) "%.2f".format( + text = if (amount.contains(Regex("[+/*-]\\d+"))) "%.2f".format( equationResult ) else "", fontSize = 14.sp, @@ -240,7 +237,7 @@ fun AddExpenseBottomSheet( NumberKeyboard( modifier = Modifier.fillMaxWidth(), onOperatorClick = { operator -> - if (amount.isDoubleTwoDigitsOrEquation() && amount.contains(Regex("[+\\/*-]\\d+"))) { + if (amount.isDoubleTwoDigitsOrEquation() && amount.contains(Regex("[+/*-]\\d+"))) { amount = evaluate(amount).toString() } val newText = amount + operator @@ -369,7 +366,7 @@ private inline fun String.indexOfFirstIndexed(predicate: (index: Int, Char) -> B } private fun String.isDoubleTwoDigitsOrEquation(): Boolean { - return this != "0.00" && this.matches(Regex("^(-?(0\\.?|0\\.\\d{1,2}|[1-9]\\d*(\\.\\d{0,2})?))([+\\/*-](0\\.?|0\\.\\d{1,2}|[1-9]\\d*(\\.\\d{0,2})?)?)?$")) + return this != "0.00" && this.matches(Regex("^(-?(0\\.?|0\\.\\d{1,2}|[1-9]\\d*(\\.\\d{0,2})?))([+/*-](0\\.?|0\\.\\d{1,2}|[1-9]\\d*(\\.\\d{0,2})?)?)?$")) } @Composable @@ -518,7 +515,6 @@ fun KeyboardButton( text: String? = null, icon: Painter? = null, onClick: () -> Unit, - enabled: Boolean = true, onLongClick: () -> Unit = {}, containerColor: Color = MaterialTheme.colorScheme.primary, contentColor: Color = MaterialTheme.colorScheme.onPrimary @@ -574,6 +570,7 @@ fun PreviewAddExpenseDisabled() { 1, "Trip", LocalDate.parse("2020-01-01"), + LocalDate.parse("2020-01-15"), Currencies.entries.random().name ), categories = categoriesToPreview @@ -607,13 +604,17 @@ fun PreviewAddExpenseEnabled() { tripId = 1 ), category = categoriesToPreview[0], - Trip(1, "Włochy", LocalDate.parse("2025-01-02"), "PLN") + Trip( + 1, "Włochy", LocalDate.parse("2025-01-02"), + LocalDate.parse("2025-01-15"), "PLN" + ) ), state = sheetState, currentTrip = Trip( 1, "Trip", LocalDate.parse("2020-01-01"), + LocalDate.parse("2020-01-11"), Currencies.entries.random().name ), categories = categoriesToPreview diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt index 22434eb..8e7e10b 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt @@ -5,14 +5,14 @@ import androidx.annotation.RequiresApi import androidx.compose.material3.AlertDialog import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePickerDialog -import androidx.compose.material3.DatePickerState +import androidx.compose.material3.DateRangePicker import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TimePicker import androidx.compose.material3.TimePickerState import androidx.compose.material3.rememberDatePickerState +import androidx.compose.material3.rememberDateRangePickerState import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -20,17 +20,55 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.sp import cc.n0th1ng.tripmoney.R.* -import java.sql.Time import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime import java.time.ZoneId -import java.time.format.DateTimeFormatter import java.util.Calendar +@RequiresApi(Build.VERSION_CODES.O) +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DateRangePicker( + startDate: LocalDate, + endDate: LocalDate, + onDismiss: () -> Unit, + onConfirm: (LocalDate, LocalDate) -> Unit +) { + val datePickerState = + rememberDateRangePickerState(initialSelectedStartDateMillis = startDate.toEpochMilli(), + initialSelectedEndDateMillis = endDate.toEpochMilli()) + + DatePickerDialog( + onDismissRequest = onDismiss, + confirmButton = { + TextButton(onClick = { + val selectedStartDateMillis = datePickerState.selectedStartDateMillis + val selectedEndDateMillis = datePickerState.selectedEndDateMillis + if (selectedStartDateMillis != null && selectedEndDateMillis != null) { + val selectedStartDate = Instant.ofEpochMilli(selectedStartDateMillis) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + val selectedEndDate = + Instant.ofEpochMilli(selectedEndDateMillis).atZone(ZoneId.systemDefault()) + .toLocalDate() + onConfirm(selectedStartDate, selectedEndDate) + } + }) { + Text("OK") + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) } + } + ) { + DateRangePicker(state = datePickerState, showModeToggle = false, + title = {}) + } +} + @RequiresApi(Build.VERSION_CODES.O) @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index 0546af4..75b7431 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -46,14 +46,12 @@ 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.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import androidx.paging.LoadState import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemKey @@ -73,7 +71,6 @@ import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.filter import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneOffset @@ -83,7 +80,9 @@ import kotlin.random.Random @RequiresApi(Build.VERSION_CODES.O) @Composable -fun ListExpenseScreen(filter: String) { +fun ListExpenseScreen(filter: String, + initialAutoOpen: Boolean, + onAutoOpenConsumed: () -> Unit ) { val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() @@ -97,7 +96,9 @@ fun ListExpenseScreen(filter: String) { expensesFlow = expensesFlow, onSaveExpense = { expenseAndCategoryViewModel.save(it, currentTrip!!) }, onDeleteExpense = { expenseAndCategoryViewModel.delete(it) }, - isRecalculatingRate = isRecalculatingRate + isRecalculatingRate = isRecalculatingRate, + initialAutoOpen = initialAutoOpen, + onAutoOpenConsumed = onAutoOpenConsumed ) } @@ -108,12 +109,23 @@ fun ListExpenseScreen(filter: String) { fun ListExpenseScreen( expensesFlow: Flow>, onSaveExpense: (Expense) -> Unit, onDeleteExpense: (Expense) -> Unit, - isRecalculatingRate: Boolean + isRecalculatingRate: Boolean, + initialAutoOpen: Boolean, + onAutoOpenConsumed: () -> Unit ) { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + var showBottomSheet by remember { mutableStateOf(false) } + + LaunchedEffect(initialAutoOpen) { + if (initialAutoOpen) { + showBottomSheet = true + onAutoOpenConsumed() + } + } + val items = expensesFlow.collectAsLazyPagingItems() val listState = rememberLazyListState() - var showBottomSheet by remember { mutableStateOf(false) } var expenseDtoToEdit by remember { mutableStateOf(null) } var itemToDelete by remember { mutableStateOf(null) } @@ -196,7 +208,7 @@ fun ListExpenseScreen( showBottomSheet = false }, expenseDtoToEdit = expenseDtoToEdit, - state = rememberModalBottomSheetState(skipPartiallyExpanded = true) + state = sheetState ) } } @@ -216,7 +228,9 @@ fun CustomDivider(date: LocalDate, sum: Double, currency: String) { date.format( DateTimeFormatter.ofPattern("dd EEEE") ).toString(), - modifier = Modifier.padding(horizontal = 5.dp).background(Color.White.copy(alpha = 0f)), + modifier = Modifier + .padding(horizontal = 5.dp) + .background(Color.White.copy(alpha = 0f)), style = MaterialTheme.typography.titleMedium ) Row( @@ -446,7 +460,9 @@ fun PreviewListExpenseScreen() { expensesFlow = MutableStateFlow(pagingData), onSaveExpense = {}, onDeleteExpense = {}, - true + isRecalculatingRate = true, + false, + {} ) } @@ -497,7 +513,8 @@ private fun sampleExpenseDtoWithConvertedAmountList(): List { id = 1, name = "Vacation", currency = "USD", - startDate = LocalDate.parse("2026-01-01") + startDate = LocalDate.parse("2026-01-01"), + endDate = LocalDate.parse("2026-01-11"), ) val startLong = LocalDateTime.now().minusDays(10).toEpochMilli() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt index ff4465d..0feb2ef 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Scaffold +import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -69,12 +70,12 @@ import java.nio.file.Files fun SettingsScreen(navController: NavHostController) { val settingsViewModel: SettingsViewModel = hiltViewModel() val currentTheme by settingsViewModel.theme.collectAsState() + val currentAddExpenseSwitch by settingsViewModel.addExpenseSwitch.collectAsState() val currentDefaultCurrency by settingsViewModel.defaultCurrency.collectAsState() val currentTripId by settingsViewModel.currentTrip.collectAsState() val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) - val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) val context = LocalContext.current val tripName = currentTrip?.name ?: "" val scope = rememberCoroutineScope() @@ -84,6 +85,9 @@ fun SettingsScreen(navController: NavHostController) { currentTheme = currentTheme, onThemeSave = { settingsViewModel.setTheme(it) }, onCurrencySave = { settingsViewModel.setDefaultCurrency(it) }, + onAddExpenseSwitch = { + settingsViewModel.setCurrentAddExpenseSwitch(it) + }, tripName = tripName, onExportToCsv = { scope.launch { @@ -98,7 +102,8 @@ fun SettingsScreen(navController: NavHostController) { } } }, - onCategoriesClick = {navController.navigate(Screens.MANAGE_CATEGORIES)} + onCategoriesClick = { navController.navigate(Screens.MANAGE_CATEGORIES) }, + currentAddExpenseSwitch = currentAddExpenseSwitch ) } @@ -111,13 +116,14 @@ fun SettingsScreen( onCurrencySave: (Currencies) -> Unit, tripName: String, onExportToCsv: () -> Unit, - onCategoriesClick: () -> Unit + onCategoriesClick: () -> Unit, + onAddExpenseSwitch: (Boolean) -> Unit, + currentAddExpenseSwitch: Boolean ) { Scaffold { padding -> var showThemeDialog by remember { mutableStateOf(false) } var showCurrencyDialog by remember { mutableStateOf(false) } - var showCategoriesDialog by remember { mutableStateOf(false) } Column( modifier = Modifier .fillMaxWidth() @@ -161,6 +167,15 @@ fun SettingsScreen( supportingText = stringResource(string.manage_categories), iconResource = R.drawable.materialsymbols_ic_label_outlined ) + SettingsListItem( + onClick = onCategoriesClick, + stringResource(string.add_expense), + supportingText = stringResource(string.add_expense_settings), + iconResource = R.drawable.materialsymbols_ic_payments_outlined, + trailingContent = { + Switch(checked = currentAddExpenseSwitch, onCheckedChange = {onAddExpenseSwitch(it)}) + } + ) if (showThemeDialog) { ThemeSelectionDialog( @@ -209,7 +224,7 @@ fun SettingsListItem( headlineText: String, trailingContent: @Composable () -> Unit = {}, supportingText: String, - iconResource: Int + iconResource: Int, ) { Card { ListItem( @@ -226,6 +241,7 @@ fun SettingsListItem( } } + @Composable fun ThemeSelectionDialog( onDismiss: () -> Unit, @@ -275,13 +291,16 @@ fun ThemeSelectionDialog( fun PreviewSettingsScreen() { TripMoneyTheme { SettingsScreen( - Currencies.entries.random(), - AppTheme.entries.random(), - {}, - {}, - "Włochy", - {}, - {}) + currentDefaultCurrency = Currencies.entries.random(), + currentTheme = AppTheme.entries.random(), + onThemeSave = {}, + onCurrencySave = {}, + onExportToCsv = {}, + tripName = "Włochy", + onCategoriesClick = {}, + onAddExpenseSwitch = {}, + currentAddExpenseSwitch = false + ) } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt index b29fde8..e6ca67b 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt @@ -14,12 +14,8 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.filled.Add -import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.ElevatedCard -import androidx.compose.material3.FabPosition -import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -31,13 +27,13 @@ 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.layout.ModifierLocalBeyondBoundsLayout +import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt +import androidx.core.graphics.toColorLong import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Trip @@ -66,7 +62,8 @@ fun StatisticsScreen() { StatisticsScreen( summaryPerCategoryList, summaryAmount, - Currencies.valueOf(currentTrip?.currency ?: Currencies.default().name) + Currencies.valueOf(currentTrip?.currency ?: Currencies.default().name), + expenseAndCategoryViewModel.getBudgetLeft(currentTripId) ) } @@ -75,7 +72,8 @@ fun StatisticsScreen() { fun StatisticsScreen( summaryPerCategoryList: List, summaryAmount: Double, - tripCurrency: Currencies + tripCurrency: Currencies, + moneyLeft: Double ) { Column( modifier = Modifier @@ -83,48 +81,70 @@ fun StatisticsScreen( .fillMaxSize(), verticalArrangement = Arrangement.spacedBy(10.dp) ) { - Summary(summaryAmount, tripCurrency.name) + Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) { + Summary( + Modifier.weight(1f), -1 * summaryAmount, tripCurrency.name, + stringResource(cc.n0th1ng.tripmoney.R.string.total_expenses), + R.drawable.materialsymbols_ic_payment_arrow_down_outlined, + iconColor = MaterialTheme.colorScheme.error + ) + Summary( + Modifier.weight(1f), moneyLeft, tripCurrency.name, + stringResource(cc.n0th1ng.tripmoney.R.string.money_left), + R.drawable.materialsymbols_ic_payments_outlined, + iconColor = colorResource(cc.n0th1ng.tripmoney.R.color.good_green) + ) + } SummaryPerCategoryCard(summaryPerCategoryList) + } } + @Composable -fun Summary(summaryAmount: Double, currency: String) { +fun Summary( + modifier: Modifier = Modifier, + amount: Double, + currency: String, + text: String, + icon: Int, + iconColor: Color +) { ElevatedCard( - modifier = Modifier.fillMaxWidth(), + modifier = modifier, colors = CardDefaults.elevatedCardColors() .copy(containerColor = MaterialTheme.colorScheme.surfaceContainer) ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(15.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween + Column( + modifier = Modifier.padding(10.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) ) { - Column { + Row( + modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Icon( + modifier = Modifier + .background( + color = MaterialTheme.colorScheme.surfaceDim, + shape = MaterialTheme.shapes.small + ) + .padding(5.dp), + painter = painterResource(icon), + tint = iconColor, + contentDescription = null, + ) Text( - stringResource(cc.n0th1ng.tripmoney.R.string.total_expenses), + text, style = MaterialTheme.typography.titleSmall ) - Text( - "%.2f %s".format(summaryAmount, currency), - style = MaterialTheme.typography.headlineLarge - ) + } - Row( - horizontalArrangement = Arrangement.Center + Text( + "%.2f %s".format(amount, currency), + style = MaterialTheme.typography.titleLarge, ) - { - Icon( - painter = painterResource(R.drawable.materialsymbols_ic_payment_arrow_down_outlined), - contentDescription = null, - modifier = Modifier.size(45.dp) - ) - - } } - } } @@ -217,7 +237,8 @@ fun Preview() { StatisticsScreen( summaryPerCategoryList, summaryAmount = 125.24, - Currencies.entries.random() + Currencies.entries.random(), + 432.14 ) } } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt index c00c932..e32de5e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt @@ -29,6 +29,7 @@ import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableDoubleStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -37,6 +38,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Shape import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -47,9 +49,11 @@ import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.screens.addexpense.CurrencyButton import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.DatePicker +import cc.n0th1ng.tripmoney.screens.listexpense.DateRangePicker import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies +import cc.n0th1ng.tripmoney.utils.pretty import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import io.ktor.http.hostIsIp import kotlinx.coroutines.CoroutineScope @@ -98,8 +102,15 @@ fun AddTripBottomSheet( ) } + var endDate by remember { + mutableStateOf( + tripToEdit?.startDate ?: LocalDate.now() + ) + } + var showCurrencyDialog by remember { mutableStateOf(false) } var showDatePicker by remember { mutableStateOf(false) } + var budgetString by remember { mutableStateOf(tripToEdit?.budget?.toString() ?: "") } var currency by remember { mutableStateOf(tripToEdit?.currency ?: defaultCurrency.name) } var enableSave by remember { mutableStateOf(tripToEdit != null) } @@ -127,6 +138,23 @@ fun AddTripBottomSheet( name = newText enableSave = !name.isEmpty() }) + Row( + modifier = Modifier.fillMaxWidth(0.9f), + horizontalArrangement = Arrangement.spacedBy(15.dp), + verticalAlignment = Alignment.CenterVertically + ) { + BudgetInput( + modifier = Modifier.fillMaxWidth(0.7f), + budget = budgetString, + onTextChange = { newBudget -> budgetString = newBudget }) + CurrencyButton( + modifier = Modifier + .weight(1f) + .fillMaxWidth(1f), + onClick = { showCurrencyDialog = true }, text = currency + ) + } + Row( modifier = Modifier.fillMaxWidth(0.9f), horizontalArrangement = Arrangement.spacedBy(10.dp) @@ -137,17 +165,14 @@ fun AddTripBottomSheet( .weight(1f), shape = MaterialTheme.shapes.medium, onClick = { showDatePicker = true }) { + val startDateFormatted = startDate.pretty() + val endDateFormatted = endDate.pretty() Text( - text = startDate.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")), + text = "$startDateFormatted - $endDateFormatted", fontSize = 17.sp ) } - CurrencyButton( - modifier = Modifier - .weight(1f) - .fillMaxWidth(1f), - onClick = { showCurrencyDialog = true }, text = currency - ) + } @@ -157,7 +182,13 @@ fun AddTripBottomSheet( shape = MaterialTheme.shapes.medium, onClick = { val trip = - Trip(name = name, startDate = startDate, currency = currency) + Trip( + name = name, + startDate = startDate, + endDate = endDate, + currency = currency, + budget = budgetString.toDoubleOrNull() ?: 0.0 + ) onSave(if (tripToEdit == null) trip else trip.copy(id = tripToEdit.id)) }) { @@ -182,10 +213,15 @@ fun AddTripBottomSheet( } if (showDatePicker) { - DatePicker(startDate, onDismiss = { showDatePicker = false }, onConfirm = { newDate -> - startDate = newDate - showDatePicker = false - }) + DateRangePicker( + startDate = startDate, + endDate = endDate, + onDismiss = { showDatePicker = false }, + onConfirm = { newStartDate, newEndDate -> + startDate = newStartDate + endDate = newEndDate + showDatePicker = false + }) } } @@ -201,6 +237,28 @@ fun NameInput(name: String, onTextChange: (String) -> Unit) { ) } +@Composable +fun BudgetInput(modifier: Modifier = Modifier, budget: String, onTextChange: (String) -> Unit) { + var text by remember { mutableStateOf(budget) } + OutlinedTextField( + placeholder = { Text("0.0") }, + modifier = modifier, + label = { Text(stringResource(R.string.budget)) }, + value = text, + onValueChange = { newText -> + val regex = Regex("^\\d*\\.?\\d{0,2}$") + if (regex.matches(newText)) { + text = newText + onTextChange(text) + } + }, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Decimal, + imeAction = ImeAction.Done + ) + ) +} + @RequiresApi(Build.VERSION_CODES.O) @SuppressLint("CoroutineCreationDuringComposition") @@ -231,7 +289,8 @@ fun PreviewAddTripBottomSheetEditTrip() { AddTripBottomSheet( {}, {}, - Trip(1, "Włochy", LocalDate.parse("2025-01-02"), "PLN"), + Trip(1, "Włochy", LocalDate.parse("2025-01-02"), + LocalDate.parse("2025-01-15"), "PLN", budget = 0.0), sheetState, defaultCurrency = Currencies.entries.random() ) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt index 63954f9..a42ac7c 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreen.kt @@ -58,6 +58,7 @@ import cc.n0th1ng.tripmoney.navigation.Screens import cc.n0th1ng.tripmoney.screens.listexpense.DeleteConfirmationDialog import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.utils.AllPreviews +import cc.n0th1ng.tripmoney.utils.pretty import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import kotlinx.coroutines.flow.Flow @@ -204,6 +205,7 @@ fun SwipeToDeleteTripCard( } +@RequiresApi(Build.VERSION_CODES.O) @Composable fun TripCard( trip: Trip, @@ -236,15 +238,34 @@ fun TripCard( Column( modifier = Modifier.padding(16.dp) ) { - Text(fontSize = 25.sp, fontWeight = FontWeight.SemiBold, text = trip.name) - Text(trip.startDate.toString()) + Text( + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.SemiBold, + text = trip.name + ) + Text( + style = MaterialTheme.typography.bodySmall, + text = "start: " + trip.startDate.pretty() + "\nend: " + trip.endDate.pretty() + ) + } + Column( + modifier = Modifier.padding(end = 20.dp), + horizontalAlignment = Alignment.End) { + Text( + trip.currency.uppercase(), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + Text( + "budget:", + style = MaterialTheme.typography.bodySmall, + ) + Text( + "%.2f".format(trip.budget), + style = MaterialTheme.typography.bodySmall, + ) + } - Text( - trip.currency.uppercase(), - modifier = Modifier.padding(20.dp), - fontSize = 20.sp, - fontWeight = FontWeight.SemiBold - ) } } } @@ -258,18 +279,22 @@ fun PreviewTripPickerScreen() { 1, name = "Włochy", startDate = LocalDate.parse("2026-03-01"), - currency = "PLN" + endDate = LocalDate.parse("2026-03-14"), + currency = "PLN", + budget = 1053.53 ), Trip( 2, name = "Szwajcaria", startDate = LocalDate.parse("2025-03-01"), + endDate = LocalDate.parse("2025-03-11"), currency = "EUR" ), Trip( 3, name = "Portugalia", startDate = LocalDate.parse("2025-03-01"), + endDate = LocalDate.parse("2025-03-11"), currency = "USD" ) ) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/DateUtils.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/DateUtils.kt new file mode 100644 index 0000000..626cba8 --- /dev/null +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/DateUtils.kt @@ -0,0 +1,11 @@ +package cc.n0th1ng.tripmoney.utils + +import android.os.Build +import androidx.annotation.RequiresApi +import java.time.LocalDate +import java.time.format.DateTimeFormatter + +@RequiresApi(Build.VERSION_CODES.O) +fun LocalDate.pretty(): String { + return this.format(DateTimeFormatter.ofPattern("dd MMM yyyy")) +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index 269acb8..4b61a8f 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -40,16 +40,8 @@ open class ExpenseAndCategoryViewModel @Inject constructor( private val tripRepo: TripRepository ) : ViewModel() { - fun archiveCategory(category: Category) { - viewModelScope.launch { - categoryRepo.save(category.copy(archived = true)) - } - } - - fun deArchiveCategory(category: Category) { - viewModelScope.launch { - categoryRepo.save(category.copy(archived = false)) - } + fun getBudgetLeft(tripId: Int): Double { + return expenseRepo.getBudgetLeft(tripId) } fun getExpensesDtoPaged(tripId: Int, filter: String = ""): Flow> = diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt index e7da36e..00c8e5e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/SettingsViewModel.kt @@ -5,15 +5,23 @@ import android.content.Context import android.os.Build import androidx.annotation.RequiresApi import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import cc.n0th1ng.tripmoney.data.repository.AppTheme import cc.n0th1ng.tripmoney.data.repository.PreferencesRepository import cc.n0th1ng.tripmoney.utils.Currencies +import dagger.Provides import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.android.scopes.ViewScoped +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.take +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import javax.inject.Inject @@ -22,6 +30,7 @@ class SettingsViewModel @Inject constructor( private val repo: PreferencesRepository, @ApplicationContext private val context: Context ) : ViewModel() { + private val uiModeManager: UiModeManager = context.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager val theme = repo.themeFlow @@ -31,6 +40,18 @@ class SettingsViewModel @Inject constructor( AppTheme.SYSTEM ) + val autoOpenStartupPref = repo.currentAddExpenseSwitchFlow + .take(1) + .stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5000), + initialValue = null + ) + + val addExpenseSwitch = repo.currentAddExpenseSwitchFlow.stateIn( + viewModelScope, SharingStarted.WhileSubscribed(5000), false + ) + val currentTrip = repo.currentTripFlow.stateIn( viewModelScope, SharingStarted.WhileSubscribed(5000), -1 @@ -47,6 +68,11 @@ class SettingsViewModel @Inject constructor( } } + fun setCurrentAddExpenseSwitch(value: Boolean) { + viewModelScope.launch { + repo.saveAddExpenseSwitch(value) + } + } fun setCurrentTrip(tripId: Int) { viewModelScope.launch { repo.saveCurrentTrip(tripId) @@ -77,5 +103,3 @@ class SettingsViewModel @Inject constructor( } } - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..5e81d96 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,5 @@ - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF + #A0D585 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 59ee799..12a3abd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,4 +36,7 @@ Do you want to archive? No expense will be deleted. Your all expenses with category Hotel will be removed. + Budget + Money left + Open add expense form on startup \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1b29632..4c5ec5b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,6 @@ [versions] agp = "8.13.2" +iconsMaterialSymbolsOutlinedAndroid = "2.2.1" kotlin = "2.2.21" coreKtx = "1.10.1" junit = "4.13.2" @@ -17,6 +18,7 @@ profileinstaller = "1.3.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +icons-material-symbols-outlined-android = { module = "com.composables:icons-material-symbols-outlined-android", version.ref = "iconsMaterialSymbolsOutlinedAndroid" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } From 3847e311a5263a4baf7b5e695cdfe4012d3fa1a5 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Wed, 8 Apr 2026 13:31:38 +0200 Subject: [PATCH 11/18] init --- app/build.gradle.kts | 15 +- app/src/main/AndroidManifest.xml | 1 + .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 41 +++-- .../n0th1ng/tripmoney/data/dao/ExpenseDao.kt | 88 +++++++--- .../data/repository/ExpenseRepository.kt | 43 +++-- .../cc/n0th1ng/tripmoney/navigation/TopBar.kt | 156 ++++++++++++++++-- .../screens/listexpense/ListExpenseScreen.kt | 12 +- .../viewmodel/ExpenseAndCategoryViewModel.kt | 20 ++- baselineprofile/build.gradle.kts | 1 + .../BaselineProfileGenerator.kt | 12 +- gradle/libs.versions.toml | 4 + 11 files changed, 308 insertions(+), 85 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d582721..6e2da08 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,6 +30,19 @@ android { "proguard-rules.pro" ) } + create("benchmark") { + initWith(getByName("release")) + + // 🔑 Critical settings for Macrobenchmark + isDebuggable = false + isMinifyEnabled = false + isShrinkResources = false + + // Use release signing if needed (optional for local) + signingConfig = signingConfigs.getByName("debug") + + matchingFallbacks += listOf("release") + } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 @@ -95,7 +108,7 @@ dependencies { implementation("androidx.paging:paging-runtime:3.4.2") implementation("androidx.paging:paging-compose:3.4.2") - implementation("androidx.datastore:datastore-preferences:1.2.1") + implementation(libs.androidx.datastore.preferences) implementation(libs.icons.material.symbols.outlined.android) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e16262c..72d3e33 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ android:supportsRtl="true" android:theme="@style/Theme.TripMoney"> diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index a344b1b..6d6f4cc 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -19,16 +19,12 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument -import androidx.paging.compose.collectAsLazyPagingItems +import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.navigation.BottomNavigation import cc.n0th1ng.tripmoney.navigation.CustomNavigationDrawer @@ -45,9 +41,7 @@ import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking @AndroidEntryPoint class MainActivity : ComponentActivity() { @@ -69,6 +63,8 @@ class MainActivity : ComponentActivity() { fun NavigationDrawer() { val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() + val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() + val categories by expenseAndCategoryViewModel.getCategories().collectAsState(emptyList()) val currentTripId by settingsViewModel.currentTrip.collectAsState() val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) val navController = rememberNavController() @@ -76,7 +72,8 @@ fun NavigationDrawer() { val current = navBackStack?.destination?.route val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() - var filter by remember { mutableStateOf("") } + var search by remember { mutableStateOf("") } + var filter by remember { mutableStateOf(Filter()) } val autoOpenPref by settingsViewModel.autoOpenStartupPref.collectAsState() var hasHandledStartupOpen by rememberSaveable { mutableStateOf(false) } val shouldTriggerAutoOpen = autoOpenPref == true && !hasHandledStartupOpen @@ -98,7 +95,11 @@ fun NavigationDrawer() { } }, isSearchable = current == Screens.LIST_EXPENSE, - onFilterChange = { newFilter -> filter = newFilter }) + onSearchChange = { newSearch -> search = newSearch }, + onFilterChange = { newFilter -> filter = newFilter }, + categories = categories, + filter = filter + ) }, bottomBar = { BottomNavigation(navController) }) { innerPadding -> @@ -109,7 +110,7 @@ fun NavigationDrawer() { ) { composable(Screens.LIST_EXPENSE) { ListExpenseScreen( - filter, + filter = filter, search = search, initialAutoOpen = shouldTriggerAutoOpen, onAutoOpenConsumed = { hasHandledStartupOpen = true }) } @@ -128,5 +129,25 @@ fun NavigationDrawer() { } } } +} +data class Filter( + val categories: List = emptyList(), val startAmount: Double = 0.0, + val endAmount: Double = Double.MAX_VALUE +) { + fun with(category: Category): Filter { + return this.copy(categories = categories + category) + } + + fun withStartAmount(amount: Double): Filter { + return this.copy(startAmount = amount) + } + + fun withEndAmount(amount: Double): Filter { + return this.copy(endAmount = amount) + } + + fun without(category: Category): Filter { + return this.copy(categories = categories - category) + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt index 7485d66..601c5ac 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt @@ -6,55 +6,93 @@ import androidx.room.Delete import androidx.room.Query import androidx.room.Transaction import androidx.room.Upsert -import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategoryRaw +import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import kotlinx.coroutines.flow.Flow @Dao interface ExpenseDao { + @Upsert suspend fun insert(expense: Expense) @Query( """ - SELECT expense.*, category.* - FROM expense - JOIN category ON expense.category_id = category.id - WHERE expense.trip_id = :tripId - AND - ( - (:filter IS NULL OR category.name LIKE '%' || :filter || '%') - OR (:filter IS NULL OR expense.note LIKE '%' || :filter || '%') + SELECT * FROM expense + JOIN category ON expense.category_id = category.id + WHERE trip_id = :tripId + AND ( + :search IS NULL + OR category.name LIKE '%' || :search || '%' + OR expense.note LIKE '%' || :search || '%' ) - ORDER BY expense.datetime DESC + AND ( + :categoriesEmpty = 1 + OR expense.category_id IN (:categoryIds) + ) + AND ( + :startAmount IS NULL OR expense.amount >= :startAmount + ) + AND ( + :endAmount IS NULL OR expense.amount <= :endAmount + ) + + ORDER BY expense.datetime DESC """ ) - fun expenseDtoPaged(tripId: Int, filter: String): PagingSource + fun expenseDtoPaged( + tripId: Int, + search: String?, + categoryIds: List, + categoriesEmpty: Boolean, + startAmount: Double?, + endAmount: Double? + ): PagingSource @Transaction @Query( - """ - SELECT * FROM expense - JOIN category ON expense.category_id = category.id - WHERE trip_id = :tripId - AND - ( - (:filter IS NULL OR category.name LIKE '%' || :filter || '%') - OR (:filter IS NULL OR expense.note LIKE '%' || :filter || '%') + """ + SELECT * FROM expense + JOIN category ON expense.category_id = category.id + WHERE trip_id = :tripId + AND ( + :search IS NULL + OR category.name LIKE '%' || :search || '%' + OR expense.note LIKE '%' || :search || '%' + ) + AND ( + :categoriesEmpty = 1 + OR expense.category_id IN (:categoryIds) + ) + AND ( + :startAmount IS NULL OR expense.amount >= :startAmount + ) + AND ( + :endAmount IS NULL OR expense.amount <= :endAmount ) - ORDER BY expense.datetime DESC - """ - ) - fun expenseDto(tripId: Int, filter: String): Flow> - @Query(""" + ORDER BY expense.datetime DESC +""" + ) + fun expenseDto( + tripId: Int, + search: String?, + categoryIds: List, + categoriesEmpty: Boolean, + startAmount: Double?, + endAmount: Double? + ): Flow> + + @Query( + """ SELECT trip.budget - IFNULL(SUM(expense.amount * expense.rate), 0) FROM trip LEFT JOIN expense ON expense.trip_id = trip.id WHERE trip.id = :tripId - """) + """ + ) fun budgetLeft(tripId: Int): Double @Delete diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt index bf77bb1..5212e00 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt @@ -3,21 +3,16 @@ package cc.n0th1ng.tripmoney.data.repository import android.os.Build import androidx.annotation.RequiresApi import androidx.annotation.WorkerThread -import androidx.lifecycle.viewModelScope import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData +import cc.n0th1ng.tripmoney.Filter import cc.n0th1ng.tripmoney.data.dao.ExpenseDao -import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategoryRaw import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.utils.Currencies -import kotlinx.coroutines.async -import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch import javax.inject.Inject class ExpenseRepository @Inject constructor( @@ -39,15 +34,43 @@ class ExpenseRepository @Inject constructor( expenseDao.delete(expense) } - fun getExpensesDtoPaged(tripId: Int, filter: String): Flow> { + fun getExpensesDtoPaged( + tripId: Int, + search: String, + filter: Filter, + ): Flow> { return Pager( config = PagingConfig(pageSize = 50, enablePlaceholders = false), - pagingSourceFactory = { expenseDao.expenseDtoPaged(tripId, filter) } + pagingSourceFactory = { + val categoryIds = filter.categories.map { it.id } + expenseDao.expenseDtoPaged( + tripId = tripId, + search = search.takeIf { it.isNotBlank() }, + categoryIds = categoryIds, + categoriesEmpty = categoryIds.isEmpty(), + startAmount = filter.startAmount, + endAmount = filter.endAmount + ) + + } ).flow } - fun getExpensesDto(tripId: Int, filter: String = ""): Flow> { - return expenseDao.expenseDto(tripId, filter) + fun getExpensesDto( + tripId: Int, + search: String = "", + filter: Filter = Filter() + ): Flow> { + val categoryIds = filter.categories.map { it.id } + + return expenseDao.expenseDto( + tripId = tripId, + search = search.takeIf { it.isNotBlank() }, + categoryIds = categoryIds, + categoriesEmpty = categoryIds.isEmpty(), + startAmount = filter.startAmount, + endAmount = filter.endAmount + ) } @RequiresApi(Build.VERSION_CODES.O) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt index dc2ae7c..b864b3f 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt @@ -2,25 +2,26 @@ package cc.n0th1ng.tripmoney.navigation 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.FlowRow import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Menu -import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilterChip import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextField -import androidx.compose.material3.TextFieldColors import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable @@ -33,12 +34,17 @@ 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.platform.LocalFocusManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController +import cc.n0th1ng.tripmoney.Filter import cc.n0th1ng.tripmoney.R +import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.screens.addexpense.categoriesToPreview import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.utils.AllPreviews import com.composables.icons.materialsymbols.outlined.R.drawable @@ -50,21 +56,27 @@ fun TopBar( onDrawerClick: () -> Unit, title: String = "", isSearchable: Boolean = false, - onFilterChange: (String) -> Unit + onSearchChange: (String) -> Unit, + filter: Filter, + onFilterChange: (Filter) -> Unit, + categories: List ) { - var isSearch by remember { mutableStateOf(false) } + var showSearch by remember { mutableStateOf(false) } + var showFilter by remember { mutableStateOf(false) } var value by remember { mutableStateOf("") } val focusRequester = remember { FocusRequester() } TopAppBar( title = { - if (isSearch && isSearchable) { + if (showSearch && isSearchable) { LaunchedEffect(Unit) { focusRequester.requestFocus() } OutlinedTextField( textStyle = MaterialTheme.typography.bodyMedium, shape = MaterialTheme.shapes.medium, - modifier = Modifier.fillMaxWidth(0.9f).focusRequester(focusRequester), + modifier = Modifier + .fillMaxWidth(0.9f) + .focusRequester(focusRequester), colors = TextFieldDefaults.colors( focusedContainerColor = Color.Transparent, unfocusedContainerColor = Color.Transparent, @@ -79,9 +91,9 @@ fun TopBar( trailingIcon = { Icon( modifier = Modifier.clickable(onClick = { - isSearch = false + showSearch = false value = "" - onFilterChange("") + onSearchChange("") }), imageVector = Icons.Default.Close, contentDescription = null @@ -90,7 +102,7 @@ fun TopBar( ) LaunchedEffect(key1 = value) { delay(1000) - onFilterChange(value) + onSearchChange(value) } } else { Text(title) @@ -102,7 +114,7 @@ fun TopBar( } }, actions = { - if (!isSearch && isSearchable) { + if (!showSearch && isSearchable) { Row( modifier = Modifier.padding(end = 13.dp), horizontalArrangement = Arrangement.spacedBy(15.dp) @@ -111,14 +123,16 @@ fun TopBar( tint = MaterialTheme.colorScheme.primary, painter = painterResource(drawable.materialsymbols_ic_filter_alt_outlined), contentDescription = null, - modifier = Modifier.clickable(onClick = {}) + modifier = Modifier.clickable(onClick = { + showFilter = true + }) ) Icon( tint = MaterialTheme.colorScheme.primary, painter = painterResource(drawable.materialsymbols_ic_search_outlined), contentDescription = null, modifier = Modifier.clickable(onClick = { - isSearch = true + showSearch = true }) ) @@ -127,13 +141,96 @@ fun TopBar( } ) + + if (showFilter) { + FilterDialog( + onDismiss = { showFilter = false }, + onSave = { newFilter -> + onFilterChange(newFilter) + showFilter = false + }, + categories = categories, + filter = filter + ) + + + } } +@Composable +fun FilterDialog( + onDismiss: () -> Unit, + onSave: (Filter) -> Unit, + categories: List, + filter: Filter +) { + var filter by remember { mutableStateOf(filter) } + var fromAmountString by remember { mutableStateOf(filter.startAmount.toString()) } + var toAmountString by remember { mutableStateOf(filter.endAmount.toString()) } + AlertDialog( + onDismiss, { + Button( + enabled = true, + onClick = { + onSave( + filter.withStartAmount(fromAmountString.safeToDouble()) + .withEndAmount( toAmountString.safeToDouble()) + ) + }) { Text(stringResource(R.string.save)) } + }, title = { Text("Filter") }, + text = { + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { + Text(text = "Categories") + FlowRow(horizontalArrangement = Arrangement.spacedBy(10.dp)) { + categories.forEach { + FilterChip(selected = filter.categories.contains(it), onClick = { + filter = if (filter.categories.contains(it)) { + filter.without(it) + } else { + filter.with(it) + } + }, label = { Text(text = it.name) }) + } + } + AmountTextField(label = "from", onValueChange = { newText -> + fromAmountString = newText + }, value = fromAmountString) + AmountTextField(label = "to", onValueChange = { newText -> + toAmountString = newText + }, value = toAmountString) + + } + }) +} + +@Composable +fun AmountTextField(label: String, onValueChange: (String) -> Unit, value: String) { + var value by remember { mutableStateOf(value) } + OutlinedTextField( + label = { Text(label) }, + value = if (value == Double.MAX_VALUE.toString()) "∞" else value, + onValueChange = { newText -> + if (newText == Double.MAX_VALUE.toString()) { + value = "∞" + return@OutlinedTextField + } + val regex = Regex("^\\d*\\.?\\d{0,2}$") + if (regex.matches(newText)) { + value = newText + onValueChange(value) + } + }, + placeholder = { Text("0.00") }, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Decimal, + imeAction = ImeAction.Done + ) + ) +} @OptIn(ExperimentalMaterial3Api::class) @Composable fun TopBarSettings(navController: NavHostController) { - TopAppBar( title = { Text(stringResource(R.string.settings)) }, navigationIcon = { @@ -151,7 +248,30 @@ fun PreviewTopBar() { TopBar( onDrawerClick = {}, title = "Essa", - onFilterChange = {} + onSearchChange = {}, + onFilterChange = {}, + isSearchable = true, + categories = categoriesToPreview, + filter = Filter() ) } } + +@AllPreviews +@Composable +fun PreviewFilterDialog() { + TripMoneyTheme { + FilterDialog( + onDismiss = {}, + onSave = {}, + categories = categoriesToPreview, + filter = Filter() + ) + } +} + +private fun String.safeToDouble(): Double { + if(this == "∞") return Double.MAX_VALUE + if(this.isEmpty()) return 0.0 + return this.toDouble() +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index 75b7431..d98b61e 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -55,6 +55,7 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.itemKey +import cc.n0th1ng.tripmoney.Filter import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense @@ -80,16 +81,19 @@ import kotlin.random.Random @RequiresApi(Build.VERSION_CODES.O) @Composable -fun ListExpenseScreen(filter: String, - initialAutoOpen: Boolean, - onAutoOpenConsumed: () -> Unit ) { +fun ListExpenseScreen( + filter: Filter, + search: String, + initialAutoOpen: Boolean, + onAutoOpenConsumed: () -> Unit +) { val settingsViewModel: SettingsViewModel = hiltViewModel() val tripViewModel: TripViewModel = hiltViewModel() val currentTripId by settingsViewModel.currentTrip.collectAsState() val currentTrip by tripViewModel.getTrip(currentTripId).collectAsState(Trip.DUMMY) val expenseAndCategoryViewModel: ExpenseAndCategoryViewModel = hiltViewModel() val expensesFlow = - expenseAndCategoryViewModel.getExpensesWithHeadersPaged(currentTripId, filter) + expenseAndCategoryViewModel.getExpensesWithHeadersPaged(currentTripId, search, filter) val isRecalculatingRate by tripViewModel.isRecalculating.collectAsState() ListExpenseScreen( diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index 4b61a8f..3c5fba4 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -8,6 +8,7 @@ import androidx.paging.PagingData import androidx.paging.cachedIn import androidx.paging.insertSeparators import androidx.paging.map +import cc.n0th1ng.tripmoney.Filter import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense @@ -44,16 +45,17 @@ open class ExpenseAndCategoryViewModel @Inject constructor( return expenseRepo.getBudgetLeft(tripId) } - fun getExpensesDtoPaged(tripId: Int, filter: String = ""): Flow> = - expenseRepo.getExpensesDtoPaged(tripId, filter).cachedIn(viewModelScope) + fun getExpensesDtoPaged(tripId: Int, search: String = "", filter: Filter = Filter()): Flow> = + expenseRepo.getExpensesDtoPaged(tripId, search, filter).cachedIn(viewModelScope) @RequiresApi(Build.VERSION_CODES.O) fun getExpensesWithHeadersPaged( tripId: Int, - filter: String = "" + search: String = "", + filter: Filter ): Flow> { - val pagingFlow = getExpensesDtoPaged(tripId, filter) - val sumsFlow = getDailySums(tripId, filter) + val pagingFlow = getExpensesDtoPaged(tripId, search, filter) + val sumsFlow = getDailySums(tripId, search, filter) val tripFlow = tripRepo.getTrip(tripId) return combine(pagingFlow, sumsFlow, tripFlow) { pagingData, sums, trip -> val currency = trip?.currency ?: "" @@ -85,8 +87,8 @@ open class ExpenseAndCategoryViewModel @Inject constructor( }.cachedIn(viewModelScope) } - fun getExpensesDto(tripId: Int, filter: String = ""): Flow> = - expenseRepo.getExpensesDto(tripId, filter) + fun getExpensesDto(tripId: Int, search: String = "", filter: Filter = Filter()): Flow> = + expenseRepo.getExpensesDto(tripId, search, filter) @RequiresApi(Build.VERSION_CODES.O) fun save(expense: Expense, trip: Trip) { @@ -143,8 +145,8 @@ open class ExpenseAndCategoryViewModel @Inject constructor( } @RequiresApi(Build.VERSION_CODES.O) - fun getDailySums(tripId: Int, filter: String): Flow> { - return getExpensesDto(tripId, filter) + fun getDailySums(tripId: Int, search: String, filter: Filter): Flow> { + return getExpensesDto(tripId, search, filter) .map { expenses -> expenses.groupBy { it.expense.datetime.toLocalDate() } .mapValues { (_, list) -> diff --git a/baselineprofile/build.gradle.kts b/baselineprofile/build.gradle.kts index 1f81fc5..bf95b1c 100644 --- a/baselineprofile/build.gradle.kts +++ b/baselineprofile/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { implementation(libs.androidx.espresso.core) implementation(libs.androidx.uiautomator) implementation(libs.androidx.benchmark.macro.junit4) + implementation(libs.androidx.ui.test.junit4) } androidComponents { diff --git a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt index 52d45e7..04bc79a 100644 --- a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt +++ b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt @@ -3,6 +3,7 @@ package cc.n0th1ng.baselineprofile import android.R.attr.contentDescription import androidx.benchmark.macro.MacrobenchmarkScope import androidx.benchmark.macro.junit4.BaselineProfileRule +import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import androidx.test.platform.app.InstrumentationRegistry @@ -16,7 +17,6 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) @LargeTest class BaselineProfileGenerator { - @get:Rule val rule = BaselineProfileRule() @@ -29,12 +29,8 @@ class BaselineProfileGenerator { pressHome() startActivityAndWait() - - // Give Compose time to render - Thread.sleep(500) - - val listNav = device.wait(Until.findObject(By.desc("listExpenseScreen")), 10000) - listNav?.click() ?: throw RuntimeException("listExpenseScreen not found or not clickable") + device.waitForIdle() + device.wait(Until.hasObject(By.desc("list screen")), 10_000) } } -} \ No newline at end of file +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4c5ec5b..543126a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,6 @@ [versions] agp = "8.13.2" +datastorePreferences = "1.2.1" iconsMaterialSymbolsOutlinedAndroid = "2.2.1" kotlin = "2.2.21" coreKtx = "1.10.1" @@ -15,9 +16,11 @@ uiautomator = "2.3.0" benchmarkMacroJunit4 = "1.2.4" baselineprofile = "1.2.4" profileinstaller = "1.3.1" +uiTestJunit4 = "1.10.6" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } icons-material-symbols-outlined-android = { module = "com.composables:icons-material-symbols-outlined-android", version.ref = "iconsMaterialSymbolsOutlinedAndroid" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } @@ -37,6 +40,7 @@ androidx-compose-foundation-layout = { group = "androidx.compose.foundation", na androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" } androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "profileinstaller" } +androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "uiTestJunit4" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From 795ce9812a2a1b46104bd451429bc0f25836888b Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Sat, 25 Apr 2026 13:32:46 +0200 Subject: [PATCH 12/18] init --- .../addexpense/AddExpenseBottomSheet.kt | 6 +- .../screens/listexpense/DateTimePicker.kt | 73 +++++++++++++------ .../screens/trippicker/AddTripBottomSheet.kt | 2 +- .../cc/n0th1ng/tripmoney/utils/Currencies.kt | 3 +- app/src/main/res/values/strings.xml | 1 + .../BaselineProfileGenerator.kt | 2 +- 6 files changed, 59 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index 0092cfd..a006fe3 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -487,7 +487,7 @@ fun NumberKeyboard( onLongClick = onLongBackspaceClick ) - "+", "/", "-", "*" -> KeyboardButton( + "+", "÷", "-", "×" -> KeyboardButton( text = key, onClick = { onOperatorClick(key) }, modifier = Modifier.weight(1f), @@ -531,7 +531,7 @@ fun KeyboardButton( ) { when { text != null -> Text( - text, + text = text, style = MaterialTheme.typography.headlineMedium ) @@ -541,7 +541,7 @@ fun KeyboardButton( } val keyboard = listOf( - listOf("+", "-", "*", "/"), + listOf("+", "-", "×", "÷"), listOf("1", "2", "3"), listOf("4", "5", "6"), listOf("7", "8", "9"), diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt index 8e7e10b..ba608df 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/DateTimePicker.kt @@ -2,6 +2,7 @@ package cc.n0th1ng.tripmoney.screens.listexpense import android.os.Build import androidx.annotation.RequiresApi +import androidx.compose.foundation.layout.Row import androidx.compose.material3.AlertDialog import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePickerDialog @@ -20,13 +21,15 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import cc.n0th1ng.tripmoney.R.* +import cc.n0th1ng.tripmoney.theme.TripMoneyTheme +import cc.n0th1ng.tripmoney.utils.AllPreviews import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime import java.time.ZoneId -import java.util.Calendar @RequiresApi(Build.VERSION_CODES.O) @OptIn(ExperimentalMaterial3Api::class) @@ -38,8 +41,10 @@ fun DateRangePicker( onConfirm: (LocalDate, LocalDate) -> Unit ) { val datePickerState = - rememberDateRangePickerState(initialSelectedStartDateMillis = startDate.toEpochMilli(), - initialSelectedEndDateMillis = endDate.toEpochMilli()) + rememberDateRangePickerState( + initialSelectedStartDateMillis = startDate.toEpochMilli(), + initialSelectedEndDateMillis = endDate.toEpochMilli() + ) DatePickerDialog( onDismissRequest = onDismiss, @@ -64,7 +69,8 @@ fun DateRangePicker( TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) } } ) { - DateRangePicker(state = datePickerState, showModeToggle = false, + DateRangePicker( + state = datePickerState, showModeToggle = false, title = {}) } } @@ -73,27 +79,35 @@ fun DateRangePicker( @OptIn(ExperimentalMaterial3Api::class) @Composable fun DatePicker( - dateTime: LocalDate = LocalDate.now(), + date: LocalDate = LocalDate.now(), onDismiss: () -> Unit, onConfirm: (LocalDate) -> Unit ) { val datePickerState = - rememberDatePickerState(initialSelectedDateMillis = dateTime.toEpochMilli()) + rememberDatePickerState(initialSelectedDateMillis = date.toEpochMilli()) DatePickerDialog( onDismissRequest = onDismiss, confirmButton = { - TextButton(onClick = { - val selectedMillis = datePickerState.selectedDateMillis - if (selectedMillis != null) { - val selectedDate = Instant.ofEpochMilli(selectedMillis) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - onConfirm(selectedDate) + Row() { + TextButton(onClick = { + onConfirm(LocalDate.now().minusDays(1)) + }) { + Text(stringResource(string.yesterday)) + } + TextButton(onClick = { + val selectedMillis = datePickerState.selectedDateMillis + if (selectedMillis != null) { + val selectedDate = Instant.ofEpochMilli(selectedMillis) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + onConfirm(selectedDate) + } + }) { + Text("OK") } - }) { - Text("OK") } + }, dismissButton = { TextButton(onClick = onDismiss) { Text(stringResource(string.cancel)) } @@ -103,13 +117,17 @@ fun DatePicker( } } +@RequiresApi(Build.VERSION_CODES.O) @OptIn(ExperimentalMaterial3Api::class) @Composable -fun TimePicker(onDismiss: () -> Unit, onConfirm: (TimePickerState) -> Unit) { - val currentTime = Calendar.getInstance() +fun TimePicker( + onDismiss: () -> Unit, + onConfirm: (TimePickerState) -> Unit, + time: LocalTime = LocalTime.now() +) { val timePickerState = rememberTimePickerState( - initialHour = currentTime.get(Calendar.HOUR_OF_DAY), - initialMinute = currentTime.get(Calendar.MINUTE), + initialHour = time.hour, + initialMinute = time.minute, is24Hour = true ) @@ -141,7 +159,9 @@ fun DateTimePicker( var date by remember { mutableStateOf(dateTime.toLocalDate()) } if (showDatePicker) { - DatePicker(onDismiss = { showDatePicker = false }, onConfirm = { newDate -> + DatePicker( + date = dateTime.toLocalDate(), + onDismiss = { showDatePicker = false }, onConfirm = { newDate -> date = newDate showDatePicker = false showTimePicker = true @@ -157,7 +177,7 @@ fun DateTimePicker( showDatePicker = true val newTime = LocalTime.of(timePickerState.hour, timePickerState.minute) onChange(LocalDateTime.of(date, newTime)) - }) + }, time = dateTime.toLocalTime()) } } @@ -167,4 +187,13 @@ fun LocalDateTime.toEpochMilli(): Long = @RequiresApi(Build.VERSION_CODES.O) fun LocalDate.toEpochMilli(): Long = - this.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() \ No newline at end of file + this.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant().toEpochMilli() + +@RequiresApi(Build.VERSION_CODES.O) +@AllPreviews +@Composable +fun DatePickerPreview() { + TripMoneyTheme { + DatePicker(LocalDate.now(), {}, {}) + } +} \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt index e32de5e..3f8501c 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/trippicker/AddTripBottomSheet.kt @@ -104,7 +104,7 @@ fun AddTripBottomSheet( var endDate by remember { mutableStateOf( - tripToEdit?.startDate ?: LocalDate.now() + tripToEdit?.endDate ?: LocalDate.now() ) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt index 4963490..c510b63 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/utils/Currencies.kt @@ -3,7 +3,8 @@ package cc.n0th1ng.tripmoney.utils enum class Currencies { PLN, EUR, - USD; + USD, + RON; companion object { fun default(): Currencies { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 12a3abd..81e4dca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -39,4 +39,5 @@ Budget Money left Open add expense form on startup + Yesterday \ No newline at end of file diff --git a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt index 04bc79a..371e938 100644 --- a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt +++ b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt @@ -26,7 +26,7 @@ class BaselineProfileGenerator { packageName = "cc.n0th1ng.tripmoney", includeInStartupProfile = true ) { - pressHome() +// pressHome() startActivityAndWait() device.waitForIdle() From 0518da44d7bd90bc890da3b312ebb13bacab0dbd Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Mon, 27 Apr 2026 19:29:19 +0200 Subject: [PATCH 13/18] init --- app/build.gradle.kts | 2 +- .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 4 ++ .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 52 ++++++++++++++++--- .../n0th1ng/tripmoney/data/dao/ExpenseDao.kt | 11 +++- .../n0th1ng/tripmoney/data/entity/Expense.kt | 4 +- .../data/repository/ExpenseRepository.kt | 3 +- .../cc/n0th1ng/tripmoney/navigation/TopBar.kt | 44 ++++++++++++---- .../addexpense/AddExpenseBottomSheet.kt | 4 +- .../screens/listexpense/ListExpenseScreen.kt | 2 +- .../screens/statistics/StatisticsScreen.kt | 22 +++++--- .../viewmodel/ExpenseAndCategoryViewModel.kt | 3 +- app/src/main/res/values/strings.xml | 1 + gradle/libs.versions.toml | 28 ++++++++++ 13 files changed, 146 insertions(+), 34 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6e2da08..816387e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -33,7 +33,6 @@ android { create("benchmark") { initWith(getByName("release")) - // 🔑 Critical settings for Macrobenchmark isDebuggable = false isMinifyEnabled = false isShrinkResources = false @@ -111,6 +110,7 @@ dependencies { implementation(libs.androidx.datastore.preferences) implementation(libs.icons.material.symbols.outlined.android) + implementation(libs.icons.material.symbols.outlined.filled.android) implementation("com.google.dagger:hilt-android:2.57.1") ksp("com.google.dagger:hilt-android-compiler:2.57.1") diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index 6d6f4cc..8adc5b1 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -150,4 +150,8 @@ data class Filter( fun without(category: Category): Filter { return this.copy(categories = categories - category) } + + fun isDefault(): Boolean { + return this.categories.isEmpty() && startAmount == 0.0 && endAmount == Double.MAX_VALUE + } } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index bf57ea5..79c4b70 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -14,9 +14,7 @@ import cc.n0th1ng.tripmoney.data.dao.TripDao import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.ExchangeRate import cc.n0th1ng.tripmoney.data.entity.Expense -import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.data.entity.Trip -import cc.n0th1ng.tripmoney.screens.listexpense.toEpochMilli import cc.n0th1ng.tripmoney.utils.Currencies import cc.n0th1ng.tripmoney.utils.Icons import cc.n0th1ng.tripmoney.utils.colors @@ -26,9 +24,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Delay import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.time.Instant import java.time.LocalDate @@ -36,7 +32,6 @@ import java.time.LocalDateTime import java.time.ZoneOffset import javax.inject.Singleton import kotlin.random.Random -import kotlin.random.nextInt @Database( entities = [Trip::class, Expense::class, Category::class, ExchangeRate::class], @@ -176,6 +171,51 @@ private class DatabasePrepopulator( icon = Icons.GROCERIES, color = colors.random() ), + Category( + name = "Zakupy1", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy2", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy3", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy4", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy5", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy6", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy7", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy8", + icon = Icons.GROCERIES, + color = colors.random() + ), + Category( + name = "Zakupy9 ", + icon = Icons.GROCERIES, + color = colors.random() + ), ) @RequiresApi(Build.VERSION_CODES.O) @@ -193,7 +233,7 @@ private class DatabasePrepopulator( val expense = Expense( - categoryId = Random.nextInt(1, 5), + categoryId = Random.nextInt(1, sampleCategories.size), tripId = 1, amount = Random.nextDouble(0.1, 300.0), currency = Currencies.entries.random().name, diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt index 601c5ac..97308f9 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt @@ -4,6 +4,7 @@ import androidx.paging.PagingSource import androidx.room.Dao import androidx.room.Delete import androidx.room.Query +import androidx.room.RewriteQueriesToDropUnusedColumns import androidx.room.Transaction import androidx.room.Upsert import cc.n0th1ng.tripmoney.data.entity.Category @@ -18,6 +19,8 @@ interface ExpenseDao { suspend fun insert(expense: Expense) + @Transaction + @RewriteQueriesToDropUnusedColumns @Query( """ SELECT * FROM expense @@ -87,13 +90,17 @@ interface ExpenseDao { @Query( """ - SELECT trip.budget - IFNULL(SUM(expense.amount * expense.rate), 0) + SELECT + CASE + WHEN trip.budget = 0 THEN NULL + ELSE trip.budget - IFNULL(SUM(expense.amount * expense.rate), 0) + END FROM trip LEFT JOIN expense ON expense.trip_id = trip.id WHERE trip.id = :tripId """ ) - fun budgetLeft(tripId: Int): Double + fun budgetLeft(tripId: Int): Double? @Delete suspend fun delete(expense: Expense) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt index c4894ab..febd2d5 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt @@ -5,6 +5,7 @@ import androidx.room.ColumnInfo import androidx.room.Embedded import androidx.room.Entity import androidx.room.ForeignKey +import androidx.room.Index import androidx.room.PrimaryKey import androidx.room.Relation import java.time.LocalDateTime @@ -17,7 +18,8 @@ import java.time.LocalDateTime childColumns = arrayOf("category_id"), onUpdate = ForeignKey.CASCADE, onDelete = ForeignKey.CASCADE - )] + )], + indices = [Index(value = ["category_id"], unique = true)] ) @Immutable data class Expense( diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt index 5212e00..3e5aedf 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt @@ -13,6 +13,7 @@ import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.utils.Currencies import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first +import java.util.OptionalDouble import javax.inject.Inject class ExpenseRepository @Inject constructor( @@ -20,7 +21,7 @@ class ExpenseRepository @Inject constructor( private val exchangeRateRepository: ExchangeRateRepository ) { - fun getBudgetLeft(tripId: Int): Double { + fun getBudgetLeft(tripId: Int): Double? { return expenseDao.budgetLeft(tripId) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt index b864b3f..c8b7c6d 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/navigation/TopBar.kt @@ -14,6 +14,7 @@ import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Menu import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilterChip import androidx.compose.material3.Icon @@ -21,7 +22,6 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text -import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable @@ -38,7 +38,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import cc.n0th1ng.tripmoney.Filter @@ -121,7 +120,11 @@ fun TopBar( ) { Icon( tint = MaterialTheme.colorScheme.primary, - painter = painterResource(drawable.materialsymbols_ic_filter_alt_outlined), + painter = painterResource( + if (filter.isDefault()) + drawable.materialsymbols_ic_filter_alt_outlined + else com.composables.icons.materialsymbols.outlinedfilled.R.drawable.materialsymbols_ic_filter_alt_outlined_filled + ), contentDescription = null, modifier = Modifier.clickable(onClick = { showFilter = true @@ -150,7 +153,11 @@ fun TopBar( showFilter = false }, categories = categories, - filter = filter + filter = filter, + onClear = { + onFilterChange(Filter()) + showFilter = false + } ) @@ -161,6 +168,7 @@ fun TopBar( fun FilterDialog( onDismiss: () -> Unit, onSave: (Filter) -> Unit, + onClear: () -> Unit, categories: List, filter: Filter ) { @@ -168,20 +176,28 @@ fun FilterDialog( var fromAmountString by remember { mutableStateOf(filter.startAmount.toString()) } var toAmountString by remember { mutableStateOf(filter.endAmount.toString()) } AlertDialog( - onDismiss, { + onDismissRequest = onDismiss, + dismissButton = { + Button( + colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.secondary), + enabled = true, + onClick = onClear + ) { Text(stringResource(R.string.clear)) } + }, + confirmButton = { Button( enabled = true, onClick = { onSave( filter.withStartAmount(fromAmountString.safeToDouble()) - .withEndAmount( toAmountString.safeToDouble()) + .withEndAmount(toAmountString.safeToDouble()) ) }) { Text(stringResource(R.string.save)) } }, title = { Text("Filter") }, text = { Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { Text(text = "Categories") - FlowRow(horizontalArrangement = Arrangement.spacedBy(10.dp)) { + FlowRow(horizontalArrangement = Arrangement.spacedBy(7.dp)) { categories.forEach { FilterChip(selected = filter.categories.contains(it), onClick = { filter = if (filter.categories.contains(it)) { @@ -189,7 +205,12 @@ fun FilterDialog( } else { filter.with(it) } - }, label = { Text(text = it.name) }) + }, label = { + Row(horizontalArrangement = Arrangement.spacedBy(5.dp)) { + Icon(painterResource(it.icon.resource), contentDescription = null) + Text(text = it.name) + } + }) } } AmountTextField(label = "from", onValueChange = { newText -> @@ -265,13 +286,14 @@ fun PreviewFilterDialog() { onDismiss = {}, onSave = {}, categories = categoriesToPreview, - filter = Filter() + filter = Filter(), + onClear = {} ) } } private fun String.safeToDouble(): Double { - if(this == "∞") return Double.MAX_VALUE - if(this.isEmpty()) return 0.0 + if (this == "∞") return Double.MAX_VALUE + if (this.isEmpty()) return 0.0 return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt index a006fe3..395b164 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/addexpense/AddExpenseBottomSheet.kt @@ -487,7 +487,7 @@ fun NumberKeyboard( onLongClick = onLongBackspaceClick ) - "+", "÷", "-", "×" -> KeyboardButton( + "+", "÷", "−", "×" -> KeyboardButton( text = key, onClick = { onOperatorClick(key) }, modifier = Modifier.weight(1f), @@ -541,7 +541,7 @@ fun KeyboardButton( } val keyboard = listOf( - listOf("+", "-", "×", "÷"), + listOf("+", "−", "×", "÷"), listOf("1", "2", "3"), listOf("4", "5", "6"), listOf("7", "8", "9"), diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index d98b61e..f1e1bd7 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -363,7 +363,7 @@ fun ExpenseCard( colors = CardDefaults.elevatedCardColors() .copy(containerColor = MaterialTheme.colorScheme.surfaceContainer), modifier = Modifier - .fillMaxWidth(0.9f) + .fillMaxWidth(0.95f) .height(70.dp) .combinedClickable( enabled = true, diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt index e6ca67b..9ecbdd2 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt @@ -13,7 +13,9 @@ 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.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.CardDefaults import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Icon @@ -32,7 +34,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt -import androidx.core.graphics.toColorLong import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import cc.n0th1ng.tripmoney.data.dto.SummaryPerCategory import cc.n0th1ng.tripmoney.data.entity.Category @@ -73,7 +74,7 @@ fun StatisticsScreen( summaryPerCategoryList: List, summaryAmount: Double, tripCurrency: Currencies, - moneyLeft: Double + moneyLeft: Double? ) { Column( modifier = Modifier @@ -104,7 +105,7 @@ fun StatisticsScreen( @Composable fun Summary( modifier: Modifier = Modifier, - amount: Double, + amount: Double?, currency: String, text: String, icon: Int, @@ -117,7 +118,8 @@ fun Summary( ) { Column( modifier = Modifier.padding(10.dp), - verticalArrangement = Arrangement.spacedBy(10.dp) + verticalArrangement = Arrangement.spacedBy(10.dp), + horizontalAlignment = Alignment.CenterHorizontally ) { Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, @@ -141,7 +143,8 @@ fun Summary( } Text( - "%.2f %s".format(amount, currency), + if (amount == null) "∞" else + "%.2f %s".format(amount, currency), style = MaterialTheme.typography.titleLarge, ) } @@ -156,7 +159,10 @@ fun SummaryPerCategoryCard(summaryPerCategoryList: List) { .copy(containerColor = MaterialTheme.colorScheme.surfaceContainer) ) { Column( - modifier = Modifier.padding(15.dp), + modifier = Modifier + .padding(15.dp) + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.spacedBy(5.dp) ) { summaryPerCategoryList.forEach { @@ -204,7 +210,7 @@ fun CategoryCard(modifier: Modifier = Modifier, summaryPerCategory: SummaryPerCa ) { Box( modifier = Modifier - .height(40.dp) + .height(30.dp) .fillMaxWidth(0.12f + (0.90f - 0.12f) * summaryPerCategory.percent) .clip(RoundedCornerShape(16.dp)) .background(MaterialTheme.colorScheme.primary) @@ -213,7 +219,7 @@ fun CategoryCard(modifier: Modifier = Modifier, summaryPerCategory: SummaryPerCa verticalArrangement = Arrangement.Center, modifier = Modifier .fillMaxSize() - .padding(11.dp) + .padding(vertical = 5.dp, horizontal = 10.dp) ) { Text( "%d%%".format((summaryPerCategory.percent * 100).toInt()), diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index 3c5fba4..61fcf43 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -29,6 +29,7 @@ import org.apache.commons.csv.CSVFormat import org.apache.commons.csv.CSVPrinter import java.io.File import java.time.LocalDate +import java.util.OptionalDouble import javax.inject.Inject import kotlin.collections.mapValues @@ -41,7 +42,7 @@ open class ExpenseAndCategoryViewModel @Inject constructor( private val tripRepo: TripRepository ) : ViewModel() { - fun getBudgetLeft(tripId: Int): Double { + fun getBudgetLeft(tripId: Int): Double? { return expenseRepo.getBudgetLeft(tripId) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81e4dca..182c496 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,4 +40,5 @@ Money left Open add expense form on startup Yesterday + Clear \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 543126a..e7d7fcb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,17 +1,26 @@ [versions] agp = "8.13.2" +commonsCsv = "1.14.1" datastorePreferences = "1.2.1" +desugar_jdk_libsVersion = "2.1.5" +hiltAndroid = "2.59.2" +hiltNavigationCompose = "1.3.0" iconsMaterialSymbolsOutlinedAndroid = "2.2.1" kotlin = "2.2.21" coreKtx = "1.10.1" junit = "4.13.2" junitVersion = "1.1.5" espressoCore = "3.5.1" +kotlinxSerializationJsonJvm = "1.11.0" +ktorClientCore = "3.4.3" +ktorClientOkhttp = "3.4.3" lifecycleRuntimeKtx = "2.6.1" activityCompose = "1.8.0" composeBom = "2024.09.00" navigationCompose = "2.9.7" foundationLayout = "1.10.5" +pagingCompose = "3.4.2" +roomCompiler = "2.8.4" uiautomator = "2.3.0" benchmarkMacroJunit4 = "1.2.4" baselineprofile = "1.2.4" @@ -21,7 +30,22 @@ uiTestJunit4 = "1.10.6" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } +#androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationCompose" } +#androidx-paging-compose = { module = "androidx.paging:paging-compose", version.ref = "pagingCompose" } +#androidx-paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "pagingCompose" } +#androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomCompiler" } +#androidx-room-guava = { module = "androidx.room:room-guava", version.ref = "roomCompiler" } +#androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomCompiler" } +#androidx-room-paging = { module = "androidx.room:room-paging", version.ref = "roomCompiler" } +#androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomCompiler" } +#androidx-room-rxjava3 = { module = "androidx.room:room-rxjava3", version.ref = "roomCompiler" } +#androidx-room-rxjava2 = { module = "androidx.room:room-rxjava2", version.ref = "roomCompiler" } +#androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "roomCompiler" } +#commons-csv = { module = "org.apache.commons:commons-csv", version.ref = "commonsCsv" } +#hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" } +#hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hiltAndroid" } icons-material-symbols-outlined-android = { module = "com.composables:icons-material-symbols-outlined-android", version.ref = "iconsMaterialSymbolsOutlinedAndroid" } +icons-material-symbols-outlined-filled-android = { module = "com.composables:icons-material-symbols-outlined-filled-android", version.ref = "iconsMaterialSymbolsOutlinedAndroid" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } @@ -41,6 +65,10 @@ androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomato androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" } androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "profileinstaller" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "uiTestJunit4" } +kotlinx-serialization-json-jvm = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm", version.ref = "kotlinxSerializationJsonJvm" } +ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktorClientCore" } +ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktorClientOkhttp" } +tools-desugar_jdk_libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugar_jdk_libsVersion" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From 664df1e5a155f23a678a62e1aaab11506d505cc2 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Mon, 27 Apr 2026 19:58:38 +0200 Subject: [PATCH 14/18] init --- app/build.gradle.kts | 50 ++++++++++++++------------------------- gradle/libs.versions.toml | 27 +++++++++++++++++++++ 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 816387e..d3fa9ab 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -78,46 +78,32 @@ dependencies { debugImplementation(libs.androidx.compose.ui.tooling) debugImplementation(libs.androidx.compose.ui.test.manifest) - coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") - val room_version = "2.8.4" + coreLibraryDesugaring(libs.tools.desugar.jdk.libs) - implementation("androidx.room:room-runtime:$room_version") + implementation(libs.androidx.room.runtime) // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See Add the KSP plugin to your project - ksp("androidx.room:room-compiler:$room_version") + ksp(libs.androidx.room.compiler) - // optional - Kotlin Extensions and Coroutines support for Room - implementation("androidx.room:room-ktx:$room_version") - - // optional - RxJava2 support for Room - implementation("androidx.room:room-rxjava2:$room_version") - - // optional - RxJava3 support for Room - implementation("androidx.room:room-rxjava3:$room_version") - - // optional - Guava support for Room, including Optional and ListenableFuture - implementation("androidx.room:room-guava:$room_version") - - // optional - Test helpers - testImplementation("androidx.room:room-testing:$room_version") - - // optional - Paging 3 Integration - implementation("androidx.room:room-paging:$room_version") - - implementation("androidx.paging:paging-runtime:3.4.2") - implementation("androidx.paging:paging-compose:3.4.2") + implementation(libs.androidx.room.ktx) + implementation(libs.androidx.room.rxjava2) + implementation(libs.androidx.room.rxjava3) + implementation(libs.androidx.room.guava) + testImplementation(libs.androidx.room.testing) + implementation(libs.androidx.room.paging) + implementation(libs.androidx.paging.runtime) + implementation(libs.androidx.paging.compose) implementation(libs.androidx.datastore.preferences) - implementation(libs.icons.material.symbols.outlined.android) implementation(libs.icons.material.symbols.outlined.filled.android) - implementation("com.google.dagger:hilt-android:2.57.1") - ksp("com.google.dagger:hilt-android-compiler:2.57.1") - implementation("androidx.hilt:hilt-navigation-compose:1.3.0") + implementation(libs.hilt.android) + ksp(libs.hilt.android.compiler) + implementation(libs.androidx.hilt.navigation.compose) - implementation("io.ktor:ktor-client-core:3.4.1") - implementation("io.ktor:ktor-client-okhttp:3.4.1") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.10.0") - implementation("org.apache.commons:commons-csv:1.5") + implementation(libs.ktor.client.core) + implementation(libs.ktor.client.okhttp) + implementation(libs.kotlinx.serialization.json.jvm) + implementation(libs.commons.csv) } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e7d7fcb..d758490 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,13 @@ [versions] agp = "8.13.2" commonsCsv = "1.14.1" +commonsCsvVersion = "1.14.1" datastorePreferences = "1.2.1" desugar_jdk_libsVersion = "2.1.5" hiltAndroid = "2.59.2" +hiltAndroidCompiler = "2.57.1" hiltNavigationCompose = "1.3.0" +hiltNavigationComposeVersion = "1.3.0" iconsMaterialSymbolsOutlinedAndroid = "2.2.1" kotlin = "2.2.21" coreKtx = "1.10.1" @@ -20,7 +23,17 @@ composeBom = "2024.09.00" navigationCompose = "2.9.7" foundationLayout = "1.10.5" pagingCompose = "3.4.2" +pagingComposeVersion = "3.4.2" +pagingRuntime = "3.4.2" roomCompiler = "2.8.4" +roomCompilerVersion = "2.8.4" +roomGuava = "2.8.4" +roomKtx = "2.8.4" +roomPaging = "2.8.4" +roomRuntime = "2.8.4" +roomRxjava2 = "2.8.4" +roomRxjava3 = "2.8.4" +roomTesting = "2.8.4" uiautomator = "2.3.0" benchmarkMacroJunit4 = "1.2.4" baselineprofile = "1.2.4" @@ -44,6 +57,20 @@ androidx-datastore-preferences = { module = "androidx.datastore:datastore-prefer #commons-csv = { module = "org.apache.commons:commons-csv", version.ref = "commonsCsv" } #hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" } #hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hiltAndroid" } +androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationComposeVersion" } +androidx-paging-compose = { module = "androidx.paging:paging-compose", version.ref = "pagingComposeVersion" } +androidx-paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "pagingRuntime" } +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomCompilerVersion" } +androidx-room-guava = { module = "androidx.room:room-guava", version.ref = "roomGuava" } +androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomKtx" } +androidx-room-paging = { module = "androidx.room:room-paging", version.ref = "roomPaging" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" } +androidx-room-rxjava2 = { module = "androidx.room:room-rxjava2", version.ref = "roomRxjava2" } +androidx-room-rxjava3 = { module = "androidx.room:room-rxjava3", version.ref = "roomRxjava3" } +androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "roomTesting" } +commons-csv = { module = "org.apache.commons:commons-csv", version.ref = "commonsCsvVersion" } +hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroidCompiler" } +hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hiltAndroidCompiler" } icons-material-symbols-outlined-android = { module = "com.composables:icons-material-symbols-outlined-android", version.ref = "iconsMaterialSymbolsOutlinedAndroid" } icons-material-symbols-outlined-filled-android = { module = "com.composables:icons-material-symbols-outlined-filled-android", version.ref = "iconsMaterialSymbolsOutlinedAndroid" } junit = { group = "junit", name = "junit", version.ref = "junit" } From 2ab7ef3f657939c9641111a60ee6a9a215f3673d Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Wed, 29 Apr 2026 15:42:57 +0200 Subject: [PATCH 15/18] init --- app/baseline-profiles-rules.pro | 1 + app/build.gradle.kts | 22 +- app/proguard-rules.pro | 3 +- app/src/main/AndroidManifest.xml | 11 +- app/src/main/baseline-prof.txt | 8766 +++++++++++++++++ .../java/cc/n0th1ng/tripmoney/MainActivity.kt | 5 +- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 2 +- .../n0th1ng/tripmoney/data/entity/Expense.kt | 2 +- .../screens/listexpense/ListExpenseScreen.kt | 7 +- baselineprofile/build.gradle.kts | 53 - .../BaselineProfileGenerator.kt | 36 - .../baselineprofile/StartupBenchmarks.kt | 76 - {baselineprofile => benchmark}/.gitignore | 0 benchmark/build.gradle.kts | 54 + .../src/main/AndroidManifest.xml | 0 .../benchmark/BaselineProfileGenerator.kt | 46 + .../benchmark/ExampleStartupBenchmark.kt | 43 + gradle/libs.versions.toml | 8 +- settings.gradle.kts | 2 +- 19 files changed, 8949 insertions(+), 188 deletions(-) create mode 100644 app/baseline-profiles-rules.pro create mode 100644 app/src/main/baseline-prof.txt delete mode 100644 baselineprofile/build.gradle.kts delete mode 100644 baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt delete mode 100644 baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt rename {baselineprofile => benchmark}/.gitignore (100%) create mode 100644 benchmark/build.gradle.kts rename {baselineprofile => benchmark}/src/main/AndroidManifest.xml (100%) create mode 100644 benchmark/src/main/java/cc/n0th1ng/benchmark/BaselineProfileGenerator.kt create mode 100644 benchmark/src/main/java/cc/n0th1ng/benchmark/ExampleStartupBenchmark.kt diff --git a/app/baseline-profiles-rules.pro b/app/baseline-profiles-rules.pro new file mode 100644 index 0000000..0674e77 --- /dev/null +++ b/app/baseline-profiles-rules.pro @@ -0,0 +1 @@ +-dontobfuscate \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d3fa9ab..314159a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,10 +19,16 @@ android { versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["androidx.compose.ui.test.tagsAsResourceId"] = "true" } buildTypes { + debug { + applicationIdSuffix = ".debug" + isDebuggable = true + } release { + signingConfig = signingConfigs.getByName("debug") isMinifyEnabled = true isShrinkResources = true proguardFiles( @@ -31,24 +37,21 @@ android { ) } create("benchmark") { - initWith(getByName("release")) - - isDebuggable = false isMinifyEnabled = false isShrinkResources = false - - // Use release signing if needed (optional for local) + initWith(buildTypes.getByName("release")) signingConfig = signingConfigs.getByName("debug") - matchingFallbacks += listOf("release") + isDebuggable = false + proguardFiles("baseline-profiles-rules.pro") } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = "11" + jvmTarget = "17" freeCompilerArgs = listOf("-XXLanguage:+PropertyParamAnnotationDefaultTargetMode") } buildFeatures { @@ -74,7 +77,6 @@ dependencies { androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.compose.ui.test.junit4) - "baselineProfile"(project(":baselineprofile")) debugImplementation(libs.androidx.compose.ui.tooling) debugImplementation(libs.androidx.compose.ui.test.manifest) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..a468ab8 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,5 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile +-dontwarn edu.umd.cs.findbugs.annotations.SuppressFBWarnings \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 72d3e33..d1f1875 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,16 +12,22 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.TripMoney"> + + + + + android:resource="@xml/file_paths" /> - \ No newline at end of file diff --git a/app/src/main/baseline-prof.txt b/app/src/main/baseline-prof.txt new file mode 100644 index 0000000..f47da87 --- /dev/null +++ b/app/src/main/baseline-prof.txt @@ -0,0 +1,8766 @@ +Landroidx/activity/Cancellable; +Landroidx/activity/ComponentActivity; +SPLandroidx/activity/ComponentActivity;->()V +SPLandroidx/activity/ComponentActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/MutableCreationExtras; +SPLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry; +SPLandroidx/activity/ComponentActivity;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; +SPLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Lio/ktor/utils/io/WriterJob; +SPLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; +SPLandroidx/activity/ComponentActivity;->initializeViewTreeOwners()V +SPLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V +SPLandroidx/activity/ComponentActivity;->reportFullyDrawn()V +SPLandroidx/activity/ComponentActivity;->setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->(ILjava/lang/Object;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda1; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->(ILjava/lang/Object;)V +Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda2; +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->(Lcc/n0th1ng/tripmoney/MainActivity;)V +SPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->onContextAvailable()V +Landroidx/activity/ComponentActivity$1; +SPLandroidx/activity/ComponentActivity$1;->()V +Landroidx/activity/ComponentActivity$2; +SPLandroidx/activity/ComponentActivity$2;->(Lcc/n0th1ng/tripmoney/MainActivity;I)V +SPLandroidx/activity/ComponentActivity$2;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/ComponentActivity$5; +SPLandroidx/activity/ComponentActivity$5;->(ILjava/lang/Object;)V +Landroidx/activity/ComponentActivity$Api33Impl; +SPLandroidx/activity/ComponentActivity$Api33Impl;->getOnBackInvokedDispatcher(Landroid/app/Activity;)Landroid/window/OnBackInvokedDispatcher; +Landroidx/activity/ComponentActivity$NonConfigurationInstances; +Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl; +SPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->(Lcc/n0th1ng/tripmoney/MainActivity;)V +SPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->execute(Ljava/lang/Runnable;)V +SPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->onDraw()V +PLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->run()V +SPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->viewCreated(Landroid/view/View;)V +Landroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0; +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/text/LineBreakConfig$Builder;I)Landroid/graphics/text/LineBreakConfig$Builder; +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/text/LineBreakConfig$Builder; +PLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/text/LineBreakConfig$Builder;)Landroid/graphics/text/LineBreakConfig; +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/text/LineBreakConfig$Builder;I)Landroid/graphics/text/LineBreakConfig$Builder; +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;Landroid/graphics/text/LineBreakConfig;)V +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout;)Z +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;)Landroid/text/BoringLayout$Metrics; +Landroidx/activity/ComponentDialog$$ExternalSyntheticLambda1; +SPLandroidx/activity/ComponentDialog$$ExternalSyntheticLambda1;->(ILjava/lang/Object;)V +PLandroidx/activity/ComponentDialog$$ExternalSyntheticLambda1;->run$androidx$emoji2$text$FontRequestEmojiCompatConfig$FontRequestMetadataLoader$$ExternalSyntheticLambda0()V +Landroidx/activity/EdgeToEdge; +SPLandroidx/activity/EdgeToEdge;->()V +Landroidx/activity/EdgeToEdgeApi29; +SPLandroidx/activity/EdgeToEdgeApi29;->setUp(Landroidx/activity/SystemBarStyle;Landroidx/activity/SystemBarStyle;Landroid/view/Window;Landroid/view/View;ZZ)V +Landroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0; +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/Window;)V +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m$13()Landroid/graphics/BlendMode; +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m$16()Landroid/graphics/BlendMode; +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/BlendMode; +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Canvas;Landroid/graphics/RenderNode;)V +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Landroid/graphics/RecordingCanvas; +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)V +SPLandroidx/activity/EdgeToEdgeApi29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)V +Landroidx/activity/EdgeToEdgeImpl; +Landroidx/activity/FullyDrawnReporter; +SPLandroidx/activity/FullyDrawnReporter;->(Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;)V +SPLandroidx/activity/FullyDrawnReporter;->fullyDrawnReported()V +Landroidx/activity/FullyDrawnReporterOwner; +Landroidx/activity/OnBackPressedCallback; +SPLandroidx/activity/OnBackPressedCallback;->(Z)V +Landroidx/activity/OnBackPressedDispatcher; +SPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;)V +SPLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V +SPLandroidx/activity/OnBackPressedDispatcher;->updateBackInvokedCallbackState(Z)V +SPLandroidx/activity/OnBackPressedDispatcher;->updateEnabledCallbacks()V +Landroidx/activity/OnBackPressedDispatcher$1; +SPLandroidx/activity/OnBackPressedDispatcher$1;->(Landroidx/activity/OnBackPressedDispatcher;I)V +Landroidx/activity/OnBackPressedDispatcher$3; +SPLandroidx/activity/OnBackPressedDispatcher$3;->(Landroidx/activity/OnBackPressedDispatcher;I)V +Landroidx/activity/OnBackPressedDispatcher$Api33Impl; +SPLandroidx/activity/OnBackPressedDispatcher$Api33Impl;->()V +PLandroidx/activity/OnBackPressedDispatcher$Api33Impl;->registerOnBackInvokedCallback(Ljava/lang/Object;ILjava/lang/Object;)V +PLandroidx/activity/OnBackPressedDispatcher$Api33Impl;->unregisterOnBackInvokedCallback(Ljava/lang/Object;Ljava/lang/Object;)V +Landroidx/activity/OnBackPressedDispatcher$Api34Impl; +SPLandroidx/activity/OnBackPressedDispatcher$Api34Impl;->()V +SPLandroidx/activity/OnBackPressedDispatcher$Api34Impl;->createOnBackAnimationCallback(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)Landroid/window/OnBackInvokedCallback; +Landroidx/activity/OnBackPressedDispatcher$Api34Impl$createOnBackAnimationCallback$1; +SPLandroidx/activity/OnBackPressedDispatcher$Api34Impl$createOnBackAnimationCallback$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V +Landroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable; +SPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/LifecycleRegistry;Landroidx/activity/OnBackPressedCallback;)V +SPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable; +SPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/OnBackPressedCallback;)V +Landroidx/activity/OnBackPressedDispatcherOwner; +Landroidx/activity/SystemBarStyle; +SPLandroidx/activity/SystemBarStyle;->()V +SPLandroidx/activity/SystemBarStyle;->(IILkotlin/jvm/functions/Function1;)V +Landroidx/activity/SystemBarStyle$Companion$auto$1; +SPLandroidx/activity/SystemBarStyle$Companion$auto$1;->()V +SPLandroidx/activity/SystemBarStyle$Companion$auto$1;->(II)V +SPLandroidx/activity/SystemBarStyle$Companion$auto$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/activity/compose/ComponentActivityKt; +SPLandroidx/activity/compose/ComponentActivityKt;->()V +Landroidx/activity/compose/LocalFullyDrawnReporterOwner; +SPLandroidx/activity/compose/LocalFullyDrawnReporterOwner;->()V +Landroidx/activity/compose/LocalFullyDrawnReporterOwner$LocalFullyDrawnReporterOwner$1; +SPLandroidx/activity/compose/LocalFullyDrawnReporterOwner$LocalFullyDrawnReporterOwner$1;->()V +SPLandroidx/activity/compose/LocalFullyDrawnReporterOwner$LocalFullyDrawnReporterOwner$1;->(II)V +SPLandroidx/activity/compose/LocalFullyDrawnReporterOwner$LocalFullyDrawnReporterOwner$1;->invoke()Ljava/lang/Object; +Landroidx/activity/compose/LocalOnBackPressedDispatcherOwner; +SPLandroidx/activity/compose/LocalOnBackPressedDispatcherOwner;->()V +Landroidx/activity/compose/OnBackInstance$job$1$1; +SPLandroidx/activity/compose/OnBackInstance$job$1$1;->(ILkotlin/coroutines/Continuation;)V +SPLandroidx/activity/compose/OnBackInstance$job$1$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +PLandroidx/activity/compose/OnBackInstance$job$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/activity/compose/OnBackInstance$job$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/activity/compose/PredictiveBackHandlerKt$PredictiveBackHandler$backCallBack$1$1; +SPLandroidx/activity/compose/PredictiveBackHandlerKt$PredictiveBackHandler$backCallBack$1$1;->(ZLkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/MutableState;)V +Landroidx/activity/compose/ReportDrawnComposition; +SPLandroidx/activity/compose/ReportDrawnComposition;->(Landroidx/activity/FullyDrawnReporter;Lkotlin/jvm/functions/Function0;)V +SPLandroidx/activity/compose/ReportDrawnComposition;->invoke()Ljava/lang/Object; +SPLandroidx/activity/compose/ReportDrawnComposition;->removeReporter()V +Landroidx/activity/compose/ReportDrawnComposition$snapshotStateObserver$1; +SPLandroidx/activity/compose/ReportDrawnComposition$snapshotStateObserver$1;->()V +SPLandroidx/activity/compose/ReportDrawnComposition$snapshotStateObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/activity/compose/ReportDrawnKt$ReportDrawnWhen$1$invoke$$inlined$onDispose$2; +SPLandroidx/activity/compose/ReportDrawnKt$ReportDrawnWhen$1$invoke$$inlined$onDispose$2;->(ILjava/lang/Object;)V +PLandroidx/activity/compose/ReportDrawnKt$ReportDrawnWhen$1$invoke$$inlined$onDispose$2;->dispose()V +Landroidx/activity/contextaware/ContextAwareHelper; +SPLandroidx/activity/contextaware/ContextAwareHelper;->()V +Landroidx/activity/contextaware/OnContextAvailableListener; +Landroidx/arch/core/executor/ArchTaskExecutor; +SPLandroidx/arch/core/executor/ArchTaskExecutor;->()V +SPLandroidx/arch/core/executor/ArchTaskExecutor;->()V +SPLandroidx/arch/core/executor/ArchTaskExecutor;->getInstance()Landroidx/arch/core/executor/ArchTaskExecutor; +Landroidx/arch/core/executor/ArchTaskExecutor$$ExternalSyntheticLambda0; +SPLandroidx/arch/core/executor/ArchTaskExecutor$$ExternalSyntheticLambda0;->(I)V +SPLandroidx/arch/core/executor/ArchTaskExecutor$$ExternalSyntheticLambda0;->execute(Ljava/lang/Runnable;)V +Landroidx/arch/core/executor/DefaultTaskExecutor; +SPLandroidx/arch/core/executor/DefaultTaskExecutor;->()V +Landroidx/arch/core/executor/DefaultTaskExecutor$1; +SPLandroidx/arch/core/executor/DefaultTaskExecutor$1;->()V +SPLandroidx/arch/core/executor/DefaultTaskExecutor$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; +Landroidx/arch/core/internal/FastSafeIterableMap; +SPLandroidx/arch/core/internal/FastSafeIterableMap;->()V +PLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;I)V +PLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;->hasNext()Z +PLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;->next()Ljava/lang/Object; +Landroidx/arch/core/internal/SafeIterableMap$Entry; +SPLandroidx/arch/core/internal/SafeIterableMap$Entry;->(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/LifecycleRegistry$ObserverWithState;)V +SPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object; +SPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object; +Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; +SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->(Landroidx/arch/core/internal/FastSafeIterableMap;)V +SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z +SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object; +SPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V +Landroidx/arch/core/internal/SafeIterableMap$SupportRemove; +Landroidx/collection/ArraySet; +SPLandroidx/collection/ArraySet;->()V +SPLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z +PLandroidx/collection/ArraySet;->clear()V +PLandroidx/collection/ArraySet;->toArray()[Ljava/lang/Object; +Landroidx/collection/ArraySetKt; +SPLandroidx/collection/ArraySetKt;->()V +SPLandroidx/collection/ArraySetKt;->indexOf(Landroidx/collection/ArraySet;Ljava/lang/Object;I)I +Landroidx/collection/FloatSetKt; +SPLandroidx/collection/FloatSetKt;->()V +Landroidx/collection/IntIntMapKt; +SPLandroidx/collection/IntIntMapKt;->()V +Landroidx/collection/IntListKt; +SPLandroidx/collection/IntListKt;->()V +SPLandroidx/collection/IntListKt;->intListOf([I)Landroidx/collection/MutableIntList; +Landroidx/collection/IntObjectMap; +HSPLandroidx/collection/IntObjectMap;->containsKey(I)Z +HSPLandroidx/collection/IntObjectMap;->get(I)Ljava/lang/Object; +Landroidx/collection/IntObjectMapKt; +SPLandroidx/collection/IntObjectMapKt;->()V +SPLandroidx/collection/IntObjectMapKt;->mutableIntObjectMapOf()Landroidx/collection/MutableIntObjectMap; +Landroidx/collection/IntSetKt; +SPLandroidx/collection/IntSetKt;->()V +Landroidx/collection/LongObjectMapKt; +SPLandroidx/collection/LongObjectMapKt;->()V +Landroidx/collection/LongSetKt; +SPLandroidx/collection/LongSetKt;->()V +Landroidx/collection/LongSparseArray; +SPLandroidx/collection/LongSparseArray;->()V +SPLandroidx/collection/LongSparseArray;->(I)V +PLandroidx/collection/LongSparseArray;->clear()V +PLandroidx/collection/LongSparseArray;->containsKey(J)Z +PLandroidx/collection/LongSparseArray;->get(J)Ljava/lang/Object; +PLandroidx/collection/LongSparseArray;->keyAt(I)J +PLandroidx/collection/LongSparseArray;->put(JLjava/lang/Object;)V +PLandroidx/collection/LongSparseArray;->remove(J)V +PLandroidx/collection/LongSparseArray;->size()I +PLandroidx/collection/LongSparseArray;->valueAt(I)Ljava/lang/Object; +Landroidx/collection/LruCache; +SPLandroidx/collection/LruCache;->(I)V +SPLandroidx/collection/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/collection/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/collection/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)V +SPLandroidx/collection/LruCache;->trimToSize(I)V +Landroidx/collection/MutableIntIntMap; +SPLandroidx/collection/MutableIntIntMap;->()V +SPLandroidx/collection/MutableIntIntMap;->(I)V +PLandroidx/collection/MutableIntIntMap;->findFirstAvailableSlot(I)I +PLandroidx/collection/MutableIntIntMap;->findKeyIndex(I)I +PLandroidx/collection/MutableIntIntMap;->getOrDefault(I)I +SPLandroidx/collection/MutableIntIntMap;->initializeStorage(I)V +PLandroidx/collection/MutableIntIntMap;->set(II)V +Landroidx/collection/MutableIntList; +SPLandroidx/collection/MutableIntList;->()V +SPLandroidx/collection/MutableIntList;->(I)V +SPLandroidx/collection/MutableIntList;->add(I)V +SPLandroidx/collection/MutableIntList;->get(I)I +SPLandroidx/collection/MutableIntList;->last()I +SPLandroidx/collection/MutableIntList;->removeAt(I)V +SPLandroidx/collection/MutableIntList;->set(II)V +Landroidx/collection/MutableIntObjectMap; +SPLandroidx/collection/MutableIntObjectMap;->()V +SPLandroidx/collection/MutableIntObjectMap;->(I)V +SPLandroidx/collection/MutableIntObjectMap;->clear()V +HSPLandroidx/collection/MutableIntObjectMap;->findAbsoluteInsertIndex(I)I +HSPLandroidx/collection/MutableIntObjectMap;->findFirstAvailableSlot(I)I +HSPLandroidx/collection/MutableIntObjectMap;->initializeStorage(I)V +SPLandroidx/collection/MutableIntObjectMap;->remove(I)Ljava/lang/Object; +HSPLandroidx/collection/MutableIntObjectMap;->set(ILjava/lang/Object;)V +Landroidx/collection/MutableIntSet; +SPLandroidx/collection/MutableIntSet;->()V +HSPLandroidx/collection/MutableIntSet;->(I)V +SPLandroidx/collection/MutableIntSet;->add(I)Z +SPLandroidx/collection/MutableIntSet;->contains(I)Z +SPLandroidx/collection/MutableIntSet;->findFirstAvailableSlot(I)I +HSPLandroidx/collection/MutableIntSet;->initializeStorage(I)V +HPLandroidx/collection/MutableIntSet;->remove(I)Z +PLandroidx/collection/MutableIntSet;->removeElementAt(I)V +Landroidx/collection/MutableLongList; +SPLandroidx/collection/MutableLongList;->(I)V +PLandroidx/collection/MutableLongList;->add(J)V +Landroidx/collection/MutableLongObjectMap; +SPLandroidx/collection/MutableLongObjectMap;->(I)V +PLandroidx/collection/MutableLongObjectMap;->clear()V +PLandroidx/collection/MutableLongObjectMap;->findFirstAvailableSlot(I)I +PLandroidx/collection/MutableLongObjectMap;->get(J)Ljava/lang/Object; +SPLandroidx/collection/MutableLongObjectMap;->initializeStorage(I)V +PLandroidx/collection/MutableLongObjectMap;->set(JLjava/lang/Object;)V +Landroidx/collection/MutableLongSet; +SPLandroidx/collection/MutableLongSet;->(I)V +SPLandroidx/collection/MutableLongSet;->initializeStorage(I)V +Landroidx/collection/MutableObjectFloatMap; +SPLandroidx/collection/MutableObjectFloatMap;->(I)V +SPLandroidx/collection/MutableObjectFloatMap;->findFirstAvailableSlot(I)I +SPLandroidx/collection/MutableObjectFloatMap;->findKeyIndex(Ljava/lang/Object;)I +SPLandroidx/collection/MutableObjectFloatMap;->initializeStorage(I)V +SPLandroidx/collection/MutableObjectFloatMap;->set(Ljava/lang/String;F)V +Landroidx/collection/MutableObjectIntMap; +SPLandroidx/collection/MutableObjectIntMap;->()V +HSPLandroidx/collection/MutableObjectIntMap;->(I)V +SPLandroidx/collection/MutableObjectIntMap;->clear()V +PLandroidx/collection/MutableObjectIntMap;->equals(Ljava/lang/Object;)Z +HSPLandroidx/collection/MutableObjectIntMap;->findFirstAvailableSlot(I)I +HSPLandroidx/collection/MutableObjectIntMap;->findKeyIndex(Ljava/lang/Object;)I +HSPLandroidx/collection/MutableObjectIntMap;->initializeStorage(I)V +SPLandroidx/collection/MutableObjectIntMap;->removeValueAt(I)V +SPLandroidx/collection/MutableObjectIntMap;->set(ILjava/lang/Object;)V +Landroidx/collection/MutableObjectList; +SPLandroidx/collection/MutableObjectList;->()V +SPLandroidx/collection/MutableObjectList;->(I)V +SPLandroidx/collection/MutableObjectList;->add(Ljava/lang/Object;)V +SPLandroidx/collection/MutableObjectList;->clear()V +SPLandroidx/collection/MutableObjectList;->get(I)Ljava/lang/Object; +PLandroidx/collection/MutableObjectList;->indexOf(Ljava/lang/Object;)I +PLandroidx/collection/MutableObjectList;->isEmpty()Z +SPLandroidx/collection/MutableObjectList;->isNotEmpty()Z +PLandroidx/collection/MutableObjectList;->remove(Ljava/lang/Object;)Z +PLandroidx/collection/MutableObjectList;->removeAt(I)Ljava/lang/Object; +SPLandroidx/collection/MutableObjectList;->resizeStorage(I[Ljava/lang/Object;)V +Landroidx/collection/MutableObjectList$ObjectListMutableList; +SPLandroidx/collection/MutableObjectList$ObjectListMutableList;->(ILjava/lang/Object;)V +HSPLandroidx/collection/MutableObjectList$ObjectListMutableList;->get(I)Ljava/lang/Object; +SPLandroidx/collection/MutableObjectList$ObjectListMutableList;->isEmpty()Z +HSPLandroidx/collection/MutableObjectList$ObjectListMutableList;->size()I +Landroidx/collection/MutableOrderedScatterSet; +SPLandroidx/collection/MutableOrderedScatterSet;->(I)V +PLandroidx/collection/MutableOrderedScatterSet;->add(Ljava/lang/Object;)Z +HPLandroidx/collection/MutableOrderedScatterSet;->clear()V +PLandroidx/collection/MutableOrderedScatterSet;->contains(Ljava/lang/Object;)Z +PLandroidx/collection/MutableOrderedScatterSet;->findAbsoluteInsertIndex(Ljava/lang/Object;)I +PLandroidx/collection/MutableOrderedScatterSet;->findFirstAvailableSlot(I)I +SPLandroidx/collection/MutableOrderedScatterSet;->initializeStorage(I)V +Landroidx/collection/MutableScatterMap; +SPLandroidx/collection/MutableScatterMap;->()V +HSPLandroidx/collection/MutableScatterMap;->(I)V +SPLandroidx/collection/MutableScatterMap;->clear()V +SPLandroidx/collection/MutableScatterMap;->contains(Ljava/lang/Object;)Z +HSPLandroidx/collection/MutableScatterMap;->findFirstAvailableSlot(I)I +HSPLandroidx/collection/MutableScatterMap;->initializeStorage(I)V +SPLandroidx/collection/MutableScatterMap;->isEmpty()Z +SPLandroidx/collection/MutableScatterMap;->isNotEmpty()Z +SPLandroidx/collection/MutableScatterMap;->removeValueAt(I)Ljava/lang/Object; +HSPLandroidx/collection/MutableScatterMap;->set(Ljava/lang/Object;Ljava/lang/Object;)V +Landroidx/collection/MutableScatterSet; +SPLandroidx/collection/MutableScatterSet;->()V +HSPLandroidx/collection/MutableScatterSet;->(I)V +HSPLandroidx/collection/MutableScatterSet;->add(Ljava/lang/Object;)Z +HSPLandroidx/collection/MutableScatterSet;->clear()V +SPLandroidx/collection/MutableScatterSet;->contains(Ljava/lang/Object;)Z +HSPLandroidx/collection/MutableScatterSet;->findFirstAvailableSlot(I)I +HSPLandroidx/collection/MutableScatterSet;->initializeStorage(I)V +SPLandroidx/collection/MutableScatterSet;->isEmpty()Z +SPLandroidx/collection/MutableScatterSet;->isNotEmpty()Z +PLandroidx/collection/MutableScatterSet;->minusAssign(Ljava/lang/Object;)V +PLandroidx/collection/MutableScatterSet;->plusAssign(Landroidx/collection/MutableScatterSet;)V +SPLandroidx/collection/MutableScatterSet;->plusAssign(Ljava/lang/Object;)V +SPLandroidx/collection/MutableScatterSet;->removeElementAt(I)V +Landroidx/collection/MutableSetWrapper; +SPLandroidx/collection/MutableSetWrapper;->(Landroidx/collection/MutableScatterSet;)V +SPLandroidx/collection/MutableSetWrapper;->add(Ljava/lang/Object;)Z +SPLandroidx/collection/MutableSetWrapper;->isEmpty()Z +SPLandroidx/collection/MutableSetWrapper;->remove(Ljava/lang/Object;)Z +Landroidx/collection/ObjectFloatMapKt; +SPLandroidx/collection/ObjectFloatMapKt;->()V +Landroidx/collection/ObjectIntMapKt; +SPLandroidx/collection/ObjectIntMapKt;->()V +Landroidx/collection/ObjectListKt; +SPLandroidx/collection/ObjectListKt;->()V +Landroidx/collection/OrderedScatterSetKt; +SPLandroidx/collection/OrderedScatterSetKt;->()V +Landroidx/collection/ScatterMapKt; +SPLandroidx/collection/ScatterMapKt;->()V +SPLandroidx/collection/ScatterMapKt;->loadedCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->nextCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->normalizeCapacity(I)I +SPLandroidx/collection/ScatterMapKt;->unloadedCapacity(I)I +Landroidx/collection/ScatterSetKt; +SPLandroidx/collection/ScatterSetKt;->()V +Landroidx/collection/SparseArrayCompat; +SPLandroidx/collection/SparseArrayCompat;->()V +SPLandroidx/collection/SparseArrayCompat;->get(I)Ljava/lang/Object; +SPLandroidx/collection/SparseArrayCompat;->keyAt(I)I +SPLandroidx/collection/SparseArrayCompat;->put(ILjava/lang/Object;)V +SPLandroidx/collection/SparseArrayCompat;->size()I +SPLandroidx/collection/SparseArrayCompat;->valueAt(I)Ljava/lang/Object; +Landroidx/collection/SparseArrayKt$keyIterator$1; +SPLandroidx/collection/SparseArrayKt$keyIterator$1;->(Landroidx/collection/SparseArrayCompat;)V +SPLandroidx/collection/SparseArrayKt$keyIterator$1;->hasNext()Z +Landroidx/collection/Values; +SPLandroidx/collection/Values;->()V +PLandroidx/collection/Values;->clear()V +Landroidx/collection/internal/Lock; +SPLandroidx/collection/internal/Lock;->()V +SPLandroidx/collection/internal/Lock;->(I)V +SPLandroidx/collection/internal/Lock;->(Landroidx/compose/ui/node/LayoutNode$_foldedChildren$1;)V +SPLandroidx/collection/internal/Lock;->create$default(Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/lifecycle/ViewModelProvider$Factory;I)Landroidx/lifecycle/ViewModelProvider; +SPLandroidx/collection/internal/Lock;->createAndroidTypefaceApi28-RetOiIg(Ljava/lang/String;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; +SPLandroidx/collection/internal/Lock;->createNamed-RetOiIg(Landroidx/compose/ui/text/font/GenericFontFamily;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; +Landroidx/collection/internal/RuntimeHelpersKt; +SPLandroidx/collection/internal/RuntimeHelpersKt;->()V +SPLandroidx/collection/internal/RuntimeHelpersKt;->binarySearch([III)I +PLandroidx/collection/internal/RuntimeHelpersKt;->binarySearch([JIJ)I +PLandroidx/compose/animation/AndroidFlingSpline;->()V +PLandroidx/compose/animation/AndroidFlingSpline;->flingPosition(F)Landroidx/compose/animation/AndroidFlingSpline$FlingResult; +PLandroidx/compose/animation/AndroidFlingSpline$FlingResult;->(FF)V +Landroidx/compose/animation/AnimatedContentKt; +SPLandroidx/compose/animation/AnimatedContentKt;->()V +SPLandroidx/compose/animation/AnimatedContentKt;->AnimatedContent(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$3; +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;I)V +PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1; +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Landroidx/compose/runtime/snapshots/SnapshotStateList;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/DefaultDrawerItemsColor;I)V +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1; +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1;->(ILjava/lang/Object;)V +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5; +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;Ljava/lang/Object;Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$1$invoke$$inlined$onDispose$1; +SPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$1$invoke$$inlined$onDispose$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$1$invoke$$inlined$onDispose$1;->dispose()V +PLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->()V +PLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->(II)V +PLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedContentMeasurePolicy; +SPLandroidx/compose/animation/AnimatedContentMeasurePolicy;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;)V +SPLandroidx/compose/animation/AnimatedContentMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3; +SPLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;->([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/animation/AnimatedContentMeasurePolicy;II)V +SPLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedContentScopeImpl; +Landroidx/compose/animation/AnimatedContentTransitionScopeImpl; +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Alignment;)V +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->getInitialState()Ljava/lang/Object; +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->getTargetState()Ljava/lang/Object; +Landroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData; +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->(Z)V +Landroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierElement; +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierElement;->(Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/runtime/MutableState;Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;)V +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierNode; +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierNode$measure$1; +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierNode$measure$1;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierNode;Landroidx/compose/ui/layout/Placeable;J)V +SPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifierNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedEnterExitMeasurePolicy; +SPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->(Landroidx/compose/animation/AnimatedVisibilityScopeImpl;)V +SPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$2;->(ZLandroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Ljava/lang/String;Landroidx/compose/runtime/internal/ComposableLambdaImpl;II)V +PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibilityImpl$1$1;->(Lkotlin/jvm/functions/Function1;Landroidx/compose/animation/core/Transition;)V +PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibilityImpl$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/AnimatedVisibilityScope; +Landroidx/compose/animation/AnimatedVisibilityScopeImpl; +SPLandroidx/compose/animation/AnimatedVisibilityScopeImpl;->()V +Landroidx/compose/animation/AnimationModifierKt; +SPLandroidx/compose/animation/AnimationModifierKt;->()V +Landroidx/compose/animation/ChangeSize; +SPLandroidx/compose/animation/ChangeSize;->(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/animation/ContentTransform; +SPLandroidx/compose/animation/ContentTransform;->(Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;FLandroidx/compose/animation/SizeTransformImpl;)V +Landroidx/compose/animation/CrossfadeKt$Crossfade$3$1; +SPLandroidx/compose/animation/CrossfadeKt$Crossfade$3$1;->()V +SPLandroidx/compose/animation/CrossfadeKt$Crossfade$3$1;->(II)V +SPLandroidx/compose/animation/CrossfadeKt$Crossfade$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1; +SPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->(Landroidx/compose/runtime/State;I)V +SPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/EnterExitState; +SPLandroidx/compose/animation/EnterExitState;->()V +Landroidx/compose/animation/EnterExitTransitionElement; +SPLandroidx/compose/animation/EnterExitTransitionElement;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Lkotlin/jvm/functions/Function0;Landroidx/compose/animation/EnterExitTransitionKt$$ExternalSyntheticLambda0;)V +SPLandroidx/compose/animation/EnterExitTransitionElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/animation/EnterExitTransitionElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/animation/EnterExitTransitionElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/animation/EnterExitTransitionKt; +SPLandroidx/compose/animation/EnterExitTransitionKt;->()V +SPLandroidx/compose/animation/EnterExitTransitionKt;->expandIn(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/EnterTransitionImpl; +SPLandroidx/compose/animation/EnterExitTransitionKt;->fadeIn$default(Landroidx/compose/animation/core/TweenSpec;I)Landroidx/compose/animation/EnterTransitionImpl; +SPLandroidx/compose/animation/EnterExitTransitionKt;->fadeOut$default(Landroidx/compose/animation/core/TweenSpec;I)Landroidx/compose/animation/ExitTransitionImpl; +SPLandroidx/compose/animation/EnterExitTransitionKt;->shrinkOut(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/ExitTransitionImpl; +Landroidx/compose/animation/EnterExitTransitionKt$$ExternalSyntheticLambda0; +SPLandroidx/compose/animation/EnterExitTransitionKt$$ExternalSyntheticLambda0;->(Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Landroidx/compose/animation/core/Transition$DeferredAnimation;)V +PLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$1$1$alpha$1;->(Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;I)V +PLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$1$1$alpha$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/EnterExitTransitionKt$createModifier$1$1; +SPLandroidx/compose/animation/EnterExitTransitionKt$createModifier$1$1;->()V +SPLandroidx/compose/animation/EnterExitTransitionKt$createModifier$1$1;->invoke()Ljava/lang/Object; +Landroidx/compose/animation/EnterExitTransitionKt$createModifier$2$1; +SPLandroidx/compose/animation/EnterExitTransitionKt$createModifier$2$1;->(ZLkotlin/jvm/functions/Function0;I)V +SPLandroidx/compose/animation/EnterExitTransitionKt$createModifier$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/EnterExitTransitionModifierNode; +SPLandroidx/compose/animation/EnterExitTransitionModifierNode;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Lkotlin/jvm/functions/Function0;Landroidx/compose/animation/EnterExitTransitionKt$$ExternalSyntheticLambda0;)V +PLandroidx/compose/animation/EnterExitTransitionModifierNode;->getAlignment()Landroidx/compose/ui/Alignment; +SPLandroidx/compose/animation/EnterExitTransitionModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +SPLandroidx/compose/animation/EnterExitTransitionModifierNode;->onAttach()V +Landroidx/compose/animation/EnterExitTransitionModifierNode$measure$2; +SPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$2;->(Landroidx/compose/ui/layout/Placeable;JJLandroidx/compose/ui/focus/FocusOwnerImpl$focusSearch$1;)V +SPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1; +SPLandroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1;->(Landroidx/compose/animation/EnterExitTransitionModifierNode;I)V +Landroidx/compose/animation/EnterTransitionImpl; +SPLandroidx/compose/animation/EnterTransitionImpl;->()V +SPLandroidx/compose/animation/EnterTransitionImpl;->(Landroidx/compose/animation/TransitionData;)V +SPLandroidx/compose/animation/EnterTransitionImpl;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/animation/EnterTransitionImpl;->plus(Landroidx/compose/animation/EnterTransitionImpl;)Landroidx/compose/animation/EnterTransitionImpl; +Landroidx/compose/animation/ExitTransitionImpl; +SPLandroidx/compose/animation/ExitTransitionImpl;->()V +SPLandroidx/compose/animation/ExitTransitionImpl;->(Landroidx/compose/animation/TransitionData;)V +SPLandroidx/compose/animation/ExitTransitionImpl;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/animation/ExitTransitionImpl;->plus(Landroidx/compose/animation/ExitTransitionImpl;)Landroidx/compose/animation/ExitTransitionImpl; +Landroidx/compose/animation/Fade; +SPLandroidx/compose/animation/Fade;->(FLandroidx/compose/animation/core/FiniteAnimationSpec;)V +PLandroidx/compose/animation/Fade;->equals(Ljava/lang/Object;)Z +Landroidx/compose/animation/FlingCalculator; +SPLandroidx/compose/animation/FlingCalculator;->(FLandroidx/compose/ui/unit/Density;)V +HPLandroidx/compose/animation/FlingCalculator;->flingInfo(F)Landroidx/compose/animation/FlingCalculator$FlingInfo; +PLandroidx/compose/animation/FlingCalculator;->getSplineDeceleration(F)D +PLandroidx/compose/animation/FlingCalculator$FlingInfo;->(FFJ)V +Landroidx/compose/animation/FlingCalculatorKt; +SPLandroidx/compose/animation/FlingCalculatorKt;->()V +Landroidx/compose/animation/LayoutModifierNodeWithPassThroughIntrinsics; +Landroidx/compose/animation/Scale; +SPLandroidx/compose/animation/Scale;->AnimatedEnterExitImpl(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +PLandroidx/compose/animation/Scale;->AnimatedVisibility$1(ZLandroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Ljava/lang/String;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +PLandroidx/compose/animation/Scale;->AnimatedVisibilityImpl(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransitionImpl;Landroidx/compose/animation/ExitTransitionImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/animation/Scale;->targetEnterExit(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/animation/EnterExitState; +Landroidx/compose/animation/SingleValueAnimationKt; +SPLandroidx/compose/animation/SingleValueAnimationKt;->()V +SPLandroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-euL9pac(JLandroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/runtime/State; +Landroidx/compose/animation/SizeTransformImpl; +Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt; +SPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;->()V +Landroidx/compose/animation/TransitionData; +SPLandroidx/compose/animation/TransitionData;->(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;Ljava/util/LinkedHashMap;I)V +SPLandroidx/compose/animation/TransitionData;->(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;ZLjava/util/Map;)V +SPLandroidx/compose/animation/TransitionData;->equals(Ljava/lang/Object;)Z +Landroidx/compose/animation/core/Animatable; +SPLandroidx/compose/animation/core/Animatable;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/Object;)V +SPLandroidx/compose/animation/core/Animatable;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/Object;I)V +SPLandroidx/compose/animation/core/Animatable;->access$clampToBounds(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/animation/core/Animatable;->access$endAnimation(Landroidx/compose/animation/core/Animatable;)V +SPLandroidx/compose/animation/core/Animatable;->animateTo$default(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;I)Ljava/lang/Object; +SPLandroidx/compose/animation/core/Animatable;->getValue()Ljava/lang/Object; +Landroidx/compose/animation/core/Animatable$runAnimation$2; +SPLandroidx/compose/animation/core/Animatable$runAnimation$2;->(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/TargetBasedAnimation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLandroidx/compose/animation/core/Animatable$runAnimation$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/compose/animation/core/Animatable$runAnimation$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/animation/core/Animatable$runAnimation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/AnimateAsStateKt; +SPLandroidx/compose/animation/core/AnimateAsStateKt;->()V +SPLandroidx/compose/animation/core/AnimateAsStateKt;->animateFloatAsState(FLandroidx/compose/animation/core/TweenSpec;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/State; +SPLandroidx/compose/animation/core/AnimateAsStateKt;->animateValueAsState(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverterImpl;Landroidx/compose/animation/core/AnimationSpec;Ljava/lang/Float;Ljava/lang/String;Landroidx/compose/runtime/ComposerImpl;II)Landroidx/compose/runtime/State; +Landroidx/compose/animation/core/Animation; +SPLandroidx/compose/animation/core/Animation;->isFinishedFromNanos(J)Z +PLandroidx/compose/animation/core/AnimationEndReason;->()V +PLandroidx/compose/animation/core/AnimationResult;->(Landroidx/compose/animation/core/AnimationState;Landroidx/compose/animation/core/AnimationEndReason;)V +Landroidx/compose/animation/core/AnimationScope; +SPLandroidx/compose/animation/core/AnimationScope;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverterImpl;Landroidx/compose/animation/core/AnimationVector;JLjava/lang/Object;JLkotlin/jvm/functions/Function0;)V +Landroidx/compose/animation/core/AnimationSpec; +Landroidx/compose/animation/core/AnimationState; +SPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;I)V +SPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;JJZ)V +SPLandroidx/compose/animation/core/AnimationState;->getValue()Ljava/lang/Object; +Landroidx/compose/animation/core/AnimationVector; +Landroidx/compose/animation/core/AnimationVector1D; +SPLandroidx/compose/animation/core/AnimationVector1D;->(F)V +SPLandroidx/compose/animation/core/AnimationVector1D;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/animation/core/AnimationVector1D;->get$animation_core(I)F +SPLandroidx/compose/animation/core/AnimationVector1D;->getSize$animation_core()I +SPLandroidx/compose/animation/core/AnimationVector1D;->newVector$animation_core()Landroidx/compose/animation/core/AnimationVector; +SPLandroidx/compose/animation/core/AnimationVector1D;->reset$animation_core()V +SPLandroidx/compose/animation/core/AnimationVector1D;->set$animation_core(FI)V +Landroidx/compose/animation/core/AnimationVector2D; +SPLandroidx/compose/animation/core/AnimationVector2D;->(FF)V +Landroidx/compose/animation/core/AnimationVector3D; +SPLandroidx/compose/animation/core/AnimationVector3D;->(FFF)V +Landroidx/compose/animation/core/AnimationVector4D; +SPLandroidx/compose/animation/core/AnimationVector4D;->(FFFF)V +SPLandroidx/compose/animation/core/AnimationVector4D;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/animation/core/AnimationVector4D;->get$animation_core(I)F +SPLandroidx/compose/animation/core/AnimationVector4D;->getSize$animation_core()I +SPLandroidx/compose/animation/core/AnimationVector4D;->newVector$animation_core()Landroidx/compose/animation/core/AnimationVector; +SPLandroidx/compose/animation/core/AnimationVector4D;->reset$animation_core()V +SPLandroidx/compose/animation/core/AnimationVector4D;->set$animation_core(FI)V +Landroidx/compose/animation/core/ArcSplineKt; +SPLandroidx/compose/animation/core/ArcSplineKt;->()V +PLandroidx/compose/animation/core/ArcSplineKt;->AnimationState$default(FFI)Landroidx/compose/animation/core/AnimationState; +SPLandroidx/compose/animation/core/ArcSplineKt;->animate(FFFLandroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +HSPLandroidx/compose/animation/core/ArcSplineKt;->animate(Landroidx/compose/animation/core/AnimationState;Landroidx/compose/animation/core/Animation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/animation/core/ArcSplineKt;->animateDecay(Landroidx/compose/animation/core/AnimationState;Landroidx/compose/animation/core/DecayAnimationSpecImpl;ZLkotlin/jvm/functions/Function1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +HSPLandroidx/compose/animation/core/ArcSplineKt;->callWithFrameNanos(Landroidx/compose/animation/core/Animation;Lkotlin/jvm/functions/Function1;Landroidx/compose/animation/core/SuspendAnimationKt$animate$4;)Ljava/lang/Object; +SPLandroidx/compose/animation/core/ArcSplineKt;->copy(Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; +HSPLandroidx/compose/animation/core/ArcSplineKt;->doAnimationFrameWithScale(Landroidx/compose/animation/core/AnimationScope;JFLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/animation/core/ArcSplineKt;->getDurationScale(Lkotlin/coroutines/CoroutineContext;)F +SPLandroidx/compose/animation/core/ArcSplineKt;->spring$default(FLjava/lang/Object;I)Landroidx/compose/animation/core/SpringSpec; +SPLandroidx/compose/animation/core/ArcSplineKt;->tween$default(IILandroidx/compose/animation/core/Easing;I)Landroidx/compose/animation/core/TweenSpec; +HSPLandroidx/compose/animation/core/ArcSplineKt;->updateState(Landroidx/compose/animation/core/AnimationScope;Landroidx/compose/animation/core/AnimationState;)V +Landroidx/compose/animation/core/CubicBezierEasing; +SPLandroidx/compose/animation/core/CubicBezierEasing;->(FFFF)V +SPLandroidx/compose/animation/core/CubicBezierEasing;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/animation/core/CubicBezierEasing;->transform(F)F +PLandroidx/compose/animation/core/DecayAnimation;->(Landroidx/compose/animation/core/DecayAnimationSpecImpl;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;)V +PLandroidx/compose/animation/core/DecayAnimation;->getDurationNanos()J +PLandroidx/compose/animation/core/DecayAnimation;->getTargetValue()Ljava/lang/Object; +PLandroidx/compose/animation/core/DecayAnimation;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverterImpl; +HPLandroidx/compose/animation/core/DecayAnimation;->getValueFromNanos(J)Ljava/lang/Object; +PLandroidx/compose/animation/core/DecayAnimation;->getVelocityVectorFromNanos(J)Landroidx/compose/animation/core/AnimationVector; +PLandroidx/compose/animation/core/DecayAnimation;->isInfinite()Z +Landroidx/compose/animation/core/DecayAnimationSpecImpl; +SPLandroidx/compose/animation/core/DecayAnimationSpecImpl;->(Landroidx/compose/animation/core/FloatDecayAnimationSpec;)V +Landroidx/compose/animation/core/Easing; +Landroidx/compose/animation/core/EasingKt; +SPLandroidx/compose/animation/core/EasingKt;->()V +Landroidx/compose/animation/core/FiniteAnimationSpec; +Landroidx/compose/animation/core/FloatAnimationSpec; +Landroidx/compose/animation/core/FloatDecayAnimationSpec; +PLandroidx/compose/animation/core/FloatSpringSpec;->(FFF)V +PLandroidx/compose/animation/core/FloatSpringSpec;->getDurationNanos(FFF)J +Landroidx/compose/animation/core/FloatTweenSpec; +SPLandroidx/compose/animation/core/FloatTweenSpec;->(IILandroidx/compose/animation/core/Easing;)V +SPLandroidx/compose/animation/core/FloatTweenSpec;->getValueFromNanos(JFFF)F +SPLandroidx/compose/animation/core/FloatTweenSpec;->getVelocityFromNanos(JFFF)F +Landroidx/compose/animation/core/MutableTransitionState; +SPLandroidx/compose/animation/core/MutableTransitionState;->(Ljava/lang/Object;)V +SPLandroidx/compose/animation/core/MutableTransitionState;->getCurrentState()Ljava/lang/Object; +PLandroidx/compose/animation/core/MutableTransitionState;->setCurrentState$animation_core(Ljava/lang/Object;)V +SPLandroidx/compose/animation/core/MutableTransitionState;->transitionConfigured$animation_core(Landroidx/compose/animation/core/Transition;)V +PLandroidx/compose/animation/core/MutableTransitionState;->transitionRemoved$animation_core()V +Landroidx/compose/animation/core/MutatorMutex; +SPLandroidx/compose/animation/core/MutatorMutex;->()V +SPLandroidx/compose/animation/core/MutatorMutex;->mutate$default(Landroidx/compose/animation/core/MutatorMutex;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/compose/animation/core/MutatorMutex$Mutator; +SPLandroidx/compose/animation/core/MutatorMutex$Mutator;->(Lkotlinx/coroutines/Job;)V +Landroidx/compose/animation/core/MutatorMutex$mutate$2; +SPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->(Landroidx/compose/animation/core/MutatorMutex;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->(Lkotlinx/coroutines/channels/Channel;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V +SPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/SeekableTransitionState; +SPLandroidx/compose/animation/core/SeekableTransitionState;->()V +SPLandroidx/compose/animation/core/SeekableTransitionState;->(Landroidx/navigation/NavBackStackEntry;)V +PLandroidx/compose/animation/core/SeekableTransitionState;->access$moveAnimationToInitialState(Landroidx/compose/animation/core/SeekableTransitionState;)V +PLandroidx/compose/animation/core/SeekableTransitionState;->access$runAnimations(Landroidx/compose/animation/core/SeekableTransitionState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState;->access$waitForComposition(Landroidx/compose/animation/core/SeekableTransitionState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState;->access$waitForCompositionAfterTargetStateChange(Landroidx/compose/animation/core/SeekableTransitionState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState;->animateOneFrame(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/compose/animation/core/SeekableTransitionState;->getCurrentState()Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState;->recalculateAnimationValue(Landroidx/compose/animation/core/SeekableTransitionState$SeekingAnimationState;J)V +PLandroidx/compose/animation/core/SeekableTransitionState;->seekToFraction()V +PLandroidx/compose/animation/core/SeekableTransitionState;->setCurrentState$animation_core(Ljava/lang/Object;)V +PLandroidx/compose/animation/core/SeekableTransitionState;->setFraction(F)V +SPLandroidx/compose/animation/core/SeekableTransitionState;->transitionConfigured$animation_core(Landroidx/compose/animation/core/Transition;)V +Landroidx/compose/animation/core/SeekableTransitionState$$ExternalSyntheticLambda1; +SPLandroidx/compose/animation/core/SeekableTransitionState$$ExternalSyntheticLambda1;->(Landroidx/compose/animation/core/SeekableTransitionState;I)V +PLandroidx/compose/animation/core/SeekableTransitionState$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState$SeekingAnimationState;->()V +PLandroidx/compose/animation/core/SeekableTransitionState$runAnimations$1;->(Landroidx/compose/animation/core/SeekableTransitionState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/animation/core/SeekableTransitionState$runAnimations$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState$snapTo$2;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/SeekableTransitionState;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/animation/core/SeekableTransitionState$snapTo$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/animation/core/SeekableTransitionState$snapTo$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState$snapTo$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState$waitForComposition$1;->(Landroidx/compose/animation/core/SeekableTransitionState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/animation/core/SeekableTransitionState$waitForComposition$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/animation/core/SeekableTransitionState$waitForCompositionAfterTargetStateChange$1;->(Landroidx/compose/animation/core/SeekableTransitionState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/animation/core/SeekableTransitionState$waitForCompositionAfterTargetStateChange$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/SpringSpec; +SPLandroidx/compose/animation/core/SpringSpec;->(FFLjava/lang/Object;)V +SPLandroidx/compose/animation/core/SpringSpec;->(ILjava/lang/Object;)V +SPLandroidx/compose/animation/core/SpringSpec;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/animation/core/SpringSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverterImpl;)Landroidx/compose/animation/core/VectorizedAnimationSpec; +Landroidx/compose/animation/core/SuspendAnimationKt$$ExternalSyntheticLambda1; +SPLandroidx/compose/animation/core/SuspendAnimationKt$$ExternalSyntheticLambda1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Ljava/lang/Object;Landroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationState;FLkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/animation/core/SuspendAnimationKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/SuspendAnimationKt$$ExternalSyntheticLambda2; +SPLandroidx/compose/animation/core/SuspendAnimationKt$$ExternalSyntheticLambda2;->(ILandroidx/compose/animation/core/AnimationState;)V +PLandroidx/compose/animation/core/SuspendAnimationKt$$ExternalSyntheticLambda3;->(Lkotlin/jvm/internal/Ref$ObjectRef;FLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/animation/core/SuspendAnimationKt$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/SuspendAnimationKt$animate$4; +SPLandroidx/compose/animation/core/SuspendAnimationKt$animate$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/TargetBasedAnimation; +SPLandroidx/compose/animation/core/TargetBasedAnimation;->(Landroidx/compose/animation/core/AnimationSpec;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;)V +SPLandroidx/compose/animation/core/TargetBasedAnimation;->getDurationNanos()J +SPLandroidx/compose/animation/core/TargetBasedAnimation;->getTargetValue()Ljava/lang/Object; +SPLandroidx/compose/animation/core/TargetBasedAnimation;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverterImpl; +SPLandroidx/compose/animation/core/TargetBasedAnimation;->getValueFromNanos(J)Ljava/lang/Object; +SPLandroidx/compose/animation/core/TargetBasedAnimation;->getVelocityVectorFromNanos(J)Landroidx/compose/animation/core/AnimationVector; +SPLandroidx/compose/animation/core/TargetBasedAnimation;->isInfinite()Z +PLandroidx/compose/animation/core/TargetBasedAnimation;->setMutableInitialValue$animation_core(Ljava/lang/Object;)V +PLandroidx/compose/animation/core/TargetBasedAnimation;->setMutableTargetValue$animation_core(Ljava/lang/Object;)V +Landroidx/compose/animation/core/Transition; +SPLandroidx/compose/animation/core/Transition;->(Lio/ktor/util/StringValuesBuilderImpl;Landroidx/compose/animation/core/Transition;Ljava/lang/String;)V +PLandroidx/compose/animation/core/Transition;->animateTo$animation_core(Ljava/lang/Object;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/animation/core/Transition;->calculateTotalDurationNanos()J +PLandroidx/compose/animation/core/Transition;->getHasInitialValueAnimations()Z +PLandroidx/compose/animation/core/Transition;->getPlayTimeNanos()J +SPLandroidx/compose/animation/core/Transition;->getSegment()Landroidx/compose/animation/core/Transition$Segment; +SPLandroidx/compose/animation/core/Transition;->isSeeking()Z +PLandroidx/compose/animation/core/Transition;->onTransitionEnd$animation_core()V +PLandroidx/compose/animation/core/Transition;->seekAnimations$animation_core(J)V +PLandroidx/compose/animation/core/Transition;->setInitialAnimations$animation_core(Landroidx/compose/animation/core/SeekableTransitionState$SeekingAnimationState;)V +PLandroidx/compose/animation/core/Transition;->setPlayTimeNanos(J)V +PLandroidx/compose/animation/core/Transition;->updateInitialValues$animation_core()V +SPLandroidx/compose/animation/core/Transition;->updateTarget$animation_core(Ljava/lang/Object;)V +Landroidx/compose/animation/core/Transition$$ExternalSyntheticLambda0; +SPLandroidx/compose/animation/core/Transition$$ExternalSyntheticLambda0;->(Landroidx/compose/animation/core/Transition;I)V +SPLandroidx/compose/animation/core/Transition$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/compose/animation/core/Transition$$ExternalSyntheticLambda2; +SPLandroidx/compose/animation/core/Transition$$ExternalSyntheticLambda2;->(IILjava/lang/Object;Ljava/lang/Object;)V +SPLandroidx/compose/animation/core/Transition$$ExternalSyntheticLambda2;->(ILandroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;)V +SPLandroidx/compose/animation/core/Transition$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/animation/core/Transition$DeferredAnimation;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/String;)V +PLandroidx/compose/animation/core/Transition$DeferredAnimation;->animate(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData; +PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->(Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$TransitionAnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->getValue()Ljava/lang/Object; +PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->updateAnimationStates(Landroidx/compose/animation/core/Transition$Segment;)V +Landroidx/compose/animation/core/Transition$Segment; +PLandroidx/compose/animation/core/Transition$Segment;->isTransitioningTo(Ljava/lang/Enum;Ljava/lang/Enum;)Z +Landroidx/compose/animation/core/Transition$SegmentImpl; +SPLandroidx/compose/animation/core/Transition$SegmentImpl;->(Ljava/lang/Object;Ljava/lang/Object;)V +PLandroidx/compose/animation/core/Transition$SegmentImpl;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/animation/core/Transition$SegmentImpl;->getInitialState()Ljava/lang/Object; +SPLandroidx/compose/animation/core/Transition$SegmentImpl;->getTargetState()Ljava/lang/Object; +PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/TwoWayConverterImpl;)V +PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getAnimation()Landroidx/compose/animation/core/TargetBasedAnimation; +PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; +PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->seekTo$animation_core(J)V +PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->setValue$animation_core(Ljava/lang/Object;)V +PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateAnimation(Ljava/lang/Object;Z)V +PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateTargetValue$animation_core(Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;)V +Landroidx/compose/animation/core/TransitionKt; +SPLandroidx/compose/animation/core/TransitionKt;->()V +PLandroidx/compose/animation/core/TransitionKt;->createDeferredAnimation(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverterImpl;Ljava/lang/String;Landroidx/compose/runtime/ComposerImpl;II)Landroidx/compose/animation/core/Transition$DeferredAnimation; +PLandroidx/compose/animation/core/TransitionKt;->updateTransition(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/animation/core/Transition; +Landroidx/compose/animation/core/TransitionKt$$ExternalSyntheticLambda4; +SPLandroidx/compose/animation/core/TransitionKt$$ExternalSyntheticLambda4;->(Landroidx/compose/animation/core/Transition;I)V +SPLandroidx/compose/animation/core/TransitionKt$$ExternalSyntheticLambda4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/animation/core/TransitionKt$updateTransition$lambda$1$0$$inlined$onDispose$1; +SPLandroidx/compose/animation/core/TransitionKt$updateTransition$lambda$1$0$$inlined$onDispose$1;->(Landroidx/compose/animation/core/Transition;I)V +PLandroidx/compose/animation/core/TransitionKt$updateTransition$lambda$1$0$$inlined$onDispose$1;->dispose()V +Landroidx/compose/animation/core/TweenSpec; +SPLandroidx/compose/animation/core/TweenSpec;->(IILandroidx/compose/animation/core/Easing;)V +SPLandroidx/compose/animation/core/TweenSpec;->(ILandroidx/compose/animation/core/Easing;I)V +SPLandroidx/compose/animation/core/TweenSpec;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverterImpl;)Landroidx/compose/animation/core/VectorizedAnimationSpec; +Landroidx/compose/animation/core/TwoWayConverterImpl; +SPLandroidx/compose/animation/core/TwoWayConverterImpl;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/animation/core/VectorizedAnimationSpec; +SPLandroidx/compose/animation/core/VectorizedAnimationSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; +PLandroidx/compose/animation/core/VectorizedAnimationSpecKt;->()V +Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec; +SPLandroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J +Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; +SPLandroidx/compose/animation/core/VectorizedFiniteAnimationSpec;->isInfinite()Z +PLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->(Landroidx/compose/animation/core/FloatDecayAnimationSpec;)V +HPLandroidx/compose/animation/core/VectorizedFloatDecaySpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; +Landroidx/compose/animation/core/VisibilityThresholdsKt; +SPLandroidx/compose/animation/core/VisibilityThresholdsKt;->()V +Landroidx/compose/foundation/AbstractClickableNode; +SPLandroidx/compose/foundation/AbstractClickableNode;->()V +SPLandroidx/compose/foundation/AbstractClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/IndicationNodeFactory;ZZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V +SPLandroidx/compose/foundation/AbstractClickableNode;->applyAdditionalSemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/foundation/AbstractClickableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +PLandroidx/compose/foundation/AbstractClickableNode;->delayPressInteraction()Z +PLandroidx/compose/foundation/AbstractClickableNode;->disposeInteractions()V +SPLandroidx/compose/foundation/AbstractClickableNode;->getShouldAutoInvalidate()Z +SPLandroidx/compose/foundation/AbstractClickableNode;->getShouldMergeDescendantSemantics()Z +SPLandroidx/compose/foundation/AbstractClickableNode;->getTraverseKey()Ljava/lang/Object; +SPLandroidx/compose/foundation/AbstractClickableNode;->initializeIndicationAndInteractionSourceIfNeeded()V +SPLandroidx/compose/foundation/AbstractClickableNode;->onAttach()V +PLandroidx/compose/foundation/AbstractClickableNode;->onDetach()V +SPLandroidx/compose/foundation/AbstractClickableNode;->onObservedReadsChanged()V +PLandroidx/compose/foundation/AbstractClickableNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V +SPLandroidx/compose/foundation/AbstractClickableNode;->updateCommon-O2vRcR0(Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/IndicationNodeFactory;ZZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V +Landroidx/compose/foundation/AbstractClickableNode$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/AbstractClickableNode$$ExternalSyntheticLambda0;->(Landroidx/compose/foundation/AbstractClickableNode;I)V +PLandroidx/compose/foundation/AbstractClickableNode$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +PLandroidx/compose/foundation/AbstractClickableNode$handlePressInteraction$2$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;JLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/AbstractClickableNode;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/AbstractClickableNode$handlePressInteraction$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/AbstractClickableNode$handlePressInteraction$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/AbstractClickableNode$handlePressInteraction$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect; +SPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->(Landroid/content/Context;Landroidx/compose/ui/unit/Density;JLandroidx/compose/foundation/layout/PaddingValues;)V +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->animateToReleaseIfNeeded()V +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->applyToFling-BMRW4eQ(JLandroidx/compose/foundation/gestures/ScrollingLogic$onScrollStopped$performFling$1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->updateSize-uvyYCjk$foundation(J)V +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$applyToFling$1;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$applyToFling$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$pointerInputNode$1; +SPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$pointerInputNode$1;->(ILjava/lang/Object;)V +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$pointerInputNode$1;->invoke(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$pointerInputNode$1$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$pointerInputNode$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$pointerInputNode$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$pointerInputNode$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/AndroidEdgeEffectOverscrollFactory; +SPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollFactory;->(Landroid/content/Context;Landroidx/compose/ui/unit/Density;JLandroidx/compose/foundation/layout/PaddingValues;)V +PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollFactory;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/AndroidOverscroll_androidKt; +SPLandroidx/compose/foundation/AndroidOverscroll_androidKt;->()V +Landroidx/compose/foundation/BackgroundElement; +SPLandroidx/compose/foundation/BackgroundElement;->(JLandroidx/compose/ui/graphics/Shape;)V +SPLandroidx/compose/foundation/BackgroundElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/foundation/BackgroundElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/BackgroundNode; +SPLandroidx/compose/foundation/BackgroundNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/foundation/BackgroundNode;->draw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +SPLandroidx/compose/foundation/BackgroundNode;->isImportantForBounds()Z +Landroidx/compose/foundation/BorderKt$$ExternalSyntheticLambda1; +SPLandroidx/compose/foundation/BorderKt$$ExternalSyntheticLambda1;->(I)V +SPLandroidx/compose/foundation/BorderKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/ClickableElement; +SPLandroidx/compose/foundation/ClickableElement;->(Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/IndicationNodeFactory;ZZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V +SPLandroidx/compose/foundation/ClickableElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/ClickableElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/ClickableNode; +PLandroidx/compose/foundation/Clickable_androidKt;->()V +Landroidx/compose/foundation/ClipScrollableContainerKt; +SPLandroidx/compose/foundation/ClipScrollableContainerKt;->()V +Landroidx/compose/foundation/CombinedClickableElement; +SPLandroidx/compose/foundation/CombinedClickableElement;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Z)V +PLandroidx/compose/foundation/CombinedClickableElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/CombinedClickableElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/foundation/CombinedClickableElement;->update(Landroidx/compose/ui/Modifier$Node;)V +PLandroidx/compose/foundation/CombinedClickableNode;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Z)V +PLandroidx/compose/foundation/CombinedClickableNode;->applyAdditionalSemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +PLandroidx/compose/foundation/CombinedClickableNode;->createPointerInputNodeIfNeeded()Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl; +PLandroidx/compose/foundation/CombinedClickableNode;->onReset()V +PLandroidx/compose/foundation/CombinedClickableNode;->resetKeyPressState()V +PLandroidx/compose/foundation/CombinedClickableNode$createPointerInputNodeIfNeeded$1$$ExternalSyntheticLambda0;->(Landroidx/compose/foundation/CombinedClickableNode;I)V +PLandroidx/compose/foundation/CombinedClickableNode$createPointerInputNodeIfNeeded$1$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/CombinedClickableNode$createPointerInputNodeIfNeeded$1$3;->(Landroidx/compose/foundation/CombinedClickableNode;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/CombinedClickableNode$createPointerInputNodeIfNeeded$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/CombinedClickableNode$createPointerInputNodeIfNeeded$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/EdgeEffectWrapper; +SPLandroidx/compose/foundation/EdgeEffectWrapper;->(Landroid/content/Context;I)V +SPLandroidx/compose/foundation/EdgeEffectWrapper;->isAnimating(Landroid/widget/EdgeEffect;)Z +SPLandroidx/compose/foundation/EdgeEffectWrapper;->isStretched(Landroid/widget/EdgeEffect;)Z +Landroidx/compose/foundation/FocusableNode; +SPLandroidx/compose/foundation/FocusableNode;->()V +SPLandroidx/compose/foundation/FocusableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;ILandroidx/room/InvalidationTracker$implementation$1;)V +SPLandroidx/compose/foundation/FocusableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/foundation/FocusableNode;->getShouldAutoInvalidate()Z +SPLandroidx/compose/foundation/FocusableNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V +PLandroidx/compose/foundation/FocusableNode;->onReset()V +SPLandroidx/compose/foundation/FocusableNode;->update(Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;)V +Landroidx/compose/foundation/GlowOverscrollNode; +SPLandroidx/compose/foundation/GlowOverscrollNode;->(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/foundation/EdgeEffectWrapper;)V +HSPLandroidx/compose/foundation/GlowOverscrollNode;->draw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +Landroidx/compose/foundation/Indication; +Landroidx/compose/foundation/IndicationInstance; +Landroidx/compose/foundation/IndicationKt; +SPLandroidx/compose/foundation/IndicationKt;->()V +SPLandroidx/compose/foundation/IndicationKt;->indication(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/foundation/Indication;)Landroidx/compose/ui/Modifier; +Landroidx/compose/foundation/IndicationKt$$ExternalSyntheticLambda1; +SPLandroidx/compose/foundation/IndicationKt$$ExternalSyntheticLambda1;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLandroidx/compose/foundation/IndicationKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/IndicationModifier; +Landroidx/compose/foundation/IndicationModifierElement; +SPLandroidx/compose/foundation/IndicationModifierElement;->(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/foundation/IndicationNodeFactory;)V +SPLandroidx/compose/foundation/IndicationModifierElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/foundation/IndicationModifierElement;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/IndicationModifierElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/foundation/IndicationModifierNode; +Landroidx/compose/foundation/IndicationNodeFactory; +Landroidx/compose/foundation/MutatePriority; +SPLandroidx/compose/foundation/MutatePriority;->()V +Landroidx/compose/foundation/MutatorMutex; +SPLandroidx/compose/foundation/MutatorMutex;->()V +PLandroidx/compose/foundation/MutatorMutex;->access$tryMutateOrCancel(Landroidx/compose/foundation/MutatorMutex;Landroidx/compose/foundation/MutatorMutex$Mutator;)V +PLandroidx/compose/foundation/MutatorMutex$Mutator;->(Landroidx/compose/foundation/MutatePriority;Lkotlinx/coroutines/Job;)V +Landroidx/compose/foundation/MutatorMutex$mutate$2; +SPLandroidx/compose/foundation/MutatorMutex$mutate$2;->(Landroid/content/ContentResolver;Landroid/net/Uri;Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;Lkotlinx/coroutines/channels/BufferedChannel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V +SPLandroidx/compose/foundation/MutatorMutex$mutate$2;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V +SPLandroidx/compose/foundation/MutatorMutex$mutate$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/compose/foundation/MutatorMutex$mutate$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/foundation/MutatorMutex$mutate$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/MutatorMutex$mutateWith$2;->(Landroidx/compose/foundation/MutatePriority;Landroidx/compose/foundation/MutatorMutex;Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/MutatorMutex$mutateWith$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/MutatorMutex$mutateWith$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/MutatorMutex$mutateWith$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/NoIndicationInstance; +SPLandroidx/compose/foundation/NoIndicationInstance;->()V +Landroidx/compose/foundation/OverscrollConfiguration; +SPLandroidx/compose/foundation/OverscrollConfiguration;->()V +Landroidx/compose/foundation/OverscrollConfiguration_androidKt; +SPLandroidx/compose/foundation/OverscrollConfiguration_androidKt;->()V +Landroidx/compose/foundation/OverscrollKt; +SPLandroidx/compose/foundation/OverscrollKt;->()V +SPLandroidx/compose/foundation/OverscrollKt;->rememberOverscrollEffect(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect; +Landroidx/compose/foundation/ScrollKt; +SPLandroidx/compose/foundation/ScrollKt;->Canvas(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/foundation/ScrollKt;->background-bw27NRU(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/ScrollKt;->checkScrollableContainerConstraints-K40F9xA(JLandroidx/compose/foundation/gestures/Orientation;)V +SPLandroidx/compose/foundation/ScrollKt;->clickable-O2vRcR0$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/Indication;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;I)Landroidx/compose/ui/Modifier; +PLandroidx/compose/foundation/ScrollKt;->clickable-oSLSa3U$default(Landroidx/compose/ui/Modifier;ZLjava/lang/String;Lkotlin/jvm/functions/Function0;I)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/ScrollKt;->combinedClickable-hoGz1lA$default(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;I)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/ScrollKt;->isSystemInDarkTheme(Landroidx/compose/runtime/ComposerImpl;)Z +SPLandroidx/compose/foundation/ScrollKt;->scrollableArea$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;ZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;)Landroidx/compose/ui/Modifier; +PLandroidx/compose/foundation/ScrollNode$$ExternalSyntheticLambda0;->(IILjava/lang/Object;Ljava/lang/Object;)V +PLandroidx/compose/foundation/ScrollNode$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/ScrollableAreaElement; +SPLandroidx/compose/foundation/ScrollableAreaElement;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;ZZ)V +SPLandroidx/compose/foundation/ScrollableAreaElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/ScrollableAreaElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/ScrollableAreaNode; +SPLandroidx/compose/foundation/ScrollableAreaNode;->attachOverscrollNodeIfNeeded()V +SPLandroidx/compose/foundation/ScrollableAreaNode;->onAttach()V +PLandroidx/compose/foundation/ScrollableAreaNode;->onDetach()V +SPLandroidx/compose/foundation/ScrollableAreaNode;->shouldReverseDirection()Z +Landroidx/compose/foundation/VerticalScrollableClipShape; +SPLandroidx/compose/foundation/VerticalScrollableClipShape;->()V +SPLandroidx/compose/foundation/VerticalScrollableClipShape;->(I)V +SPLandroidx/compose/foundation/VerticalScrollableClipShape;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/ColorKt; +Landroidx/compose/foundation/gestures/ContentInViewNode; +SPLandroidx/compose/foundation/gestures/ContentInViewNode;->(Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollingLogic;ZLandroidx/compose/foundation/gestures/ScrollableNode$$ExternalSyntheticLambda0;)V +SPLandroidx/compose/foundation/gestures/ContentInViewNode;->onRemeasured-ozmzZPI(J)V +Landroidx/compose/foundation/gestures/ContentInViewNode$Request; +Landroidx/compose/foundation/gestures/DefaultFlingBehavior; +SPLandroidx/compose/foundation/gestures/DefaultFlingBehavior;->(Landroidx/compose/animation/core/DecayAnimationSpecImpl;)V +PLandroidx/compose/foundation/gestures/DefaultFlingBehavior;->performFling(Landroidx/compose/foundation/lazy/LazyListScrollScopeKt$LazyLayoutScrollScope$1;FLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$2;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/DefaultFlingBehavior$performFling$2;->(FLandroidx/compose/foundation/gestures/DefaultFlingBehavior;Landroidx/compose/foundation/lazy/LazyListScrollScopeKt$LazyLayoutScrollScope$1;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/DefaultFlingBehavior$performFling$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/DefaultFlingBehavior$performFling$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/DefaultFlingBehavior$performFling$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/gestures/DefaultScrollableState; +SPLandroidx/compose/foundation/gestures/DefaultScrollableState;->(Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/foundation/gestures/DefaultScrollableState;->isScrollInProgress()Z +PLandroidx/compose/foundation/gestures/DefaultScrollableState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1; +SPLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;->(Landroidx/compose/foundation/gestures/DefaultScrollableState;)V +HPLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;->scrollBy(F)F +PLandroidx/compose/foundation/gestures/DragDetectionState$AwaitDown$AwaitTouchSlop;->()V +PLandroidx/compose/foundation/gestures/DragDetectionState$AwaitDown$AwaitTouchSlop;->values()[Landroidx/compose/foundation/gestures/DragDetectionState$AwaitDown$AwaitTouchSlop; +PLandroidx/compose/foundation/gestures/DragEvent$DragCancelled;->()V +PLandroidx/compose/foundation/gestures/DragEvent$DragDelta;->(JZ)V +PLandroidx/compose/foundation/gestures/DragEvent$DragStarted;->(J)V +PLandroidx/compose/foundation/gestures/DragEvent$DragStopped;->(JZ)V +PLandroidx/compose/foundation/gestures/DragGestureDetectorKt;->()V +PLandroidx/compose/foundation/gestures/DragGestureDetectorKt;->pointerSlop-E8SPZFQ(Landroidx/compose/ui/platform/ViewConfiguration;I)F +Landroidx/compose/foundation/gestures/DragGestureNode; +SPLandroidx/compose/foundation/gestures/DragGestureNode;->(Lkotlin/jvm/functions/Function1;ZLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/gestures/Orientation;)V +PLandroidx/compose/foundation/gestures/DragGestureNode;->access$processDragStart(Landroidx/compose/foundation/gestures/DragGestureNode;Landroidx/compose/foundation/gestures/DragEvent$DragStarted;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/DragGestureNode;->access$processDragStop(Landroidx/compose/foundation/gestures/DragGestureNode;Landroidx/compose/foundation/gestures/DragEvent$DragStopped;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/DragGestureNode;->disposeInteractionSource$1()V +PLandroidx/compose/foundation/gestures/DragGestureNode;->moveToAwaitDownState()V +PLandroidx/compose/foundation/gestures/DragGestureNode;->moveToAwaitGesturePickupState-rnUCldI(Landroidx/compose/ui/input/pointer/PointerInputChange;JLokhttp3/internal/http1/HeadersReader;)V +PLandroidx/compose/foundation/gestures/DragGestureNode;->moveToAwaitTouchSlopState-aWI9W7U$default(Landroidx/compose/foundation/gestures/DragGestureNode;Landroidx/compose/ui/input/pointer/PointerInputChange;JJI)V +PLandroidx/compose/foundation/gestures/DragGestureNode;->onDetach()V +PLandroidx/compose/foundation/gestures/DragGestureNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V +PLandroidx/compose/foundation/gestures/DragGestureNode;->requireChannel()Lkotlinx/coroutines/channels/Channel; +PLandroidx/compose/foundation/gestures/DragGestureNode;->requireVelocityTracker()Landroidx/compose/ui/draw/DrawResult; +PLandroidx/compose/foundation/gestures/DragGestureNode;->sendDragEvent-Uv8p0NA(Landroidx/compose/ui/input/pointer/PointerInputChange;J)V +PLandroidx/compose/foundation/gestures/DragGestureNode;->sendDragStart-0AR0LA0(Landroidx/compose/ui/input/pointer/PointerInputChange;Landroidx/compose/ui/input/pointer/PointerInputChange;J)V +PLandroidx/compose/foundation/gestures/DragGestureNode;->startListeningForEvents()V +PLandroidx/compose/foundation/gestures/DragGestureNode;->update(Lkotlin/jvm/functions/Function1;ZLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/gestures/Orientation;Z)V +PLandroidx/compose/foundation/gestures/DragGestureNode$WhenMappings;->()V +PLandroidx/compose/foundation/gestures/DragGestureNode$processDragStart$1;->(Landroidx/compose/foundation/gestures/DragGestureNode;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/foundation/gestures/DragGestureNode$processDragStop$1;->(Landroidx/compose/foundation/gestures/DragGestureNode;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/foundation/gestures/DragGestureNode$startListeningForEvents$1;->(Landroidx/compose/foundation/gestures/DragGestureNode;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/DragGestureNode$startListeningForEvents$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/compose/foundation/gestures/DragGestureNode;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/DragGestureNode$startListeningForEvents$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/DragGestureNode$startListeningForEvents$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/DragGestureNode$startListeningForEvents$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/gestures/DraggableElement; +SPLandroidx/compose/foundation/gestures/DraggableElement;->()V +SPLandroidx/compose/foundation/gestures/DraggableElement;->(Landroidx/paging/ConflatedEventBus;Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;ZLandroidx/paging/CachedPagingDataKt$cachedIn$5;Lkotlin/jvm/functions/Function3;Z)V +SPLandroidx/compose/foundation/gestures/DraggableElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/gestures/DraggableElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/foundation/gestures/DraggableElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/foundation/gestures/DraggableKt; +SPLandroidx/compose/foundation/gestures/DraggableKt;->()V +SPLandroidx/compose/foundation/gestures/DraggableKt;->draggable$default(Landroidx/compose/ui/Modifier;Landroidx/paging/ConflatedEventBus;Landroidx/compose/foundation/gestures/Orientation;ZZLkotlin/jvm/functions/Function3;ZI)Landroidx/compose/ui/Modifier; +PLandroidx/compose/foundation/gestures/DraggableKt;->toValidVelocity-TH1AsA0(J)J +Landroidx/compose/foundation/gestures/DraggableNode; +PLandroidx/compose/foundation/gestures/DraggableNode;->startDragImmediately()Z +Landroidx/compose/foundation/gestures/FlingBehavior; +Landroidx/compose/foundation/gestures/ForEachGestureKt; +SPLandroidx/compose/foundation/gestures/ForEachGestureKt;->()V +PLandroidx/compose/foundation/gestures/ForEachGestureKt;->awaitAllPointersUp(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ForEachGestureKt;->awaitEachGesture(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/compose/foundation/gestures/ForEachGestureKt;->flingBehavior(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/foundation/gestures/DefaultFlingBehavior; +PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitAllPointersUp$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->(Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/LongPressResult$Canceled;->()V +PLandroidx/compose/foundation/gestures/LongPressResult$Released;->(Landroidx/compose/ui/input/pointer/PointerInputChange;)V +PLandroidx/compose/foundation/gestures/LongPressResult$Success;->()V +Landroidx/compose/foundation/gestures/Orientation; +SPLandroidx/compose/foundation/gestures/Orientation;->()V +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->(Landroidx/compose/ui/unit/Density;)V +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->cancel()V +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->release()V +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->reset(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->tryAwaitRelease(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl$tryAwaitRelease$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/foundation/gestures/PressGestureScopeImpl$tryAwaitRelease$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/gestures/ScrollScope; +Landroidx/compose/foundation/gestures/ScrollableContainerNode; +SPLandroidx/compose/foundation/gestures/ScrollableContainerNode;->()V +PLandroidx/compose/foundation/gestures/ScrollableContainerNode;->getTraverseKey()Ljava/lang/Object; +Landroidx/compose/foundation/gestures/ScrollableKt; +SPLandroidx/compose/foundation/gestures/ScrollableKt;->()V +Landroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1; +PLandroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +PLandroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1;->getScaleFactor()F +Landroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1; +Landroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1; +SPLandroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1;->getDensity()F +PLandroidx/compose/foundation/gestures/ScrollableKt$semanticsScrollBy$2;->(Ljava/lang/Object;JLjava/lang/Object;Lkotlin/coroutines/Continuation;I)V +PLandroidx/compose/foundation/gestures/ScrollableKt$semanticsScrollBy$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/ScrollableKt$semanticsScrollBy$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/gestures/ScrollableNestedScrollConnection; +SPLandroidx/compose/foundation/gestures/ScrollableNestedScrollConnection;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Z)V +Landroidx/compose/foundation/gestures/ScrollableNode; +SPLandroidx/compose/foundation/gestures/ScrollableNode;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;ZZ)V +SPLandroidx/compose/foundation/gestures/ScrollableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +PLandroidx/compose/foundation/gestures/ScrollableNode;->drag(Landroidx/compose/foundation/gestures/DragGestureNode$startListeningForEvents$1;Landroidx/compose/foundation/gestures/DragGestureNode$startListeningForEvents$1;)Ljava/lang/Object; +SPLandroidx/compose/foundation/gestures/ScrollableNode;->onAttach()V +PLandroidx/compose/foundation/gestures/ScrollableNode;->onDragStarted-k-4lQ0M(J)V +PLandroidx/compose/foundation/gestures/ScrollableNode;->onDragStopped(Landroidx/compose/foundation/gestures/DragEvent$DragStopped;)V +PLandroidx/compose/foundation/gestures/ScrollableNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V +PLandroidx/compose/foundation/gestures/ScrollableNode;->startDragImmediately()Z +Landroidx/compose/foundation/gestures/ScrollableNode$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/gestures/ScrollableNode$$ExternalSyntheticLambda0;->(Landroidx/compose/foundation/gestures/ScrollableNode;I)V +PLandroidx/compose/foundation/gestures/ScrollableNode$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/compose/foundation/gestures/ScrollableNode$onKeyEvent$1; +SPLandroidx/compose/foundation/gestures/ScrollableNode$onKeyEvent$1;->(Landroidx/compose/foundation/gestures/ScrollableNode;Lkotlin/coroutines/Continuation;)V +Landroidx/compose/foundation/gestures/ScrollableState; +Landroidx/compose/foundation/gestures/ScrollingLogic; +SPLandroidx/compose/foundation/gestures/ScrollingLogic;->(Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/gestures/Orientation;ZLokhttp3/Dispatcher;Landroidx/compose/foundation/gestures/ScrollableNode;Landroidx/compose/foundation/gestures/ScrollableNode$$ExternalSyntheticLambda0;)V +PLandroidx/compose/foundation/gestures/ScrollingLogic;->doFlingAnimation-QWom1Mo(JLkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ScrollingLogic;->onScrollStopped-BMRW4eQ(JZLkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ScrollingLogic;->reverseIfNeeded(F)F +PLandroidx/compose/foundation/gestures/ScrollingLogic;->reverseIfNeeded-MK-Hz9U(J)J +PLandroidx/compose/foundation/gestures/ScrollingLogic;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ScrollingLogic;->toFloat-k-4lQ0M(J)F +PLandroidx/compose/foundation/gestures/ScrollingLogic;->toOffset-tuRUvjQ(F)J +PLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$1;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$2;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Lkotlin/jvm/internal/Ref$LongRef;JLkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/ScrollingLogic$doFlingAnimation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/gestures/ScrollingLogic$nestedScrollScope$1; +SPLandroidx/compose/foundation/gestures/ScrollingLogic$nestedScrollScope$1;->(Landroidx/compose/foundation/gestures/ScrollingLogic;)V +HPLandroidx/compose/foundation/gestures/ScrollingLogic$nestedScrollScope$1;->scrollByWithOverscroll-OzD1aCk(IJ)J +PLandroidx/compose/foundation/gestures/ScrollingLogic$onScrollStopped$performFling$1;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/ScrollingLogic$onScrollStopped$performFling$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->()V +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown$default(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;Lkotlin/coroutines/jvm/internal/RestrictedSuspendLambda;I)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;ZLandroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->isChangedToDown$default(Landroidx/compose/ui/input/pointer/PointerEvent;Z)Z +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->launchAwaitingReset$default(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/Job;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/DeferredCoroutine; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->waitForLongPress(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;I)V +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$resetJob$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;I)V +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$resetJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$resetJob$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$resetJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1;->(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1$1;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Landroidx/compose/ui/input/pointer/PointerInputChange;Lkotlin/coroutines/Continuation;I)V +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapGestures$2$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$waitForLongPress$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/interaction/DragInteraction$Stop;->(Landroidx/compose/foundation/interaction/DragInteraction$Start;)V +Landroidx/compose/foundation/interaction/FocusInteraction$Focus; +Landroidx/compose/foundation/interaction/HoverInteraction$Enter; +Landroidx/compose/foundation/interaction/Interaction; +Landroidx/compose/foundation/interaction/InteractionSource; +Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl; +SPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->()V +PLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->emit(Landroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->getInteractions()Lkotlinx/coroutines/flow/Flow; +Landroidx/compose/foundation/interaction/PressInteraction; +Landroidx/compose/foundation/interaction/PressInteraction$Press; +PLandroidx/compose/foundation/interaction/PressInteraction$Press;->(J)V +PLandroidx/compose/foundation/interaction/PressInteraction$Release;->(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V +Landroidx/compose/foundation/layout/AndroidWindowInsets; +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->(Ljava/lang/String;I)V +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getInsets$foundation_layout()Landroidx/core/graphics/Insets; +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getTop(Landroidx/compose/ui/unit/Density;)I +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->setVisible(Z)V +SPLandroidx/compose/foundation/layout/AndroidWindowInsets;->update$foundation_layout(Landroidx/core/view/WindowInsetsCompat;I)V +Landroidx/compose/foundation/layout/Arrangement; +SPLandroidx/compose/foundation/layout/Arrangement;->()V +PLandroidx/compose/foundation/layout/Arrangement;->placeCenter$foundation_layout(I[I[IZ)V +SPLandroidx/compose/foundation/layout/Arrangement;->placeLeftOrTop$foundation_layout([I[IZ)V +SPLandroidx/compose/foundation/layout/Arrangement;->placeRightOrBottom$foundation_layout(I[I[IZ)V +PLandroidx/compose/foundation/layout/Arrangement;->placeSpaceBetween$foundation_layout(I[I[IZ)V +SPLandroidx/compose/foundation/layout/Arrangement;->spacedBy-0680j_4(F)Landroidx/compose/foundation/layout/Arrangement$SpacedAligned; +Landroidx/compose/foundation/layout/Arrangement$Center$1; +SPLandroidx/compose/foundation/layout/Arrangement$Center$1;->(I)V +PLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(Landroidx/compose/ui/unit/Density;I[ILandroidx/compose/ui/unit/LayoutDirection;[I)V +PLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V +SPLandroidx/compose/foundation/layout/Arrangement$Center$1;->getSpacing-D9Ej5fM()F +Landroidx/compose/foundation/layout/Arrangement$Horizontal; +SPLandroidx/compose/foundation/layout/Arrangement$Horizontal;->getSpacing-D9Ej5fM()F +Landroidx/compose/foundation/layout/Arrangement$SpacedAligned; +SPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->(FLandroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda0;)V +SPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->arrange(Landroidx/compose/ui/unit/Density;I[ILandroidx/compose/ui/unit/LayoutDirection;[I)V +SPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->getSpacing-D9Ej5fM()F +Landroidx/compose/foundation/layout/Arrangement$Top$1; +SPLandroidx/compose/foundation/layout/Arrangement$Top$1;->(I)V +SPLandroidx/compose/foundation/layout/Arrangement$Top$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V +Landroidx/compose/foundation/layout/Arrangement$Vertical; +SPLandroidx/compose/foundation/layout/Arrangement$Vertical;->getSpacing-D9Ej5fM()F +Landroidx/compose/foundation/layout/BoxChildDataElement; +SPLandroidx/compose/foundation/layout/BoxChildDataElement;->(Landroidx/compose/ui/BiasAlignment;Z)V +PLandroidx/compose/foundation/layout/BoxChildDataElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/layout/BoxChildDataElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/BoxChildDataNode; +PLandroidx/compose/foundation/layout/BoxChildDataNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/BoxKt; +SPLandroidx/compose/foundation/layout/BoxKt;->()V +HSPLandroidx/compose/foundation/layout/BoxKt;->Box(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/foundation/layout/BoxKt;->access$placeInBox(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/unit/LayoutDirection;IILandroidx/compose/ui/BiasAlignment;)V +SPLandroidx/compose/foundation/layout/BoxKt;->cacheFor(Z)Landroidx/collection/MutableScatterMap; +SPLandroidx/compose/foundation/layout/BoxKt;->maybeCachedBoxMeasurePolicy(Landroidx/compose/ui/BiasAlignment;Z)Landroidx/compose/ui/layout/MeasurePolicy; +Landroidx/compose/foundation/layout/BoxMeasurePolicy; +SPLandroidx/compose/foundation/layout/BoxMeasurePolicy;->(Landroidx/compose/ui/BiasAlignment;Z)V +SPLandroidx/compose/foundation/layout/BoxMeasurePolicy;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/layout/BoxMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/BoxMeasurePolicy$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/layout/BoxMeasurePolicy$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/layout/MeasureScope;IILandroidx/compose/foundation/layout/BoxMeasurePolicy;)V +SPLandroidx/compose/foundation/layout/BoxMeasurePolicy$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/BoxMeasurePolicy$$ExternalSyntheticLambda1; +SPLandroidx/compose/foundation/layout/BoxMeasurePolicy$$ExternalSyntheticLambda1;->([Landroidx/compose/ui/layout/Placeable;Ljava/util/List;Landroidx/compose/ui/layout/MeasureScope;Lkotlin/jvm/internal/Ref$IntRef;Lkotlin/jvm/internal/Ref$IntRef;Landroidx/compose/foundation/layout/BoxMeasurePolicy;)V +SPLandroidx/compose/foundation/layout/BoxMeasurePolicy$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/ColumnKt; +SPLandroidx/compose/foundation/layout/ColumnKt;->()V +HSPLandroidx/compose/foundation/layout/ColumnKt;->columnMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/foundation/layout/ColumnMeasurePolicy; +Landroidx/compose/foundation/layout/ColumnMeasurePolicy; +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->(Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/BiasAlignment$Horizontal;)V +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->createConstraints-xF2OJ5Q(IIIZ)J +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->crossAxisSize(Landroidx/compose/ui/layout/Placeable;)I +PLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->mainAxisSize(Landroidx/compose/ui/layout/Placeable;)I +HSPLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->placeHelper([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;[III[IIII)Landroidx/compose/ui/layout/MeasureResult; +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy;->populateMainAxisPositions(I[I[ILandroidx/compose/ui/layout/MeasureScope;)V +Landroidx/compose/foundation/layout/ColumnMeasurePolicy$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy$$ExternalSyntheticLambda0;->([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/foundation/layout/ColumnMeasurePolicy;ILandroidx/compose/ui/layout/MeasureScope;[I)V +SPLandroidx/compose/foundation/layout/ColumnMeasurePolicy$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/ColumnScopeInstance; +SPLandroidx/compose/foundation/layout/ColumnScopeInstance;->()V +Landroidx/compose/foundation/layout/ConsumedInsetsModifierElement; +SPLandroidx/compose/foundation/layout/ConsumedInsetsModifierElement;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/foundation/layout/ConsumedInsetsModifierElement;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/foundation/layout/ConsumedInsetsModifierNode; +SPLandroidx/compose/foundation/layout/ConsumedInsetsModifierNode;->calculateInsets(Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/foundation/layout/WindowInsets; +Landroidx/compose/foundation/layout/Direction; +SPLandroidx/compose/foundation/layout/Direction;->()V +Landroidx/compose/foundation/layout/ExcludeInsets; +SPLandroidx/compose/foundation/layout/ExcludeInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V +SPLandroidx/compose/foundation/layout/ExcludeInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I +SPLandroidx/compose/foundation/layout/ExcludeInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/ExcludeInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/ExcludeInsets;->getTop(Landroidx/compose/ui/unit/Density;)I +Landroidx/compose/foundation/layout/FillElement; +SPLandroidx/compose/foundation/layout/FillElement;->(Landroidx/compose/foundation/layout/Direction;F)V +SPLandroidx/compose/foundation/layout/FillElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/layout/FillElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/FillNode; +HSPLandroidx/compose/foundation/layout/FillNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/FillNode$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/layout/FillNode$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/layout/Placeable;I)V +HSPLandroidx/compose/foundation/layout/FillNode$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/FixedIntInsets; +SPLandroidx/compose/foundation/layout/FixedIntInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I +SPLandroidx/compose/foundation/layout/FixedIntInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/FixedIntInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/FixedIntInsets;->getTop(Landroidx/compose/ui/unit/Density;)I +Landroidx/compose/foundation/layout/FlowLayoutKt$$ExternalSyntheticLambda2; +SPLandroidx/compose/foundation/layout/FlowLayoutKt$$ExternalSyntheticLambda2;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;IB)V +SPLandroidx/compose/foundation/layout/FlowLayoutKt$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/FlowRowOverflow; +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->()V +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->(I)V +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->access$systemInsets(Ljava/lang/String;I)Landroidx/compose/foundation/layout/AndroidWindowInsets; +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->access$valueInsetsIgnoringVisibility(Ljava/lang/String;I)Landroidx/compose/foundation/layout/ValueInsets; +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->arrange(Landroidx/compose/ui/unit/Density;I[ILandroidx/compose/ui/unit/LayoutDirection;[I)V +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->current(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/foundation/layout/WindowInsetsHolder; +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->getOrCreateFor(Landroid/view/View;)Landroidx/compose/foundation/layout/WindowInsetsHolder; +SPLandroidx/compose/foundation/layout/FlowRowOverflow;->matchParentSize()Landroidx/compose/ui/Modifier; +Landroidx/compose/foundation/layout/InsetsConsumingModifierNode; +SPLandroidx/compose/foundation/layout/InsetsConsumingModifierNode;->()V +SPLandroidx/compose/foundation/layout/InsetsConsumingModifierNode;->getTraverseKey()Ljava/lang/Object; +SPLandroidx/compose/foundation/layout/InsetsConsumingModifierNode;->insetsInvalidated()V +SPLandroidx/compose/foundation/layout/InsetsConsumingModifierNode;->onAttach()V +PLandroidx/compose/foundation/layout/InsetsConsumingModifierNode;->onDetach()V +Landroidx/compose/foundation/layout/InsetsConsumingModifierNode$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/layout/InsetsConsumingModifierNode$$ExternalSyntheticLambda0;->(Landroidx/compose/foundation/layout/InsetsConsumingModifierNode;I)V +SPLandroidx/compose/foundation/layout/InsetsConsumingModifierNode$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/InsetsListener; +SPLandroidx/compose/foundation/layout/InsetsListener;->(Landroidx/compose/foundation/layout/WindowInsetsHolder;)V +SPLandroidx/compose/foundation/layout/InsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/compose/foundation/layout/InsetsListener;->onViewAttachedToWindow(Landroid/view/View;)V +Landroidx/compose/foundation/layout/InsetsPaddingModifierElement; +SPLandroidx/compose/foundation/layout/InsetsPaddingModifierElement;->(Landroidx/compose/foundation/layout/WindowInsets;)V +SPLandroidx/compose/foundation/layout/InsetsPaddingModifierElement;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/foundation/layout/InsetsPaddingModifierNode; +SPLandroidx/compose/foundation/layout/InsetsPaddingModifierNode;->(Landroidx/compose/foundation/layout/WindowInsets;)V +SPLandroidx/compose/foundation/layout/InsetsPaddingModifierNode;->calculateInsets(Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/foundation/layout/WindowInsets; +SPLandroidx/compose/foundation/layout/InsetsPaddingModifierNode;->insetsInvalidated()V +SPLandroidx/compose/foundation/layout/InsetsPaddingModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/InsetsPaddingValues; +SPLandroidx/compose/foundation/layout/InsetsPaddingValues;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/unit/Density;)V +SPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateBottomPadding-D9Ej5fM()F +SPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateLeftPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F +SPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateRightPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F +SPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateTopPadding-D9Ej5fM()F +Landroidx/compose/foundation/layout/InsetsValues; +SPLandroidx/compose/foundation/layout/InsetsValues;->(IIII)V +SPLandroidx/compose/foundation/layout/InsetsValues;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/LayoutWeightElement; +SPLandroidx/compose/foundation/layout/LayoutWeightElement;->(FZ)V +SPLandroidx/compose/foundation/layout/LayoutWeightElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/foundation/layout/LayoutWeightElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/LayoutWeightNode; +SPLandroidx/compose/foundation/layout/LayoutWeightNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/layout/LimitInsets; +SPLandroidx/compose/foundation/layout/LimitInsets;->(Landroidx/compose/foundation/layout/WindowInsets;I)V +SPLandroidx/compose/foundation/layout/LimitInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I +SPLandroidx/compose/foundation/layout/LimitInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/LimitInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/LimitInsets;->getTop(Landroidx/compose/ui/unit/Density;)I +Landroidx/compose/foundation/layout/OffsetKt; +SPLandroidx/compose/foundation/layout/OffsetKt;->()V +SPLandroidx/compose/foundation/layout/OffsetKt;->PaddingValues-YgX7TsA$default(FI)Landroidx/compose/foundation/layout/PaddingValuesImpl; +SPLandroidx/compose/foundation/layout/OffsetKt;->Spacer(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/Modifier;)V +SPLandroidx/compose/foundation/layout/OffsetKt;->calculateEndPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F +SPLandroidx/compose/foundation/layout/OffsetKt;->calculateStartPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F +SPLandroidx/compose/foundation/layout/OffsetKt;->getRowColumnParentData(Landroidx/compose/ui/layout/Measurable;)Landroidx/compose/foundation/layout/RowColumnParentData; +SPLandroidx/compose/foundation/layout/OffsetKt;->getWeight(Landroidx/compose/foundation/layout/RowColumnParentData;)F +SPLandroidx/compose/foundation/layout/OffsetKt;->offset(Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/OffsetKt;->onConsumedWindowInsetsChanged(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/OffsetKt;->padding(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/OffsetKt;->padding-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/OffsetKt;->padding-VpY3zN4$default(Landroidx/compose/ui/Modifier;FFI)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/OffsetKt;->padding-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/OffsetKt;->padding-qDBjuR0$default(Landroidx/compose/ui/Modifier;FFFFI)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/OffsetKt;->toInsetsValues(Landroidx/core/graphics/Insets;)Landroidx/compose/foundation/layout/InsetsValues; +SPLandroidx/compose/foundation/layout/OffsetKt;->windowInsetsPadding(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/ui/Modifier; +Landroidx/compose/foundation/layout/OffsetPxElement; +SPLandroidx/compose/foundation/layout/OffsetPxElement;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/foundation/layout/OffsetPxElement;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/foundation/layout/OffsetPxNode; +SPLandroidx/compose/foundation/layout/OffsetPxNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/PaddingElement; +SPLandroidx/compose/foundation/layout/PaddingElement;->(FFFF)V +SPLandroidx/compose/foundation/layout/PaddingElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/layout/PaddingElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/PaddingNode; +HSPLandroidx/compose/foundation/layout/PaddingNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/PaddingValues; +Landroidx/compose/foundation/layout/PaddingValuesElement; +SPLandroidx/compose/foundation/layout/PaddingValuesElement;->(Landroidx/compose/foundation/layout/PaddingValues;)V +SPLandroidx/compose/foundation/layout/PaddingValuesElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/foundation/layout/PaddingValuesElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/PaddingValuesImpl; +SPLandroidx/compose/foundation/layout/PaddingValuesImpl;->(FFFF)V +SPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateBottomPadding-D9Ej5fM()F +SPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateLeftPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F +SPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateRightPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F +SPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateTopPadding-D9Ej5fM()F +SPLandroidx/compose/foundation/layout/PaddingValuesImpl;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/PaddingValuesModifier; +SPLandroidx/compose/foundation/layout/PaddingValuesModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/RowColumnMeasurePolicy; +Landroidx/compose/foundation/layout/RowColumnParentData; +SPLandroidx/compose/foundation/layout/RowColumnParentData;->()V +Landroidx/compose/foundation/layout/RowKt; +SPLandroidx/compose/foundation/layout/RowKt;->()V +HSPLandroidx/compose/foundation/layout/RowKt;->rowMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/foundation/layout/RowMeasurePolicy; +Landroidx/compose/foundation/layout/RowMeasurePolicy; +SPLandroidx/compose/foundation/layout/RowMeasurePolicy;->(Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/ui/BiasAlignment$Vertical;)V +SPLandroidx/compose/foundation/layout/RowMeasurePolicy;->createConstraints-xF2OJ5Q(IIIZ)J +SPLandroidx/compose/foundation/layout/RowMeasurePolicy;->crossAxisSize(Landroidx/compose/ui/layout/Placeable;)I +PLandroidx/compose/foundation/layout/RowMeasurePolicy;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/layout/RowMeasurePolicy;->mainAxisSize(Landroidx/compose/ui/layout/Placeable;)I +HSPLandroidx/compose/foundation/layout/RowMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +SPLandroidx/compose/foundation/layout/RowMeasurePolicy;->placeHelper([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;[III[IIII)Landroidx/compose/ui/layout/MeasureResult; +SPLandroidx/compose/foundation/layout/RowMeasurePolicy;->populateMainAxisPositions(I[I[ILandroidx/compose/ui/layout/MeasureScope;)V +Landroidx/compose/foundation/layout/RowScope; +Landroidx/compose/foundation/layout/RowScopeInstance; +SPLandroidx/compose/foundation/layout/RowScopeInstance;->()V +SPLandroidx/compose/foundation/layout/RowScopeInstance;->weight(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; +Landroidx/compose/foundation/layout/SizeElement; +SPLandroidx/compose/foundation/layout/SizeElement;->(FFFFZ)V +SPLandroidx/compose/foundation/layout/SizeElement;->(FFFFZI)V +SPLandroidx/compose/foundation/layout/SizeElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/layout/SizeElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/SizeKt; +SPLandroidx/compose/foundation/layout/SizeKt;->()V +SPLandroidx/compose/foundation/layout/SizeKt;->defaultMinSize-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->fillMaxWidth(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->height-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->heightIn-VpY3zN4$default(Landroidx/compose/ui/Modifier;FFI)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->heightIn-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->size-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->sizeIn-qDBjuR0$default(Landroidx/compose/ui/Modifier;FFI)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->sizeIn-qDBjuR0(Landroidx/compose/ui/Modifier;FFFF)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/layout/SizeKt;->width-3ABfNKs(F)Landroidx/compose/ui/Modifier; +Landroidx/compose/foundation/layout/SizeNode; +SPLandroidx/compose/foundation/layout/SizeNode;->getTargetConstraints-OenEA2s(Landroidx/compose/ui/layout/MeasureScope;)J +SPLandroidx/compose/foundation/layout/SizeNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/SpacerMeasurePolicy; +SPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->()V +SPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->(I)V +SPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/UnionInsets; +SPLandroidx/compose/foundation/layout/UnionInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V +SPLandroidx/compose/foundation/layout/UnionInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I +SPLandroidx/compose/foundation/layout/UnionInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/UnionInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/foundation/layout/UnionInsets;->getTop(Landroidx/compose/ui/unit/Density;)I +Landroidx/compose/foundation/layout/UnspecifiedConstraintsElement; +SPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->(FF)V +SPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/layout/UnspecifiedConstraintsNode; +SPLandroidx/compose/foundation/layout/UnspecifiedConstraintsNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/layout/ValueInsets; +SPLandroidx/compose/foundation/layout/ValueInsets;->(Landroidx/compose/foundation/layout/InsetsValues;Ljava/lang/String;)V +SPLandroidx/compose/foundation/layout/ValueInsets;->setValue$foundation_layout(Landroidx/compose/foundation/layout/InsetsValues;)V +Landroidx/compose/foundation/layout/WindowInsets; +Landroidx/compose/foundation/layout/WindowInsetsHolder; +SPLandroidx/compose/foundation/layout/WindowInsetsHolder;->()V +SPLandroidx/compose/foundation/layout/WindowInsetsHolder;->(Landroid/view/View;)V +SPLandroidx/compose/foundation/layout/WindowInsetsHolder;->incrementAccessors(Landroid/view/View;)V +SPLandroidx/compose/foundation/layout/WindowInsetsHolder;->update$default(Landroidx/compose/foundation/layout/WindowInsetsHolder;Landroidx/core/view/WindowInsetsCompat;)V +Landroidx/compose/foundation/layout/WrapContentElement; +SPLandroidx/compose/foundation/layout/WrapContentElement;->(Landroidx/compose/foundation/layout/Direction;Lkotlin/jvm/functions/Function2;Ljava/lang/Object;)V +Landroidx/compose/foundation/lazy/DefaultLazyListPrefetchStrategy; +PLandroidx/compose/foundation/lazy/DefaultLazyListPrefetchStrategy;->calculateIndexToPrefetch(Landroidx/compose/foundation/lazy/LazyListMeasureResult;Z)I +Landroidx/compose/foundation/lazy/LazyItemScopeImpl; +Landroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1; +SPLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->(Landroidx/compose/foundation/lazy/LazyListState;Z)V +SPLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->collectionInfo()Landroidx/compose/ui/semantics/CollectionInfo; +PLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->getMaxScrollOffset()F +PLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->getScrollOffset()F +Landroidx/compose/foundation/lazy/LazyListBeyondBoundsState; +SPLandroidx/compose/foundation/lazy/LazyListBeyondBoundsState;->(Landroidx/compose/foundation/lazy/LazyListState;)V +Landroidx/compose/foundation/lazy/LazyListInterval; +SPLandroidx/compose/foundation/lazy/LazyListInterval;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/foundation/lazy/LazyListInterval;->getKey()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/foundation/lazy/LazyListInterval;->getType()Lkotlin/jvm/functions/Function1; +Landroidx/compose/foundation/lazy/LazyListIntervalContent; +SPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getIntervals$1()Lokhttp3/internal/http/StatusLine; +SPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->items$default(Landroidx/compose/foundation/lazy/LazyListIntervalContent;ILkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;I)V +Landroidx/compose/foundation/lazy/LazyListIntervalContent$$ExternalSyntheticLambda1; +SPLandroidx/compose/foundation/lazy/LazyListIntervalContent$$ExternalSyntheticLambda1;->(I)V +Landroidx/compose/foundation/lazy/LazyListItemProviderImpl; +SPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListIntervalContent;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;Lokhttp3/internal/http/StatusLine;)V +SPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->Item(ILjava/lang/Object;Landroidx/compose/runtime/ComposerImpl;I)V +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getContentType(I)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getIndex(Ljava/lang/Object;)I +SPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getItemCount()I +SPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getKey(I)Ljava/lang/Object; +Landroidx/compose/foundation/lazy/LazyListKt$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/lazy/LazyListKt$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/gestures/FlingBehavior;ZLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;III)V +Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1; +SPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->(Landroidx/compose/foundation/lazy/LazyListState;ZLandroidx/compose/foundation/layout/PaddingValues;Lkotlin/reflect/KProperty0;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/ui/graphics/GraphicsContext;Landroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState$Companion;Landroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/ui/BiasAlignment$Vertical;)V +Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1; +SPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->(JZLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;IILandroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/ui/BiasAlignment$Vertical;IIJLandroidx/compose/foundation/lazy/LazyListState;)V +HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->getAndMeasure-0kLqBqw(IJ)Landroidx/compose/foundation/lazy/LazyListMeasuredItem; +PLandroidx/compose/foundation/lazy/LazyListMeasureKt$$ExternalSyntheticLambda1;->(Landroidx/compose/runtime/MutableState;Ljava/util/ArrayList;Ljava/util/List;ZI)V +Landroidx/compose/foundation/lazy/LazyListMeasureResult; +SPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->(Landroidx/compose/foundation/lazy/LazyListMeasuredItem;IZFLandroidx/compose/ui/layout/MeasureResult;FZLkotlinx/coroutines/CoroutineScope;Landroidx/compose/ui/unit/Density;JLjava/util/List;IIILandroidx/compose/foundation/gestures/Orientation;II)V +HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->copyWithScrollDeltaWithoutRemeasure(IZ)Landroidx/compose/foundation/lazy/LazyListMeasureResult; +SPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getAlignmentLines()Ljava/util/Map; +SPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getHeight()I +SPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getRulers()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getWidth()I +SPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->placeChildren()V +Landroidx/compose/foundation/lazy/LazyListMeasuredItem; +HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->(ILjava/util/List;ZLandroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/ui/unit/LayoutDirection;IIIJLjava/lang/Object;Ljava/lang/Object;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator;J)V +PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getIndex()I +PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getOffset-Bjo55l4(I)J +PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getParentData(I)Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getPlaceablesCount()I +HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->place(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V +PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->position$1(III)V +Landroidx/compose/foundation/lazy/LazyListScope$items$1; +SPLandroidx/compose/foundation/lazy/LazyListScope$items$1;->()V +SPLandroidx/compose/foundation/lazy/LazyListScope$items$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/lazy/LazyListScrollPosition; +SPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->(III)V +PLandroidx/compose/foundation/lazy/LazyListScrollPosition;->update(II)V +PLandroidx/compose/foundation/lazy/LazyListScrollScopeKt$LazyLayoutScrollScope$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +HPLandroidx/compose/foundation/lazy/LazyListScrollScopeKt$LazyLayoutScrollScope$1;->scrollBy(F)F +Landroidx/compose/foundation/lazy/LazyListState; +SPLandroidx/compose/foundation/lazy/LazyListState;->()V +SPLandroidx/compose/foundation/lazy/LazyListState;->(II)V +HSPLandroidx/compose/foundation/lazy/LazyListState;->applyMeasureResult$foundation(Landroidx/compose/foundation/lazy/LazyListMeasureResult;ZZ)V +PLandroidx/compose/foundation/lazy/LazyListState;->getCanScrollBackward()Z +PLandroidx/compose/foundation/lazy/LazyListState;->getCanScrollForward()Z +SPLandroidx/compose/foundation/lazy/LazyListState;->getLayoutInfo()Landroidx/compose/foundation/lazy/LazyListMeasureResult; +PLandroidx/compose/foundation/lazy/LazyListState;->isScrollInProgress()Z +HPLandroidx/compose/foundation/lazy/LazyListState;->notifyPrefetchOnScroll(FLandroidx/compose/foundation/lazy/LazyListMeasureResult;)V +PLandroidx/compose/foundation/lazy/LazyListState;->scroll(Landroidx/compose/foundation/MutatePriority;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1; +SPLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->(Landroidx/compose/foundation/gestures/ScrollableState;I)V +PLandroidx/compose/foundation/lazy/LazyListState$scroll$1;->(Landroidx/compose/foundation/lazy/LazyListState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/foundation/lazy/LazyListState$scroll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/lazy/LazyListStateKt; +SPLandroidx/compose/foundation/lazy/LazyListStateKt;->()V +SPLandroidx/compose/foundation/lazy/LazyListStateKt;->rememberLazyListState(IILandroidx/compose/runtime/ComposerImpl;)Landroidx/compose/foundation/lazy/LazyListState; +Landroidx/compose/foundation/lazy/LazyListStateKt$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/lazy/LazyListStateKt$$ExternalSyntheticLambda0;->(II)V +SPLandroidx/compose/foundation/lazy/LazyListStateKt$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/compose/foundation/lazy/LazyListStateKt$EmptyLazyListMeasureResult$1; +Landroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler; +SPLandroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler;->(Landroid/view/View;)V +PLandroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler;->doFrame(J)V +HPLandroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler;->run()V +PLandroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler;->runRequest()Z +Landroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler$PrefetchRequestScopeImpl; +PLandroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler$PrefetchRequestScopeImpl;->availableTimeNanos()J +PLandroidx/compose/foundation/lazy/layout/Averages;->calculateAverageTime(JJ)J +Landroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier; +SPLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;->()V +SPLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier$Node; +SPLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier$Node;->(Landroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;)V +SPLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier$Node;->onAttach()V +PLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier$Node;->onDetach()V +Landroidx/compose/foundation/lazy/layout/IntervalList$Interval; +SPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->(IILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval;)V +Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;->(I)V +Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo$Interval; +Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierElement; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierElement;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState;Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;Landroidx/compose/foundation/gestures/Orientation;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsProviderModifierNode; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsProviderModifierNode;->()V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsProviderModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsProviderModifierNode$Companion$emptyBeyondBoundsScope$1; +Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState; +Landroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval; +Landroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator;->()V +PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator;->getAnimation(ILjava/lang/Object;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator;->getMinSizeToFitDisappearingItems-YbymL2g()J +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator;->onMeasured(IILjava/util/ArrayList;Lokhttp3/internal/http/StatusLine;Lio/ktor/util/StringValuesBuilderImpl;ZIZII)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator;->releaseAnimations()V +Landroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsElement; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsElement;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsNode; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsNode;->draw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsNode;->onAttach()V +PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemAnimator$DisplayingDisappearingItemsNode;->onDetach()V +Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->(Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda14;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContent(Ljava/lang/Object;ILjava/lang/Object;)Lkotlin/jvm/functions/Function2; +PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContentType(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;ILjava/lang/Object;Ljava/lang/Object;)V +Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider; +Landroidx/compose/foundation/lazy/layout/LazyLayoutKt; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->()V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayout(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasurePolicy;Landroidx/compose/runtime/ComposerImpl;I)V +HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayoutPinnableItem(Ljava/lang/Object;ILandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazySaveableStateHolderProvider(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->SkippableItem-JVlU9Rs(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;ILjava/lang/Object;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->access$binarySearch(ILandroidx/compose/runtime/collection/MutableVector;)I +PLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->applyStickyItems(Landroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState$Companion;IILjava/util/ArrayList;Landroidx/collection/MutableIntList;IIILkotlin/jvm/functions/Function1;)Ljava/util/List; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->calculateLazyLayoutPinnedIndices(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;)Ljava/util/List; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->constructor-impl$default()Landroidx/compose/runtime/MutableState; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->findIndexByKey(ILandroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;)I +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->lazyLayoutBeyondBoundsModifier(Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState;Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;Landroidx/compose/foundation/gestures/Orientation;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->lazyLayoutSemantics(Landroidx/compose/ui/Modifier;Lkotlin/reflect/KProperty0;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;Landroidx/compose/foundation/gestures/Orientation;Z)Landroidx/compose/ui/Modifier; +PLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->updatedVisibleItems(IILjava/util/ArrayList;Ljava/util/List;)Ljava/util/List; +Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$$ExternalSyntheticLambda0;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasurePolicy;Landroidx/compose/runtime/MutableState;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$$ExternalSyntheticLambda3; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$$ExternalSyntheticLambda3;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/foundation/lazy/layout/PrefetchScheduler;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasurePolicy; +Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeMeasureScope;)V +Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasuredItem; +Landroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->()V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->(III)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->getValue()Ljava/lang/Object; +PLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->update(I)V +Landroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState$Companion; +Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->(Ljava/lang/Object;Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;)V +Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;->()V +Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;->(Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;->schedulePrecompositionAndPremeasure-_EkL_-Y$foundation(IJZLkotlin/jvm/functions/Function1;)Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$PrefetchHandle; +Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchStateKt; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchStateKt;->()V +Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState; +Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifier; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifier;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;Landroidx/compose/foundation/gestures/Orientation;Z)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifier;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifier;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;Landroidx/compose/foundation/gestures/Orientation;Z)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode;->updateCachedSemanticsValues()V +Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode$$ExternalSyntheticLambda0;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode;I)V +Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode$$ExternalSyntheticLambda1; +SPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode$$ExternalSyntheticLambda1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode;I)V +PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsModifierNode$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder; +SPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/util/Map;Landroidx/compose/runtime/saveable/SaveableStateHolder;)V +SPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->SaveableStateProvider(Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->performSave()Ljava/util/Map; +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->(Landroidx/compose/runtime/Latch;ILandroidx/emoji2/text/EmojiProcessor;Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->cancel()V +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->cleanUp()V +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->execute(Landroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler$PrefetchRequestScopeImpl;)Z +HPLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->executeRequest(Landroidx/compose/foundation/lazy/layout/AndroidPrefetchScheduler$PrefetchRequestScopeImpl;)Z +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->isComposed()Z +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->markAsUrgent()V +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->performMeasure-BRTryo0(J)V +HPLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->performPausableComposition(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/foundation/lazy/layout/Averages;)V +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->resolveNestedPrefetchStates()Landroidx/paging/FlattenedPageEventStorage; +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->shouldExecute(JJ)Z +HPLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;->updateElapsedAndAvailableTime()V +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl$$ExternalSyntheticLambda1;->(Landroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;Landroidx/compose/foundation/lazy/layout/Averages;)V +PLandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl$$ExternalSyntheticLambda1;->shouldPause()Z +Landroidx/compose/foundation/lazy/layout/PrefetchScheduler; +Landroidx/compose/foundation/lazy/layout/PrefetchScheduler_androidKt; +SPLandroidx/compose/foundation/lazy/layout/PrefetchScheduler_androidKt;->()V +PLandroidx/compose/foundation/lazy/layout/PriorityTask;->(ILandroidx/compose/foundation/lazy/layout/PrefetchHandleProvider$HandleAndRequestImpl;)V +Landroidx/compose/foundation/lazy/layout/StickyItemsPlacement$Companion; +SPLandroidx/compose/foundation/lazy/layout/StickyItemsPlacement$Companion;->()V +Landroidx/compose/foundation/lazy/layout/TraversablePrefetchStateModifierElement; +SPLandroidx/compose/foundation/lazy/layout/TraversablePrefetchStateModifierElement;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;)V +SPLandroidx/compose/foundation/lazy/layout/TraversablePrefetchStateModifierElement;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/foundation/lazy/layout/TraversablePrefetchStateNode; +PLandroidx/compose/foundation/lazy/layout/TraversablePrefetchStateNode;->getTraverseKey()Ljava/lang/Object; +Landroidx/compose/foundation/relocation/BringIntoViewResponderNode; +SPLandroidx/compose/foundation/relocation/BringIntoViewResponderNode;->onPlaced(Landroidx/compose/ui/layout/LayoutCoordinates;)V +Landroidx/compose/foundation/selection/SelectableElement; +SPLandroidx/compose/foundation/selection/SelectableElement;->(ZLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/IndicationNodeFactory;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V +SPLandroidx/compose/foundation/selection/SelectableElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/foundation/selection/SelectableElement;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/foundation/selection/SelectableElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/foundation/selection/SelectableKt; +SPLandroidx/compose/foundation/selection/SelectableKt;->selectable-O2vRcR0(Landroidx/compose/ui/Modifier;ZLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/foundation/Indication;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/Modifier; +Landroidx/compose/foundation/selection/SelectableNode; +SPLandroidx/compose/foundation/selection/SelectableNode;->applyAdditionalSemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +Landroidx/compose/foundation/shape/CornerSize; +Landroidx/compose/foundation/shape/DpCornerSize; +SPLandroidx/compose/foundation/shape/DpCornerSize;->(F)V +SPLandroidx/compose/foundation/shape/DpCornerSize;->toPx-TmRCtEA(JLandroidx/compose/ui/unit/Density;)F +Landroidx/compose/foundation/shape/PercentCornerSize; +SPLandroidx/compose/foundation/shape/PercentCornerSize;->(F)V +SPLandroidx/compose/foundation/shape/PercentCornerSize;->toPx-TmRCtEA(JLandroidx/compose/ui/unit/Density;)F +Landroidx/compose/foundation/shape/RoundedCornerShape; +SPLandroidx/compose/foundation/shape/RoundedCornerShape;->(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V +SPLandroidx/compose/foundation/shape/RoundedCornerShape;->copy$default(Landroidx/compose/foundation/shape/RoundedCornerShape;Landroidx/compose/foundation/shape/DpCornerSize;Landroidx/compose/foundation/shape/DpCornerSize;Landroidx/compose/foundation/shape/DpCornerSize;Landroidx/compose/foundation/shape/DpCornerSize;I)Landroidx/compose/foundation/shape/RoundedCornerShape; +HSPLandroidx/compose/foundation/shape/RoundedCornerShape;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/ColorKt; +SPLandroidx/compose/foundation/shape/RoundedCornerShape;->equals(Ljava/lang/Object;)Z +Landroidx/compose/foundation/shape/RoundedCornerShapeKt; +SPLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->()V +SPLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->RoundedCornerShape-0680j_4(F)Landroidx/compose/foundation/shape/RoundedCornerShape; +Landroidx/compose/foundation/text/BasicTextKt; +SPLandroidx/compose/foundation/text/BasicTextKt;->()V +HSPLandroidx/compose/foundation/text/BasicTextKt;->BasicText-RWo7tUw(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/TextStyle;IZIILandroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/foundation/text/BasicTextKt;->BasicText-VhcvRP8(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/TextStyle;IZIILandroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/foundation/text/BasicTextKt;->ceilToIntPx(F)I +SPLandroidx/compose/foundation/text/BasicTextKt;->validateMinMaxLines(II)V +PLandroidx/compose/foundation/text/BasicTextKt$$ExternalSyntheticLambda0;->(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/TextStyle;IZIII)V +PLandroidx/compose/foundation/text/BasicTextKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/text/BasicText_androidKt; +SPLandroidx/compose/foundation/text/BasicText_androidKt;->()V +Landroidx/compose/foundation/text/EmptyMeasurePolicy; +SPLandroidx/compose/foundation/text/EmptyMeasurePolicy;->()V +SPLandroidx/compose/foundation/text/EmptyMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/text/KeyMappingKt$commonKeyMapping$1; +SPLandroidx/compose/foundation/text/KeyMappingKt$commonKeyMapping$1;->(I)V +Landroidx/compose/foundation/text/modifiers/InlineDensity; +SPLandroidx/compose/foundation/text/modifiers/InlineDensity;->()V +SPLandroidx/compose/foundation/text/modifiers/InlineDensity;->constructor-impl(FF)J +Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; +SPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily$Resolver;IZII)V +HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->layoutWithConstraints-K40F9xA(JLandroidx/compose/ui/unit/LayoutDirection;)Z +PLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->markDirty()V +SPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->setDensity$foundation(Landroidx/compose/ui/unit/Density;)V +HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/ParagraphIntrinsics; +Landroidx/compose/foundation/text/modifiers/TextStringSimpleElement; +SPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily$Resolver;IZIILandroidx/compose/ui/graphics/ColorProducer;)V +SPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->equals(Ljava/lang/Object;)Z +HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode; +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->draw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +SPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getLayoutCache()Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; +PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getShouldAutoInvalidate()Z +HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$$ExternalSyntheticLambda0; +SPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$$ExternalSyntheticLambda0;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;I)V +HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/foundation/text/selection/SelectionMagnifierKt$rememberAnimatedMagnifierPosition$1$1$2$1;->(JLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;Lkotlin/coroutines/Continuation;)V +PLandroidx/compose/foundation/text/selection/SelectionMagnifierKt$rememberAnimatedMagnifierPosition$1$1$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/compose/foundation/text/selection/SelectionMagnifierKt$rememberAnimatedMagnifierPosition$1$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/foundation/text/selection/SelectionRegistrarKt; +SPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt;->()V +Landroidx/compose/foundation/text/selection/TextSelectionColors; +SPLandroidx/compose/foundation/text/selection/TextSelectionColors;->(JJ)V +Landroidx/compose/foundation/text/selection/TextSelectionColorsKt; +SPLandroidx/compose/foundation/text/selection/TextSelectionColorsKt;->()V +Landroidx/compose/material/ripple/AndroidRippleNode; +PLandroidx/compose/material/ripple/AndroidRippleNode;->addRipple-12SF9DM(Landroidx/compose/foundation/interaction/PressInteraction$Press;JF)V +SPLandroidx/compose/material/ripple/AndroidRippleNode;->drawRipples(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +SPLandroidx/compose/material/ripple/AndroidRippleNode;->onDetach()V +PLandroidx/compose/material/ripple/AndroidRippleNode;->onResetRippleHostView()V +PLandroidx/compose/material/ripple/AndroidRippleNode;->removeRipple(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V +Landroidx/compose/material/ripple/RippleAlpha; +SPLandroidx/compose/material/ripple/RippleAlpha;->(FFFF)V +Landroidx/compose/material/ripple/RippleAnimationKt; +SPLandroidx/compose/material/ripple/RippleAnimationKt;->()V +SPLandroidx/compose/material/ripple/RippleAnimationKt;->getRippleEndRadius-cSwnlzA(Landroidx/compose/ui/unit/Density;ZJ)F +PLandroidx/compose/material/ripple/RippleContainer;->(Landroid/content/Context;)V +PLandroidx/compose/material/ripple/RippleContainer;->getRippleHostView(Landroidx/compose/material/ripple/RippleHostKey;)Landroidx/compose/material/ripple/RippleHostView; +PLandroidx/compose/material/ripple/RippleContainer;->requestLayout()V +Landroidx/compose/material/ripple/RippleHostKey; +PLandroidx/compose/material/ripple/RippleHostView;->$r8$lambda$kwnYusj11673lL3l--Z3fgj8B_w(Landroidx/compose/material/ripple/RippleHostView;)V +PLandroidx/compose/material/ripple/RippleHostView;->()V +PLandroidx/compose/material/ripple/RippleHostView;->addRipple-KOepWvA(Landroidx/compose/foundation/interaction/PressInteraction$Press;ZJIJFLkotlin/jvm/functions/Function0;)V +PLandroidx/compose/material/ripple/RippleHostView;->disposeRipple()V +PLandroidx/compose/material/ripple/RippleHostView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V +PLandroidx/compose/material/ripple/RippleHostView;->refreshDrawableState()V +PLandroidx/compose/material/ripple/RippleHostView;->removeRipple()V +PLandroidx/compose/material/ripple/RippleHostView;->setRippleProperties-07v42R4(JJF)V +PLandroidx/compose/material/ripple/RippleHostView;->setRippleState$lambda$2(Landroidx/compose/material/ripple/RippleHostView;)V +PLandroidx/compose/material/ripple/RippleHostView;->setRippleState(Z)V +Landroidx/compose/material/ripple/RippleKt; +SPLandroidx/compose/material/ripple/RippleKt;->()V +Landroidx/compose/material/ripple/RippleNode; +SPLandroidx/compose/material/ripple/RippleNode;->(Landroidx/compose/foundation/interaction/InteractionSource;ZFLandroidx/compose/material3/RippleNodeFactory$create$colorProducer$1;Landroidx/compose/material3/DelegatingThemeAwareRippleNode$updateConfiguration$1;)V +SPLandroidx/compose/material/ripple/RippleNode;->draw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +SPLandroidx/compose/material/ripple/RippleNode;->getShouldAutoInvalidate()Z +PLandroidx/compose/material/ripple/RippleNode;->handlePressInteraction(Landroidx/compose/foundation/interaction/PressInteraction;)V +SPLandroidx/compose/material/ripple/RippleNode;->onAttach()V +SPLandroidx/compose/material/ripple/RippleNode;->onRemeasured-ozmzZPI(J)V +Landroidx/compose/material/ripple/RippleTheme; +Landroidx/compose/material/ripple/RippleThemeKt; +SPLandroidx/compose/material/ripple/RippleThemeKt;->()V +Landroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1; +SPLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->()V +Landroidx/compose/material/ripple/Ripple_androidKt; +SPLandroidx/compose/material/ripple/Ripple_androidKt;->()V +PLandroidx/compose/material/ripple/Ripple_androidKt;->access$createAndAttachRippleContainerIfNeeded(Landroid/view/ViewGroup;)Landroidx/compose/material/ripple/RippleContainer; +PLandroidx/compose/material/ripple/Ripple_androidKt;->access$findNearestViewGroup(Landroid/view/View;)Landroid/view/ViewGroup; +Landroidx/compose/material/ripple/StateLayer; +PLandroidx/compose/material/ripple/StateLayer;->process-BIzXfog(Landroidx/paging/ConflatedEventBus;Landroidx/compose/ui/platform/AndroidComposeView;Z)I +PLandroidx/compose/material/ripple/UnprojectedRipple;->(Z)V +PLandroidx/compose/material/ripple/UnprojectedRipple;->getDirtyBounds()Landroid/graphics/Rect; +PLandroidx/compose/material/ripple/UnprojectedRipple;->isProjected()Z +PLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->()V +PLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->setRadius(Landroid/graphics/drawable/RippleDrawable;I)V +Landroidx/compose/material3/AppBarKt; +SPLandroidx/compose/material3/AppBarKt;->()V +SPLandroidx/compose/material3/AppBarKt;->SingleRowTopAppBar-cJHQLPU(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function3;FLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/AppBarKt;->TopAppBar-GHTll3U(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function3;FLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/AppBarKt;->access$TopAppBarLayout-kXwM9vE(Landroidx/compose/ui/Modifier;Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3$$ExternalSyntheticLambda0;JJJLandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3; +SPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->(Landroidx/compose/foundation/layout/WindowInsets;FLandroidx/compose/material3/TopAppBarColors;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3$$ExternalSyntheticLambda0; +Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$4; +SPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$4;->(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function3;FLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;I)V +Landroidx/compose/material3/AppBarKt$TopAppBarLayout$2$1; +SPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/material3/AppBarKt$TopAppBarLayout$2$1$1; +SPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$1$1;->(Landroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/Placeable;Landroidx/compose/foundation/layout/Arrangement$Horizontal;JLandroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/foundation/layout/Arrangement$Vertical;I)V +SPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/ButtonKt$Button$1; +SPLandroidx/compose/material3/ButtonKt$Button$1;->()V +SPLandroidx/compose/material3/ButtonKt$Button$1;->(II)V +SPLandroidx/compose/material3/ButtonKt$Button$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/ButtonKt$Button$2$1; +SPLandroidx/compose/material3/ButtonKt$Button$2$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLandroidx/compose/material3/ButtonKt$Button$2$1;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;II)V +Landroidx/compose/material3/CardColors; +SPLandroidx/compose/material3/CardColors;->(JJJJ)V +SPLandroidx/compose/material3/CardColors;->copy-jRlVdoo(JJJJ)Landroidx/compose/material3/CardColors; +Landroidx/compose/material3/CardElevation; +SPLandroidx/compose/material3/CardElevation;->(FFFFFF)V +Landroidx/compose/material3/CardKt; +SPLandroidx/compose/material3/CardKt;->()V +HSPLandroidx/compose/material3/CardKt;->Card(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/CardColors;Landroidx/compose/material3/CardElevation;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/CardKt;->ElevatedCard(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/CardColors;Landroidx/compose/material3/CardElevation;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/CardKt;->HorizontalDivider-9IZ8Weo(Landroidx/compose/ui/Modifier;FJLandroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/CardKt;->IconButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/IconButtonColors;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/CardKt;->cardElevation-aqJV_2Y(FI)Landroidx/compose/material3/CardElevation; +PLandroidx/compose/material3/CardKt;->elevatedCardColors(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/material3/CardColors; +PLandroidx/compose/material3/CardKt;->getColorScheme(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/material3/ColorScheme; +SPLandroidx/compose/material3/CardKt;->getDefaultElevatedCardColors$material3_release(Landroidx/compose/material3/ColorScheme;)Landroidx/compose/material3/CardColors; +PLandroidx/compose/material3/CardKt;->getTypography(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/material3/Typography; +Landroidx/compose/material3/CardKt$Card$1; +SPLandroidx/compose/material3/CardKt$Card$1;->(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;)V +HSPLandroidx/compose/material3/CardKt$Card$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/material3/CardKt$Card$2;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/CardColors;Landroidx/compose/material3/CardElevation;Landroidx/compose/runtime/internal/ComposableLambdaImpl;III)V +Landroidx/compose/material3/ColorScheme; +SPLandroidx/compose/material3/ColorScheme;->(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)V +Landroidx/compose/material3/ColorSchemeKt; +SPLandroidx/compose/material3/ColorSchemeKt;->()V +SPLandroidx/compose/material3/ColorSchemeKt;->contentColorFor-4WTKRHQ(Landroidx/compose/material3/ColorScheme;J)J +SPLandroidx/compose/material3/ColorSchemeKt;->contentColorFor-ek8zF_U(JLandroidx/compose/runtime/ComposerImpl;)J +SPLandroidx/compose/material3/ColorSchemeKt;->fromToken(Landroidx/compose/material3/ColorScheme;I)J +SPLandroidx/compose/material3/ColorSchemeKt;->getValue(ILandroidx/compose/runtime/ComposerImpl;)J +SPLandroidx/compose/material3/ColorSchemeKt;->lightColorScheme-C-Xl9yA$default(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJII)Landroidx/compose/material3/ColorScheme; +Landroidx/compose/material3/CompatRippleTheme; +SPLandroidx/compose/material3/CompatRippleTheme;->()V +Landroidx/compose/material3/ComposableSingletons$ScaffoldKt; +SPLandroidx/compose/material3/ComposableSingletons$ScaffoldKt;->()V +Landroidx/compose/material3/ContentColorKt; +SPLandroidx/compose/material3/ContentColorKt;->()V +Landroidx/compose/material3/DatePickerKt$DatePickerHeader$1$1; +SPLandroidx/compose/material3/DatePickerKt$DatePickerHeader$1$1;->(ILkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/material3/DatePickerKt$DatePickerHeader$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/DatePickerKt$Day$1$1; +SPLandroidx/compose/material3/DatePickerKt$Day$1$1;->(Ljava/lang/String;I)V +SPLandroidx/compose/material3/DatePickerKt$Day$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/material3/DatePickerKt$MonthsNavigation$1$1;->(Landroidx/compose/material3/SwipeToDismissBoxState;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;ZZZLandroidx/compose/runtime/internal/ComposableLambdaImpl;I)V +Landroidx/compose/material3/DatePickerKt$YearPicker$1$2$1$1$1$1; +SPLandroidx/compose/material3/DatePickerKt$YearPicker$1$2$1$1$1$1;->(IILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V +SPLandroidx/compose/material3/DatePickerKt$YearPicker$1$2$1$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/DatePickerKt$updateDisplayedMonth$3; +SPLandroidx/compose/material3/DatePickerKt$updateDisplayedMonth$3;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLandroidx/compose/material3/DatePickerKt$updateDisplayedMonth$3;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/compose/material3/DefaultDrawerItemsColor; +SPLandroidx/compose/material3/DefaultDrawerItemsColor;->(JJJJJJJJ)V +Landroidx/compose/material3/DelegatingThemeAwareRippleNode; +SPLandroidx/compose/material3/DelegatingThemeAwareRippleNode;->(Landroidx/compose/foundation/interaction/InteractionSource;ZFLandroidx/compose/ui/graphics/ColorProducer;)V +SPLandroidx/compose/material3/DelegatingThemeAwareRippleNode;->onAttach()V +Landroidx/compose/material3/DelegatingThemeAwareRippleNode$updateConfiguration$1; +SPLandroidx/compose/material3/DelegatingThemeAwareRippleNode$updateConfiguration$1;->(Landroidx/compose/material3/DelegatingThemeAwareRippleNode;I)V +SPLandroidx/compose/material3/DelegatingThemeAwareRippleNode$updateConfiguration$1;->invoke()Ljava/lang/Object; +Landroidx/compose/material3/DividerDefaults; +SPLandroidx/compose/material3/DividerDefaults;->()V +Landroidx/compose/material3/DividerKt$HorizontalDivider$1$1; +SPLandroidx/compose/material3/DividerKt$HorizontalDivider$1$1;->(FJ)V +SPLandroidx/compose/material3/DividerKt$HorizontalDivider$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/DrawerDefaults; +SPLandroidx/compose/material3/DrawerDefaults;->()V +Landroidx/compose/material3/DrawerState; +SPLandroidx/compose/material3/DrawerState;->(Landroidx/compose/material3/DrawerValue;)V +Landroidx/compose/material3/DrawerState$Companion$Saver$2; +SPLandroidx/compose/material3/DrawerState$Companion$Saver$2;->()V +SPLandroidx/compose/material3/DrawerState$Companion$Saver$2;->(II)V +Landroidx/compose/material3/DrawerValue; +SPLandroidx/compose/material3/DrawerValue;->()V +Landroidx/compose/material3/FloatingActionButtonDefaults; +SPLandroidx/compose/material3/FloatingActionButtonDefaults;->()V +SPLandroidx/compose/material3/FloatingActionButtonDefaults;->elevation-xZ9-QkE()Landroidx/compose/material3/FloatingActionButtonElevation; +Landroidx/compose/material3/FloatingActionButtonElevation; +SPLandroidx/compose/material3/FloatingActionButtonElevation;->(FFFF)V +Landroidx/compose/material3/FloatingActionButtonElevationAnimatable; +SPLandroidx/compose/material3/FloatingActionButtonElevationAnimatable;->(FFFF)V +SPLandroidx/compose/material3/FloatingActionButtonElevationAnimatable;->snapElevation(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/compose/material3/FloatingActionButtonElevationAnimatable$snapElevation$1; +SPLandroidx/compose/material3/FloatingActionButtonElevationAnimatable$snapElevation$1;->(Landroidx/compose/material3/FloatingActionButtonElevationAnimatable;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/compose/material3/FloatingActionButtonKt; +SPLandroidx/compose/material3/FloatingActionButtonKt;->()V +PLandroidx/compose/material3/FloatingActionButtonKt;->ExtendedFloatingActionButton-ElI5-7k(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;JJLandroidx/compose/material3/FloatingActionButtonElevation;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/FloatingActionButtonKt;->FloatingActionButton-X-z6DiA(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JJLandroidx/compose/material3/FloatingActionButtonElevation;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +Landroidx/compose/material3/FloatingActionButtonKt$FloatingActionButton$2; +SPLandroidx/compose/material3/FloatingActionButtonKt$FloatingActionButton$2;->(JLkotlin/jvm/functions/Function2;I)V +SPLandroidx/compose/material3/FloatingActionButtonKt$FloatingActionButton$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/FloatingActionButtonKt$FloatingActionButton$3; +SPLandroidx/compose/material3/FloatingActionButtonKt$FloatingActionButton$3;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JJLandroidx/compose/material3/FloatingActionButtonElevation;Landroidx/compose/runtime/internal/ComposableLambdaImpl;II)V +Landroidx/compose/material3/IconButtonColors; +SPLandroidx/compose/material3/IconButtonColors;->(JJJJ)V +Landroidx/compose/material3/IconButtonKt$IconButton$2; +SPLandroidx/compose/material3/IconButtonKt$IconButton$2;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/IconButtonColors;Landroidx/compose/runtime/internal/ComposableLambdaImpl;II)V +Landroidx/compose/material3/IconKt; +SPLandroidx/compose/material3/IconKt;->()V +HSPLandroidx/compose/material3/IconKt;->Icon-ww6aTOc(Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Modifier;JLandroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/IconKt;->Icon-ww6aTOc(Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;Landroidx/compose/ui/Modifier;JLandroidx/compose/runtime/ComposerImpl;II)V +Landroidx/compose/material3/IconKt$Icon$1; +SPLandroidx/compose/material3/IconKt$Icon$1;->(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/ui/Modifier;JIII)V +PLandroidx/compose/material3/IconKt$Icon$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/InteractiveComponentSizeKt; +SPLandroidx/compose/material3/InteractiveComponentSizeKt;->()V +Landroidx/compose/material3/MaterialThemeKt; +SPLandroidx/compose/material3/MaterialThemeKt;->()V +SPLandroidx/compose/material3/MaterialThemeKt;->MaterialTheme(Landroidx/compose/material3/ColorScheme;Landroidx/compose/material3/Shapes;Landroidx/compose/material3/Typography;Landroidx/compose/runtime/ComposerImpl;I)V +Landroidx/compose/material3/MinimumInteractiveModifier; +SPLandroidx/compose/material3/MinimumInteractiveModifier;->()V +SPLandroidx/compose/material3/MinimumInteractiveModifier;->()V +SPLandroidx/compose/material3/MinimumInteractiveModifier;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/material3/MinimumInteractiveModifierNode; +SPLandroidx/compose/material3/MinimumInteractiveModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/material3/MinimumInteractiveModifierNode$measure$1; +SPLandroidx/compose/material3/MinimumInteractiveModifierNode$measure$1;->(ILandroidx/compose/ui/layout/Placeable;I)V +SPLandroidx/compose/material3/MinimumInteractiveModifierNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/material3/ModalBottomSheetKt;->()V +PLandroidx/compose/material3/ModalBottomSheetKt;->rememberModalBottomSheetState(IILandroidx/compose/runtime/ComposerImpl;)Landroidx/compose/material3/SheetState; +Landroidx/compose/material3/ModalBottomSheetKt$ModalBottomSheetContent$7$2$1$1$1$2; +SPLandroidx/compose/material3/ModalBottomSheetKt$ModalBottomSheetContent$7$2$1$1$1$2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLandroidx/compose/material3/ModalBottomSheetKt$ModalBottomSheetContent$7$2$1$1$1$2;->invoke()Ljava/lang/Object; +Landroidx/compose/material3/ModalBottomSheetKt$Scrim$1$1; +SPLandroidx/compose/material3/ModalBottomSheetKt$Scrim$1$1;->(IJLjava/lang/Object;)V +SPLandroidx/compose/material3/ModalBottomSheetKt$Scrim$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/NavigationBarDefaults; +SPLandroidx/compose/material3/NavigationBarDefaults;->()V +Landroidx/compose/material3/NavigationBarItemColors; +SPLandroidx/compose/material3/NavigationBarItemColors;->(JJJJJJJ)V +Landroidx/compose/material3/NavigationBarKt; +SPLandroidx/compose/material3/NavigationBarKt;->()V +SPLandroidx/compose/material3/NavigationBarKt;->NavigationBar-HsRjFd4(Landroidx/compose/ui/Modifier;JJFLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/NavigationBarKt;->NavigationBarItem(Landroidx/compose/foundation/layout/RowScope;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;ZZLandroidx/compose/material3/NavigationBarItemColors;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/NavigationBarKt;->NavigationBarItemLayout(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function2;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;I)V +Landroidx/compose/material3/NavigationBarKt$NavigationBar$1; +SPLandroidx/compose/material3/NavigationBarKt$NavigationBar$1;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/NavigationBarKt$NavigationBar$1;->(ZLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/NavigationBarKt$NavigationBar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/NavigationBarKt$NavigationBar$2; +SPLandroidx/compose/material3/NavigationBarKt$NavigationBar$2;->(Landroidx/compose/ui/Modifier;JJFLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/internal/ComposableLambdaImpl;I)V +Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$2$1; +SPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$2$1;->(Landroidx/compose/runtime/State;I)V +SPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$2$1;->invoke()Ljava/lang/Object; +Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$3; +SPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$3;->(Landroidx/compose/foundation/layout/RowScope;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;ZZLandroidx/compose/material3/NavigationBarItemColors;I)V +Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1; +SPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->(Landroidx/compose/material3/NavigationBarItemColors;ZZZLandroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2$1; +SPLandroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Z)V +SPLandroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/material3/NavigationBarKt$placeIcon$1; +SPLandroidx/compose/material3/NavigationBarKt$placeIcon$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;IILandroidx/compose/ui/layout/Placeable;IIII)V +SPLandroidx/compose/material3/NavigationBarKt$placeIcon$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/NavigationDrawerItemDefaults; +SPLandroidx/compose/material3/NavigationDrawerItemDefaults;->()V +Landroidx/compose/material3/NavigationDrawerKt; +SPLandroidx/compose/material3/NavigationDrawerKt;->()V +SPLandroidx/compose/material3/NavigationDrawerKt;->DrawerSheet-7zSek6w(FIJJLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;)V +SPLandroidx/compose/material3/NavigationDrawerKt;->ModalDrawerSheet-afqeVBk(FIJJLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;)V +SPLandroidx/compose/material3/NavigationDrawerKt;->ModalNavigationDrawer-FHprtrg(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;Landroidx/compose/material3/DrawerState;ZJLandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/NavigationDrawerKt;->NavigationDrawerItem(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/DefaultDrawerItemsColor;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/NavigationDrawerKt;->Scrim-Bx497Mc(ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;JLandroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/NavigationDrawerKt;->rememberDrawerState(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/material3/DrawerState; +Landroidx/compose/material3/NavigationDrawerKt$ModalNavigationDrawer$2$2$1; +SPLandroidx/compose/material3/NavigationDrawerKt$ModalNavigationDrawer$2$2$1;->(ILjava/lang/Object;Ljava/lang/Object;Z)V +Landroidx/compose/material3/NavigationDrawerKt$ModalNavigationDrawer$3; +SPLandroidx/compose/material3/NavigationDrawerKt$ModalNavigationDrawer$3;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;Landroidx/compose/material3/DrawerState;ZJLandroidx/compose/runtime/internal/ComposableLambdaImpl;I)V +Landroidx/compose/material3/NavigationDrawerKt$NavigationDrawerItem$2; +SPLandroidx/compose/material3/NavigationDrawerKt$NavigationDrawerItem$2;->(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/AndroidUriHandler;Lkotlin/jvm/functions/Function2;I)V +SPLandroidx/compose/material3/NavigationDrawerKt$NavigationDrawerItem$2;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/ui/platform/AndroidUriHandler;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/material3/NavigationDrawerKt$NavigationDrawerItem$2;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;I)V +SPLandroidx/compose/material3/NavigationDrawerKt$NavigationDrawerItem$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/NavigationDrawerKt$Scrim$2; +SPLandroidx/compose/material3/NavigationDrawerKt$Scrim$2;->(ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;JI)V +Landroidx/compose/material3/RippleConfiguration; +SPLandroidx/compose/material3/RippleConfiguration;->()V +Landroidx/compose/material3/RippleKt; +SPLandroidx/compose/material3/RippleKt;->()V +SPLandroidx/compose/material3/RippleKt;->rippleOrFallbackImplementation-9IZ8Weo(FLandroidx/compose/runtime/ComposerImpl;II)Landroidx/compose/foundation/Indication; +Landroidx/compose/material3/RippleNodeFactory; +SPLandroidx/compose/material3/RippleNodeFactory;->(ZFJ)V +SPLandroidx/compose/material3/RippleNodeFactory;->create(Landroidx/compose/foundation/interaction/InteractionSource;)Landroidx/compose/ui/node/DelegatableNode; +PLandroidx/compose/material3/RippleNodeFactory;->equals(Ljava/lang/Object;)Z +Landroidx/compose/material3/RippleNodeFactory$create$colorProducer$1; +SPLandroidx/compose/material3/RippleNodeFactory$create$colorProducer$1;->(ILjava/lang/Object;)V +PLandroidx/compose/material3/RippleNodeFactory$create$colorProducer$1;->invoke-0d7_KjU()J +Landroidx/compose/material3/ScaffoldKt; +SPLandroidx/compose/material3/ScaffoldKt;->()V +SPLandroidx/compose/material3/ScaffoldKt;->Scaffold-TvnljyQ(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/ScaffoldKt;->access$ScaffoldLayout-FMILGgc(ILkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +Landroidx/compose/material3/ScaffoldKt$Scaffold$2; +SPLandroidx/compose/material3/ScaffoldKt$Scaffold$2;->(ILkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/material3/internal/MutableWindowInsets;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/material3/ScaffoldKt$Scaffold$2;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;II)V +SPLandroidx/compose/material3/ScaffoldKt$Scaffold$2;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;Ljava/util/ArrayList;ILjava/util/ArrayList;Ljava/lang/Integer;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/ScaffoldKt$Scaffold$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;ILandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/ScaffoldKt$Scaffold$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/ScaffoldKt$Scaffold$3; +SPLandroidx/compose/material3/ScaffoldKt$Scaffold$3;->(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/internal/ComposableLambdaImpl;II)V +Landroidx/compose/material3/ScaffoldKt$ScaffoldLayout$1$1$1; +SPLandroidx/compose/material3/ScaffoldKt$ScaffoldLayout$1$1$1;->(Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;Landroidx/navigation/NavOptions$Builder;IILandroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;IILjava/lang/Integer;Ljava/util/ArrayList;Ljava/lang/Integer;)V +SPLandroidx/compose/material3/ScaffoldKt$ScaffoldLayout$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/ScaffoldLayoutContent; +SPLandroidx/compose/material3/ScaffoldLayoutContent;->()V +Landroidx/compose/material3/ShapeDefaults; +SPLandroidx/compose/material3/ShapeDefaults;->()V +Landroidx/compose/material3/Shapes; +SPLandroidx/compose/material3/Shapes;->()V +Landroidx/compose/material3/ShapesKt; +SPLandroidx/compose/material3/ShapesKt;->()V +SPLandroidx/compose/material3/ShapesKt;->getValue(ILandroidx/compose/runtime/ComposerImpl;)Landroidx/compose/ui/graphics/Shape; +Landroidx/compose/material3/ShapesKt$LocalShapes$1; +SPLandroidx/compose/material3/ShapesKt$LocalShapes$1;->()V +SPLandroidx/compose/material3/ShapesKt$LocalShapes$1;->(II)V +SPLandroidx/compose/material3/ShapesKt$LocalShapes$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/material3/SheetDefaultsKt;->()V +PLandroidx/compose/material3/SheetDefaultsKt$rememberSheetState$2$1;->(ZLandroidx/compose/ui/unit/Density;Landroidx/compose/material3/SheetValue;Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/material3/SheetDefaultsKt$rememberSheetState$2$1;->invoke()Ljava/lang/Object; +PLandroidx/compose/material3/SheetState;->(ZLandroidx/compose/ui/unit/Density;Landroidx/compose/material3/SheetValue;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/material3/SheetState$Companion$Saver$1; +SPLandroidx/compose/material3/SheetState$Companion$Saver$1;->()V +SPLandroidx/compose/material3/SheetState$Companion$Saver$1;->(II)V +SPLandroidx/compose/material3/SheetState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/material3/SheetState$Companion$Saver$2;->(ZLandroidx/compose/ui/unit/Density;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/material3/SheetState$anchoredDraggableState$1; +SPLandroidx/compose/material3/SheetState$anchoredDraggableState$1;->(Landroidx/compose/ui/unit/Density;I)V +PLandroidx/compose/material3/SheetValue;->()V +Landroidx/compose/material3/SurfaceKt; +SPLandroidx/compose/material3/SurfaceKt;->()V +SPLandroidx/compose/material3/SurfaceKt;->Surface-T9BRK9s(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JJFFLandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/SurfaceKt;->Surface-d85dljk(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;JJFLandroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/SurfaceKt;->Surface-o_FOJdg(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;JJFFLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;II)V +SPLandroidx/compose/material3/SurfaceKt;->access$surface-XO-JAsU(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JLandroidx/compose/foundation/BorderStroke;F)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/material3/SurfaceKt;->access$surfaceColorAtElevation-CLU3JFs(JFLandroidx/compose/runtime/ComposerImpl;)J +Landroidx/compose/material3/SurfaceKt$Surface$1; +SPLandroidx/compose/material3/SurfaceKt$Surface$1;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFLandroidx/compose/foundation/BorderStroke;FLandroidx/compose/runtime/internal/ComposableLambdaImpl;)V +HSPLandroidx/compose/material3/SurfaceKt$Surface$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/SurfaceKt$Surface$2; +SPLandroidx/compose/material3/SurfaceKt$Surface$2;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFLandroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;ZLkotlin/jvm/functions/Function0;FLandroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/SurfaceKt$Surface$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/SurfaceKt$Surface$3; +SPLandroidx/compose/material3/SurfaceKt$Surface$3;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFLandroidx/compose/foundation/BorderStroke;ZLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;ZLkotlin/jvm/functions/Function0;FLandroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/compose/material3/SurfaceKt$Surface$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/SwipeToDismissBoxKt; +SPLandroidx/compose/material3/SwipeToDismissBoxKt;->()V +HSPLandroidx/compose/material3/SwipeToDismissBoxKt;->SwipeToDismissBox(Landroidx/compose/material3/SwipeToDismissBoxState;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/ui/Modifier;ZZZLandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +HSPLandroidx/compose/material3/SwipeToDismissBoxKt;->rememberSwipeToDismissBoxState(Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/material3/SwipeToDismissBoxState; +Landroidx/compose/material3/SwipeToDismissBoxKt$SwipeToDismissBox$1$1$1; +SPLandroidx/compose/material3/SwipeToDismissBoxKt$SwipeToDismissBox$1$1$1;->(Landroidx/compose/material3/SwipeToDismissBoxState;ZZ)V +HPLandroidx/compose/material3/SwipeToDismissBoxKt$SwipeToDismissBox$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/SwipeToDismissBoxState; +SPLandroidx/compose/material3/SwipeToDismissBoxState;->(Landroidx/compose/material3/SwipeToDismissBoxValue;Landroidx/compose/ui/unit/Density;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/material3/SwipeToDismissBoxValue; +SPLandroidx/compose/material3/SwipeToDismissBoxValue;->()V +Landroidx/compose/material3/TextKt; +SPLandroidx/compose/material3/TextKt;->()V +SPLandroidx/compose/material3/TextKt;->ProvideTextStyle(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +HSPLandroidx/compose/material3/TextKt;->Text--4IGK_g(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;JLandroidx/compose/ui/text/style/TextAlign;JIZIILandroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/ComposerImpl;III)V +Landroidx/compose/material3/TextKt$Text$1; +SPLandroidx/compose/material3/TextKt$Text$1;->(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontWeight;JLandroidx/compose/ui/text/style/TextAlign;JIZIILandroidx/compose/ui/text/TextStyle;III)V +Landroidx/compose/material3/ThumbNode$onAttach$1$1; +SPLandroidx/compose/material3/ThumbNode$onAttach$1$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLandroidx/compose/material3/ThumbNode$onAttach$1$1;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/flow/FlowCollector;)V +SPLandroidx/compose/material3/ThumbNode$onAttach$1$1;->(Lkotlinx/coroutines/flow/DistinctFlowImpl;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V +HSPLandroidx/compose/material3/ThumbNode$onAttach$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLandroidx/compose/material3/TimePickerKt$ClockFace$1$2$1;->(ZLandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +PLandroidx/compose/material3/TimePickerKt$ClockFace$1$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/material3/TopAppBarColors; +SPLandroidx/compose/material3/TopAppBarColors;->(JJJJJ)V +Landroidx/compose/material3/TopAppBarDefaults; +SPLandroidx/compose/material3/TopAppBarDefaults;->()V +Landroidx/compose/material3/Typography; +SPLandroidx/compose/material3/Typography;->(Landroidx/compose/ui/text/TextStyle;I)V +Landroidx/compose/material3/TypographyKt; +SPLandroidx/compose/material3/TypographyKt;->()V +SPLandroidx/compose/material3/TypographyKt;->getValue(Landroidx/compose/material3/tokens/TypographyKeyTokens;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/ui/text/TextStyle; +Landroidx/compose/material3/internal/AnchoredDragFinishedSignal; +Landroidx/compose/material3/internal/AnchoredDraggableDefaults; +SPLandroidx/compose/material3/internal/AnchoredDraggableDefaults;->()V +Landroidx/compose/material3/internal/AnchoredDraggableKt$anchoredDraggable$1; +SPLandroidx/compose/material3/internal/AnchoredDraggableKt$anchoredDraggable$1;->(Landroidx/compose/material3/internal/AnchoredDraggableState;Lkotlin/coroutines/Continuation;)V +Landroidx/compose/material3/internal/AnchoredDraggableState; +HSPLandroidx/compose/material3/internal/AnchoredDraggableState;->(Ljava/lang/Enum;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/material3/internal/AnchoredDraggableState;->computeTarget(FFLjava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/material3/internal/AnchoredDraggableState;->getAnchors()Landroidx/compose/material3/internal/MapDraggableAnchors; +SPLandroidx/compose/material3/internal/AnchoredDraggableState;->requireOffset()F +SPLandroidx/compose/material3/internal/AnchoredDraggableState;->setCurrentValue(Ljava/lang/Object;)V +SPLandroidx/compose/material3/internal/AnchoredDraggableState;->setDragTarget(Ljava/lang/Object;)V +SPLandroidx/compose/material3/internal/AnchoredDraggableState;->updateAnchors(Landroidx/compose/material3/internal/MapDraggableAnchors;Ljava/lang/Object;)V +Landroidx/compose/material3/internal/AnchoredDraggableState$anchoredDragScope$1; +SPLandroidx/compose/material3/internal/AnchoredDraggableState$anchoredDragScope$1;->(Landroidx/compose/material3/internal/AnchoredDraggableState;)V +SPLandroidx/compose/material3/internal/AnchoredDraggableState$anchoredDragScope$1;->dragTo$default(Landroidx/compose/material3/internal/AnchoredDraggableState$anchoredDragScope$1;F)V +Landroidx/compose/material3/internal/AnchoredDraggableState$draggableState$1$dragScope$1; +SPLandroidx/compose/material3/internal/AnchoredDraggableState$draggableState$1$dragScope$1;->(Landroidx/compose/material3/internal/AnchoredDraggableState;)V +Landroidx/compose/material3/internal/AnchoredDraggableState$progress$2; +SPLandroidx/compose/material3/internal/AnchoredDraggableState$progress$2;->(Landroidx/compose/material3/internal/AnchoredDraggableState;I)V +SPLandroidx/compose/material3/internal/AnchoredDraggableState$progress$2;->invoke()Ljava/lang/Object; +PLandroidx/compose/material3/internal/CalendarModelImpl$$ExternalSyntheticApiModelOutline0;->m(J)Ljava/time/Instant; +PLandroidx/compose/material3/internal/CalendarModelImpl$$ExternalSyntheticApiModelOutline0;->m(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime; +Landroidx/compose/material3/internal/CalendarModelKt; +SPLandroidx/compose/material3/internal/CalendarModelKt;->()V +SPLandroidx/compose/material3/internal/CalendarModelKt;->ProvideContentColorTextStyle-3J-VO9M(JLandroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/material3/internal/CalendarModelKt;->anchoredDraggable$default(Landroidx/compose/ui/Modifier;Landroidx/compose/material3/internal/AnchoredDraggableState;ZZI)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/material3/internal/CalendarModelKt;->draggableAnchors(Landroidx/compose/ui/Modifier;Landroidx/compose/material3/internal/AnchoredDraggableState;Landroidx/compose/foundation/gestures/Orientation;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/material3/internal/CalendarModelKt;->getString-2EP1pXo(ILandroidx/compose/runtime/ComposerImpl;)Ljava/lang/String; +Landroidx/compose/material3/internal/DraggableAnchorsElement; +SPLandroidx/compose/material3/internal/DraggableAnchorsElement;->(Landroidx/compose/material3/internal/AnchoredDraggableState;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/gestures/Orientation;)V +PLandroidx/compose/material3/internal/DraggableAnchorsElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/material3/internal/DraggableAnchorsElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/material3/internal/DraggableAnchorsElement;->update(Landroidx/compose/ui/Modifier$Node;)V +HPLandroidx/compose/material3/internal/DraggableAnchorsNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +PLandroidx/compose/material3/internal/DraggableAnchorsNode;->onDetach()V +Landroidx/compose/material3/internal/InternalMutatorMutex; +SPLandroidx/compose/material3/internal/InternalMutatorMutex;->()V +Landroidx/compose/material3/internal/MapDraggableAnchors; +SPLandroidx/compose/material3/internal/MapDraggableAnchors;->(Ljava/util/Map;)V +SPLandroidx/compose/material3/internal/MapDraggableAnchors;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/material3/internal/MapDraggableAnchors;->positionOf(Ljava/lang/Object;)F +Landroidx/compose/material3/internal/MappedInteractionSource; +SPLandroidx/compose/material3/internal/MappedInteractionSource;->(Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl;J)V +SPLandroidx/compose/material3/internal/MappedInteractionSource;->getInteractions()Lkotlinx/coroutines/flow/Flow; +Landroidx/compose/material3/internal/MutableWindowInsets; +SPLandroidx/compose/material3/internal/MutableWindowInsets;->(Landroidx/compose/foundation/layout/WindowInsets;)V +SPLandroidx/compose/material3/internal/MutableWindowInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I +SPLandroidx/compose/material3/internal/MutableWindowInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/material3/internal/MutableWindowInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/material3/internal/MutableWindowInsets;->getTop(Landroidx/compose/ui/unit/Density;)I +Landroidx/compose/material3/internal/TextFieldImplKt$Decoration$1; +SPLandroidx/compose/material3/internal/TextFieldImplKt$Decoration$1;->(JLjava/lang/Object;Lkotlin/jvm/functions/Function2;II)V +Landroidx/compose/material3/tokens/ColorSchemeKeyTokens$EnumUnboxingSharedUtility; +SPLandroidx/compose/material3/tokens/ColorSchemeKeyTokens$EnumUnboxingSharedUtility;->()V +SPLandroidx/compose/material3/tokens/ColorSchemeKeyTokens$EnumUnboxingSharedUtility;->ordinal(I)I +Landroidx/compose/material3/tokens/DividerTokens; +SPLandroidx/compose/material3/tokens/DividerTokens;->()V +Landroidx/compose/material3/tokens/ElevatedCardTokens; +SPLandroidx/compose/material3/tokens/ElevatedCardTokens;->()V +Landroidx/compose/material3/tokens/ElevationTokens; +SPLandroidx/compose/material3/tokens/ElevationTokens;->()V +Landroidx/compose/material3/tokens/ExtendedFabPrimaryTokens; +SPLandroidx/compose/material3/tokens/ExtendedFabPrimaryTokens;->()V +Landroidx/compose/material3/tokens/FabPrimaryLargeTokens; +SPLandroidx/compose/material3/tokens/FabPrimaryLargeTokens;->()V +Landroidx/compose/material3/tokens/FabPrimaryTokens; +SPLandroidx/compose/material3/tokens/FabPrimaryTokens;->()V +Landroidx/compose/material3/tokens/FilledCardTokens; +SPLandroidx/compose/material3/tokens/FilledCardTokens;->()V +Landroidx/compose/material3/tokens/IconButtonTokens; +SPLandroidx/compose/material3/tokens/IconButtonTokens;->()V +Landroidx/compose/material3/tokens/MotionTokens; +SPLandroidx/compose/material3/tokens/MotionTokens;->()V +Landroidx/compose/material3/tokens/NavigationBarTokens; +SPLandroidx/compose/material3/tokens/NavigationBarTokens;->()V +Landroidx/compose/material3/tokens/NavigationDrawerTokens; +SPLandroidx/compose/material3/tokens/NavigationDrawerTokens;->()V +Landroidx/compose/material3/tokens/ShapeTokens; +SPLandroidx/compose/material3/tokens/ShapeTokens;->()V +Landroidx/compose/material3/tokens/TopAppBarLargeTokens; +SPLandroidx/compose/material3/tokens/TopAppBarLargeTokens;->()V +Landroidx/compose/material3/tokens/TopAppBarMediumTokens; +SPLandroidx/compose/material3/tokens/TopAppBarMediumTokens;->()V +Landroidx/compose/material3/tokens/TopAppBarSmallTokens; +SPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->()V +Landroidx/compose/material3/tokens/TypeScaleTokens; +SPLandroidx/compose/material3/tokens/TypeScaleTokens;->()V +Landroidx/compose/material3/tokens/TypefaceTokens; +SPLandroidx/compose/material3/tokens/TypefaceTokens;->()V +Landroidx/compose/material3/tokens/TypographyKeyTokens; +SPLandroidx/compose/material3/tokens/TypographyKeyTokens;->()V +Landroidx/compose/material3/tokens/TypographyTokens; +SPLandroidx/compose/material3/tokens/TypographyTokens;->()V +Landroidx/compose/material3/tokens/TypographyTokensKt; +SPLandroidx/compose/material3/tokens/TypographyTokensKt;->()V +Landroidx/compose/runtime/Anchor; +SPLandroidx/compose/runtime/Anchor;->(I)V +SPLandroidx/compose/runtime/Anchor;->getValid()Z +Landroidx/compose/runtime/Applier; +SPLandroidx/compose/runtime/Applier;->apply(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V +PLandroidx/compose/runtime/Applier;->onEndChanges()V +Landroidx/compose/runtime/BroadcastFrameClock; +SPLandroidx/compose/runtime/BroadcastFrameClock;->(Landroid/view/Choreographer;Landroidx/compose/ui/platform/AndroidUiDispatcher;)V +SPLandroidx/compose/runtime/BroadcastFrameClock;->(Landroidx/compose/runtime/BroadcastFrameClock;)V +SPLandroidx/compose/runtime/BroadcastFrameClock;->(Landroidx/compose/runtime/Recomposer$$ExternalSyntheticLambda1;)V +SPLandroidx/compose/runtime/BroadcastFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLandroidx/compose/runtime/BroadcastFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLandroidx/compose/runtime/BroadcastFrameClock;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +SPLandroidx/compose/runtime/BroadcastFrameClock;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +HSPLandroidx/compose/runtime/BroadcastFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/compose/runtime/BroadcastFrameClock$$ExternalSyntheticLambda0; +SPLandroidx/compose/runtime/BroadcastFrameClock$$ExternalSyntheticLambda0;->(IJ)V +SPLandroidx/compose/runtime/BroadcastFrameClock$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter; +PLandroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter;->cancel()V +Landroidx/compose/runtime/CancellationHandle; +Landroidx/compose/runtime/CancelledCoroutineContext; +SPLandroidx/compose/runtime/CancelledCoroutineContext;->()V +Landroidx/compose/runtime/ComposeNodeLifecycleCallback; +Landroidx/compose/runtime/Composer$Companion; +SPLandroidx/compose/runtime/Composer$Companion;->()V +Landroidx/compose/runtime/ComposerImpl; +SPLandroidx/compose/runtime/ComposerImpl;->(Landroidx/compose/ui/node/UiApplier;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/SlotTable;Landroidx/collection/MutableSetWrapper;Landroidx/compose/runtime/changelist/ChangeList;Landroidx/compose/runtime/changelist/ChangeList;Landroidx/compose/ui/draw/DrawResult;Landroidx/compose/runtime/CompositionImpl;)V +HSPLandroidx/compose/runtime/ComposerImpl;->apply(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/runtime/ComposerImpl;->changed(F)Z +SPLandroidx/compose/runtime/ComposerImpl;->changed(I)Z +HSPLandroidx/compose/runtime/ComposerImpl;->changed(J)Z +HSPLandroidx/compose/runtime/ComposerImpl;->changed(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/ComposerImpl;->changed(Z)Z +SPLandroidx/compose/runtime/ComposerImpl;->changedInstance(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/ComposerImpl;->cleanUpCompose()V +HSPLandroidx/compose/runtime/ComposerImpl;->consume(Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; +SPLandroidx/compose/runtime/ComposerImpl;->createNode(Lkotlin/jvm/functions/Function0;)V +HSPLandroidx/compose/runtime/ComposerImpl;->currentCompositionLocalScope()Landroidx/compose/runtime/PersistentCompositionLocalMap; +HSPLandroidx/compose/runtime/ComposerImpl;->doCompose-aFTiNEg(Landroidx/collection/MutableScatterMap;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/runtime/ComposerImpl;->doRecordDownsFor(II)V +SPLandroidx/compose/runtime/ComposerImpl;->endDefaults()V +HSPLandroidx/compose/runtime/ComposerImpl;->endRestartGroup()Landroidx/compose/runtime/RecomposeScopeImpl; +PLandroidx/compose/runtime/ComposerImpl;->endReuseFromRoot()V +HSPLandroidx/compose/runtime/ComposerImpl;->endRoot()V +HSPLandroidx/compose/runtime/ComposerImpl;->enterGroup(ZLandroidx/compose/runtime/Pending;)V +SPLandroidx/compose/runtime/ComposerImpl;->forceFreshInsertTable()V +HSPLandroidx/compose/runtime/ComposerImpl;->getCurrentRecomposeScope$runtime()Landroidx/compose/runtime/RecomposeScopeImpl; +PLandroidx/compose/runtime/ComposerImpl;->getDefaultsInvalid()Z +SPLandroidx/compose/runtime/ComposerImpl;->getErrorContext$runtime()Landroidx/compose/runtime/tooling/CompositionErrorContextImpl; +SPLandroidx/compose/runtime/ComposerImpl;->getSkipping()Z +HSPLandroidx/compose/runtime/ComposerImpl;->nextSlot()Ljava/lang/Object; +SPLandroidx/compose/runtime/ComposerImpl;->rGroupIndexOf(I)I +PLandroidx/compose/runtime/ComposerImpl;->recordDelete()V +PLandroidx/compose/runtime/ComposerImpl;->recordProviderUpdate(Landroidx/compose/runtime/PersistentCompositionLocalMap;)V +SPLandroidx/compose/runtime/ComposerImpl;->recordUpsAndDowns(III)V +HSPLandroidx/compose/runtime/ComposerImpl;->rememberedValue()Ljava/lang/Object; +PLandroidx/compose/runtime/ComposerImpl;->reportFreeMovableContent$reportGroup(IILandroidx/compose/runtime/ComposerImpl;Z)I +PLandroidx/compose/runtime/ComposerImpl;->reportFreeMovableContent(I)V +HSPLandroidx/compose/runtime/ComposerImpl;->shouldExecute(IZ)Z +SPLandroidx/compose/runtime/ComposerImpl;->skipCurrentGroup()V +SPLandroidx/compose/runtime/ComposerImpl;->skipReaderToGroupEnd()V +SPLandroidx/compose/runtime/ComposerImpl;->skipToGroupEnd()V +SPLandroidx/compose/runtime/ComposerImpl;->startDefaults()V +SPLandroidx/compose/runtime/ComposerImpl;->startGroup(ILandroidx/compose/runtime/OpaqueKey;)V +HSPLandroidx/compose/runtime/ComposerImpl;->startReaderGroup(Ljava/lang/Object;Z)V +HSPLandroidx/compose/runtime/ComposerImpl;->startReplaceGroup(I)V +SPLandroidx/compose/runtime/ComposerImpl;->startReplaceableGroup(I)V +HSPLandroidx/compose/runtime/ComposerImpl;->startRestartGroup(I)Landroidx/compose/runtime/ComposerImpl; +SPLandroidx/compose/runtime/ComposerImpl;->startReusableGroup(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/ComposerImpl;->startReusableNode()V +HSPLandroidx/compose/runtime/ComposerImpl;->startRoot()V +SPLandroidx/compose/runtime/ComposerImpl;->tryImminentInvalidation$runtime(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/ComposerImpl;->updateComposerInvalidations-RY85e9Y(Landroidx/collection/MutableScatterMap;)V +PLandroidx/compose/runtime/ComposerImpl;->updateNodeCount(II)V +PLandroidx/compose/runtime/ComposerImpl;->updateNodeCountOverrides(II)V +HSPLandroidx/compose/runtime/ComposerImpl;->updateProviderMapGroup(Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; +HSPLandroidx/compose/runtime/ComposerImpl;->updateRememberedValue(Ljava/lang/Object;)V +HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V +HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I +HSPLandroidx/compose/runtime/ComposerImpl;->useNode()V +Landroidx/compose/runtime/ComposerImpl$$ExternalSyntheticLambda0; +SPLandroidx/compose/runtime/ComposerImpl$$ExternalSyntheticLambda0;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLandroidx/compose/runtime/ComposerImpl$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/compose/runtime/ComposerImpl$CompositionContextHolder; +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->(Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl;)V +PLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->onForgotten()V +Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl; +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->(Landroidx/compose/runtime/ComposerImpl;JZZLandroidx/compose/ui/draw/DrawResult;)V +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->composeInitial$runtime(Landroidx/compose/runtime/CompositionImpl;Lkotlin/jvm/functions/Function2;)V +PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->composeInitialPaused$runtime(Landroidx/compose/runtime/CompositionImpl;Landroidx/compose/runtime/ShouldPauseCallback;Lkotlin/jvm/functions/Function2;)Landroidx/collection/MutableScatterSet; +PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->dispose()V +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->doneComposing$runtime()V +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCollectingCallByInformation$runtime()Z +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCollectingParameterInformation$runtime()Z +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCollectingSourceInformation$runtime()Z +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompositeKeyHashCode$runtime()J +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompositionLocalScope$runtime()Landroidx/compose/runtime/PersistentCompositionLocalMap; +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getEffectCoroutineContext()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getStackTraceEnabled$runtime()Z +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->invalidate$runtime(Landroidx/compose/runtime/CompositionImpl;)V +PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->recomposePaused$runtime(Landroidx/compose/runtime/CompositionImpl;Landroidx/compose/runtime/ShouldPauseCallback;Landroidx/collection/MutableScatterSet;)Landroidx/collection/MutableScatterSet; +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->registerComposer$runtime(Landroidx/compose/runtime/ComposerImpl;)V +PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->reportPausedScope$runtime(Landroidx/compose/runtime/RecomposeScopeImpl;)V +PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->reportRemovedComposition$runtime(Landroidx/compose/runtime/CompositionImpl;)V +SPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->startComposing$runtime()V +PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposer$runtime(Landroidx/compose/runtime/ComposerImpl;)V +PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposition$runtime(Landroidx/compose/runtime/CompositionImpl;)V +Landroidx/compose/runtime/ComposerImpl$derivedStateObserver$1; +SPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->(ILjava/lang/Object;)V +SPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->done()V +SPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->start()V +Landroidx/compose/runtime/ComposerKt; +SPLandroidx/compose/runtime/ComposerKt;->()V +Landroidx/compose/runtime/Composition; +Landroidx/compose/runtime/CompositionContext; +SPLandroidx/compose/runtime/CompositionContext;->doneComposing$runtime()V +SPLandroidx/compose/runtime/CompositionContext;->getCompositionLocalScope$runtime()Landroidx/compose/runtime/PersistentCompositionLocalMap; +SPLandroidx/compose/runtime/CompositionContext;->registerComposer$runtime(Landroidx/compose/runtime/ComposerImpl;)V +SPLandroidx/compose/runtime/CompositionContext;->startComposing$runtime()V +Landroidx/compose/runtime/CompositionContextKt; +SPLandroidx/compose/runtime/CompositionContextKt;->()V +Landroidx/compose/runtime/CompositionImpl; +SPLandroidx/compose/runtime/CompositionImpl;->(Landroidx/compose/runtime/CompositionContext;Landroidx/compose/ui/node/UiApplier;)V +SPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked(Ljava/lang/Object;Z)V +SPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked(Ljava/util/Set;Z)V +SPLandroidx/compose/runtime/CompositionImpl;->applyChanges()V +HSPLandroidx/compose/runtime/CompositionImpl;->applyChangesInLocked(Landroidx/compose/runtime/changelist/ChangeList;)V +SPLandroidx/compose/runtime/CompositionImpl;->applyLateChanges()V +SPLandroidx/compose/runtime/CompositionImpl;->changesApplied()V +SPLandroidx/compose/runtime/CompositionImpl;->cleanUpDerivedStateObservations()V +SPLandroidx/compose/runtime/CompositionImpl;->clearDeactivated()Z +SPLandroidx/compose/runtime/CompositionImpl;->composeContent(Lkotlin/jvm/functions/Function2;)V +PLandroidx/compose/runtime/CompositionImpl;->composeInitialPaused(ZLkotlin/jvm/functions/Function2;)Landroidx/compose/runtime/PausedCompositionImpl; +HPLandroidx/compose/runtime/CompositionImpl;->deactivate()V +PLandroidx/compose/runtime/CompositionImpl;->dispose()V +SPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsForCompositionLocked()V +SPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsLocked()V +PLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsOutOfBandLocked()V +SPLandroidx/compose/runtime/CompositionImpl;->ensureRunning()V +SPLandroidx/compose/runtime/CompositionImpl;->invalidate(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)Landroidx/compose/runtime/InvalidationResult; +SPLandroidx/compose/runtime/CompositionImpl;->invalidateChecked(Landroidx/compose/runtime/RecomposeScopeImpl;Landroidx/compose/runtime/Anchor;Ljava/lang/Object;)Landroidx/compose/runtime/InvalidationResult; +SPLandroidx/compose/runtime/CompositionImpl;->invalidateScopeOfLocked(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/CompositionImpl;->observesAnyOf(Ljava/util/Set;)Z +SPLandroidx/compose/runtime/CompositionImpl;->recompose()Z +SPLandroidx/compose/runtime/CompositionImpl;->recordModificationsOf(Landroidx/compose/runtime/collection/ScatterSetWrapper;)V +HSPLandroidx/compose/runtime/CompositionImpl;->recordReadOf(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/CompositionImpl;->recordWriteOf(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/CompositionImpl;->setContent(Lkotlin/jvm/functions/Function2;)V +Landroidx/compose/runtime/CompositionLocalMap; +SPLandroidx/compose/runtime/CompositionLocalMap;->()V +Landroidx/compose/runtime/CompositionLocalMap$Companion; +SPLandroidx/compose/runtime/CompositionLocalMap$Companion;->()V +Landroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller; +SPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->(Lkotlinx/coroutines/CoroutineScope;)V +SPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->onRemembered()V +Landroidx/compose/runtime/ComputedValueHolder; +SPLandroidx/compose/runtime/ComputedValueHolder;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/ComputedValueHolder;->readValue(Landroidx/compose/runtime/PersistentCompositionLocalMap;)Ljava/lang/Object; +Landroidx/compose/runtime/DerivedSnapshotState; +SPLandroidx/compose/runtime/DerivedSnapshotState;->(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)V +HSPLandroidx/compose/runtime/DerivedSnapshotState;->getCurrentRecord()Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; +SPLandroidx/compose/runtime/DerivedSnapshotState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; +HSPLandroidx/compose/runtime/DerivedSnapshotState;->getValue()Ljava/lang/Object; +SPLandroidx/compose/runtime/DerivedSnapshotState;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V +Landroidx/compose/runtime/DerivedSnapshotState$$ExternalSyntheticLambda0; +SPLandroidx/compose/runtime/DerivedSnapshotState$$ExternalSyntheticLambda0;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;II)V +SPLandroidx/compose/runtime/DerivedSnapshotState$$ExternalSyntheticLambda0;->([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/foundation/layout/RowMeasurePolicy;I[I)V +Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; +SPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->()V +SPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->(J)V +SPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V +SPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->create(J)Landroidx/compose/runtime/snapshots/StateRecord; +Landroidx/compose/runtime/DisposableEffectImpl; +SPLandroidx/compose/runtime/DisposableEffectImpl;->(Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/runtime/DisposableEffectImpl;->onForgotten()V +SPLandroidx/compose/runtime/DisposableEffectImpl;->onRemembered()V +Landroidx/compose/runtime/DisposableEffectResult; +Landroidx/compose/runtime/DisposableEffectScope; +Landroidx/compose/runtime/DynamicProvidableCompositionLocal; +SPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->(Lkotlin/jvm/functions/Function0;)V +SPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->defaultProvidedValue$runtime(Ljava/lang/Object;)Landroidx/compose/runtime/ProvidedValue; +SPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->getDefaultValueHolder$runtime()Landroidx/compose/runtime/ValueHolder; +Landroidx/compose/runtime/DynamicValueHolder; +SPLandroidx/compose/runtime/DynamicValueHolder;->(Landroidx/compose/runtime/ParcelableSnapshotMutableState;)V +SPLandroidx/compose/runtime/DynamicValueHolder;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/DynamicValueHolder;->readValue(Landroidx/compose/runtime/PersistentCompositionLocalMap;)Ljava/lang/Object; +Landroidx/compose/runtime/ForgottenCoroutineScopeException; +SPLandroidx/compose/runtime/ForgottenCoroutineScopeException;->(I)V +Landroidx/compose/runtime/GroupInfo; +SPLandroidx/compose/runtime/GroupInfo;->(III)V +Landroidx/compose/runtime/IntStack; +SPLandroidx/compose/runtime/IntStack;->()V +SPLandroidx/compose/runtime/IntStack;->peekOr(I)I +HSPLandroidx/compose/runtime/IntStack;->pop()I +HSPLandroidx/compose/runtime/IntStack;->push(I)V +Landroidx/compose/runtime/Invalidation; +SPLandroidx/compose/runtime/Invalidation;->(Landroidx/compose/runtime/RecomposeScopeImpl;ILjava/lang/Object;)V +Landroidx/compose/runtime/InvalidationResult; +SPLandroidx/compose/runtime/InvalidationResult;->()V +PLandroidx/compose/runtime/JoinedKey;->(Ljava/lang/Integer;Ljava/lang/Object;)V +PLandroidx/compose/runtime/JoinedKey;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/runtime/JoinedKey;->hashCode()I +Landroidx/compose/runtime/KeyInfo; +SPLandroidx/compose/runtime/KeyInfo;->(Ljava/lang/Object;III)V +Landroidx/compose/runtime/Latch; +SPLandroidx/compose/runtime/Latch;->()V +SPLandroidx/compose/runtime/Latch;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/foundation/lazy/layout/PrefetchScheduler;)V +SPLandroidx/compose/runtime/Latch;->(Landroidx/room/RoomDatabase$$ExternalSyntheticLambda0;)V +SPLandroidx/compose/runtime/Latch;->(Lio/ktor/events/Events;Z)V +PLandroidx/compose/runtime/Latch;->onFinish(Lkotlinx/coroutines/Job;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/compose/runtime/Latch;->tryEnqueue(Lkotlinx/coroutines/Job;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/compose/runtime/Latch$await$2$2; +SPLandroidx/compose/runtime/Latch$await$2$2;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLandroidx/compose/runtime/Latch$await$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/LaunchedEffectImpl; +SPLandroidx/compose/runtime/LaunchedEffectImpl;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/runtime/LaunchedEffectImpl;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLandroidx/compose/runtime/LaunchedEffectImpl;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLandroidx/compose/runtime/LaunchedEffectImpl;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +SPLandroidx/compose/runtime/LaunchedEffectImpl;->onForgotten()V +SPLandroidx/compose/runtime/LaunchedEffectImpl;->onRemembered()V +Landroidx/compose/runtime/LazyValueHolder; +SPLandroidx/compose/runtime/LazyValueHolder;->(Lkotlin/jvm/functions/Function0;)V +SPLandroidx/compose/runtime/LazyValueHolder;->readValue(Landroidx/compose/runtime/PersistentCompositionLocalMap;)Ljava/lang/Object; +Landroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2; +SPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->(ILkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/MutableState; +Landroidx/compose/runtime/NeverEqualPolicy; +SPLandroidx/compose/runtime/NeverEqualPolicy;->()V +SPLandroidx/compose/runtime/NeverEqualPolicy;->(I)V +SPLandroidx/compose/runtime/NeverEqualPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z +Landroidx/compose/runtime/OpaqueKey; +SPLandroidx/compose/runtime/OpaqueKey;->(Ljava/lang/String;)V +SPLandroidx/compose/runtime/OpaqueKey;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/OpaqueKey;->hashCode()I +Landroidx/compose/runtime/ParcelableSnapshotMutableFloatState; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->()V +SPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->(F)V +SPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->getFloatValue()F +SPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->setFloatValue(F)V +Landroidx/compose/runtime/ParcelableSnapshotMutableIntState; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->()V +SPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->(I)V +SPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->getIntValue()I +SPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V +HSPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->setIntValue(I)V +Landroidx/compose/runtime/ParcelableSnapshotMutableIntState$Companion$CREATOR$1; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState$Companion$CREATOR$1;->(I)V +Landroidx/compose/runtime/ParcelableSnapshotMutableLongState; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->()V +SPLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->(J)V +PLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; +PLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->setLongValue(J)V +Landroidx/compose/runtime/ParcelableSnapshotMutableState; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->()V +HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)V +SPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->getPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; +HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->getValue()Ljava/lang/Object; +SPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V +Landroidx/compose/runtime/ParcelableSnapshotMutableState$Companion$CREATOR$1; +Landroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1; +SPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;->(Landroidx/compose/runtime/BroadcastFrameClock;Lkotlin/coroutines/Continuation;)V +SPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/runtime/PausedCompositionImpl;->(Landroidx/compose/runtime/CompositionImpl;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/ComposerImpl;Landroidx/collection/MutableSetWrapper;Lkotlin/jvm/functions/Function2;ZLandroidx/compose/ui/node/UiApplier;Ljava/lang/Object;)V +PLandroidx/compose/runtime/PausedCompositionImpl;->apply()V +PLandroidx/compose/runtime/PausedCompositionImpl;->applyChanges()V +PLandroidx/compose/runtime/PausedCompositionImpl;->isComplete()Z +PLandroidx/compose/runtime/PausedCompositionImpl;->markComplete()V +PLandroidx/compose/runtime/PausedCompositionImpl;->resume(Landroidx/compose/runtime/ShouldPauseCallback;)Z +PLandroidx/compose/runtime/PausedCompositionState;->()V +Landroidx/compose/runtime/Pending; +SPLandroidx/compose/runtime/Pending;->(ILjava/util/ArrayList;)V +PLandroidx/compose/runtime/Pending;->updateNodeCount(II)Z +Landroidx/compose/runtime/Pending$keyMap$2; +SPLandroidx/compose/runtime/Pending$keyMap$2;->(ILjava/lang/Object;)V +SPLandroidx/compose/runtime/Pending$keyMap$2;->invoke()Ljava/lang/Object; +Landroidx/compose/runtime/PersistentCompositionLocalMap; +Landroidx/compose/runtime/PreconditionsKt; +Landroidx/compose/runtime/ProduceStateScopeImpl; +SPLandroidx/compose/runtime/ProduceStateScopeImpl;->(Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/CoroutineContext;)V +SPLandroidx/compose/runtime/ProduceStateScopeImpl;->setValue(Ljava/lang/Object;)V +Landroidx/compose/runtime/ProvidableCompositionLocal; +SPLandroidx/compose/runtime/ProvidableCompositionLocal;->(Lkotlin/jvm/functions/Function0;)V +SPLandroidx/compose/runtime/ProvidableCompositionLocal;->getDefaultValueHolder$runtime()Landroidx/compose/runtime/ValueHolder; +HSPLandroidx/compose/runtime/ProvidableCompositionLocal;->updatedStateOf$runtime(Landroidx/compose/runtime/ProvidedValue;Landroidx/compose/runtime/ValueHolder;)Landroidx/compose/runtime/ValueHolder; +Landroidx/compose/runtime/ProvidedValue; +SPLandroidx/compose/runtime/ProvidedValue;->(Landroidx/compose/runtime/ProvidableCompositionLocal;Ljava/lang/Object;ZLandroidx/compose/runtime/SnapshotMutationPolicy;Z)V +SPLandroidx/compose/runtime/ProvidedValue;->getEffectiveValue$runtime()Ljava/lang/Object; +Landroidx/compose/runtime/RecomposeScopeImpl; +SPLandroidx/compose/runtime/RecomposeScopeImpl;->(Landroidx/compose/runtime/CompositionImpl;)V +PLandroidx/compose/runtime/RecomposeScopeImpl;->checkDerivedStateChanged(Landroidx/compose/runtime/DerivedSnapshotState;Landroidx/collection/MutableScatterMap;)Z +PLandroidx/compose/runtime/RecomposeScopeImpl;->getValid()Z +SPLandroidx/compose/runtime/RecomposeScopeImpl;->invalidateForResult(Ljava/lang/Object;)Landroidx/compose/runtime/InvalidationResult; +PLandroidx/compose/runtime/RecomposeScopeImpl;->release()V +Landroidx/compose/runtime/Recomposer; +SPLandroidx/compose/runtime/Recomposer;->()V +SPLandroidx/compose/runtime/Recomposer;->(Lkotlin/coroutines/CoroutineContext;)V +SPLandroidx/compose/runtime/Recomposer;->applyAndCheck(Landroidx/compose/runtime/snapshots/MutableSnapshot;)V +HSPLandroidx/compose/runtime/Recomposer;->composeInitial$runtime(Landroidx/compose/runtime/CompositionImpl;Lkotlin/jvm/functions/Function2;)V +PLandroidx/compose/runtime/Recomposer;->composeInitialPaused$runtime(Landroidx/compose/runtime/CompositionImpl;Landroidx/compose/runtime/ShouldPauseCallback;Lkotlin/jvm/functions/Function2;)Landroidx/collection/MutableScatterSet; +HSPLandroidx/compose/runtime/Recomposer;->deriveStateLocked()Lkotlinx/coroutines/CancellableContinuation; +SPLandroidx/compose/runtime/Recomposer;->getCollectingCallByInformation$runtime()Z +SPLandroidx/compose/runtime/Recomposer;->getCollectingParameterInformation$runtime()Z +SPLandroidx/compose/runtime/Recomposer;->getCollectingSourceInformation$runtime()Z +SPLandroidx/compose/runtime/Recomposer;->getCompositeKeyHashCode$runtime()J +SPLandroidx/compose/runtime/Recomposer;->getEffectCoroutineContext()Lkotlin/coroutines/CoroutineContext; +HSPLandroidx/compose/runtime/Recomposer;->getHasBroadcastFrameClockAwaitersLocked()Z +SPLandroidx/compose/runtime/Recomposer;->getHasFrameWorkLocked()Z +SPLandroidx/compose/runtime/Recomposer;->getHasNextFrameEndAwaitersLocked()Z +SPLandroidx/compose/runtime/Recomposer;->getHasSchedulingWork()Z +SPLandroidx/compose/runtime/Recomposer;->getStackTraceEnabled$runtime()Z +SPLandroidx/compose/runtime/Recomposer;->invalidate$runtime(Landroidx/compose/runtime/CompositionImpl;)V +SPLandroidx/compose/runtime/Recomposer;->knownCompositionsLocked()Ljava/util/List; +SPLandroidx/compose/runtime/Recomposer;->onNewFrameAwaiter()V +SPLandroidx/compose/runtime/Recomposer;->performInitialMovableContentInserts(Landroidx/compose/runtime/CompositionImpl;)V +HSPLandroidx/compose/runtime/Recomposer;->performRecompose(Landroidx/compose/runtime/CompositionImpl;Landroidx/collection/MutableScatterSet;)Landroidx/compose/runtime/CompositionImpl; +PLandroidx/compose/runtime/Recomposer;->recomposePaused$runtime(Landroidx/compose/runtime/CompositionImpl;Landroidx/compose/runtime/ShouldPauseCallback;Landroidx/collection/MutableScatterSet;)Landroidx/collection/MutableScatterSet; +HSPLandroidx/compose/runtime/Recomposer;->recordComposerModifications()Z +PLandroidx/compose/runtime/Recomposer;->reportPausedScope$runtime(Landroidx/compose/runtime/RecomposeScopeImpl;)V +PLandroidx/compose/runtime/Recomposer;->reportRemovedComposition$runtime(Landroidx/compose/runtime/CompositionImpl;)V +PLandroidx/compose/runtime/Recomposer;->unregisterComposition$runtime(Landroidx/compose/runtime/CompositionImpl;)V +Landroidx/compose/runtime/Recomposer$$ExternalSyntheticLambda0; +SPLandroidx/compose/runtime/Recomposer$$ExternalSyntheticLambda0;->(ILjava/lang/Object;)V +Landroidx/compose/runtime/Recomposer$$ExternalSyntheticLambda1; +SPLandroidx/compose/runtime/Recomposer$$ExternalSyntheticLambda1;->(Landroidx/compose/runtime/Recomposer;I)V +SPLandroidx/compose/runtime/Recomposer$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Landroidx/compose/runtime/Recomposer$State; +SPLandroidx/compose/runtime/Recomposer$State;->()V +Landroidx/compose/runtime/Recomposer$join$2; +SPLandroidx/compose/runtime/Recomposer$join$2;->(ILkotlin/coroutines/Continuation;I)V +SPLandroidx/compose/runtime/Recomposer$join$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +HSPLandroidx/compose/runtime/Recomposer$join$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/compose/runtime/Recomposer$join$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2; +SPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->(Landroidx/compose/runtime/Recomposer;Lkotlin/coroutines/Continuation;)V +SPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invokeSuspend$fillToInsert(Ljava/util/List;Landroidx/compose/runtime/Recomposer;)V +HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$$ExternalSyntheticLambda0; +SPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$$ExternalSyntheticLambda0;->(Landroidx/compose/runtime/Recomposer;Landroidx/collection/MutableScatterSet;Landroidx/collection/MutableScatterSet;Ljava/util/List;Ljava/util/List;Landroidx/collection/MutableScatterSet;Ljava/util/List;Landroidx/collection/MutableScatterSet;Ljava/util/Set;)V +HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/runtime/RecordingApplier;->(Ljava/lang/Object;)V +PLandroidx/compose/runtime/RecordingApplier;->apply(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V +PLandroidx/compose/runtime/RecordingApplier;->down(Ljava/lang/Object;)V +PLandroidx/compose/runtime/RecordingApplier;->insertBottomUp(ILjava/lang/Object;)V +PLandroidx/compose/runtime/RecordingApplier;->insertTopDown(ILjava/lang/Object;)V +HPLandroidx/compose/runtime/RecordingApplier;->playTo(Landroidx/compose/ui/node/UiApplier;Landroidx/compose/runtime/internal/RememberEventDispatcher;)V +PLandroidx/compose/runtime/RecordingApplier;->remove(II)V +PLandroidx/compose/runtime/RecordingApplier;->reuse()V +PLandroidx/compose/runtime/RecordingApplier;->up()V +Landroidx/compose/runtime/RememberObserver; +Landroidx/compose/runtime/RememberObserverHolder; +SPLandroidx/compose/runtime/RememberObserverHolder;->(Landroidx/compose/runtime/RememberObserver;I)V +Landroidx/compose/runtime/RememberedCoroutineScope; +SPLandroidx/compose/runtime/RememberedCoroutineScope;->()V +SPLandroidx/compose/runtime/RememberedCoroutineScope;->(Lkotlin/coroutines/CoroutineContext;)V +PLandroidx/compose/runtime/RememberedCoroutineScope;->cancelIfCreated()V +PLandroidx/compose/runtime/RememberedCoroutineScope;->onForgotten()V +SPLandroidx/compose/runtime/RememberedCoroutineScope;->onRemembered()V +Landroidx/compose/runtime/ReusableRememberObserverHolder; +Landroidx/compose/runtime/ShouldPauseCallback; +Landroidx/compose/runtime/SlotReader; +SPLandroidx/compose/runtime/SlotReader;->(Landroidx/compose/runtime/SlotTable;)V +SPLandroidx/compose/runtime/SlotReader;->anchor(I)Landroidx/compose/runtime/Anchor; +SPLandroidx/compose/runtime/SlotReader;->aux([II)Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotReader;->close()V +PLandroidx/compose/runtime/SlotReader;->containsMark(I)Z +HSPLandroidx/compose/runtime/SlotReader;->endGroup()V +SPLandroidx/compose/runtime/SlotReader;->getGroupAux()Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotReader;->getGroupKey()I +PLandroidx/compose/runtime/SlotReader;->groupGet(II)Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotReader;->groupKey(I)I +PLandroidx/compose/runtime/SlotReader;->hasMark(I)Z +SPLandroidx/compose/runtime/SlotReader;->hasObjectKey(I)Z +SPLandroidx/compose/runtime/SlotReader;->isNode(I)Z +SPLandroidx/compose/runtime/SlotReader;->next()Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotReader;->node(I)Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotReader;->nodeCount(I)I +SPLandroidx/compose/runtime/SlotReader;->objectKey([II)Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotReader;->parent(I)I +SPLandroidx/compose/runtime/SlotReader;->reposition(I)V +PLandroidx/compose/runtime/SlotReader;->skipGroup()I +SPLandroidx/compose/runtime/SlotReader;->skipToGroupEnd()V +HSPLandroidx/compose/runtime/SlotReader;->startGroup()V +Landroidx/compose/runtime/SlotTable; +SPLandroidx/compose/runtime/SlotTable;->()V +SPLandroidx/compose/runtime/SlotTable;->anchorIndex(Landroidx/compose/runtime/Anchor;)I +SPLandroidx/compose/runtime/SlotTable;->openReader()Landroidx/compose/runtime/SlotReader; +SPLandroidx/compose/runtime/SlotTable;->openWriter()Landroidx/compose/runtime/SlotWriter; +SPLandroidx/compose/runtime/SlotTable;->ownsAnchor(Landroidx/compose/runtime/Anchor;)Z +Landroidx/compose/runtime/SlotTableKt; +SPLandroidx/compose/runtime/SlotTableKt;->access$groupSize([II)I +PLandroidx/compose/runtime/SlotTableKt;->access$locationOf(Ljava/util/ArrayList;II)I +HSPLandroidx/compose/runtime/SlotTableKt;->access$slotAnchor([II)I +SPLandroidx/compose/runtime/SlotTableKt;->access$updateNodeCount([III)V +HSPLandroidx/compose/runtime/SlotTableKt;->search(Ljava/util/ArrayList;II)I +Landroidx/compose/runtime/SlotWriter; +HSPLandroidx/compose/runtime/SlotWriter;->(Landroidx/compose/runtime/SlotTable;)V +SPLandroidx/compose/runtime/SlotWriter;->advanceBy(I)V +HSPLandroidx/compose/runtime/SlotWriter;->anchor(I)Landroidx/compose/runtime/Anchor; +SPLandroidx/compose/runtime/SlotWriter;->anchorIndex(Landroidx/compose/runtime/Anchor;)I +SPLandroidx/compose/runtime/SlotWriter;->beginInsert()V +HSPLandroidx/compose/runtime/SlotWriter;->close(Z)V +SPLandroidx/compose/runtime/SlotWriter;->dataIndex(I)I +HSPLandroidx/compose/runtime/SlotWriter;->dataIndex([II)I +HSPLandroidx/compose/runtime/SlotWriter;->dataIndexToDataAddress(I)I +SPLandroidx/compose/runtime/SlotWriter;->dataIndexToDataAnchor(IIII)I +HSPLandroidx/compose/runtime/SlotWriter;->endGroup()V +SPLandroidx/compose/runtime/SlotWriter;->endInsert()V +PLandroidx/compose/runtime/SlotWriter;->ensureStarted(I)V +PLandroidx/compose/runtime/SlotWriter;->fixParentAnchorsFor(III)V +SPLandroidx/compose/runtime/SlotWriter;->getCapacity()I +SPLandroidx/compose/runtime/SlotWriter;->getSize$runtime()I +SPLandroidx/compose/runtime/SlotWriter;->groupAux(I)Ljava/lang/Object; +HSPLandroidx/compose/runtime/SlotWriter;->groupIndexToAddress(I)I +SPLandroidx/compose/runtime/SlotWriter;->groupKey(I)I +SPLandroidx/compose/runtime/SlotWriter;->groupObjectKey(I)Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotWriter;->groupSize(I)I +HSPLandroidx/compose/runtime/SlotWriter;->insertGroups(I)V +HSPLandroidx/compose/runtime/SlotWriter;->insertSlots(II)V +SPLandroidx/compose/runtime/SlotWriter;->markGroup$default(Landroidx/compose/runtime/SlotWriter;)V +SPLandroidx/compose/runtime/SlotWriter;->moveFrom(Landroidx/compose/runtime/SlotTable;I)V +SPLandroidx/compose/runtime/SlotWriter;->moveGroupGapTo(I)V +HSPLandroidx/compose/runtime/SlotWriter;->moveSlotGapTo(II)V +SPLandroidx/compose/runtime/SlotWriter;->node(I)Ljava/lang/Object; +HSPLandroidx/compose/runtime/SlotWriter;->parent([II)I +HSPLandroidx/compose/runtime/SlotWriter;->rawUpdate(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/runtime/SlotWriter;->recalculateMarks()V +PLandroidx/compose/runtime/SlotWriter;->removeGroup()Z +PLandroidx/compose/runtime/SlotWriter;->removeGroups(II)Z +PLandroidx/compose/runtime/SlotWriter;->removeSlots(III)V +HSPLandroidx/compose/runtime/SlotWriter;->set(IILjava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/runtime/SlotWriter;->skipGroup()I +SPLandroidx/compose/runtime/SlotWriter;->skipToGroupEnd()V +HSPLandroidx/compose/runtime/SlotWriter;->slotIndex([II)I +SPLandroidx/compose/runtime/SlotWriter;->sourceInformationOf$runtime(I)Landroidx/compose/runtime/GroupSourceInformation; +PLandroidx/compose/runtime/SlotWriter;->startGroup()V +HSPLandroidx/compose/runtime/SlotWriter;->startGroup(ILjava/lang/Object;Ljava/lang/Object;Z)V +PLandroidx/compose/runtime/SlotWriter;->updateAux(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/SlotWriter;->updateContainsMark(I)V +SPLandroidx/compose/runtime/SlotWriter;->updateNodeOfGroup(ILjava/lang/Object;)V +Landroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord; +SPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->(FJ)V +SPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V +Landroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord; +SPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->(IJ)V +SPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V +SPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->create(J)Landroidx/compose/runtime/snapshots/StateRecord; +Landroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord; +SPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->(JJ)V +PLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V +Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord; +SPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->(JLjava/lang/Object;)V +SPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V +SPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->create(J)Landroidx/compose/runtime/snapshots/StateRecord; +Landroidx/compose/runtime/SnapshotMutationPolicy; +Landroidx/compose/runtime/SnapshotStateKt__DerivedStateKt; +SPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->()V +Landroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1$1; +SPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1$1;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1$1; +SPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1$1;->(Landroidx/compose/runtime/ProduceStateScopeImpl;I)V +SPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/compose/runtime/State; +Landroidx/compose/runtime/StaticProvidableCompositionLocal; +SPLandroidx/compose/runtime/StaticProvidableCompositionLocal;->defaultProvidedValue$runtime(Ljava/lang/Object;)Landroidx/compose/runtime/ProvidedValue; +Landroidx/compose/runtime/StaticValueHolder; +SPLandroidx/compose/runtime/StaticValueHolder;->(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/StaticValueHolder;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/StaticValueHolder;->readValue(Landroidx/compose/runtime/PersistentCompositionLocalMap;)Ljava/lang/Object; +Landroidx/compose/runtime/Updater; +SPLandroidx/compose/runtime/Updater;->()V +HSPLandroidx/compose/runtime/Updater;->CompositionLocalProvider(Landroidx/compose/runtime/ProvidedValue;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +HSPLandroidx/compose/runtime/Updater;->CompositionLocalProvider([Landroidx/compose/runtime/ProvidedValue;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/runtime/Updater;->DisposableEffect(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;)V +SPLandroidx/compose/runtime/Updater;->DisposableEffect(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;)V +SPLandroidx/compose/runtime/Updater;->LaunchedEffect(Landroidx/compose/runtime/ComposerImpl;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/runtime/Updater;->LaunchedEffect(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;)V +SPLandroidx/compose/runtime/Updater;->SideEffect(Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;)V +PLandroidx/compose/runtime/Updater;->access$removeRange(Ljava/util/List;II)V +SPLandroidx/compose/runtime/Updater;->add-impl(Landroidx/collection/MutableIntList;I)V +SPLandroidx/compose/runtime/Updater;->collectAsState(Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext;Landroidx/compose/runtime/ComposerImpl;II)Landroidx/compose/runtime/MutableState; +SPLandroidx/compose/runtime/Updater;->collectAsState(Lkotlinx/coroutines/flow/StateFlow;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/MutableState; +SPLandroidx/compose/runtime/Updater;->createCompositionCoroutineScope(Landroidx/compose/runtime/ComposerImpl;)Lkotlinx/coroutines/CoroutineScope; +HSPLandroidx/compose/runtime/Updater;->derivedStateObservers()Landroidx/compose/runtime/collection/MutableVector; +SPLandroidx/compose/runtime/Updater;->derivedStateOf(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DerivedSnapshotState; +SPLandroidx/compose/runtime/Updater;->derivedStateOf(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DerivedSnapshotState; +SPLandroidx/compose/runtime/Updater;->findLocation(ILjava/util/List;)I +SPLandroidx/compose/runtime/Updater;->getCurrentCompositeKeyHash(Landroidx/compose/runtime/ComposerImpl;)I +SPLandroidx/compose/runtime/Updater;->getMonotonicFrameClock(Lkotlin/coroutines/CoroutineContext;)Landroidx/compose/runtime/BroadcastFrameClock; +SPLandroidx/compose/runtime/Updater;->init-impl(Landroidx/compose/runtime/ComposerImpl;Ljava/lang/Integer;Lkotlin/jvm/functions/Function2;)V +PLandroidx/compose/runtime/Updater;->moveGroup(Landroidx/compose/runtime/SlotWriter;ILandroidx/compose/runtime/SlotWriter;ZZZ)Ljava/util/List; +SPLandroidx/compose/runtime/Updater;->mutableStateOf$default(Ljava/lang/Object;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; +HSPLandroidx/compose/runtime/Updater;->reconcile-impl(Landroidx/compose/runtime/ComposerImpl;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/Updater;->rememberCompositionContext(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl; +SPLandroidx/compose/runtime/Updater;->rememberUpdatedState(Ljava/lang/Object;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/MutableState; +PLandroidx/compose/runtime/Updater;->removeData(Landroidx/compose/runtime/SlotWriter;ILjava/lang/Object;)V +HSPLandroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/ComposerImpl;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/runtime/Updater;->snapshotFlow(Lkotlin/jvm/functions/Function0;)Lkotlinx/coroutines/flow/SafeFlow; +SPLandroidx/compose/runtime/Updater;->takeMax-impl(Landroidx/collection/MutableIntList;)I +SPLandroidx/compose/runtime/Updater;->updateChangedFlags(I)I +HSPLandroidx/compose/runtime/Updater;->updateCompositionMap([Landroidx/compose/runtime/ProvidedValue;Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/PersistentCompositionLocalMap;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; +Landroidx/compose/runtime/ValueHolder; +Landroidx/compose/runtime/changelist/ChangeList; +SPLandroidx/compose/runtime/changelist/ChangeList;->()V +SPLandroidx/compose/runtime/changelist/ChangeList;->executeAndFlushAllPendingChanges(Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/ComposerChangeListWriter; +SPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/runtime/changelist/ChangeList;)V +SPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveUp()V +HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->pushPendingUpsAndDowns()V +SPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->realizeNodeMovementOperations()V +HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->realizeOperationLocation(Z)V +PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->removeNode(II)V +Landroidx/compose/runtime/changelist/FixupList; +SPLandroidx/compose/runtime/changelist/FixupList;->()V +Landroidx/compose/runtime/changelist/Operation; +SPLandroidx/compose/runtime/changelist/Operation;->(II)V +SPLandroidx/compose/runtime/changelist/Operation;->(III)V +HSPLandroidx/compose/runtime/changelist/Operation;->getGroupAnchor(Landroidx/compose/ui/text/input/GapBuffer;)Landroidx/compose/runtime/Anchor; +Landroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy; +SPLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->()V +SPLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$AppendValue;->()V +PLandroidx/compose/runtime/changelist/Operation$AppendValue;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$Downs; +SPLandroidx/compose/runtime/changelist/Operation$Downs;->()V +SPLandroidx/compose/runtime/changelist/Operation$Downs;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->()V +PLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$EndCurrentGroup; +PLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->()V +PLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$EndResumingScope;->()V +PLandroidx/compose/runtime/changelist/Operation$EndResumingScope;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$EnsureGroupStarted; +PLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->()V +PLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted; +PLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->()V +PLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$InsertSlots; +SPLandroidx/compose/runtime/changelist/Operation$InsertSlots;->()V +SPLandroidx/compose/runtime/changelist/Operation$InsertSlots;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups; +SPLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->()V +SPLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->()V +PLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$Remember; +SPLandroidx/compose/runtime/changelist/Operation$Remember;->()V +SPLandroidx/compose/runtime/changelist/Operation$Remember;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$RememberPausingScope;->()V +PLandroidx/compose/runtime/changelist/Operation$RememberPausingScope;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->()V +PLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$RemoveNode;->()V +PLandroidx/compose/runtime/changelist/Operation$RemoveNode;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$SideEffect; +SPLandroidx/compose/runtime/changelist/Operation$SideEffect;->()V +SPLandroidx/compose/runtime/changelist/Operation$SideEffect;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$StartResumingScope;->()V +PLandroidx/compose/runtime/changelist/Operation$StartResumingScope;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$TrimParentValues; +PLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->()V +PLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/Operation$UpdateNode; +SPLandroidx/compose/runtime/changelist/Operation$UpdateNode;->()V +Landroidx/compose/runtime/changelist/Operation$UpdateValue; +SPLandroidx/compose/runtime/changelist/Operation$UpdateValue;->()V +SPLandroidx/compose/runtime/changelist/Operation$UpdateValue;->(III)V +HSPLandroidx/compose/runtime/changelist/Operation$UpdateValue;->getGroupAnchor(Landroidx/compose/ui/text/input/GapBuffer;)Landroidx/compose/runtime/Anchor; +Landroidx/compose/runtime/changelist/Operation$Ups; +SPLandroidx/compose/runtime/changelist/Operation$Ups;->()V +SPLandroidx/compose/runtime/changelist/Operation$Ups;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +PLandroidx/compose/runtime/changelist/Operation$UseCurrentNode;->()V +PLandroidx/compose/runtime/changelist/Operation$UseCurrentNode;->execute(Landroidx/compose/ui/text/input/GapBuffer;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/internal/RememberEventDispatcher;Landroidx/compose/runtime/changelist/OperationErrorContext;)V +Landroidx/compose/runtime/changelist/OperationErrorContext; +Landroidx/compose/runtime/changelist/Operations; +SPLandroidx/compose/runtime/changelist/Operations;->()V +SPLandroidx/compose/runtime/changelist/Operations;->clear()V +SPLandroidx/compose/runtime/changelist/Operations;->isEmpty()Z +SPLandroidx/compose/runtime/changelist/Operations;->isNotEmpty()Z +HSPLandroidx/compose/runtime/changelist/Operations;->pushOp(Landroidx/compose/runtime/changelist/Operation;)V +Landroidx/compose/runtime/collection/MultiValueMap; +SPLandroidx/compose/runtime/collection/MultiValueMap;->(Landroidx/collection/MutableScatterMap;)V +Landroidx/compose/runtime/collection/MutableVector; +SPLandroidx/compose/runtime/collection/MutableVector;->([Ljava/lang/Object;)V +SPLandroidx/compose/runtime/collection/MutableVector;->add(ILjava/lang/Object;)V +SPLandroidx/compose/runtime/collection/MutableVector;->add(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/collection/MutableVector;->addAll(ILandroidx/compose/runtime/collection/MutableVector;)V +SPLandroidx/compose/runtime/collection/MutableVector;->asMutableList()Ljava/util/List; +SPLandroidx/compose/runtime/collection/MutableVector;->clear()V +SPLandroidx/compose/runtime/collection/MutableVector;->contains(Ljava/lang/Object;)Z +PLandroidx/compose/runtime/collection/MutableVector;->indexOf(Ljava/lang/Object;)I +PLandroidx/compose/runtime/collection/MutableVector;->remove(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/collection/MutableVector;->removeAt(I)Ljava/lang/Object; +SPLandroidx/compose/runtime/collection/MutableVector;->removeRange(II)V +SPLandroidx/compose/runtime/collection/MutableVector;->resizeStorage(I)V +Landroidx/compose/runtime/collection/MutableVectorKt; +SPLandroidx/compose/runtime/collection/MutableVectorKt;->checkIndex(ILjava/util/List;)V +Landroidx/compose/runtime/collection/ScatterSetWrapper; +SPLandroidx/compose/runtime/collection/ScatterSetWrapper;->(Landroidx/collection/MutableScatterSet;)V +PLandroidx/compose/runtime/collection/ScatterSetWrapper;->contains(Ljava/lang/Object;)Z +Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentSet; +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractListIterator; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractListIterator;->(II)V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractListIterator;->hasNext()Z +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->contains(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->iterator()Ljava/util/Iterator; +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/BufferIterator; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/BufferIterator;->([Ljava/lang/Object;II)V +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->()V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->([Ljava/lang/Object;)V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->add(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->addAll(Ljava/util/Collection;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->get(I)Ljava/lang/Object; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->getSize()I +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->indexOf(Ljava/lang/Object;)I +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->listIterator(I)Ljava/util/ListIterator; +PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->removeAt(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList; +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->()V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->containsKey(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->put(Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->()V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->(II[Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;)V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->bufferMoveEntryToNode(IIILjava/lang/Object;Ljava/lang/Object;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;)[Ljava/lang/Object; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->containsKey(IILjava/lang/Object;)Z +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->elementsIdentityEquals(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)Z +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->entryKeyIndex$runtime(I)I +HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->get(IILjava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasEntryAt$runtime(I)Z +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasNodeAt(I)Z +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->makeNode(ILjava/lang/Object;Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; +HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->mutablePut(ILjava/lang/Object;Ljava/lang/Object;ILandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeAtIndex$runtime(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; +HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeIndex$runtime(I)I +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->put(IILjava/lang/Object;Ljava/lang/Object;)Lokio/PriorityQueue; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->updateNodeAtIndex(IILandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->valueAtKeyIndex(I)Ljava/lang/Object; +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->(Ljava/lang/Object;Ljava/lang/Object;)V +Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->()V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->getSize()I +Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter; +Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain; +SPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;->()V +Landroidx/compose/runtime/internal/AtomicInt; +Landroidx/compose/runtime/internal/AwaiterQueue$Awaiter; +Landroidx/compose/runtime/internal/ComposableLambda; +Landroidx/compose/runtime/internal/ComposableLambdaImpl; +SPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->(Ljava/lang/Object;ZI)V +HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(ILandroidx/compose/runtime/ComposerImpl;)Ljava/lang/Object; +HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Landroidx/compose/runtime/ComposerImpl;I)Ljava/lang/Object; +HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/ComposerImpl;I)Ljava/lang/Object; +SPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->trackRead(Landroidx/compose/runtime/ComposerImpl;)V +Landroidx/compose/runtime/internal/ComposableLambdaImpl$$ExternalSyntheticLambda2; +PLandroidx/compose/runtime/internal/ComposableLambdaImpl$$ExternalSyntheticLambda2;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;ILjava/lang/Object;I)V +SPLandroidx/compose/runtime/internal/ComposableLambdaImpl$$ExternalSyntheticLambda2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;II)V +PLandroidx/compose/runtime/internal/ComposableLambdaImpl$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1; +SPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;II)V +SPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/runtime/internal/IntRef; +SPLandroidx/compose/runtime/internal/IntRef;->()V +PLandroidx/compose/runtime/internal/PausedCompositionRemembers;->(Ljava/util/Set;)V +PLandroidx/compose/runtime/internal/PausedCompositionRemembers;->onRemembered()V +Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->()V +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->containsKey(Ljava/lang/Object;)Z +HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->putValue(Landroidx/compose/runtime/ProvidableCompositionLocal;Landroidx/compose/runtime/ValueHolder;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; +Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder; +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->(Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;)V +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->build()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->putAll(Ljava/util/Map;)V +SPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->setSize(I)V +Landroidx/compose/runtime/internal/RememberEventDispatcher; +SPLandroidx/compose/runtime/internal/RememberEventDispatcher;->()V +HSPLandroidx/compose/runtime/internal/RememberEventDispatcher;->clear()V +SPLandroidx/compose/runtime/internal/RememberEventDispatcher;->dispatchAbandons()V +SPLandroidx/compose/runtime/internal/RememberEventDispatcher;->dispatchSideEffects()V +SPLandroidx/compose/runtime/internal/RememberEventDispatcher;->forgetting(Landroidx/compose/runtime/RememberObserverHolder;)V +SPLandroidx/compose/runtime/internal/RememberEventDispatcher;->prepare(Ljava/util/Set;Landroidx/compose/runtime/tooling/CompositionErrorContextImpl;)V +Landroidx/compose/runtime/internal/ThreadMap; +SPLandroidx/compose/runtime/internal/ThreadMap;->(I[J[Ljava/lang/Object;)V +Landroidx/compose/runtime/internal/Thread_androidKt; +SPLandroidx/compose/runtime/internal/Thread_androidKt;->()V +Landroidx/compose/runtime/internal/Thread_jvmKt; +SPLandroidx/compose/runtime/internal/Thread_jvmKt;->()V +SPLandroidx/compose/runtime/internal/Thread_jvmKt;->bitsForSlot(II)I +HSPLandroidx/compose/runtime/internal/Thread_jvmKt;->currentThreadId()J +HSPLandroidx/compose/runtime/internal/Thread_jvmKt;->rememberComposableLambda(ILkotlin/Function;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/internal/ComposableLambdaImpl; +SPLandroidx/compose/runtime/internal/Thread_jvmKt;->replacableWith(Landroidx/compose/runtime/RecomposeScopeImpl;Landroidx/compose/runtime/RecomposeScopeImpl;)Z +Landroidx/compose/runtime/internal/WeakReference; +Landroidx/compose/runtime/retain/ForgetfulRetainedValuesStore; +SPLandroidx/compose/runtime/retain/ForgetfulRetainedValuesStore;->()V +Landroidx/compose/runtime/retain/LocalRetainedValuesStoreKt; +SPLandroidx/compose/runtime/retain/LocalRetainedValuesStoreKt;->()V +Landroidx/compose/runtime/retain/ManagedRetainedValuesStore; +SPLandroidx/compose/runtime/retain/ManagedRetainedValuesStore;->()V +SPLandroidx/compose/runtime/retain/ManagedRetainedValuesStore;->purgeUnusedExitedValues()V +Landroidx/compose/runtime/retain/RetainedValuesStore; +Landroidx/compose/runtime/saveable/SaveableHolder; +SPLandroidx/compose/runtime/saveable/SaveableHolder;->(Landroidx/compose/runtime/saveable/Saver;Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V +PLandroidx/compose/runtime/saveable/SaveableHolder;->onForgotten()V +SPLandroidx/compose/runtime/saveable/SaveableHolder;->onRemembered()V +SPLandroidx/compose/runtime/saveable/SaveableHolder;->register$1()V +Landroidx/compose/runtime/saveable/SaveableStateHolder; +Landroidx/compose/runtime/saveable/SaveableStateHolderImpl; +SPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->()V +SPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->(Ljava/util/Map;)V +HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->SaveableStateProvider(Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->removeState(Ljava/lang/Object;)V +Landroidx/compose/runtime/saveable/SaveableStateRegistry; +Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl; +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->(Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->canBeSaved(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->performSave()Ljava/util/Map; +HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/emoji2/text/EmojiProcessor; +Landroidx/compose/runtime/saveable/SaveableStateRegistryKt; +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;->()V +Landroidx/compose/runtime/saveable/SaveableStateRegistryWrapper; +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryWrapper;->(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;)V +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryWrapper;->canBeSaved(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryWrapper;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; +PLandroidx/compose/runtime/saveable/SaveableStateRegistryWrapper;->performSave()Ljava/util/Map; +SPLandroidx/compose/runtime/saveable/SaveableStateRegistryWrapper;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/emoji2/text/EmojiProcessor; +Landroidx/compose/runtime/saveable/Saver; +Landroidx/compose/runtime/saveable/SaverKt; +SPLandroidx/compose/runtime/saveable/SaverKt;->()V +SPLandroidx/compose/runtime/saveable/SaverKt;->listSaver(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Landroidx/paging/ConflatedEventBus; +SPLandroidx/compose/runtime/saveable/SaverKt;->rememberSaveable([Ljava/lang/Object;Landroidx/compose/runtime/saveable/Saver;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;I)Ljava/lang/Object; +HSPLandroidx/compose/runtime/saveable/SaverKt;->rememberSaveable([Ljava/lang/Object;Landroidx/compose/runtime/saveable/Saver;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;II)Ljava/lang/Object; +SPLandroidx/compose/runtime/saveable/SaverKt;->rememberSaveable([Ljava/lang/Object;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;)Ljava/lang/Object; +SPLandroidx/compose/runtime/saveable/SaverKt;->rememberSaveableStateHolder(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/saveable/SaveableStateHolderImpl; +Landroidx/compose/runtime/saveable/SaverKt$$ExternalSyntheticLambda1; +SPLandroidx/compose/runtime/saveable/SaverKt$$ExternalSyntheticLambda1;->(I)V +PLandroidx/compose/runtime/saveable/SaverKt$$ExternalSyntheticLambda1;->(ILandroidx/compose/foundation/lazy/LazyListMeasureResult;)V +Landroidx/compose/runtime/snapshots/GlobalSnapshot; +SPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->notifyObjectsInitialized$runtime()V +HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; +SPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedSnapshot(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/Snapshot; +Landroidx/compose/runtime/snapshots/MutableSnapshot; +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->()V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->(JLandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->advance$runtime()V +HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/SnapshotId_jvmKt; +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->closeLocked$runtime()V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->dispose()V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getModified$runtime()Landroidx/collection/MutableScatterSet; +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadObserver$runtime()Lkotlin/jvm/functions/Function1; +HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadObserver()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadOnly()Z +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getWriteCount$runtime()I +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getWriteObserver$runtime()Lkotlin/jvm/functions/Function1; +PLandroidx/compose/runtime/snapshots/MutableSnapshot;->innerApplyLocked$runtime(JLandroidx/collection/MutableScatterSet;Ljava/util/HashMap;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotId_jvmKt; +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->nestedDeactivated$runtime()V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->notifyObjectsInitialized$runtime()V +HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordModified$runtime(Landroidx/compose/runtime/snapshots/StateObject;)V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPrevious$runtime(J)V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->releasePinnedSnapshotsForCloseLocked$runtime()V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->setModified$runtime(Landroidx/collection/MutableScatterSet;)V +SPLandroidx/compose/runtime/snapshots/MutableSnapshot;->setWriteCount$runtime(I)V +Landroidx/compose/runtime/snapshots/ReadonlySnapshot; +SPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->(JLandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->dispose()V +SPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->getReadObserver()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->nestedDeactivated$runtime()V +Landroidx/compose/runtime/snapshots/Snapshot; +SPLandroidx/compose/runtime/snapshots/Snapshot;->closeAndReleasePinning$runtime()V +SPLandroidx/compose/runtime/snapshots/Snapshot;->closeLocked$runtime()V +HSPLandroidx/compose/runtime/snapshots/Snapshot;->getInvalid$runtime()Landroidx/compose/runtime/snapshots/SnapshotIdSet; +HSPLandroidx/compose/runtime/snapshots/Snapshot;->getSnapshotId()J +SPLandroidx/compose/runtime/snapshots/Snapshot;->makeCurrent()Landroidx/compose/runtime/snapshots/Snapshot; +SPLandroidx/compose/runtime/snapshots/Snapshot;->releasePinnedSnapshotLocked$runtime()V +SPLandroidx/compose/runtime/snapshots/Snapshot;->releasePinnedSnapshotsForCloseLocked$runtime()V +SPLandroidx/compose/runtime/snapshots/Snapshot;->restoreCurrent(Landroidx/compose/runtime/snapshots/Snapshot;)V +SPLandroidx/compose/runtime/snapshots/Snapshot;->setInvalid$runtime(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V +SPLandroidx/compose/runtime/snapshots/Snapshot;->setSnapshotId$runtime(J)V +Landroidx/compose/runtime/snapshots/Snapshot$Companion$$ExternalSyntheticLambda0; +SPLandroidx/compose/runtime/snapshots/Snapshot$Companion$$ExternalSyntheticLambda0;->(Ljava/lang/Object;)V +SPLandroidx/compose/runtime/snapshots/Snapshot$Companion$$ExternalSyntheticLambda0;->dispose()V +Landroidx/compose/runtime/snapshots/SnapshotApplyResult$Failure; +Landroidx/compose/runtime/snapshots/SnapshotApplyResult$Success; +SPLandroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;->()V +Landroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap; +SPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->add(J)I +SPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->swap(II)V +Landroidx/compose/runtime/snapshots/SnapshotIdSet; +SPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->()V +SPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->(JJJ[J)V +SPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->andNot(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet; +HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->clear(J)Landroidx/compose/runtime/snapshots/SnapshotIdSet; +HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->get(J)Z +PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->or(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet; +HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->set(J)Landroidx/compose/runtime/snapshots/SnapshotIdSet; +Landroidx/compose/runtime/snapshots/SnapshotId_jvmKt; +SPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->()V +PLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->access$validateRange(II)V +SPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->attemptUpdate(Landroidx/compose/runtime/snapshots/StateListStateRecord;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;Z)Z +PLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->binarySearch([JJ)I +SPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->getCurrentThreadSnapshot()Landroidx/compose/runtime/snapshots/Snapshot; +SPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->getReadable(Landroidx/compose/runtime/snapshots/SnapshotStateList;)Landroidx/compose/runtime/snapshots/StateListStateRecord; +SPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->getStructure(Landroidx/compose/runtime/snapshots/SnapshotStateList;)I +HSPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->makeCurrentNonObservable(Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/Snapshot; +HSPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->observe(Landroidx/compose/runtime/DerivedSnapshotState$$ExternalSyntheticLambda0;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +HSPLandroidx/compose/runtime/snapshots/SnapshotId_jvmKt;->restoreNonObservable(Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/runtime/snapshots/SnapshotKt; +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->()V +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$advanceGlobalSnapshot()V +PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$optimisticMerges(JLandroidx/compose/runtime/snapshots/MutableSnapshot;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Ljava/util/HashMap; +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$validateOpen(Landroidx/compose/runtime/snapshots/Snapshot;)V +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->addRange(Landroidx/compose/runtime/snapshots/SnapshotIdSet;JJ)Landroidx/compose/runtime/snapshots/SnapshotIdSet; +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->checkAndOverwriteUnusedRecordsLocked()V +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->createTransparentSnapshotWithNoParentReadObserver(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/runtime/snapshots/Snapshot; +HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->currentSnapshot()Landroidx/compose/runtime/snapshots/Snapshot; +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->mergedReadObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Z)Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->mergedWriteObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->processForUnusedRecordsLocked(Landroidx/compose/runtime/snapshots/StateObject;)V +HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;JLandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/StateRecord; +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->releasePinningLocked(I)V +SPLandroidx/compose/runtime/snapshots/SnapshotKt;->writableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; +Landroidx/compose/runtime/snapshots/SnapshotMutableState; +Landroidx/compose/runtime/snapshots/SnapshotStateList; +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->()V +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->()V +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;)V +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->add(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->addAll(Ljava/util/Collection;)Z +PLandroidx/compose/runtime/snapshots/SnapshotStateList;->clear()V +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->contains(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->get(I)Ljava/lang/Object; +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->isEmpty()Z +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->listIterator()Ljava/util/ListIterator; +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V +PLandroidx/compose/runtime/snapshots/SnapshotStateList;->remove(Ljava/lang/Object;)Z +SPLandroidx/compose/runtime/snapshots/SnapshotStateList;->size()I +Landroidx/compose/runtime/snapshots/SnapshotStateList$Companion$CREATOR$1; +Landroidx/compose/runtime/snapshots/SnapshotStateObserver; +SPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->clear()V +SPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->clear(Ljava/lang/Object;)V +HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->drainChanges()Z +SPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->start()V +Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap; +SPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->(Lkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordRead(Ljava/lang/Object;ILjava/lang/Object;Landroidx/collection/MutableObjectIntMap;)V +SPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->removeObservation(Ljava/lang/Object;Ljava/lang/Object;)V +PLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->removeScopeIf()V +Landroidx/compose/runtime/snapshots/StateListStateRecord; +SPLandroidx/compose/runtime/snapshots/StateListStateRecord;->(JLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;)V +SPLandroidx/compose/runtime/snapshots/StateListStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V +SPLandroidx/compose/runtime/snapshots/StateListStateRecord;->create(J)Landroidx/compose/runtime/snapshots/StateRecord; +Landroidx/compose/runtime/snapshots/StateObject; +Landroidx/compose/runtime/snapshots/StateObjectImpl; +SPLandroidx/compose/runtime/snapshots/StateObjectImpl;->()V +HSPLandroidx/compose/runtime/snapshots/StateObjectImpl;->isReadIn-h_f27i8$runtime(I)Z +HSPLandroidx/compose/runtime/snapshots/StateObjectImpl;->recordReadIn-h_f27i8$runtime(I)V +Landroidx/compose/runtime/snapshots/StateRecord; +SPLandroidx/compose/runtime/snapshots/StateRecord;->(J)V +Landroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot; +PLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/SnapshotId_jvmKt; +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->dispose()V +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getCurrentSnapshot()Landroidx/compose/runtime/snapshots/MutableSnapshot; +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getReadObserver()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getReadOnly()Z +HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getWriteCount$runtime()I +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getWriteObserver$runtime()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->notifyObjectsInitialized$runtime()V +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->recordModified$runtime(Landroidx/compose/runtime/snapshots/StateObject;)V +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->setWriteCount$runtime(I)V +SPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; +Landroidx/compose/runtime/snapshots/TransparentObserverSnapshot; +Landroidx/compose/runtime/tooling/CompositionData; +Landroidx/compose/runtime/tooling/CompositionErrorContextImpl; +SPLandroidx/compose/runtime/tooling/CompositionErrorContextImpl;->()V +SPLandroidx/compose/runtime/tooling/CompositionErrorContextImpl;->(Landroidx/compose/runtime/ComposerImpl;)V +Landroidx/compose/runtime/tooling/InspectionTablesKt; +SPLandroidx/compose/runtime/tooling/InspectionTablesKt;->()V +Landroidx/compose/ui/AbsoluteAlignment; +SPLandroidx/compose/ui/AbsoluteAlignment;->()V +SPLandroidx/compose/ui/AbsoluteAlignment;->materializeImpl(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; +HSPLandroidx/compose/ui/AbsoluteAlignment;->materializeModifier(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; +Landroidx/compose/ui/Actual_androidKt; +SPLandroidx/compose/ui/Actual_androidKt;->()V +Landroidx/compose/ui/Actual_androidKt$$ExternalSyntheticLambda0; +SPLandroidx/compose/ui/Actual_androidKt$$ExternalSyntheticLambda0;->(ILkotlin/jvm/functions/Function0;)V +Landroidx/compose/ui/Alignment; +Landroidx/compose/ui/Alignment$Companion; +SPLandroidx/compose/ui/Alignment$Companion;->()V +Landroidx/compose/ui/BiasAbsoluteAlignment; +SPLandroidx/compose/ui/BiasAbsoluteAlignment;->(F)V +Landroidx/compose/ui/BiasAlignment; +SPLandroidx/compose/ui/BiasAlignment;->(FF)V +SPLandroidx/compose/ui/BiasAlignment;->align-KFBX0sM(JJLandroidx/compose/ui/unit/LayoutDirection;)J +SPLandroidx/compose/ui/BiasAlignment;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/BiasAlignment;->hashCode()I +Landroidx/compose/ui/BiasAlignment$Horizontal; +SPLandroidx/compose/ui/BiasAlignment$Horizontal;->(F)V +SPLandroidx/compose/ui/BiasAlignment$Horizontal;->align(IILandroidx/compose/ui/unit/LayoutDirection;)I +SPLandroidx/compose/ui/BiasAlignment$Horizontal;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/BiasAlignment$Vertical; +SPLandroidx/compose/ui/BiasAlignment$Vertical;->(F)V +SPLandroidx/compose/ui/BiasAlignment$Vertical;->align(II)I +SPLandroidx/compose/ui/BiasAlignment$Vertical;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/CombinedModifier; +SPLandroidx/compose/ui/CombinedModifier;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Modifier;)V +SPLandroidx/compose/ui/CombinedModifier;->all(Lkotlin/jvm/functions/Function1;)Z +SPLandroidx/compose/ui/CombinedModifier;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/ComposedModifier; +Landroidx/compose/ui/ComposedModifierKt$materializeImpl$1; +SPLandroidx/compose/ui/ComposedModifierKt$materializeImpl$1;->()V +SPLandroidx/compose/ui/ComposedModifierKt$materializeImpl$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/Modifier;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; +Landroidx/compose/ui/Modifier$Companion; +SPLandroidx/compose/ui/Modifier$Companion;->()V +SPLandroidx/compose/ui/Modifier$Companion;->all(Lkotlin/jvm/functions/Function1;)Z +SPLandroidx/compose/ui/Modifier$Companion;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; +Landroidx/compose/ui/Modifier$Element; +Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/ui/Modifier$Node;->()V +SPLandroidx/compose/ui/Modifier$Node;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; +SPLandroidx/compose/ui/Modifier$Node;->getShouldAutoInvalidate()Z +SPLandroidx/compose/ui/Modifier$Node;->markAsAttached$ui()V +SPLandroidx/compose/ui/Modifier$Node;->markAsDetached$ui()V +SPLandroidx/compose/ui/Modifier$Node;->onAttach()V +SPLandroidx/compose/ui/Modifier$Node;->onDetach()V +PLandroidx/compose/ui/Modifier$Node;->onReset()V +PLandroidx/compose/ui/Modifier$Node;->reset$ui()V +SPLandroidx/compose/ui/Modifier$Node;->runAttachLifecycle$ui()V +SPLandroidx/compose/ui/Modifier$Node;->runDetachLifecycle$ui()V +SPLandroidx/compose/ui/Modifier$Node;->setAsDelegateTo$ui(Landroidx/compose/ui/Modifier$Node;)V +SPLandroidx/compose/ui/Modifier$Node;->updateCoordinator$ui(Landroidx/compose/ui/node/NodeCoordinator;)V +Landroidx/compose/ui/MotionDurationScale; +SPLandroidx/compose/ui/MotionDurationScale;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +Landroidx/compose/ui/SessionMutex$Session; +Landroidx/compose/ui/ZIndexNode$measure$1; +SPLandroidx/compose/ui/ZIndexNode$measure$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +HSPLandroidx/compose/ui/ZIndexNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline0; +SPLandroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/Class; +SPLandroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline0;->m(Landroidx/compose/ui/platform/AndroidComposeView;)V +SPLandroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/autofill/AutofillManager$AutofillCallback; +SPLandroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/autofill/AutofillManager; +SPLandroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutline0;->m(Ljava/time/LocalDate;Ljava/time/format/DateTimeFormatter;)Ljava/lang/String; +Landroidx/compose/ui/autofill/AndroidAutofillManager; +SPLandroidx/compose/ui/autofill/AndroidAutofillManager;->(Landroidx/compose/ui/draw/DrawResult;Landroidx/compose/ui/semantics/SemanticsOwner;Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/ui/spatial/RectManager;Ljava/lang/String;)V +Landroidx/compose/ui/autofill/AndroidFillableData; +Landroidx/compose/ui/autofill/Autofill; +Landroidx/compose/ui/autofill/AutofillCallback; +SPLandroidx/compose/ui/autofill/AutofillCallback;->()V +Landroidx/compose/ui/autofill/AutofillManager; +Landroidx/compose/ui/autofill/AutofillTree; +SPLandroidx/compose/ui/autofill/AutofillTree;->()V +Landroidx/compose/ui/contentcapture/AndroidContentCaptureManager; +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/paging/PageFetcher$flow$1$2$1;)V +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->boundsUpdatesEventLoop$ui(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +HSPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->checkForContentCapturePropertyChanges(Landroidx/collection/IntObjectMap;)V +HSPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->getCurrentSemanticsNodes$ui()Landroidx/collection/IntObjectMap; +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->isEnabled$ui()Z +HSPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->notifyContentCaptureChanges()V +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->onViewAttachedToWindow(Landroid/view/View;)V +PLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->sendContentCaptureTextUpdateEvent(Ljava/lang/String;I)V +HSPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->updateBuffersOnAppeared(ILandroidx/compose/ui/semantics/SemanticsNode;)V +HSPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager;->updateSemanticsCopy()V +Landroidx/compose/ui/contentcapture/AndroidContentCaptureManager$TranslateStatus; +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager$TranslateStatus;->()V +Landroidx/compose/ui/contentcapture/AndroidContentCaptureManager$boundsUpdatesEventLoop$1; +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager$boundsUpdatesEventLoop$1;->(Landroidx/compose/ui/contentcapture/AndroidContentCaptureManager;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager$boundsUpdatesEventLoop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/contentcapture/AndroidContentCaptureManager$currentSemanticsNodes$1; +SPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager$currentSemanticsNodes$1;->()V +HSPLandroidx/compose/ui/contentcapture/AndroidContentCaptureManager$currentSemanticsNodes$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/contentcapture/ContentCaptureEvent; +SPLandroidx/compose/ui/contentcapture/ContentCaptureEvent;->(IJLandroidx/compose/ui/contentcapture/ContentCaptureEventType;Landroidx/compose/ui/draw/DrawResult;)V +Landroidx/compose/ui/contentcapture/ContentCaptureEventType; +SPLandroidx/compose/ui/contentcapture/ContentCaptureEventType;->()V +Landroidx/compose/ui/draganddrop/AndroidDragAndDropManager; +SPLandroidx/compose/ui/draganddrop/AndroidDragAndDropManager;->()V +Landroidx/compose/ui/draganddrop/AndroidDragAndDropManager$modifier$1; +SPLandroidx/compose/ui/draganddrop/AndroidDragAndDropManager$modifier$1;->(Landroidx/compose/ui/draganddrop/AndroidDragAndDropManager;)V +SPLandroidx/compose/ui/draganddrop/AndroidDragAndDropManager$modifier$1;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/ui/draganddrop/DragAndDropManager; +Landroidx/compose/ui/draganddrop/DragAndDropNode; +SPLandroidx/compose/ui/draganddrop/DragAndDropNode;->getTraverseKey()Ljava/lang/Object; +SPLandroidx/compose/ui/draganddrop/DragAndDropNode;->onRemeasured-ozmzZPI(J)V +Landroidx/compose/ui/draganddrop/DragAndDropNode$Companion$DragAndDropTraversableKey; +SPLandroidx/compose/ui/draganddrop/DragAndDropNode$Companion$DragAndDropTraversableKey;->()V +Landroidx/compose/ui/draw/BuildDrawCacheParams; +Landroidx/compose/ui/draw/ClipKt; +SPLandroidx/compose/ui/draw/ClipKt;->clip(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/draw/ClipKt;->clipToBounds(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/draw/ClipKt;->drawBehind(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/draw/ClipKt;->paint$default(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/BlendModeColorFilter;)Landroidx/compose/ui/Modifier; +Landroidx/compose/ui/draw/DrawBackgroundModifier; +SPLandroidx/compose/ui/draw/DrawBackgroundModifier;->draw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +Landroidx/compose/ui/draw/DrawBehindElement; +SPLandroidx/compose/ui/draw/DrawBehindElement;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/draw/DrawBehindElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/ui/draw/DrawBehindElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/draw/DrawBehindElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/ui/draw/DrawResult; +PLandroidx/compose/ui/draw/DrawResult;->(FF)V +PLandroidx/compose/ui/draw/DrawResult;->(FFLandroidx/compose/animation/core/AnimationVector;)V +SPLandroidx/compose/ui/draw/DrawResult;->(I)V +SPLandroidx/compose/ui/draw/DrawResult;->(ILjava/lang/Object;)V +SPLandroidx/compose/ui/draw/DrawResult;->(IZ)V +PLandroidx/compose/ui/draw/DrawResult;->(Landroidx/compose/animation/core/AnimationVector;FF)V +SPLandroidx/compose/ui/draw/DrawResult;->(Landroidx/compose/ui/unit/Density;)V +PLandroidx/compose/ui/draw/DrawResult;->([J)V +HSPLandroidx/compose/ui/draw/DrawResult;->add(Landroidx/compose/ui/node/LayoutNode;)V +PLandroidx/compose/ui/draw/DrawResult;->calculateVelocity-AH228Gc(J)J +HSPLandroidx/compose/ui/draw/DrawResult;->current()V +SPLandroidx/compose/ui/draw/DrawResult;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec; +PLandroidx/compose/ui/draw/DrawResult;->getAbsVelocityThreshold()F +PLandroidx/compose/ui/draw/DrawResult;->getDurationNanos(F)J +PLandroidx/compose/ui/draw/DrawResult;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J +PLandroidx/compose/ui/draw/DrawResult;->getTargetValue(FF)F +PLandroidx/compose/ui/draw/DrawResult;->getValueFromNanos(FFJ)F +PLandroidx/compose/ui/draw/DrawResult;->getVelocityFromNanos(FJ)F +HSPLandroidx/compose/ui/draw/DrawResult;->inset(FFFF)V +SPLandroidx/compose/ui/draw/DrawResult;->pathStringToNodes$default(Landroidx/compose/ui/draw/DrawResult;Ljava/lang/String;)Ljava/util/ArrayList; +PLandroidx/compose/ui/draw/DrawResult;->produce(Landroidx/paging/ConflatedEventBus;Landroidx/compose/ui/platform/AndroidComposeView;)Landroidx/paging/ConflatedEventBus; +HSPLandroidx/compose/ui/draw/DrawResult;->remove(Landroidx/compose/ui/node/LayoutNode;)Z +SPLandroidx/compose/ui/draw/DrawResult;->scale-0AR0LA0(FFJ)V +PLandroidx/compose/ui/draw/DrawResult;->schedulePrefetch$default(Landroidx/compose/ui/draw/DrawResult;I)Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$PrefetchHandle; +SPLandroidx/compose/ui/draw/DrawResult;->translate(FF)V +Landroidx/compose/ui/draw/PainterElement; +SPLandroidx/compose/ui/draw/PainterElement;->(Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/BlendModeColorFilter;)V +SPLandroidx/compose/ui/draw/PainterElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/ui/draw/PainterElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/draw/PainterElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/ui/draw/PainterNode; +HSPLandroidx/compose/ui/draw/PainterNode;->draw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +PLandroidx/compose/ui/draw/PainterNode;->getShouldAutoInvalidate()Z +SPLandroidx/compose/ui/draw/PainterNode;->getUseIntrinsicSize()Z +SPLandroidx/compose/ui/draw/PainterNode;->hasSpecifiedAndFiniteHeight-uvyYCjk(J)Z +SPLandroidx/compose/ui/draw/PainterNode;->hasSpecifiedAndFiniteWidth-uvyYCjk(J)Z +SPLandroidx/compose/ui/draw/PainterNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +SPLandroidx/compose/ui/draw/PainterNode;->modifyConstraints-ZezNO4M(J)J +Landroidx/compose/ui/draw/PainterNode$measure$1; +SPLandroidx/compose/ui/draw/PainterNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;I)V +SPLandroidx/compose/ui/draw/PainterNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/focus/FocusEventModifierNode; +Landroidx/compose/ui/focus/FocusInteropUtils_androidKt; +SPLandroidx/compose/ui/focus/FocusInteropUtils_androidKt;->()V +Landroidx/compose/ui/focus/FocusInvalidationManager; +SPLandroidx/compose/ui/focus/FocusInvalidationManager;->(Landroidx/compose/ui/focus/FocusOwnerImpl;Landroidx/compose/ui/platform/AndroidComposeView;)V +Landroidx/compose/ui/focus/FocusListener; +Landroidx/compose/ui/focus/FocusOwner; +Landroidx/compose/ui/focus/FocusOwnerImpl; +SPLandroidx/compose/ui/focus/FocusOwnerImpl;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/ui/platform/AndroidComposeView;)V +SPLandroidx/compose/ui/focus/FocusOwnerImpl;->getActiveFocusTargetNode()Landroidx/compose/ui/focus/FocusTargetNode; +Landroidx/compose/ui/focus/FocusOwnerImpl$focusSearch$1; +SPLandroidx/compose/ui/focus/FocusOwnerImpl$focusSearch$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +HSPLandroidx/compose/ui/focus/FocusOwnerImpl$focusSearch$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/focus/FocusOwnerImpl$modifier$1; +SPLandroidx/compose/ui/focus/FocusOwnerImpl$modifier$1;->(Landroidx/compose/ui/focus/FocusOwnerImpl;)V +SPLandroidx/compose/ui/focus/FocusOwnerImpl$modifier$1;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/ui/focus/FocusRequester; +SPLandroidx/compose/ui/focus/FocusRequester;->()V +SPLandroidx/compose/ui/focus/FocusRequester;->()V +Landroidx/compose/ui/focus/FocusRequesterModifierNode; +Landroidx/compose/ui/focus/FocusStateImpl; +SPLandroidx/compose/ui/focus/FocusStateImpl;->()V +SPLandroidx/compose/ui/focus/FocusStateImpl;->isFocused()Z +Landroidx/compose/ui/focus/FocusTargetNode; +SPLandroidx/compose/ui/focus/FocusTargetNode;->(ILkotlin/jvm/functions/Function2;I)V +HSPLandroidx/compose/ui/focus/FocusTargetNode;->getFocusState()Landroidx/compose/ui/focus/FocusStateImpl; +SPLandroidx/compose/ui/focus/FocusTargetNode;->getShouldAutoInvalidate()Z +PLandroidx/compose/ui/focus/FocusTargetNode;->onDetach()V +SPLandroidx/compose/ui/focus/FocusTargetNode;->onPlaced(Landroidx/compose/ui/layout/LayoutCoordinates;)V +PLandroidx/compose/ui/focus/FocusTargetNode;->onReset()V +Landroidx/compose/ui/focus/FocusTargetNode$invalidateFocus$1; +SPLandroidx/compose/ui/focus/FocusTargetNode$invalidateFocus$1;->(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/internal/Ref$ObjectRef;)V +SPLandroidx/compose/ui/focus/FocusTargetNode$invalidateFocus$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +Landroidx/compose/ui/geometry/MutableRect; +SPLandroidx/compose/ui/geometry/MutableRect;->()V +HSPLandroidx/compose/ui/geometry/MutableRect;->intersect(FFFF)V +HSPLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z +Landroidx/compose/ui/geometry/Offset; +PLandroidx/compose/ui/geometry/Offset;->(J)V +PLandroidx/compose/ui/geometry/Offset;->copy-dBAh8RU$default(JFI)J +SPLandroidx/compose/ui/geometry/Offset;->equals-impl0(JJ)Z +SPLandroidx/compose/ui/geometry/Offset;->getDistance-impl(J)F +PLandroidx/compose/ui/geometry/Offset;->getX-impl(J)F +PLandroidx/compose/ui/geometry/Offset;->getY-impl(J)F +HPLandroidx/compose/ui/geometry/Offset;->minus-MK-Hz9U(JJ)J +HPLandroidx/compose/ui/geometry/Offset;->plus-MK-Hz9U(JJ)J +HPLandroidx/compose/ui/geometry/Offset;->times-tuRUvjQ(FJ)J +Landroidx/compose/ui/geometry/Rect; +SPLandroidx/compose/ui/geometry/Rect;->()V +SPLandroidx/compose/ui/geometry/Rect;->(FFFF)V +PLandroidx/compose/ui/geometry/Rect;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/geometry/Rect;->getCenter-F1C5BW0()J +Landroidx/compose/ui/geometry/RoundRect; +SPLandroidx/compose/ui/geometry/RoundRect;->()V +SPLandroidx/compose/ui/geometry/RoundRect;->(FFFFJJJJ)V +SPLandroidx/compose/ui/geometry/RoundRect;->getHeight()F +SPLandroidx/compose/ui/geometry/RoundRect;->getWidth()F +Landroidx/compose/ui/geometry/Size; +SPLandroidx/compose/ui/geometry/Size;->(J)V +SPLandroidx/compose/ui/geometry/Size;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/geometry/Size;->equals-impl0(JJ)Z +SPLandroidx/compose/ui/geometry/Size;->getHeight-impl(J)F +SPLandroidx/compose/ui/geometry/Size;->getMinDimension-impl(J)F +SPLandroidx/compose/ui/geometry/Size;->getWidth-impl(J)F +SPLandroidx/compose/ui/geometry/Size;->isEmpty-impl(J)Z +Landroidx/compose/ui/graphics/AndroidCanvas; +SPLandroidx/compose/ui/graphics/AndroidCanvas;->()V +PLandroidx/compose/ui/graphics/AndroidCanvas;->clipRect-N_I0leg(FFFFI)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->concat-58bKbWc([F)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->disableZ()V +HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawImageRect-HPBpro0(Landroidx/compose/ui/graphics/AndroidImageBitmap;JJJLkotlinx/coroutines/flow/SharingConfig;)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->drawLine-Wko1d7g(JJLkotlinx/coroutines/flow/SharingConfig;)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->drawPath(Landroidx/compose/ui/graphics/AndroidPath;Lkotlinx/coroutines/flow/SharingConfig;)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->drawRect(FFFFLkotlinx/coroutines/flow/SharingConfig;)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->drawRoundRect(FFFFFFLkotlinx/coroutines/flow/SharingConfig;)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->enableZ()V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->restore()V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->save()V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->scale(FF)V +SPLandroidx/compose/ui/graphics/AndroidCanvas;->translate(FF)V +Landroidx/compose/ui/graphics/AndroidCanvas_androidKt; +SPLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->()V +HSPLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->getNativeCanvas(Landroidx/compose/ui/graphics/Canvas;)Landroid/graphics/Canvas; +Landroidx/compose/ui/graphics/AndroidGraphicsContext; +SPLandroidx/compose/ui/graphics/AndroidGraphicsContext;->(Landroidx/compose/ui/platform/AndroidComposeView;)V +SPLandroidx/compose/ui/graphics/AndroidGraphicsContext;->createGraphicsLayer()Landroidx/compose/ui/graphics/layer/GraphicsLayer; +PLandroidx/compose/ui/graphics/AndroidGraphicsContext;->releaseGraphicsLayer(Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +Landroidx/compose/ui/graphics/AndroidGraphicsContext$1; +SPLandroidx/compose/ui/graphics/AndroidGraphicsContext$1;->(Landroidx/compose/ui/graphics/AndroidGraphicsContext;)V +Landroidx/compose/ui/graphics/AndroidGraphicsContext$2; +SPLandroidx/compose/ui/graphics/AndroidGraphicsContext$2;->(ILjava/lang/Object;)V +SPLandroidx/compose/ui/graphics/AndroidGraphicsContext$2;->onViewAttachedToWindow(Landroid/view/View;)V +Landroidx/compose/ui/graphics/AndroidImageBitmap; +SPLandroidx/compose/ui/graphics/AndroidImageBitmap;->(Landroid/graphics/Bitmap;)V +PLandroidx/compose/ui/graphics/AndroidImageBitmap;->getConfig-_sVssgQ()I +Landroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings; +SPLandroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings;->()V +Landroidx/compose/ui/graphics/AndroidPath; +SPLandroidx/compose/ui/graphics/AndroidPath;->(Landroid/graphics/Path;)V +SPLandroidx/compose/ui/graphics/AndroidPath;->addRoundRect$default(Landroidx/compose/ui/graphics/AndroidPath;Landroidx/compose/ui/geometry/RoundRect;)V +PLandroidx/compose/ui/graphics/AndroidPath;->op-N5in7k0(Landroidx/compose/ui/graphics/AndroidPath;Landroidx/compose/ui/graphics/AndroidPath;I)Z +PLandroidx/compose/ui/graphics/AndroidPath;->reset()V +Landroidx/compose/ui/graphics/AndroidPath_androidKt; +SPLandroidx/compose/ui/graphics/AndroidPath_androidKt;->Path()Landroidx/compose/ui/graphics/AndroidPath; +Landroidx/compose/ui/graphics/BlendModeColorFilter; +HSPLandroidx/compose/ui/graphics/BlendModeColorFilter;->(IJ)V +SPLandroidx/compose/ui/graphics/BlendModeColorFilter;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/graphics/BlockGraphicsLayerElement; +SPLandroidx/compose/ui/graphics/BlockGraphicsLayerElement;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/graphics/BlockGraphicsLayerElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/ui/graphics/BlockGraphicsLayerElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/graphics/BlockGraphicsLayerModifier; +SPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->isImportantForBounds()Z +SPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/graphics/Brush; +Landroidx/compose/ui/graphics/Canvas; +Landroidx/compose/ui/graphics/CanvasHolder; +SPLandroidx/compose/ui/graphics/CanvasHolder;->()V +Landroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0; +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/Canvas;)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;F)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;Landroid/graphics/Paint;)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/RenderNode;F)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m()V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(ILandroid/graphics/BlendMode;)Landroid/graphics/BlendModeColorFilter; +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Canvas;)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Paint;Landroid/graphics/BlendMode;)V +PLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Z +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Landroid/graphics/Outline;)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Z)V +SPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroidx/compose/ui/platform/AndroidComposeView;)J +Landroidx/compose/ui/graphics/Color; +SPLandroidx/compose/ui/graphics/Color;->()V +SPLandroidx/compose/ui/graphics/Color;->(J)V +SPLandroidx/compose/ui/graphics/Color;->copy-wmQWz5c$default(FJ)J +SPLandroidx/compose/ui/graphics/Color;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/graphics/Color;->equals-impl0(JJ)Z +SPLandroidx/compose/ui/graphics/Color;->getAlpha-impl(J)F +SPLandroidx/compose/ui/graphics/Color;->getBlue-impl(J)F +SPLandroidx/compose/ui/graphics/Color;->getColorSpace-impl(J)Landroidx/compose/ui/graphics/colorspace/ColorSpace; +SPLandroidx/compose/ui/graphics/Color;->getGreen-impl(J)F +SPLandroidx/compose/ui/graphics/Color;->getRed-impl(J)F +Landroidx/compose/ui/graphics/ColorKt; +SPLandroidx/compose/ui/graphics/ColorKt;->()V +SPLandroidx/compose/ui/graphics/ColorKt;->Canvas(Landroidx/compose/ui/graphics/AndroidImageBitmap;)Landroidx/compose/ui/graphics/AndroidCanvas; +SPLandroidx/compose/ui/graphics/ColorKt;->Color(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J +SPLandroidx/compose/ui/graphics/ColorKt;->Color(I)J +SPLandroidx/compose/ui/graphics/ColorKt;->Color(J)J +SPLandroidx/compose/ui/graphics/ColorKt;->ImageBitmap-x__-hDU$default(III)Landroidx/compose/ui/graphics/AndroidImageBitmap; +SPLandroidx/compose/ui/graphics/ColorKt;->Paint()Lkotlinx/coroutines/flow/SharingConfig; +SPLandroidx/compose/ui/graphics/ColorKt;->TransformOrigin(FF)J +SPLandroidx/compose/ui/graphics/ColorKt;->UncheckedColor(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J +SPLandroidx/compose/ui/graphics/ColorKt;->asAndroidBitmap(Landroidx/compose/ui/graphics/AndroidImageBitmap;)Landroid/graphics/Bitmap; +SPLandroidx/compose/ui/graphics/ColorKt;->compositeOver--OWjLjI(JJ)J +HSPLandroidx/compose/ui/graphics/ColorKt;->drawOutline-wDX37Ww$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/ColorKt;J)V +SPLandroidx/compose/ui/graphics/ColorKt;->enableZ(Landroid/graphics/Canvas;Z)V +SPLandroidx/compose/ui/graphics/ColorKt;->graphicsLayer(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/graphics/ColorKt;->graphicsLayer-Ap8cVGQ$default(Landroidx/compose/ui/Modifier;FLandroidx/compose/ui/graphics/Shape;I)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/graphics/ColorKt;->graphicsLayer-_6ThJ44$default(Landroidx/compose/ui/Modifier;FFLandroidx/compose/ui/graphics/Shape;I)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/graphics/ColorKt;->isIdentity-58bKbWc([F)Z +SPLandroidx/compose/ui/graphics/ColorKt;->lerp-jxsXWHM(JJF)J +SPLandroidx/compose/ui/graphics/ColorKt;->setFrom-tU-YjHk(Landroid/graphics/Matrix;[F)V +SPLandroidx/compose/ui/graphics/ColorKt;->toAndroidBlendMode-s9anfk8(I)Landroid/graphics/BlendMode; +SPLandroidx/compose/ui/graphics/ColorKt;->toArgb-8_81llA(J)I +SPLandroidx/compose/ui/graphics/ColorKt;->toBitmapConfig-1JJdX4A(I)Landroid/graphics/Bitmap$Config; +SPLandroidx/compose/ui/graphics/ColorKt;->writeValidRootInUnitRange(F[FI)I +Landroidx/compose/ui/graphics/ColorProducer; +Landroidx/compose/ui/graphics/ColorSpaceVerificationHelper; +SPLandroidx/compose/ui/graphics/ColorSpaceVerificationHelper;->androidColorSpace(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroid/graphics/ColorSpace; +Landroidx/compose/ui/graphics/GraphicsContext; +Landroidx/compose/ui/graphics/GraphicsLayerElement; +SPLandroidx/compose/ui/graphics/GraphicsLayerElement;->(FFFJLandroidx/compose/ui/graphics/Shape;ZJJ)V +SPLandroidx/compose/ui/graphics/GraphicsLayerElement;->create()Landroidx/compose/ui/Modifier$Node; +HSPLandroidx/compose/ui/graphics/GraphicsLayerElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/graphics/GraphicsLayerScopeKt; +SPLandroidx/compose/ui/graphics/GraphicsLayerScopeKt;->()V +Landroidx/compose/ui/graphics/Matrix; +SPLandroidx/compose/ui/graphics/Matrix;->constructor-impl$default()[F +SPLandroidx/compose/ui/graphics/Matrix;->map-MK-Hz9U(J[F)J +PLandroidx/compose/ui/graphics/Matrix;->reset-impl([F)V +SPLandroidx/compose/ui/graphics/Matrix;->translate-impl([FFF)V +Landroidx/compose/ui/graphics/Outline$Generic; +PLandroidx/compose/ui/graphics/Outline$Generic;->(Landroidx/compose/ui/graphics/AndroidPath;)V +Landroidx/compose/ui/graphics/Outline$Rectangle; +SPLandroidx/compose/ui/graphics/Outline$Rectangle;->(Landroidx/compose/ui/geometry/Rect;)V +PLandroidx/compose/ui/graphics/Outline$Rectangle;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/graphics/Outline$Rounded; +SPLandroidx/compose/ui/graphics/Outline$Rounded;->(Landroidx/compose/ui/geometry/RoundRect;)V +Landroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1; +SPLandroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/ColorKt; +Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope; +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->()V +HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->reset$2()V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAlpha(F)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAmbientShadowColor-8_81llA(J)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setClip(Z)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleX(F)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleY(F)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShadowElevation(F)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShape(Landroidx/compose/ui/graphics/Shape;)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setSpotShadowColor-8_81llA(J)V +SPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTransformOrigin-__ExYCQ(J)V +Landroidx/compose/ui/graphics/Shadow; +SPLandroidx/compose/ui/graphics/Shadow;->()V +SPLandroidx/compose/ui/graphics/Shadow;->()V +SPLandroidx/compose/ui/graphics/Shadow;->(JJF)V +SPLandroidx/compose/ui/graphics/Shadow;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/graphics/Shape; +Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier; +SPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->isImportantForBounds()Z +SPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/graphics/SolidColor; +SPLandroidx/compose/ui/graphics/SolidColor;->(J)V +SPLandroidx/compose/ui/graphics/SolidColor;->applyTo-Pq9zytI(FJLkotlinx/coroutines/flow/SharingConfig;)V +Landroidx/compose/ui/graphics/TransformOrigin; +SPLandroidx/compose/ui/graphics/TransformOrigin;->()V +SPLandroidx/compose/ui/graphics/TransformOrigin;->equals-impl0(JJ)Z +Landroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1; +SPLandroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1;->()V +SPLandroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1;->([F)V +Landroidx/compose/ui/graphics/colorspace/ColorModel; +SPLandroidx/compose/ui/graphics/colorspace/ColorModel;->()V +SPLandroidx/compose/ui/graphics/colorspace/ColorModel;->equals-impl0(JJ)Z +Landroidx/compose/ui/graphics/colorspace/ColorSpace; +SPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->(Ljava/lang/String;JI)V +SPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->isSrgb()Z +Landroidx/compose/ui/graphics/colorspace/ColorSpaces; +SPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->()V +Landroidx/compose/ui/graphics/colorspace/Connector; +SPLandroidx/compose/ui/graphics/colorspace/Connector;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;I)V +SPLandroidx/compose/ui/graphics/colorspace/Connector;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;[F)V +SPLandroidx/compose/ui/graphics/colorspace/Connector;->transformToColor-l2rxGTc$ui_graphics(J)J +Landroidx/compose/ui/graphics/colorspace/Connector$Companion$identity$1; +SPLandroidx/compose/ui/graphics/colorspace/Connector$Companion$identity$1;->transformToColor-l2rxGTc$ui_graphics(J)J +Landroidx/compose/ui/graphics/colorspace/ConnectorKt; +SPLandroidx/compose/ui/graphics/colorspace/ConnectorKt;->()V +Landroidx/compose/ui/graphics/colorspace/DoubleFunction; +Landroidx/compose/ui/graphics/colorspace/Illuminant; +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->()V +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->adapt$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroidx/compose/ui/graphics/colorspace/ColorSpace; +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->area([F)F +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->chromaticAdaptation([F[F[F)[F +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->compare(Landroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/WhitePoint;)Z +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->inverse3x3([F)[F +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->mul3x3([F[F)[F +SPLandroidx/compose/ui/graphics/colorspace/Illuminant;->mul3x3Float3([F[F)[F +Landroidx/compose/ui/graphics/colorspace/Lab; +SPLandroidx/compose/ui/graphics/colorspace/Lab;->(IIJLjava/lang/String;)V +Landroidx/compose/ui/graphics/colorspace/Oklab; +SPLandroidx/compose/ui/graphics/colorspace/Oklab;->()V +SPLandroidx/compose/ui/graphics/colorspace/Oklab;->getMaxValue(I)F +SPLandroidx/compose/ui/graphics/colorspace/Oklab;->getMinValue(I)F +SPLandroidx/compose/ui/graphics/colorspace/Oklab;->toXy$ui_graphics(FFF)J +SPLandroidx/compose/ui/graphics/colorspace/Oklab;->toZ$ui_graphics(FFF)F +SPLandroidx/compose/ui/graphics/colorspace/Oklab;->xyzaToColor-JlNiLsg$ui_graphics(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J +Landroidx/compose/ui/graphics/colorspace/Rgb; +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->()V +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;DFFI)V +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/TransferParameters;I)V +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;[FLandroidx/compose/ui/graphics/colorspace/DoubleFunction;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;FFLandroidx/compose/ui/graphics/colorspace/TransferParameters;I)V +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->getMaxValue(I)F +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->getMinValue(I)F +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->isSrgb()Z +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->toXy$ui_graphics(FFF)J +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->toZ$ui_graphics(FFF)F +SPLandroidx/compose/ui/graphics/colorspace/Rgb;->xyzaToColor-JlNiLsg$ui_graphics(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J +Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0; +SPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/graphics/colorspace/Rgb;I)V +SPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;->invoke(D)D +Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda3; +SPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda3;->(DI)V +Landroidx/compose/ui/graphics/colorspace/Rgb$Companion$$ExternalSyntheticLambda0; +SPLandroidx/compose/ui/graphics/colorspace/Rgb$Companion$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/graphics/colorspace/TransferParameters;I)V +SPLandroidx/compose/ui/graphics/colorspace/Rgb$Companion$$ExternalSyntheticLambda0;->invoke(D)D +Landroidx/compose/ui/graphics/colorspace/Rgb$eotf$1; +SPLandroidx/compose/ui/graphics/colorspace/Rgb$eotf$1;->(Landroidx/compose/ui/graphics/colorspace/Rgb;I)V +Landroidx/compose/ui/graphics/colorspace/TransferParameters; +SPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->(DDDDD)V +SPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->(DDDDDDD)V +Landroidx/compose/ui/graphics/colorspace/WhitePoint; +SPLandroidx/compose/ui/graphics/colorspace/WhitePoint;->(FF)V +SPLandroidx/compose/ui/graphics/colorspace/WhitePoint;->toXyz$ui_graphics()[F +Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope; +HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->()V +HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-2qPWKa0$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;JLandroidx/compose/ui/graphics/drawscope/DrawStyle;FI)Lkotlinx/coroutines/flow/SharingConfig; +HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-swdJneE(Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/BlendModeColorFilter;II)Lkotlinx/coroutines/flow/SharingConfig; +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/AndroidImageBitmap;JJJFLandroidx/compose/ui/graphics/BlendModeColorFilter;I)V +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawLine-NGM6Ib0(JJJFI)V +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawPath-GBMwjPU(Landroidx/compose/ui/graphics/AndroidPath;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/drawscope/DrawStyle;I)V +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawPath-LG529CI(Landroidx/compose/ui/graphics/AndroidPath;JLandroidx/compose/ui/graphics/drawscope/DrawStyle;)V +HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRect-n-J9OG0(JJJFI)V +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-u-Aw5IA(JJJJ)V +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDensity()F +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDrawContext()Landroidx/emoji2/text/EmojiProcessor; +SPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->selectPaint(Landroidx/compose/ui/graphics/drawscope/DrawStyle;)Lkotlinx/coroutines/flow/SharingConfig; +Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams; +Landroidx/compose/ui/graphics/drawscope/DrawContextKt; +SPLandroidx/compose/ui/graphics/drawscope/DrawContextKt;->()V +Landroidx/compose/ui/graphics/drawscope/DrawScope; +SPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawImage-AZ2fEMs$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/AndroidImageBitmap;JJFLandroidx/compose/ui/graphics/BlendModeColorFilter;II)V +SPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawPath-GBMwjPU$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/AndroidPath;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/drawscope/Stroke;I)V +SPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRect-n-J9OG0$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JJJFI)V +SPLandroidx/compose/ui/graphics/drawscope/DrawScope;->getSize-NH-jbRc()J +SPLandroidx/compose/ui/graphics/drawscope/DrawScope;->offsetSize-PENXr5M(JJ)J +Landroidx/compose/ui/graphics/drawscope/DrawStyle; +Landroidx/compose/ui/graphics/drawscope/EmptyCanvas; +SPLandroidx/compose/ui/graphics/drawscope/EmptyCanvas;->()V +Landroidx/compose/ui/graphics/drawscope/Fill; +SPLandroidx/compose/ui/graphics/drawscope/Fill;->()V +Landroidx/compose/ui/graphics/layer/GraphicsLayer; +SPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->()V +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->(Landroidx/compose/ui/graphics/layer/GraphicsLayerImpl;)V +PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->discardContentIfReleasedAndHaveNoParentLayerUsages()V +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->drawWithChildTracking(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V +PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->getOutline()Landroidx/compose/ui/graphics/ColorKt; +PLandroidx/compose/ui/graphics/layer/GraphicsLayer;->onRemovedFromParentLayer()V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayer;->setRoundRectOutline-TNW_H78(JJF)V +Landroidx/compose/ui/graphics/layer/GraphicsLayer$drawBlock$1; +SPLandroidx/compose/ui/graphics/layer/GraphicsLayer$drawBlock$1;->()V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayer$drawBlock$1;->(II)V +Landroidx/compose/ui/graphics/layer/GraphicsLayerImpl; +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerImpl;->()V +Landroidx/compose/ui/graphics/layer/GraphicsLayerImpl$Companion; +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerImpl$Companion;->()V +Landroidx/compose/ui/graphics/layer/GraphicsLayerV29; +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->()V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->applyClip$1()V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->applyCompositingStrategy-Z1X6vPc(Landroid/graphics/RenderNode;I)V +PLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->discardDisplayList()V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->draw(Landroidx/compose/ui/graphics/Canvas;)V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getAlpha()F +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getHasDisplayList()Z +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->getShadowElevation()F +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->record(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/graphics/layer/GraphicsLayer;Landroidx/compose/ui/node/NodeChainKt$fillVector$1;)V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->setAlpha(F)V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->setClip(Z)V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->setOutline-O0kMr_c(Landroid/graphics/Outline;J)V +HSPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->setPosition-H0pRuoY(IIJ)V +SPLandroidx/compose/ui/graphics/layer/GraphicsLayerV29;->setShadowElevation(F)V +Landroidx/compose/ui/graphics/painter/Painter; +SPLandroidx/compose/ui/graphics/painter/Painter;->()V +HSPLandroidx/compose/ui/graphics/painter/Painter;->draw-x_KDEd0(Landroidx/compose/ui/node/LayoutNodeDrawScope;JFLandroidx/compose/ui/graphics/BlendModeColorFilter;)V +Landroidx/compose/ui/graphics/vector/DrawCache; +SPLandroidx/compose/ui/graphics/vector/DrawCache;->()V +Landroidx/compose/ui/graphics/vector/GroupComponent; +SPLandroidx/compose/ui/graphics/vector/GroupComponent;->()V +HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V +SPLandroidx/compose/ui/graphics/vector/GroupComponent;->getInvalidateListener$ui()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/ui/graphics/vector/GroupComponent;->insertAt(ILandroidx/compose/ui/graphics/vector/VNode;)V +SPLandroidx/compose/ui/graphics/vector/GroupComponent;->markTintForColor-8_81llA(J)V +SPLandroidx/compose/ui/graphics/vector/GroupComponent;->markTintForVNode(Landroidx/compose/ui/graphics/vector/VNode;)V +Landroidx/compose/ui/graphics/vector/ImageVector; +SPLandroidx/compose/ui/graphics/vector/ImageVector;->()V +SPLandroidx/compose/ui/graphics/vector/ImageVector;->(Ljava/lang/String;FFFFLandroidx/compose/ui/graphics/vector/VectorGroup;JIZ)V +Landroidx/compose/ui/graphics/vector/ImageVector$Builder; +SPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->(Ljava/lang/String;FFFFJIZI)V +SPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->addPath-oIyEayM$default(Landroidx/compose/ui/graphics/vector/ImageVector$Builder;Ljava/util/ArrayList;Landroidx/compose/ui/graphics/SolidColor;)V +SPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->build()Landroidx/compose/ui/graphics/vector/ImageVector; +Landroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams; +SPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->(Ljava/lang/String;FFFFFFFLjava/util/List;I)V +Landroidx/compose/ui/graphics/vector/PathComponent; +SPLandroidx/compose/ui/graphics/vector/PathComponent;->()V +SPLandroidx/compose/ui/graphics/vector/PathComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V +SPLandroidx/compose/ui/graphics/vector/PathComponent;->updateRenderPath()V +Landroidx/compose/ui/graphics/vector/PathComponent$pathMeasure$2; +SPLandroidx/compose/ui/graphics/vector/PathComponent$pathMeasure$2;->()V +SPLandroidx/compose/ui/graphics/vector/PathComponent$pathMeasure$2;->(II)V +Landroidx/compose/ui/graphics/vector/PathNode; +SPLandroidx/compose/ui/graphics/vector/PathNode;->(I)V +Landroidx/compose/ui/graphics/vector/PathNode$Close; +SPLandroidx/compose/ui/graphics/vector/PathNode$Close;->()V +Landroidx/compose/ui/graphics/vector/PathNode$CurveTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->(FFFFFF)V +Landroidx/compose/ui/graphics/vector/PathNode$HorizontalTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$HorizontalTo;->(F)V +Landroidx/compose/ui/graphics/vector/PathNode$LineTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->(FF)V +Landroidx/compose/ui/graphics/vector/PathNode$MoveTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->(FF)V +Landroidx/compose/ui/graphics/vector/PathNode$QuadTo; +Landroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->(FFFF)V +Landroidx/compose/ui/graphics/vector/PathNode$ReflectiveQuadTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveQuadTo;->(FF)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->(FFFFFF)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo;->(F)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->(FF)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->(FF)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeQuadTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeQuadTo;->(FFFF)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->(FFFF)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveQuadTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveQuadTo;->(FF)V +Landroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo;->(F)V +Landroidx/compose/ui/graphics/vector/PathNode$VerticalTo; +SPLandroidx/compose/ui/graphics/vector/PathNode$VerticalTo;->(F)V +Landroidx/compose/ui/graphics/vector/PathParserKt; +SPLandroidx/compose/ui/graphics/vector/PathParserKt;->()V +HSPLandroidx/compose/ui/graphics/vector/PathParserKt;->createGroupComponent(Landroidx/compose/ui/graphics/vector/GroupComponent;Landroidx/compose/ui/graphics/vector/VectorGroup;)V +SPLandroidx/compose/ui/graphics/vector/PathParserKt;->nextFloat(IILjava/lang/String;)J +HSPLandroidx/compose/ui/graphics/vector/PathParserKt;->rememberVectorPainter(Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/ui/graphics/vector/VectorPainter; +HSPLandroidx/compose/ui/graphics/vector/PathParserKt;->toPath(Ljava/util/List;Landroidx/compose/ui/graphics/AndroidPath;)V +Landroidx/compose/ui/graphics/vector/VNode; +SPLandroidx/compose/ui/graphics/vector/VNode;->getInvalidateListener$ui()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/ui/graphics/vector/VNode;->invalidate()V +SPLandroidx/compose/ui/graphics/vector/VNode;->setInvalidateListener$ui(Landroidx/compose/ui/node/NodeChainKt$fillVector$1;)V +Landroidx/compose/ui/graphics/vector/VectorComponent; +HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->(Landroidx/compose/ui/graphics/vector/GroupComponent;)V +HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;FLandroidx/compose/ui/graphics/BlendModeColorFilter;)V +Landroidx/compose/ui/graphics/vector/VectorComponent$1; +SPLandroidx/compose/ui/graphics/vector/VectorComponent$1;->(Landroidx/compose/ui/graphics/vector/VectorComponent;I)V +HSPLandroidx/compose/ui/graphics/vector/VectorComponent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/graphics/vector/VectorGroup; +SPLandroidx/compose/ui/graphics/vector/VectorGroup;->(Ljava/lang/String;FFFFFFFLjava/util/List;Ljava/util/ArrayList;)V +Landroidx/compose/ui/graphics/vector/VectorKt; +SPLandroidx/compose/ui/graphics/vector/VectorKt;->()V +Landroidx/compose/ui/graphics/vector/VectorNode; +Landroidx/compose/ui/graphics/vector/VectorPainter; +HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->(Landroidx/compose/ui/graphics/vector/GroupComponent;)V +SPLandroidx/compose/ui/graphics/vector/VectorPainter;->applyColorFilter(Landroidx/compose/ui/graphics/BlendModeColorFilter;)V +SPLandroidx/compose/ui/graphics/vector/VectorPainter;->getIntrinsicSize-NH-jbRc()J +SPLandroidx/compose/ui/graphics/vector/VectorPainter;->onDraw(Landroidx/compose/ui/node/LayoutNodeDrawScope;)V +Landroidx/compose/ui/graphics/vector/VectorPath; +SPLandroidx/compose/ui/graphics/vector/VectorPath;->(Ljava/lang/String;Ljava/util/List;ILandroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Brush;FFIIFFFF)V +Landroidx/compose/ui/graphics/vector/compat/AndroidVectorParser; +SPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->(Landroid/content/res/XmlResourceParser;)V +SPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedComplexColor(Landroid/content/res/TypedArray;Landroid/content/res/Resources$Theme;Ljava/lang/String;I)Lokio/PriorityQueue; +SPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedFloat(Landroid/content/res/TypedArray;Ljava/lang/String;IF)F +SPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->updateConfig(I)V +Landroidx/compose/ui/graphics/vector/compat/AndroidVectorResources; +SPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->()V +Landroidx/compose/ui/hapticfeedback/HapticFeedback; +Landroidx/compose/ui/input/InputMode; +SPLandroidx/compose/ui/input/InputMode;->(I)V +SPLandroidx/compose/ui/input/InputMode;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/input/InputModeManager; +Landroidx/compose/ui/input/InputModeManagerImpl; +SPLandroidx/compose/ui/input/InputModeManagerImpl;->(I)V +Landroidx/compose/ui/input/indirect/IndirectPointerInputModifierNode; +Landroidx/compose/ui/input/key/KeyInputModifierNode; +Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection; +PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$dispatchPostFling$1;->(Lokhttp3/Dispatcher;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher$dispatchPreFling$1;->(Lokhttp3/Dispatcher;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/compose/ui/input/nestedscroll/NestedScrollNode; +SPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Lokhttp3/Dispatcher;)V +PLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->getNestedCoroutineScope()Lkotlinx/coroutines/CoroutineScope; +PLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->getTraverseKey()Ljava/lang/Object; +SPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->onAttach()V +PLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->onDetach()V +Landroidx/compose/ui/input/pointer/AndroidPointerIconType; +SPLandroidx/compose/ui/input/pointer/AndroidPointerIconType;->(I)V +PLandroidx/compose/ui/input/pointer/CancelTimeoutCancellationException;->()V +PLandroidx/compose/ui/input/pointer/HistoricalChange;->(JJJ)V +Landroidx/compose/ui/input/pointer/HitPathTracker; +SPLandroidx/compose/ui/input/pointer/HitPathTracker;->(Landroidx/compose/ui/layout/LayoutCoordinates;)V +PLandroidx/compose/ui/input/pointer/HitPathTracker;->addHitPath-QJqDSyo(JLjava/util/List;Z)V +PLandroidx/compose/ui/input/pointer/HitPathTracker;->dispatchChanges(Landroidx/paging/ConflatedEventBus;Z)Z +PLandroidx/compose/ui/input/pointer/HitPathTracker;->removePointerInputModifierNode(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/ui/input/pointer/MatrixPositionCalculator; +Landroidx/compose/ui/input/pointer/MotionEventAdapter; +SPLandroidx/compose/ui/input/pointer/MotionEventAdapter;->()V +PLandroidx/compose/ui/input/pointer/MotionEventAdapter;->addFreshIds(Landroid/view/MotionEvent;)V +PLandroidx/compose/ui/input/pointer/MotionEventAdapter;->clearOnDeviceChange(Landroid/view/MotionEvent;)V +PLandroidx/compose/ui/input/pointer/MotionEventAdapter;->convertToPointerInputEvent$ui(Landroid/view/MotionEvent;Landroidx/compose/ui/platform/AndroidComposeView;)Landroidx/paging/ConflatedEventBus; +PLandroidx/compose/ui/input/pointer/MotionEventAdapter;->removeStaleIds(Landroid/view/MotionEvent;)V +Landroidx/compose/ui/input/pointer/Node; +PLandroidx/compose/ui/input/pointer/Node;->(Landroidx/compose/ui/Modifier$Node;)V +HPLandroidx/compose/ui/input/pointer/Node;->buildCache(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/paging/ConflatedEventBus;Z)Z +PLandroidx/compose/ui/input/pointer/Node;->cleanUpHits(Landroidx/paging/ConflatedEventBus;)V +PLandroidx/compose/ui/input/pointer/Node;->dispatchFinalEventPass(Landroidx/paging/ConflatedEventBus;)Z +PLandroidx/compose/ui/input/pointer/Node;->dispatchMainEventPass(Landroidx/paging/ConflatedEventBus;Z)Z +PLandroidx/compose/ui/input/pointer/Node;->removeInvalidPointerIdsAndChanges(JLandroidx/collection/MutableObjectList;)V +Landroidx/compose/ui/input/pointer/NodeParent; +SPLandroidx/compose/ui/input/pointer/NodeParent;->()V +PLandroidx/compose/ui/input/pointer/NodeParent;->buildCache(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/paging/ConflatedEventBus;Z)Z +PLandroidx/compose/ui/input/pointer/NodeParent;->cleanUpHits(Landroidx/paging/ConflatedEventBus;)V +Landroidx/compose/ui/input/pointer/PointerEvent; +SPLandroidx/compose/ui/input/pointer/PointerEvent;->(Ljava/util/List;Landroidx/paging/ConflatedEventBus;)V +SPLandroidx/compose/ui/input/pointer/PointerEvent;->getMotionEvent()Landroid/view/MotionEvent; +PLandroidx/compose/ui/input/pointer/PointerEventPass;->()V +Landroidx/compose/ui/input/pointer/PointerIcon; +SPLandroidx/compose/ui/input/pointer/PointerIcon;->()V +Landroidx/compose/ui/input/pointer/PointerIcon$Companion; +SPLandroidx/compose/ui/input/pointer/PointerIcon$Companion;->()V +Landroidx/compose/ui/input/pointer/PointerIconService; +PLandroidx/compose/ui/input/pointer/PointerId;->()V +PLandroidx/compose/ui/input/pointer/PointerId;->changedToDown(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z +PLandroidx/compose/ui/input/pointer/PointerId;->changedToDownIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z +PLandroidx/compose/ui/input/pointer/PointerId;->changedToUp(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z +PLandroidx/compose/ui/input/pointer/PointerId;->changedToUpIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z +PLandroidx/compose/ui/input/pointer/PointerId;->equals-impl0(JJ)Z +PLandroidx/compose/ui/input/pointer/PointerId;->isOutOfBounds-jwHxaWs(Landroidx/compose/ui/input/pointer/PointerInputChange;JJ)Z +PLandroidx/compose/ui/input/pointer/PointerId;->positionChangeInternal(Landroidx/compose/ui/input/pointer/PointerInputChange;Z)J +PLandroidx/compose/ui/input/pointer/PointerInputChange;->(JJJZFJJZILjava/util/ArrayList;JJ)V +PLandroidx/compose/ui/input/pointer/PointerInputChange;->(JJJZFJJZZIJ)V +PLandroidx/compose/ui/input/pointer/PointerInputChange;->consume()V +PLandroidx/compose/ui/input/pointer/PointerInputChange;->isConsumed()Z +PLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->(JJZ)V +PLandroidx/compose/ui/input/pointer/PointerInputEventData;->(JJJJZFIZLjava/util/ArrayList;JJ)V +Landroidx/compose/ui/input/pointer/PointerInputEventHandler; +Landroidx/compose/ui/input/pointer/PointerInputResetException; +Landroidx/compose/ui/input/pointer/PointerInputScope; +PLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->(I)V +PLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/input/pointer/PointerType;->(I)V +Landroidx/compose/ui/input/pointer/SuspendPointerInputElement; +SPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/ui/input/pointer/PointerInputEventHandler;I)V +SPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->update(Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt; +SPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->()V +SPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->pointerInput(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/Modifier; +Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$sam$androidx_compose_ui_input_pointer_PointerInputEventHandler$0; +SPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$sam$androidx_compose_ui_input_pointer_PointerInputEventHandler$0;->(Lkotlin/jvm/functions/Function2;)V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt$sam$androidx_compose_ui_input_pointer_PointerInputEventHandler$0;->invoke(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl; +SPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/ui/input/pointer/PointerInputEventHandler;)V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->awaitPointerEventScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->dispatchPointerEvent(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;)V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->getDensity()F +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->onDetach()V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->resetPointerInputHandler()V +Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine; +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;Lkotlinx/coroutines/CancellableContinuationImpl;)V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->awaitPointerEvent(Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getExtendedTouchPadding-NH-jbRc()J +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->resumeWith(Ljava/lang/Object;)V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->withTimeout(JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine$withTimeout$1;->(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine$withTimeout$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/ui/input/pointer/util/DefaultVelocityTracker;->()V +PLandroidx/compose/ui/input/pointer/util/DefaultVelocityTracker;->addPosition-Uv8p0NA(JJ)V +PLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->()V +PLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->(ZLandroidx/compose/ui/input/pointer/util/VelocityTracker1D$Strategy;)V +PLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->addDataPoint(FJ)V +PLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->calculateVelocity(F)F +PLandroidx/compose/ui/input/pointer/util/VelocityTracker1D$Strategy;->()V +Landroidx/compose/ui/internal/PlatformOptimizedCancellationException; +SPLandroidx/compose/ui/internal/PlatformOptimizedCancellationException;->(Ljava/lang/String;I)V +SPLandroidx/compose/ui/internal/PlatformOptimizedCancellationException;->fillInStackTrace()Ljava/lang/Throwable; +Landroidx/compose/ui/internal/PlatformOptimizedCancellationException_jvmKt; +SPLandroidx/compose/ui/internal/PlatformOptimizedCancellationException_jvmKt;->()V +Landroidx/compose/ui/layout/AlignmentLineKt; +SPLandroidx/compose/ui/layout/AlignmentLineKt;->()V +Landroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1; +SPLandroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;->()V +Landroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1; +SPLandroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;->()V +Landroidx/compose/ui/layout/BeyondBoundsLayout$BeyondBoundsScope; +Landroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt; +SPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt;->()V +Landroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda$641200809$1; +SPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda$641200809$1;->()V +Landroidx/compose/ui/layout/ContentScale$Companion; +SPLandroidx/compose/ui/layout/ContentScale$Companion;->()V +Landroidx/compose/ui/layout/ContentScale$Companion$Fit$1; +SPLandroidx/compose/ui/layout/ContentScale$Companion$Fit$1;->()V +SPLandroidx/compose/ui/layout/ContentScale$Companion$Fit$1;->(I)V +SPLandroidx/compose/ui/layout/ContentScale$Companion$Fit$1;->computeScaleFactor-H7hwNQA(JJ)J +Landroidx/compose/ui/layout/HorizontalAlignmentLine; +SPLandroidx/compose/ui/layout/HorizontalAlignmentLine;->(Lkotlin/jvm/functions/Function2;)V +Landroidx/compose/ui/layout/HorizontalRuler$Companion$maxOf$1; +SPLandroidx/compose/ui/layout/HorizontalRuler$Companion$maxOf$1;->([Landroidx/compose/ui/layout/VerticalRuler;I)V +Landroidx/compose/ui/layout/InsetsListener; +SPLandroidx/compose/ui/layout/InsetsListener;->()V +SPLandroidx/compose/ui/layout/InsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/compose/ui/layout/InsetsListener;->onViewAttachedToWindow(Landroid/view/View;)V +SPLandroidx/compose/ui/layout/InsetsListener;->updateInsets(Landroidx/core/view/WindowInsetsCompat;)V +Landroidx/compose/ui/layout/IntrinsicMeasureScope; +Landroidx/compose/ui/layout/LayoutCoordinates; +Landroidx/compose/ui/layout/LayoutElement; +SPLandroidx/compose/ui/layout/LayoutElement;->(Lkotlin/jvm/functions/Function3;)V +SPLandroidx/compose/ui/layout/LayoutElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/ui/layout/LayoutElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/layout/LayoutIdElement; +SPLandroidx/compose/ui/layout/LayoutIdElement;->(Ljava/lang/Object;)V +SPLandroidx/compose/ui/layout/LayoutIdElement;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/ui/layout/LayoutIdElement;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/layout/LayoutIdModifier; +SPLandroidx/compose/ui/layout/LayoutIdModifier;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/layout/LayoutModifier; +Landroidx/compose/ui/layout/LayoutModifierImpl; +SPLandroidx/compose/ui/layout/LayoutModifierImpl;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$disposePrecomposedSlot(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Ljava/lang/Object;)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->applyPausedPrecomposition(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;Z)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->cancelPausedPrecomposition(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->createPrecomposedSlotHandle(Ljava/lang/Object;)Landroidx/compose/ui/layout/SubcomposeLayoutState$PrecomposedSlotHandle; +HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->makeSureStateIsConsistent()V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->move(II)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->onRelease()V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->precompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Z)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->reuseComposition(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;Z)V +HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->subcompose(Landroidx/compose/ui/node/LayoutNode;Ljava/lang/Object;ZLkotlin/jvm/functions/Function2;)V +HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->takeNodeFromReusables(Ljava/lang/Object;)Landroidx/compose/ui/node/LayoutNode; +Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$ApproachMeasureScopeImpl; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$ApproachMeasureScopeImpl;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V +Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState; +Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getDensity()F +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->isLookingAhead()Z +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; +HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->subcompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/util/List; +Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope$layout$1; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope$layout$1;->(IILjava/util/Map;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope$layout$1;->getAlignmentLines()Ljava/util/Map; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope$layout$1;->getHeight()I +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope$layout$1;->getRulers()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope$layout$1;->getWidth()I +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope$layout$1;->placeChildren()V +Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Lkotlin/jvm/functions/Function2;Ljava/lang/String;)V +HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->(Landroidx/compose/ui/layout/MeasureResult;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;ILandroidx/compose/ui/layout/MeasureResult;I)V +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getAlignmentLines()Ljava/util/Map; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getHeight()I +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getRulers()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getWidth()I +SPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->placeChildren()V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createPrecomposedSlotHandle$2;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Ljava/lang/Object;)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createPrecomposedSlotHandle$2;->dispose()V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createPrecomposedSlotHandle$2;->getPlaceablesCount()I +HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createPrecomposedSlotHandle$2;->premeasure-0kLqBqw(IJ)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createPrecomposedSlotHandle$2;->traverseDescendants(Landroidx/navigation/NavGraphNavigator$$ExternalSyntheticLambda0;)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precomposePaused$1;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Ljava/lang/Object;I)V +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precomposePaused$1;->getNodeState()Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState; +PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$precomposePaused$1;->isComplete()Z +Landroidx/compose/ui/layout/LookaheadLayoutCoordinates; +Landroidx/compose/ui/layout/Measurable; +Landroidx/compose/ui/layout/MeasurePolicy; +Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/layout/MeasureScope; +SPLandroidx/compose/ui/layout/MeasureScope;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/layout/OnSizeChangedModifier; +SPLandroidx/compose/ui/layout/OnSizeChangedModifier;->(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/layout/OnSizeChangedModifier;->create()Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/ui/layout/OnSizeChangedModifier;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/layout/OnSizeChangedNode; +SPLandroidx/compose/ui/layout/OnSizeChangedNode;->onRemeasured-ozmzZPI(J)V +Landroidx/compose/ui/layout/OuterPlacementScope; +SPLandroidx/compose/ui/layout/OuterPlacementScope;->(ILjava/lang/Object;)V +SPLandroidx/compose/ui/layout/OuterPlacementScope;->getDensity()F +SPLandroidx/compose/ui/layout/OuterPlacementScope;->getParentLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; +Landroidx/compose/ui/layout/PinnableContainerKt; +SPLandroidx/compose/ui/layout/PinnableContainerKt;->()V +Landroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1; +SPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->()V +SPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/layout/Placeable; +HSPLandroidx/compose/ui/layout/Placeable;->()V +SPLandroidx/compose/ui/layout/Placeable;->getMeasuredHeight()I +SPLandroidx/compose/ui/layout/Placeable;->getMeasuredWidth()I +HSPLandroidx/compose/ui/layout/Placeable;->onMeasuredSizeChanged()V +SPLandroidx/compose/ui/layout/Placeable;->setMeasuredSize-ozmzZPI(J)V +SPLandroidx/compose/ui/layout/Placeable;->setMeasurementConstraints-BRTryo0(J)V +Landroidx/compose/ui/layout/Placeable$PlacementScope; +SPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V +HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place(Landroidx/compose/ui/layout/Placeable;IIF)V +SPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place-70tqf50$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;J)V +HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelative$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V +SPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelativeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V +HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;IILkotlin/jvm/functions/Function1;I)V +Landroidx/compose/ui/layout/PlaceableKt; +SPLandroidx/compose/ui/layout/PlaceableKt;->()V +Landroidx/compose/ui/layout/RectRulersImpl; +SPLandroidx/compose/ui/layout/RectRulersImpl;->(Ljava/lang/String;)V +SPLandroidx/compose/ui/layout/RectRulersImpl;->([Landroidx/compose/ui/layout/RectRulersImpl;)V +SPLandroidx/compose/ui/layout/RectRulersImpl;->getBottom()Landroidx/compose/ui/layout/VerticalRuler; +SPLandroidx/compose/ui/layout/RectRulersImpl;->getLeft()Landroidx/compose/ui/layout/VerticalRuler; +SPLandroidx/compose/ui/layout/RectRulersImpl;->getRight()Landroidx/compose/ui/layout/VerticalRuler; +SPLandroidx/compose/ui/layout/RectRulersImpl;->getTop()Landroidx/compose/ui/layout/VerticalRuler; +Landroidx/compose/ui/layout/RootMeasurePolicy; +SPLandroidx/compose/ui/layout/RootMeasurePolicy;->()V +SPLandroidx/compose/ui/layout/RootMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/layout/RootMeasurePolicy$measure$1; +SPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->()V +SPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->(II)V +SPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/layout/RootMeasurePolicy$measure$3; +SPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$3;->(ILjava/util/ArrayList;)V +SPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/layout/RulerKt; +SPLandroidx/compose/ui/layout/RulerKt;->()V +SPLandroidx/compose/ui/layout/RulerKt;->SubcomposeLayout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/ui/layout/RulerKt;->SubcomposeLayout(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/ui/layout/RulerKt;->equals-impl0(JJ)Z +SPLandroidx/compose/ui/layout/RulerKt;->getLayoutId(Landroidx/compose/ui/layout/Measurable;)Ljava/lang/Object; +SPLandroidx/compose/ui/layout/RulerKt;->layout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/layout/RulerKt;->layoutId(Landroidx/compose/ui/Modifier;Ljava/lang/Object;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/layout/RulerKt;->onSizeChanged(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/layout/RulerKt;->times-UQTWf7w(JJ)J +Landroidx/compose/ui/layout/ScaleFactor; +SPLandroidx/compose/ui/layout/ScaleFactor;->()V +Landroidx/compose/ui/layout/SubcomposeLayoutState; +SPLandroidx/compose/ui/layout/SubcomposeLayoutState;->(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V +SPLandroidx/compose/ui/layout/SubcomposeLayoutState;->getState()Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; +Landroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1; +SPLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;->(Landroidx/compose/ui/layout/SubcomposeLayoutState;I)V +SPLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/layout/SubcomposeMeasureScope; +Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy; +Landroidx/compose/ui/layout/VerticalRuler; +SPLandroidx/compose/ui/layout/VerticalRuler;->(ILkotlin/jvm/functions/Function2;)V +Landroidx/compose/ui/layout/VerticalRuler$Companion$maxOf$1; +SPLandroidx/compose/ui/layout/VerticalRuler$Companion$maxOf$1;->([Landroidx/compose/ui/layout/VerticalRuler;I)V +Landroidx/compose/ui/layout/WindowInsetsRulers; +SPLandroidx/compose/ui/layout/WindowInsetsRulers;->()V +Landroidx/compose/ui/layout/WindowInsetsRulers$Companion; +SPLandroidx/compose/ui/layout/WindowInsetsRulers$Companion;->()V +Landroidx/compose/ui/layout/WindowInsetsRulersImpl; +SPLandroidx/compose/ui/layout/WindowInsetsRulersImpl;->(Ljava/lang/String;)V +Landroidx/compose/ui/layout/WindowInsetsRulers_androidKt; +SPLandroidx/compose/ui/layout/WindowInsetsRulers_androidKt;->()V +SPLandroidx/compose/ui/layout/WindowInsetsRulers_androidKt;->provideInsetsValues-cytEWk0(Landroidx/compose/ui/node/LookaheadCapablePlaceable$ResettableRulerScope;Landroidx/compose/ui/layout/RectRulersImpl;JII)V +Landroidx/compose/ui/layout/WindowWindowInsetsAnimationValues; +SPLandroidx/compose/ui/layout/WindowWindowInsetsAnimationValues;->(Ljava/lang/String;)V +Landroidx/compose/ui/modifier/ModifierLocalManager; +Landroidx/compose/ui/modifier/ModifierLocalModifierNode; +Landroidx/compose/ui/node/AlignmentLinesOwner; +Landroidx/compose/ui/node/BackwardsCompatNode; +SPLandroidx/compose/ui/node/BackwardsCompatNode;->initializeModifier(Z)V +SPLandroidx/compose/ui/node/BackwardsCompatNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/compose/ui/node/BackwardsCompatNode;->onAttach()V +PLandroidx/compose/ui/node/BackwardsCompatNode;->onDetach()V +Landroidx/compose/ui/node/ComposeUiNode; +SPLandroidx/compose/ui/node/ComposeUiNode;->()V +Landroidx/compose/ui/node/ComposeUiNode$Companion; +SPLandroidx/compose/ui/node/ComposeUiNode$Companion;->()V +Landroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1; +SPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;->()V +SPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;->(II)V +HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/node/CompositionLocalConsumerModifierNode; +Landroidx/compose/ui/node/DelegatableNode; +SPLandroidx/compose/ui/node/DelegatableNode;->onDensityChange()V +Landroidx/compose/ui/node/DelegatingNode; +SPLandroidx/compose/ui/node/DelegatingNode;->()V +SPLandroidx/compose/ui/node/DelegatingNode;->delegate(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/DelegatableNode; +SPLandroidx/compose/ui/node/DelegatingNode;->markAsAttached$ui()V +SPLandroidx/compose/ui/node/DelegatingNode;->markAsDetached$ui()V +PLandroidx/compose/ui/node/DelegatingNode;->reset$ui()V +SPLandroidx/compose/ui/node/DelegatingNode;->runAttachLifecycle$ui()V +SPLandroidx/compose/ui/node/DelegatingNode;->runDetachLifecycle$ui()V +SPLandroidx/compose/ui/node/DelegatingNode;->setAsDelegateTo$ui(Landroidx/compose/ui/Modifier$Node;)V +SPLandroidx/compose/ui/node/DelegatingNode;->undelegate(Landroidx/compose/ui/node/DelegatableNode;)V +SPLandroidx/compose/ui/node/DelegatingNode;->updateCoordinator$ui(Landroidx/compose/ui/node/NodeCoordinator;)V +SPLandroidx/compose/ui/node/DelegatingNode;->updateNodeKindSet(IZ)V +Landroidx/compose/ui/node/DepthSortedSetKt$DepthComparator$1; +SPLandroidx/compose/ui/node/DepthSortedSetKt$DepthComparator$1;->()V +SPLandroidx/compose/ui/node/DepthSortedSetKt$DepthComparator$1;->(I)V +HSPLandroidx/compose/ui/node/DepthSortedSetKt$DepthComparator$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I +Landroidx/compose/ui/node/DrawModifierNode; +SPLandroidx/compose/ui/node/DrawModifierNode;->onMeasureResultChanged()V +Landroidx/compose/ui/node/GlobalPositionAwareModifierNode; +Landroidx/compose/ui/node/HitTestResult; +SPLandroidx/compose/ui/node/HitTestResult;->()V +PLandroidx/compose/ui/node/HitTestResult;->clear()V +PLandroidx/compose/ui/node/HitTestResult;->findBestHitDistance-fn2tFes()J +PLandroidx/compose/ui/node/HitTestResult;->get(I)Ljava/lang/Object; +PLandroidx/compose/ui/node/HitTestResult;->removeNodesInRange(II)V +PLandroidx/compose/ui/node/HitTestResult;->size()I +Landroidx/compose/ui/node/HitTestResultKt; +SPLandroidx/compose/ui/node/HitTestResultKt;->()V +PLandroidx/compose/ui/node/HitTestResultKt;->DistanceAndFlags(FZZ)J +SPLandroidx/compose/ui/node/HitTestResultKt;->access$addLayoutNodeChildren(Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/Modifier$Node;)V +SPLandroidx/compose/ui/node/HitTestResultKt;->access$calculateAlignmentAndPlaceChildAsNeeded(Landroidx/compose/ui/node/LookaheadCapablePlaceable;Landroidx/compose/ui/layout/HorizontalAlignmentLine;)I +PLandroidx/compose/ui/node/HitTestResultKt;->access$nextUntil-hw7D004(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/Modifier$Node; +HSPLandroidx/compose/ui/node/HitTestResultKt;->access$pop(Landroidx/compose/runtime/collection/MutableVector;)Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/ui/node/HitTestResultKt;->asLayoutModifierNode(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/node/LayoutModifierNode; +PLandroidx/compose/ui/node/HitTestResultKt;->compareTo-9YPOF3E(JJ)I +SPLandroidx/compose/ui/node/HitTestResultKt;->currentValueOf(Landroidx/compose/ui/node/CompositionLocalConsumerModifierNode;Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; +PLandroidx/compose/ui/node/HitTestResultKt;->getDistance-impl(J)F +SPLandroidx/compose/ui/node/HitTestResultKt;->invalidateDraw(Landroidx/compose/ui/node/DrawModifierNode;)V +SPLandroidx/compose/ui/node/HitTestResultKt;->invalidateMeasurement(Landroidx/compose/ui/node/LayoutModifierNode;)V +SPLandroidx/compose/ui/node/HitTestResultKt;->invalidateSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)V +PLandroidx/compose/ui/node/HitTestResultKt;->isInExpandedBounds-impl(J)Z +PLandroidx/compose/ui/node/HitTestResultKt;->isInLayer-impl(J)Z +SPLandroidx/compose/ui/node/HitTestResultKt;->isOutMostLookaheadRoot(Landroidx/compose/ui/node/LayoutNode;)Z +SPLandroidx/compose/ui/node/HitTestResultKt;->observeReads(Landroidx/compose/ui/Modifier$Node;Lkotlin/jvm/functions/Function0;)V +PLandroidx/compose/ui/node/HitTestResultKt;->requireLayoutCoordinates(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/NodeCoordinator; +HSPLandroidx/compose/ui/node/HitTestResultKt;->requireLayoutNode(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/LayoutNode; +SPLandroidx/compose/ui/node/HitTestResultKt;->requireOwner(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/Owner; +SPLandroidx/compose/ui/node/HitTestResultKt;->traverseAncestors(Landroidx/compose/ui/node/DelegatableNode;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/ui/node/HitTestResultKt;->traverseAncestors(Landroidx/compose/ui/node/TraversableNode;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/node/HitTestResultKt;->traverseDescendants(Landroidx/compose/ui/node/DelegatableNode;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/ui/node/InnerNodeCoordinator; +SPLandroidx/compose/ui/node/InnerNodeCoordinator;->()V +HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;)V +SPLandroidx/compose/ui/node/InnerNodeCoordinator;->calculateAlignmentLine(Landroidx/compose/ui/layout/HorizontalAlignmentLine;)I +HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/ui/node/InnerNodeCoordinator;->hitTestChild-qzLsGqo(Landroidx/compose/ui/node/TouchBoundsExpansion$Companion;JLandroidx/compose/ui/node/HitTestResult;IZ)V +HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V +Landroidx/compose/ui/node/Invalidation; +SPLandroidx/compose/ui/node/Invalidation;->()V +Landroidx/compose/ui/node/LayerPositionalProperties; +SPLandroidx/compose/ui/node/LayerPositionalProperties;->()V +Landroidx/compose/ui/node/LayoutAwareModifierNode; +SPLandroidx/compose/ui/node/LayoutAwareModifierNode;->onPlaced(Landroidx/compose/ui/layout/LayoutCoordinates;)V +SPLandroidx/compose/ui/node/LayoutAwareModifierNode;->onRemeasured-ozmzZPI(J)V +Landroidx/compose/ui/node/LayoutModifierNode; +Landroidx/compose/ui/node/LayoutModifierNodeCoordinator; +SPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->()V +SPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutModifierNode;)V +SPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->calculateAlignmentLine(Landroidx/compose/ui/layout/HorizontalAlignmentLine;)I +HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node; +HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; +HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V +Landroidx/compose/ui/node/LayoutNode; +SPLandroidx/compose/ui/node/LayoutNode;->()V +SPLandroidx/compose/ui/node/LayoutNode;->(I)V +HSPLandroidx/compose/ui/node/LayoutNode;->(IZ)V +HSPLandroidx/compose/ui/node/LayoutNode;->attach$ui(Landroidx/compose/ui/node/Owner;)V +HSPLandroidx/compose/ui/node/LayoutNode;->clearSubtreeIntrinsicsUsage$ui()V +HSPLandroidx/compose/ui/node/LayoutNode;->clearSubtreePlacementIntrinsicsUsage()V +HPLandroidx/compose/ui/node/LayoutNode;->detach$ui()V +SPLandroidx/compose/ui/node/LayoutNode;->draw$ui(Landroidx/compose/ui/graphics/Canvas;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +PLandroidx/compose/ui/node/LayoutNode;->forceRemeasure()V +SPLandroidx/compose/ui/node/LayoutNode;->getChildMeasurables$ui()Ljava/util/List; +SPLandroidx/compose/ui/node/LayoutNode;->getChildren$ui()Ljava/util/List; +HSPLandroidx/compose/ui/node/LayoutNode;->getFoldedChildren$ui()Ljava/util/List; +SPLandroidx/compose/ui/node/LayoutNode;->getLayoutPending$ui()Z +SPLandroidx/compose/ui/node/LayoutNode;->getMeasurePending$ui()Z +SPLandroidx/compose/ui/node/LayoutNode;->getMeasuredByParent$ui()Landroidx/compose/ui/node/LayoutNode$UsageByParent; +HSPLandroidx/compose/ui/node/LayoutNode;->getParent$ui()Landroidx/compose/ui/node/LayoutNode; +SPLandroidx/compose/ui/node/LayoutNode;->getPlaceOrder$ui()I +HSPLandroidx/compose/ui/node/LayoutNode;->getSemanticsConfiguration()Landroidx/compose/ui/semantics/SemanticsConfiguration; +HSPLandroidx/compose/ui/node/LayoutNode;->getZSortedChildren()Landroidx/compose/runtime/collection/MutableVector; +HSPLandroidx/compose/ui/node/LayoutNode;->get_children$ui()Landroidx/compose/runtime/collection/MutableVector; +PLandroidx/compose/ui/node/LayoutNode;->hitTest-6fMxITs$ui(JLandroidx/compose/ui/node/HitTestResult;IZ)V +SPLandroidx/compose/ui/node/LayoutNode;->insertAt$ui(ILandroidx/compose/ui/node/LayoutNode;)V +HSPLandroidx/compose/ui/node/LayoutNode;->invalidateLayer$ui()V +SPLandroidx/compose/ui/node/LayoutNode;->invalidateLayers$ui()V +SPLandroidx/compose/ui/node/LayoutNode;->invalidateMeasurements$ui()V +HSPLandroidx/compose/ui/node/LayoutNode;->invalidateSemantics$ui()V +SPLandroidx/compose/ui/node/LayoutNode;->invalidateUnfoldedVirtualChildren()V +SPLandroidx/compose/ui/node/LayoutNode;->isAttached()Z +SPLandroidx/compose/ui/node/LayoutNode;->isPlaced()Z +SPLandroidx/compose/ui/node/LayoutNode;->isPlacedInLookahead()Ljava/lang/Boolean; +PLandroidx/compose/ui/node/LayoutNode;->isValidOwnerScope()Z +HPLandroidx/compose/ui/node/LayoutNode;->move$ui(III)V +PLandroidx/compose/ui/node/LayoutNode;->onChildRemoved(Landroidx/compose/ui/node/LayoutNode;)V +HSPLandroidx/compose/ui/node/LayoutNode;->onCoordinatorPositionChanged$ui()V +PLandroidx/compose/ui/node/LayoutNode;->onRelease()V +SPLandroidx/compose/ui/node/LayoutNode;->onZSortedChildrenInvalidated$ui()V +HSPLandroidx/compose/ui/node/LayoutNode;->remeasure-_Sx5XlM$ui$default(Landroidx/compose/ui/node/LayoutNode;)Z +SPLandroidx/compose/ui/node/LayoutNode;->remeasure-_Sx5XlM$ui(Landroidx/compose/ui/unit/Constraints;)Z +PLandroidx/compose/ui/node/LayoutNode;->removeAll$ui()V +PLandroidx/compose/ui/node/LayoutNode;->removeAt$ui(II)V +SPLandroidx/compose/ui/node/LayoutNode;->replace$ui()V +HSPLandroidx/compose/ui/node/LayoutNode;->requestRelayout$ui(Z)V +HSPLandroidx/compose/ui/node/LayoutNode;->requestRemeasure$ui$default(Landroidx/compose/ui/node/LayoutNode;ZI)V +HSPLandroidx/compose/ui/node/LayoutNode;->rescheduleRemeasureOrRelayout$ui(Landroidx/compose/ui/node/LayoutNode;)V +HSPLandroidx/compose/ui/node/LayoutNode;->resetSubtreeIntrinsicsUsage$ui()V +HSPLandroidx/compose/ui/node/LayoutNode;->setDensity(Landroidx/compose/ui/unit/Density;)V +SPLandroidx/compose/ui/node/LayoutNode;->setGloballyPositionedObservers(I)V +SPLandroidx/compose/ui/node/LayoutNode;->setLookaheadRoot(Landroidx/compose/ui/node/LayoutNode;)V +SPLandroidx/compose/ui/node/LayoutNode;->setMeasurePolicy(Landroidx/compose/ui/layout/MeasurePolicy;)V +HSPLandroidx/compose/ui/node/LayoutNode;->setModifier(Landroidx/compose/ui/Modifier;)V +SPLandroidx/compose/ui/node/LayoutNode;->setViewConfiguration(Landroidx/compose/ui/platform/ViewConfiguration;)V +HSPLandroidx/compose/ui/node/LayoutNode;->updateChildrenIfDirty$ui()V +Landroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0; +SPLandroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;->(I)V +Landroidx/compose/ui/node/LayoutNode$Companion$Constructor$1; +SPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->()V +SPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->(II)V +SPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/node/LayoutNode$Companion$DummyViewConfiguration$1; +Landroidx/compose/ui/node/LayoutNode$Companion$ErrorMeasurePolicy$1; +Landroidx/compose/ui/node/LayoutNode$LayoutState; +SPLandroidx/compose/ui/node/LayoutNode$LayoutState;->()V +SPLandroidx/compose/ui/node/LayoutNode$LayoutState;->values()[Landroidx/compose/ui/node/LayoutNode$LayoutState; +Landroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy; +SPLandroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy;->(Ljava/lang/String;)V +Landroidx/compose/ui/node/LayoutNode$UsageByParent; +SPLandroidx/compose/ui/node/LayoutNode$UsageByParent;->()V +Landroidx/compose/ui/node/LayoutNode$WhenMappings; +SPLandroidx/compose/ui/node/LayoutNode$WhenMappings;->()V +Landroidx/compose/ui/node/LayoutNode$_foldedChildren$1; +SPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->(ILjava/lang/Object;)V +SPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/node/LayoutNodeDrawScope; +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->()V +HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawContent()V +HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawDirect-eZhPAX0$ui(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/node/DrawModifierNode;Landroidx/compose/ui/graphics/layer/GraphicsLayer;)V +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/AndroidImageBitmap;JJJFLandroidx/compose/ui/graphics/BlendModeColorFilter;I)V +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawLine-NGM6Ib0(JJJFI)V +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawPath-LG529CI(Landroidx/compose/ui/graphics/AndroidPath;JLandroidx/compose/ui/graphics/drawscope/DrawStyle;)V +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRect-n-J9OG0(JJJFI)V +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-u-Aw5IA(JJJJ)V +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getSize-NH-jbRc()J +SPLandroidx/compose/ui/node/LayoutNodeDrawScope;->toPx-0680j_4(F)F +Landroidx/compose/ui/node/LayoutNodeKt; +SPLandroidx/compose/ui/node/LayoutNodeKt;->()V +SPLandroidx/compose/ui/node/LayoutNodeKt;->requireOwner(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/Owner; +Landroidx/compose/ui/node/LayoutNodeLayoutDelegate; +HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->(Landroidx/compose/ui/node/LayoutNode;)V +SPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getOuterCoordinator()Landroidx/compose/ui/node/NodeCoordinator; +HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->onCoordinatesUsed()V +SPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setChildrenAccessingCoordinatesDuringPlacement(I)V +SPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringModifierPlacement(Z)V +SPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringPlacement(Z)V +HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->updateParentData()V +Landroidx/compose/ui/node/LookaheadAlignmentLines; +HSPLandroidx/compose/ui/node/LookaheadAlignmentLines;->(Landroidx/compose/ui/node/AlignmentLinesOwner;I)V +SPLandroidx/compose/ui/node/LookaheadAlignmentLines;->access$addAlignmentLine(Landroidx/compose/ui/node/LookaheadAlignmentLines;Landroidx/compose/ui/layout/HorizontalAlignmentLine;ILandroidx/compose/ui/node/NodeCoordinator;)V +SPLandroidx/compose/ui/node/LookaheadAlignmentLines;->getAlignmentLinesMap(Landroidx/compose/ui/node/NodeCoordinator;)Ljava/util/Map; +SPLandroidx/compose/ui/node/LookaheadAlignmentLines;->getPositionFor(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/layout/HorizontalAlignmentLine;)I +HSPLandroidx/compose/ui/node/LookaheadAlignmentLines;->getQueried$ui()Z +SPLandroidx/compose/ui/node/LookaheadAlignmentLines;->getRequired$ui()Z +SPLandroidx/compose/ui/node/LookaheadAlignmentLines;->recalculate()V +Landroidx/compose/ui/node/LookaheadCapablePlaceable; +HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->()V +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->captureRulers-OSxE8f4(Landroidx/compose/ui/node/PlaceableResult;JJ)V +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->get(Landroidx/compose/ui/layout/HorizontalAlignmentLine;)I +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->getRulerScope()Landroidx/compose/ui/node/LookaheadCapablePlaceable$ResettableRulerScope; +HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->invalidateAlignmentLinesFromPositionChange(Landroidx/compose/ui/node/NodeCoordinator;)V +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->isLookingAhead()Z +HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/node/LookaheadCapablePlaceable$ResettableRulerScope; +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$ResettableRulerScope;->(Landroidx/compose/ui/node/LookaheadCapablePlaceable;)V +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$ResettableRulerScope;->provides(Landroidx/compose/ui/layout/VerticalRuler;F)V +Landroidx/compose/ui/node/LookaheadCapablePlaceable$captureRulers$1; +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$captureRulers$1;->(Landroidx/compose/ui/node/LookaheadCapablePlaceable;JJLandroidx/compose/ui/node/PlaceableResult;)V +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$captureRulers$1;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/node/LookaheadCapablePlaceable$layout$1; +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$layout$1;->(IILjava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/node/LookaheadCapablePlaceable;)V +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$layout$1;->getAlignmentLines()Ljava/util/Map; +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$layout$1;->getHeight()I +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$layout$1;->getRulers()Lkotlin/jvm/functions/Function1; +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$layout$1;->getWidth()I +SPLandroidx/compose/ui/node/LookaheadCapablePlaceable$layout$1;->placeChildren()V +Landroidx/compose/ui/node/MeasureAndLayoutDelegate; +SPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->(Landroidx/compose/ui/node/LayoutNode;)V +HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->dispatchOnPositionedCallbacks(Z)V +PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->doLookaheadRemeasure-sdFAvZA(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/unit/Constraints;)Z +HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->doRemeasure-sdFAvZA(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/unit/Constraints;)Z +SPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->drainPostponedMeasureRequests()V +PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->ensureSubtreeLookaheadReplaced(Landroidx/compose/ui/node/LayoutNode;)V +SPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;Z)V +HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->forceMeasureTheSubtreeInternal(Landroidx/compose/ui/node/LayoutNode;Z)V +SPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getCanAffectParentInLookahead(Landroidx/compose/ui/node/LayoutNode;)Z +HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getCanAffectPlacedParent(Landroidx/compose/ui/node/LayoutNode;)Z +HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureAndLayout(Landroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;)Z +HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureAndLayout-0kLqBqw(Landroidx/compose/ui/node/LayoutNode;J)V +SPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureOnly()V +HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureAndRelayoutIfNeeded(Landroidx/compose/ui/node/LayoutNode;ZZ)Z +SPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureOnly(Landroidx/compose/ui/node/LayoutNode;Z)V +HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->requestRemeasure(Landroidx/compose/ui/node/LayoutNode;Z)Z +SPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->updateRootConstraints-BRTryo0(J)V +Landroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest; +Landroidx/compose/ui/node/MeasurePassDelegate; +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V +SPLandroidx/compose/ui/node/MeasurePassDelegate;->forEachChildAlignmentLinesOwner(Landroidx/compose/ui/node/NodeChainKt$fillVector$1;)V +SPLandroidx/compose/ui/node/MeasurePassDelegate;->get(Landroidx/compose/ui/layout/HorizontalAlignmentLine;)I +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->getAlignmentLines()Landroidx/compose/ui/node/LookaheadAlignmentLines; +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->getChildDelegates$ui()Ljava/util/List; +SPLandroidx/compose/ui/node/MeasurePassDelegate;->getInnerCoordinator()Landroidx/compose/ui/node/InnerNodeCoordinator; +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->getParentAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; +SPLandroidx/compose/ui/node/MeasurePassDelegate;->getParentData()Ljava/lang/Object; +SPLandroidx/compose/ui/node/MeasurePassDelegate;->getPlaceOrder()I +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->layoutChildren()V +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->markNodeAndSubtreeAsPlaced$1()V +PLandroidx/compose/ui/node/MeasurePassDelegate;->markSubtreeAsNotPlaced()V +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; +SPLandroidx/compose/ui/node/MeasurePassDelegate;->notifyChildrenUsingCoordinatesWhilePlacing()V +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->onNodePlaced$ui()V +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->placeOuterCoordinator-MLgxB_4(JFLkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/node/MeasurePassDelegate;->remeasure-BRTryo0(J)Z +SPLandroidx/compose/ui/node/MeasurePassDelegate;->updatePlacedUnderMotionFrameOfReference(Z)V +Landroidx/compose/ui/node/MeasurePassDelegate$layoutChildrenBlock$1; +SPLandroidx/compose/ui/node/MeasurePassDelegate$layoutChildrenBlock$1;->(Landroidx/compose/ui/node/MeasurePassDelegate;I)V +Landroidx/compose/ui/node/ModifierNodeElement; +Landroidx/compose/ui/node/MotionReferencePlacementDelegate; +Landroidx/compose/ui/node/NodeChain; +HSPLandroidx/compose/ui/node/NodeChain;->(Landroidx/compose/ui/node/LayoutNode;)V +SPLandroidx/compose/ui/node/NodeChain;->createAndInsertNodeAsChild(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; +SPLandroidx/compose/ui/node/NodeChain;->has-H91voCI$ui(I)Z +HSPLandroidx/compose/ui/node/NodeChain;->runAttachLifecycle()V +SPLandroidx/compose/ui/node/NodeChain;->syncCoordinators()V +HSPLandroidx/compose/ui/node/NodeChain;->updateNode(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)V +Landroidx/compose/ui/node/NodeChain$sentinelHead$1; +Landroidx/compose/ui/node/NodeChainKt$fillVector$1; +SPLandroidx/compose/ui/node/NodeChainKt$fillVector$1;->(ILjava/lang/Object;)V +Landroidx/compose/ui/node/NodeCoordinator; +SPLandroidx/compose/ui/node/NodeCoordinator;->()V +HSPLandroidx/compose/ui/node/NodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;)V +SPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V +PLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal-S_NoaFU(Landroidx/compose/ui/node/NodeCoordinator;J)J +PLandroidx/compose/ui/node/NodeCoordinator;->distanceInMinimumTouchTarget-tz77jQw(JJ)F +PLandroidx/compose/ui/node/NodeCoordinator;->fromParentPosition-8S9VItk(J)J +SPLandroidx/compose/ui/node/NodeCoordinator;->getChild()Landroidx/compose/ui/node/LookaheadCapablePlaceable; +SPLandroidx/compose/ui/node/NodeCoordinator;->getCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; +HSPLandroidx/compose/ui/node/NodeCoordinator;->getFontScale()F +SPLandroidx/compose/ui/node/NodeCoordinator;->getHasMeasureResult()Z +SPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; +SPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode; +SPLandroidx/compose/ui/node/NodeCoordinator;->getMeasureResult$ui()Landroidx/compose/ui/layout/MeasureResult; +SPLandroidx/compose/ui/node/NodeCoordinator;->getMinimumTouchTargetSize-NH-jbRc()J +SPLandroidx/compose/ui/node/NodeCoordinator;->getParent()Landroidx/compose/ui/node/LookaheadCapablePlaceable; +SPLandroidx/compose/ui/node/NodeCoordinator;->getParentData()Ljava/lang/Object; +SPLandroidx/compose/ui/node/NodeCoordinator;->getPosition-nOcc-ac()J +SPLandroidx/compose/ui/node/NodeCoordinator;->getSize-YbymL2g()J +PLandroidx/compose/ui/node/NodeCoordinator;->hit-5ShdDok(Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/TouchBoundsExpansion$Companion;JLandroidx/compose/ui/node/HitTestResult;IZ)V +PLandroidx/compose/ui/node/NodeCoordinator;->hitTest-qzLsGqo(Landroidx/compose/ui/node/TouchBoundsExpansion$Companion;JLandroidx/compose/ui/node/HitTestResult;IZ)V +PLandroidx/compose/ui/node/NodeCoordinator;->hitTestChild-qzLsGqo(Landroidx/compose/ui/node/TouchBoundsExpansion$Companion;JLandroidx/compose/ui/node/HitTestResult;IZ)V +SPLandroidx/compose/ui/node/NodeCoordinator;->isAttached()Z +HSPLandroidx/compose/ui/node/NodeCoordinator;->isTransparent()Z +PLandroidx/compose/ui/node/NodeCoordinator;->isValidOwnerScope()Z +PLandroidx/compose/ui/node/NodeCoordinator;->localPositionOf-S_NoaFU(Landroidx/compose/ui/layout/LayoutCoordinates;J)J +SPLandroidx/compose/ui/node/NodeCoordinator;->localToRoot-MK-Hz9U(J)J +SPLandroidx/compose/ui/node/NodeCoordinator;->localToScreen-MK-Hz9U(J)J +HSPLandroidx/compose/ui/node/NodeCoordinator;->onCoordinatesUsed$ui()V +PLandroidx/compose/ui/node/NodeCoordinator;->onRelease()V +PLandroidx/compose/ui/node/NodeCoordinator;->onUnplaced()V +PLandroidx/compose/ui/node/NodeCoordinator;->outOfBoundsHit-8NAm7pk(Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/TouchBoundsExpansion$Companion;JLandroidx/compose/ui/node/HitTestResult;IZFZ)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->placeSelf-MLgxB_4(JFLkotlin/jvm/functions/Function1;)V +HSPLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui(Landroidx/compose/ui/geometry/MutableRect;ZZ)V +PLandroidx/compose/ui/node/NodeCoordinator;->releaseLayer()V +SPLandroidx/compose/ui/node/NodeCoordinator;->replace$ui()V +SPLandroidx/compose/ui/node/NodeCoordinator;->toCoordinator(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/node/NodeCoordinator; +HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerParameters(Z)V +PLandroidx/compose/ui/node/NodeCoordinator;->withinLayerBounds-k-4lQ0M(J)Z +Landroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1; +HSPLandroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;->(Landroidx/compose/ui/node/NodeCoordinator;I)V +HSPLandroidx/compose/ui/node/NodeCoordinator$invalidateParentLayer$1;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/node/NodeKindKt; +SPLandroidx/compose/ui/node/NodeKindKt;->()V +SPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateNodeIncludingDelegates(Landroidx/compose/ui/Modifier$Node;II)V +HSPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateNodeSelf(Landroidx/compose/ui/Modifier$Node;II)V +SPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateUpdatedNode(Landroidx/compose/ui/Modifier$Node;)V +SPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFrom(Landroidx/compose/ui/Modifier$Element;)I +SPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFrom(Landroidx/compose/ui/Modifier$Node;)I +SPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFromIncludingDelegates(Landroidx/compose/ui/Modifier$Node;)I +HSPLandroidx/compose/ui/node/NodeKindKt;->getIncludeSelfInTraversal-H91voCI(I)Z +Landroidx/compose/ui/node/ObserverModifierNode; +Landroidx/compose/ui/node/ObserverNodeOwnerScope; +SPLandroidx/compose/ui/node/ObserverNodeOwnerScope;->(Landroidx/compose/ui/node/ObserverModifierNode;)V +PLandroidx/compose/ui/node/ObserverNodeOwnerScope;->isValidOwnerScope()Z +Landroidx/compose/ui/node/OutOfFrameExecutor; +Landroidx/compose/ui/node/OwnedLayer; +Landroidx/compose/ui/node/Owner; +Landroidx/compose/ui/node/OwnerScope; +Landroidx/compose/ui/node/OwnerSnapshotObserver; +SPLandroidx/compose/ui/node/OwnerSnapshotObserver;->(Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;)V +Landroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1; +SPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;->()V +SPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;->(II)V +HSPLandroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/node/ParentDataModifierNode; +Landroidx/compose/ui/node/PlaceableResult; +SPLandroidx/compose/ui/node/PlaceableResult;->(Landroidx/compose/ui/layout/MeasureResult;Landroidx/compose/ui/node/LookaheadCapablePlaceable;)V +PLandroidx/compose/ui/node/PlaceableResult;->isValidOwnerScope()Z +Landroidx/compose/ui/node/PointerInputModifierNode; +PLandroidx/compose/ui/node/PointerInputModifierNode;->interceptOutOfBoundsChildEvents()Z +PLandroidx/compose/ui/node/PointerInputModifierNode;->sharePointerInputWithSiblings()Z +Landroidx/compose/ui/node/RootForTest; +Landroidx/compose/ui/node/RulerTrackingMap; +SPLandroidx/compose/ui/node/RulerTrackingMap;->()V +SPLandroidx/compose/ui/node/RulerTrackingMap;->(Landroidx/navigation/NavDestination;)V +SPLandroidx/compose/ui/node/RulerTrackingMap;->matchRoute$navigation_common_release(Ljava/lang/String;)Landroidx/navigation/NavDestination$DeepLinkMatch; +Landroidx/compose/ui/node/SemanticsModifierNode; +SPLandroidx/compose/ui/node/SemanticsModifierNode;->getShouldClearDescendantSemantics()Z +SPLandroidx/compose/ui/node/SemanticsModifierNode;->getShouldMergeDescendantSemantics()Z +SPLandroidx/compose/ui/node/SemanticsModifierNode;->isImportantForBounds()Z +Landroidx/compose/ui/node/SortedSet; +Landroidx/compose/ui/node/TailModifierNode; +SPLandroidx/compose/ui/node/TailModifierNode;->onAttach()V +PLandroidx/compose/ui/node/TailModifierNode;->onDetach()V +Landroidx/compose/ui/node/TouchBoundsExpansion$Companion; +SPLandroidx/compose/ui/node/TouchBoundsExpansion$Companion;->(I)V +PLandroidx/compose/ui/node/TouchBoundsExpansion$Companion;->entityType-OLwlOKw()I +Landroidx/compose/ui/node/TraversableNode; +Landroidx/compose/ui/node/TraversableNode$Companion$TraverseDescendantsAction; +SPLandroidx/compose/ui/node/TraversableNode$Companion$TraverseDescendantsAction;->()V +Landroidx/compose/ui/node/UiApplier; +SPLandroidx/compose/ui/node/UiApplier;->(Landroidx/compose/ui/node/LayoutNode;)V +PLandroidx/compose/ui/node/UiApplier;->clear()V +SPLandroidx/compose/ui/node/UiApplier;->down(Ljava/lang/Object;)V +SPLandroidx/compose/ui/node/UiApplier;->getCurrent()Ljava/lang/Object; +SPLandroidx/compose/ui/node/UiApplier;->insertBottomUp(ILjava/lang/Object;)V +SPLandroidx/compose/ui/node/UiApplier;->insertTopDown(ILjava/lang/Object;)V +SPLandroidx/compose/ui/node/UiApplier;->onEndChanges()V +PLandroidx/compose/ui/node/UiApplier;->remove(II)V +SPLandroidx/compose/ui/node/UiApplier;->up()V +Landroidx/compose/ui/platform/AbstractComposeView; +SPLandroidx/compose/ui/platform/AbstractComposeView;->(Landroid/content/Context;)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->checkAddView()V +SPLandroidx/compose/ui/platform/AbstractComposeView;->ensureCompositionCreated()V +SPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnLayout$ui(ZIIII)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnMeasure$ui(II)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->onAttachedToWindow()V +SPLandroidx/compose/ui/platform/AbstractComposeView;->onLayout(ZIIII)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->onMeasure(II)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->onRtlPropertiesChanged(I)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->resolveParentCompositionContext()Landroidx/compose/runtime/CompositionContext; +SPLandroidx/compose/ui/platform/AbstractComposeView;->setParentCompositionContext(Landroidx/compose/runtime/CompositionContext;)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->setParentContext(Landroidx/compose/runtime/CompositionContext;)V +SPLandroidx/compose/ui/platform/AbstractComposeView;->setPreviousAttachedWindowToken(Landroid/os/IBinder;)V +Landroidx/compose/ui/platform/AccessibilityManager; +Landroidx/compose/ui/platform/AndroidAccessibilityManager; +Landroidx/compose/ui/platform/AndroidClipboard; +SPLandroidx/compose/ui/platform/AndroidClipboard;->(Landroidx/compose/ui/platform/AndroidClipboardManager;)V +Landroidx/compose/ui/platform/AndroidClipboardManager; +SPLandroidx/compose/ui/platform/AndroidClipboardManager;->(Landroid/content/Context;)V +Landroidx/compose/ui/platform/AndroidComposeView; +SPLandroidx/compose/ui/platform/AndroidComposeView;->()V +SPLandroidx/compose/ui/platform/AndroidComposeView;->(Landroid/content/Context;Lkotlin/coroutines/CoroutineContext;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->access$get_viewTreeOwners(Landroidx/compose/ui/platform/AndroidComposeView;)Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; +PLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->addView(Landroid/view/View;I)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->autofillSupported()Z +PLandroidx/compose/ui/platform/AndroidComposeView;->clearChildInvalidObservations(Landroid/view/ViewGroup;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->convertMeasureSpec-I7RO_PI(I)J +HSPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchDraw(Landroid/graphics/Canvas;)V +PLandroidx/compose/ui/platform/AndroidComposeView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z +SPLandroidx/compose/ui/platform/AndroidComposeView;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;Z)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AccessibilityManager; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AndroidAccessibilityManager; +PLandroidx/compose/ui/platform/AndroidComposeView;->getAndroidViewsHandler$ui()Landroidx/compose/ui/platform/AndroidViewsHandler; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofill()Landroidx/compose/ui/autofill/Autofill; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofillManager()Landroidx/compose/ui/autofill/AutofillManager; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofillTree()Landroidx/compose/ui/autofill/AutofillTree; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboard()Landroidx/compose/ui/platform/AndroidClipboard; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboard()Landroidx/compose/ui/platform/Clipboard; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/AndroidClipboardManager; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/ClipboardManager; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getConfiguration()Landroid/content/res/Configuration; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getDensity()Landroidx/compose/ui/unit/Density; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getDragAndDropManager()Landroidx/compose/ui/draganddrop/AndroidDragAndDropManager; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getFocusOwner()Landroidx/compose/ui/focus/FocusOwner; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getFontFamilyResolver()Landroidx/compose/ui/text/font/FontFamily$Resolver; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getFontLoader()Landroidx/compose/ui/text/font/Font$ResourceLoader; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getGraphicsContext()Landroidx/compose/ui/graphics/GraphicsContext; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getHapticFeedBack()Landroidx/compose/ui/hapticfeedback/HapticFeedback; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getImportantForAutofill()I +SPLandroidx/compose/ui/platform/AndroidComposeView;->getInputModeManager()Landroidx/compose/ui/input/InputModeManager; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getInsetsListener()Landroidx/compose/ui/layout/InsetsListener; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getLayoutNodes()Landroidx/collection/MutableIntObjectMap; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getOutOfFrameExecutor()Landroidx/compose/ui/node/OutOfFrameExecutor; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getOutOfFrameExecutor()Landroidx/compose/ui/platform/AndroidComposeView; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getPlacementScope()Landroidx/compose/ui/layout/Placeable$PlacementScope; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getPointerIconService()Landroidx/compose/ui/input/pointer/PointerIconService; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getRectManager()Landroidx/compose/ui/spatial/RectManager; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getRetainedValuesStore()Landroidx/compose/runtime/retain/RetainedValuesStore; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getRoot()Landroidx/compose/ui/node/LayoutNode; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getScrollCaptureInProgress$ui()Z +SPLandroidx/compose/ui/platform/AndroidComposeView;->getSemanticsOwner()Landroidx/compose/ui/semantics/SemanticsOwner; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getSharedDrawScope()Landroidx/compose/ui/node/LayoutNodeDrawScope; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getShowLayoutBounds()Z +SPLandroidx/compose/ui/platform/AndroidComposeView;->getSnapshotObserver()Landroidx/compose/ui/node/OwnerSnapshotObserver; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getSoftwareKeyboardController()Landroidx/compose/ui/platform/SoftwareKeyboardController; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getTextInputService()Landroidx/compose/ui/text/input/TextInputService; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getTextToolbar()Landroidx/compose/ui/platform/TextToolbar; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getUncaughtExceptionHandler$ui()Landroidx/compose/ui/node/RootForTest$UncaughtExceptionHandler; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getView()Landroid/view/View; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getViewTreeOwners()Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; +SPLandroidx/compose/ui/platform/AndroidComposeView;->getWindowInfo()Landroidx/compose/ui/platform/WindowInfo; +SPLandroidx/compose/ui/platform/AndroidComposeView;->get_viewTreeOwners()Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; +PLandroidx/compose/ui/platform/AndroidComposeView;->handleMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I +SPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayers(Landroidx/compose/ui/node/LayoutNode;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayoutNodeMeasurement(Landroidx/compose/ui/node/LayoutNode;)V +PLandroidx/compose/ui/platform/AndroidComposeView;->isBadMotionEvent(Landroid/view/MotionEvent;)Z +PLandroidx/compose/ui/platform/AndroidComposeView;->isInBounds(Landroid/view/MotionEvent;)Z +PLandroidx/compose/ui/platform/AndroidComposeView;->isPositionChanged(Landroid/view/MotionEvent;)Z +SPLandroidx/compose/ui/platform/AndroidComposeView;->localToScreen-MK-Hz9U(J)J +HSPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout(Z)V +HPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout-0kLqBqw(Landroidx/compose/ui/node/LayoutNode;J)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->notifyLayerIsDirty$ui(Landroidx/compose/ui/node/OwnedLayer;Z)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onAttachedToWindow()V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onCheckIsTextEditor()Z +SPLandroidx/compose/ui/platform/AndroidComposeView;->onDraw(Landroid/graphics/Canvas;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onEndApplyChanges()V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onGlobalLayout()V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onLayout(ZIIII)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onMeasure(II)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onRequestMeasure(Landroidx/compose/ui/node/LayoutNode;ZZZ)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRequestRelayout(Landroidx/compose/ui/node/LayoutNode;ZZ)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onRtlPropertiesChanged(I)V +PLandroidx/compose/ui/platform/AndroidComposeView;->onScrollChanged()V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onSemanticsChange()V +SPLandroidx/compose/ui/platform/AndroidComposeView;->onTouchModeChanged(Z)V +PLandroidx/compose/ui/platform/AndroidComposeView;->onWindowFocusChanged(Z)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition()V +PLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition(Landroid/view/MotionEvent;)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->scheduleMeasureAndLayout(Landroidx/compose/ui/node/LayoutNode;)V +PLandroidx/compose/ui/platform/AndroidComposeView;->screenToLocal-MK-Hz9U(J)J +PLandroidx/compose/ui/platform/AndroidComposeView;->sendMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I +SPLandroidx/compose/ui/platform/AndroidComposeView;->setFrameEndScheduler$ui(Landroidx/compose/ui/platform/LifecycleRetainedValuesStoreOwner$FrameEndScheduler;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->setOnViewTreeOwnersAvailable(Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/platform/AndroidComposeView;->set_viewTreeOwners(Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;)V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->updatePositionCacheAndDispatch()V +HSPLandroidx/compose/ui/platform/AndroidComposeView;->voteFrameRate(F)V +Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda1; +SPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda1;->(Landroidx/compose/ui/platform/AndroidComposeView;I)V +PLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda1;->run()V +Landroidx/compose/ui/platform/AndroidComposeView$Companion$$ExternalSyntheticLambda0; +Landroidx/compose/ui/platform/AndroidComposeView$RootModifierNode; +SPLandroidx/compose/ui/platform/AndroidComposeView$RootModifierNode;->(Landroidx/compose/ui/platform/AndroidComposeView;)V +SPLandroidx/compose/ui/platform/AndroidComposeView$RootModifierNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/ui/platform/AndroidComposeView$RootModifierNode;->getTraverseKey()Ljava/lang/Object; +SPLandroidx/compose/ui/platform/AndroidComposeView$RootModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; +Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; +SPLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;->(Landroidx/lifecycle/LifecycleOwner;Landroidx/savedstate/SavedStateRegistryOwner;Landroidx/lifecycle/ViewModelStoreOwner;)V +PLandroidx/compose/ui/platform/AndroidComposeView$focusSearch$searchResult$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;I)V +Landroidx/compose/ui/platform/AndroidComposeView$getFocusedRect$1; +SPLandroidx/compose/ui/platform/AndroidComposeView$getFocusedRect$1;->()V +SPLandroidx/compose/ui/platform/AndroidComposeView$getFocusedRect$1;->(II)V +HSPLandroidx/compose/ui/platform/AndroidComposeView$getFocusedRect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1; +SPLandroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1;->(Landroidx/compose/ui/platform/AndroidComposeView;)V +Landroidx/compose/ui/platform/AndroidComposeView$root$1$1; +SPLandroidx/compose/ui/platform/AndroidComposeView$root$1$1;->(Landroidx/compose/ui/platform/AndroidComposeView;)V +SPLandroidx/compose/ui/platform/AndroidComposeView$root$1$1;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1; +SPLandroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;->(Landroidx/compose/ui/platform/AndroidComposeView;I)V +HSPLandroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2; +SPLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->(Landroidx/compose/ui/platform/AndroidComposeView;I)V +SPLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat; +SPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->()V +SPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->(Landroidx/compose/ui/platform/AndroidComposeView;)V +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsInScreen(Landroidx/compose/ui/semantics/SemanticsNodeWithAdjustedBounds;)Landroid/graphics/Rect; +SPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsUpdatesEventLoop$ui(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/paging/ConflatedEventBus; +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionEnd(Landroidx/compose/ui/semantics/SemanticsNode;)I +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionStart(Landroidx/compose/ui/semantics/SemanticsNode;)I +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getCurrentSemanticsNodes()Landroidx/collection/IntObjectMap; +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getIterableTextForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; +HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isEnabled$ui()Z +SPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onViewAttachedToWindow(Landroid/view/View;)V +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollBackward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollForward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->toBoundsInScreen(FFFF)Landroid/graphics/Rect; +PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->trimToSize(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1; +SPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$onSendAccessibilityEvent$1; +SPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$onSendAccessibilityEvent$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;I)V +Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ; +SPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V +SPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->disallowForceDark(Landroid/view/View;)V +Landroidx/compose/ui/platform/AndroidComposeViewTranslationCallback; +SPLandroidx/compose/ui/platform/AndroidComposeViewTranslationCallback;->()V +Landroidx/compose/ui/platform/AndroidComposeViewTranslationCallbackS; +SPLandroidx/compose/ui/platform/AndroidComposeViewTranslationCallbackS;->()V +SPLandroidx/compose/ui/platform/AndroidComposeViewTranslationCallbackS;->setViewTranslationCallback(Landroid/view/View;)V +Landroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO; +SPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->()V +SPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->focusable(Landroid/view/View;IZ)V +Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt; +SPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->()V +SPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->ProvideAndroidCompositionLocals(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalLifecycleOwner()Landroidx/compose/runtime/ProvidableCompositionLocal; +Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1; +SPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;->(Landroid/content/res/Configuration;Landroidx/compose/ui/res/ImageVectorCache;)V +Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainResourceIdCache$callbacks$1$1; +SPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainResourceIdCache$callbacks$1$1;->(Landroidx/compose/ui/res/ResourceIdCache;)V +Landroidx/compose/ui/platform/AndroidFontResourceLoader; +SPLandroidx/compose/ui/platform/AndroidFontResourceLoader;->()V +Landroidx/compose/ui/platform/AndroidPlatformTextInputSession; +Landroidx/compose/ui/platform/AndroidTextToolbar; +Landroidx/compose/ui/platform/AndroidUiDispatcher; +SPLandroidx/compose/ui/platform/AndroidUiDispatcher;->()V +SPLandroidx/compose/ui/platform/AndroidUiDispatcher;->(Landroid/view/Choreographer;Landroid/os/Handler;)V +HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +Landroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1; +SPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V +HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->doFrame(J)V +SPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->run()V +Landroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1; +SPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;->(Lkotlinx/coroutines/CancellableContinuationImpl;Landroidx/compose/runtime/BroadcastFrameClock;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;->doFrame(J)V +Landroidx/compose/ui/platform/AndroidUriHandler; +Landroidx/compose/ui/platform/AndroidViewConfiguration; +SPLandroidx/compose/ui/platform/AndroidViewConfiguration;->(Landroid/view/ViewConfiguration;)V +PLandroidx/compose/ui/platform/AndroidViewConfiguration;->getLongPressTimeoutMillis()J +PLandroidx/compose/ui/platform/AndroidViewConfiguration;->getMaximumFlingVelocity()F +PLandroidx/compose/ui/platform/AndroidViewConfiguration;->getTouchSlop()F +PLandroidx/compose/ui/platform/AndroidViewsHandler;->(Landroid/content/Context;)V +PLandroidx/compose/ui/platform/AndroidViewsHandler;->getLayoutNodeToHolder()Ljava/util/HashMap; +PLandroidx/compose/ui/platform/AndroidViewsHandler;->onLayout(ZIIII)V +PLandroidx/compose/ui/platform/AndroidViewsHandler;->onMeasure(II)V +PLandroidx/compose/ui/platform/AndroidViewsHandler;->requestLayout()V +Landroidx/compose/ui/platform/Api30Impl; +SPLandroidx/compose/ui/platform/Api30Impl;->()V +SPLandroidx/compose/ui/platform/Api30Impl;->isShowingLayoutBounds(Landroid/view/View;)Z +Landroidx/compose/ui/platform/Api35Impl; +SPLandroidx/compose/ui/platform/Api35Impl;->setRequestedFrameRate(Landroid/view/View;F)V +Landroidx/compose/ui/platform/CalculateMatrixToWindow; +Landroidx/compose/ui/platform/CalculateMatrixToWindowApi29; +SPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->()V +HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->calculateMatrixToWindow-EL8BTi8(Landroid/view/View;[F)V +Landroidx/compose/ui/platform/Clipboard; +Landroidx/compose/ui/platform/ClipboardManager; +Landroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt; +SPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt;->()V +Landroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda$-1759434350$1; +SPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt$lambda$-1759434350$1;->()V +Landroidx/compose/ui/platform/ComposeView; +SPLandroidx/compose/ui/platform/ComposeView;->(Lcc/n0th1ng/tripmoney/MainActivity;)V +SPLandroidx/compose/ui/platform/ComposeView;->Content(ILandroidx/compose/runtime/ComposerImpl;)V +SPLandroidx/compose/ui/platform/ComposeView;->getAccessibilityClassName()Ljava/lang/CharSequence; +SPLandroidx/compose/ui/platform/ComposeView;->getShouldCreateCompositionOnAttachedToWindow()Z +SPLandroidx/compose/ui/platform/ComposeView;->setContent(Lkotlin/jvm/functions/Function2;)V +Landroidx/compose/ui/platform/CompositionLocalsKt; +SPLandroidx/compose/ui/platform/CompositionLocalsKt;->()V +SPLandroidx/compose/ui/platform/CompositionLocalsKt;->ProvideCommonCompositionLocals(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/AndroidUriHandler;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +Landroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1; +SPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->()V +SPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->(II)V +SPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/platform/DefaultHapticFeedback; +SPLandroidx/compose/ui/platform/DefaultHapticFeedback;->(Landroid/view/View;I)V +Landroidx/compose/ui/platform/DelegatingSoftwareKeyboardController; +SPLandroidx/compose/ui/platform/DelegatingSoftwareKeyboardController;->(Landroidx/compose/ui/text/input/TextInputService;)V +Landroidx/compose/ui/platform/DisposableSaveableStateRegistry; +SPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;Landroidx/compose/material3/NavigationDrawerKt$ModalNavigationDrawer$2$2$1;)V +SPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->canBeSaved(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; +SPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/emoji2/text/EmojiProcessor; +Landroidx/compose/ui/platform/GlobalSnapshotManager; +SPLandroidx/compose/ui/platform/GlobalSnapshotManager;->()V +Landroidx/compose/ui/platform/GraphicsLayerOwnerLayer; +SPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->(Landroidx/compose/ui/graphics/layer/GraphicsLayer;Landroidx/compose/ui/graphics/GraphicsContext;Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;)V +PLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->getInverseMatrix-3i98HWw()[F +HSPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->getMatrix-sQKQjiQ()[F +SPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->invalidate()V +PLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->mapOffset-8S9VItk(JZ)J +SPLandroidx/compose/ui/platform/GraphicsLayerOwnerLayer;->resize-ozmzZPI(J)V +Landroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0; +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m$1()I +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m()I +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets; +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Outline;Landroid/graphics/Path;)V +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Vibrator;[I)Z +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;)V +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; +SPLandroidx/compose/ui/platform/HapticDefaults$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Z +Landroidx/compose/ui/platform/IndirectPointerNavigationGestureDetector; +SPLandroidx/compose/ui/platform/IndirectPointerNavigationGestureDetector;->(Landroid/content/Context;Landroidx/compose/ui/platform/AndroidComposeView$snapshotObserver$1;)V +Landroidx/compose/ui/platform/IndirectPointerNavigationGestureDetector$gestureDetector$1; +SPLandroidx/compose/ui/platform/IndirectPointerNavigationGestureDetector$gestureDetector$1;->(Landroidx/compose/ui/platform/IndirectPointerNavigationGestureDetector;)V +Landroidx/compose/ui/platform/InspectionModeKt; +SPLandroidx/compose/ui/platform/InspectionModeKt;->()V +Landroidx/compose/ui/platform/InspectionModeKt$LocalInspectionMode$1; +SPLandroidx/compose/ui/platform/InspectionModeKt$LocalInspectionMode$1;->()V +SPLandroidx/compose/ui/platform/InspectionModeKt$LocalInspectionMode$1;->(II)V +SPLandroidx/compose/ui/platform/InspectionModeKt$LocalInspectionMode$1;->invoke()Ljava/lang/Object; +Landroidx/compose/ui/platform/InvertMatrixKt; +SPLandroidx/compose/ui/platform/InvertMatrixKt;->()V +PLandroidx/compose/ui/platform/InvertMatrixKt;->access$enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z +PLandroidx/compose/ui/platform/InvertMatrixKt;->access$isScreenReaderFocusable(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/content/res/Resources;)Z +PLandroidx/compose/ui/platform/InvertMatrixKt;->addPageActions(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +PLandroidx/compose/ui/platform/InvertMatrixKt;->addSetProgressAction(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +SPLandroidx/compose/ui/platform/InvertMatrixKt;->canBeSavedToBundle(Ljava/lang/Object;)Z +PLandroidx/compose/ui/platform/InvertMatrixKt;->getInfoIsCheckable(Landroidx/compose/ui/semantics/SemanticsNode;)Z +PLandroidx/compose/ui/platform/InvertMatrixKt;->getInfoStateDescriptionOrNull(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/content/res/Resources;)Ljava/lang/String; +PLandroidx/compose/ui/platform/InvertMatrixKt;->getInfoText(Landroidx/compose/ui/semantics/SemanticsNode;)Landroidx/compose/ui/text/AnnotatedString; +HSPLandroidx/compose/ui/platform/InvertMatrixKt;->getTextLayoutResult(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Landroidx/compose/ui/text/TextLayoutResult; +SPLandroidx/compose/ui/platform/InvertMatrixKt;->invertTo-JiSxe2E([F[F)Z +PLandroidx/compose/ui/platform/InvertMatrixKt;->isInPath(FFLandroidx/compose/ui/graphics/AndroidPath;)Z +SPLandroidx/compose/ui/platform/InvertMatrixKt;->toLegacyClassName-V4PA4sw(I)Ljava/lang/String; +Landroidx/compose/ui/platform/LazyWindowInfo; +SPLandroidx/compose/ui/platform/LazyWindowInfo;->()V +Landroidx/compose/ui/platform/LifecycleRetainedValuesStoreOwner; +SPLandroidx/compose/ui/platform/LifecycleRetainedValuesStoreOwner;->()V +Landroidx/compose/ui/platform/LifecycleRetainedValuesStoreOwner$FrameEndScheduler; +Landroidx/compose/ui/platform/LifecycleRetainedValuesStoreOwner$RetainedValuesStoreEntry; +SPLandroidx/compose/ui/platform/LifecycleRetainedValuesStoreOwner$RetainedValuesStoreEntry;->()V +Landroidx/compose/ui/platform/MotionDurationScaleImpl; +SPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->()V +SPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->getScaleFactor()F +SPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +Landroidx/compose/ui/platform/NoHapticFeedback; +Landroidx/compose/ui/platform/SemanticsNodeCopy; +Landroidx/compose/ui/platform/SoftwareKeyboardController; +Landroidx/compose/ui/platform/TextToolbar; +Landroidx/compose/ui/platform/ViewCompositionStrategy; +Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$$ExternalSyntheticLambda0; +SPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$$ExternalSyntheticLambda0;->(I)V +SPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$$ExternalSyntheticLambda0;->invoke(D)D +PLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$$ExternalSyntheticLambda0;->shouldPause()Z +Landroidx/compose/ui/platform/ViewConfiguration; +HSPLandroidx/compose/ui/platform/ViewConfiguration;->getMinimumTouchTargetSize-MYxV2XQ()J +Landroidx/compose/ui/platform/ViewLayer; +SPLandroidx/compose/ui/platform/ViewLayer;->()V +Landroidx/compose/ui/platform/WindowInfo; +PLandroidx/compose/ui/platform/WindowInfoImpl;->()V +Landroidx/compose/ui/platform/WindowRecomposerFactory$Companion$$ExternalSyntheticLambda0; +Landroidx/compose/ui/platform/WindowRecomposerPolicy; +SPLandroidx/compose/ui/platform/WindowRecomposerPolicy;->()V +Landroidx/compose/ui/platform/WindowRecomposer_androidKt; +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->()V +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->access$getAnimationScaleFlowFor(Landroid/content/Context;)Lkotlinx/coroutines/flow/StateFlow; +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->getCompositionContext(Landroid/view/View;)Landroidx/compose/runtime/CompositionContext; +Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1; +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->(Landroid/view/View;Landroidx/compose/runtime/Recomposer;)V +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewAttachedToWindow(Landroid/view/View;)V +Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2; +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;->(Lio/ktor/http/cio/CIOMultipartDataBase;Landroidx/compose/runtime/BroadcastFrameClock;Landroidx/compose/runtime/Recomposer;Lkotlin/jvm/internal/Ref$ObjectRef;Landroid/view/View;)V +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$WhenMappings; +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$WhenMappings;->()V +Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1; +SPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Landroid/os/Handler;)V +Landroidx/compose/ui/platform/WrappedComposition; +SPLandroidx/compose/ui/platform/WrappedComposition;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/runtime/CompositionImpl;)V +SPLandroidx/compose/ui/platform/WrappedComposition;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/compose/ui/platform/WrappedComposition;->setContent(Lkotlin/jvm/functions/Function2;)V +Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1; +SPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;I)V +SPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1$1; +SPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1$1;->(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/platform/Wrapper_androidKt; +SPLandroidx/compose/ui/platform/Wrapper_androidKt;->()V +SPLandroidx/compose/ui/platform/Wrapper_androidKt;->setContent(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)Landroidx/compose/ui/platform/WrappedComposition; +Landroidx/compose/ui/platform/Wrapper_androidKt$doSetContent$1; +SPLandroidx/compose/ui/platform/Wrapper_androidKt$doSetContent$1;->(Landroidx/compose/runtime/CompositionContext;)V +Landroidx/compose/ui/platform/coreshims/AutofillIdCompat; +SPLandroidx/compose/ui/platform/coreshims/AutofillIdCompat;->(Ljava/lang/Object;)V +Landroidx/compose/ui/platform/coreshims/ContentCaptureSessionCompat; +SPLandroidx/compose/ui/platform/coreshims/ContentCaptureSessionCompat;->(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/View;)V +HSPLandroidx/compose/ui/platform/coreshims/ContentCaptureSessionCompat;->newAutofillId(J)Landroid/view/autofill/AutofillId; +Landroidx/compose/ui/relocation/BringIntoViewModifierNode; +Landroidx/compose/ui/res/ImageVectorCache; +SPLandroidx/compose/ui/res/ImageVectorCache;->()V +Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry; +SPLandroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;->(Landroidx/compose/ui/graphics/vector/ImageVector;I)V +Landroidx/compose/ui/res/ImageVectorCache$Key; +SPLandroidx/compose/ui/res/ImageVectorCache$Key;->(Landroid/content/res/Resources$Theme;I)V +SPLandroidx/compose/ui/res/ImageVectorCache$Key;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/res/ImageVectorCache$Key;->hashCode()I +Landroidx/compose/ui/res/ResourceIdCache; +SPLandroidx/compose/ui/res/ResourceIdCache;->()V +Landroidx/compose/ui/semantics/AccessibilityAction; +SPLandroidx/compose/ui/semantics/AccessibilityAction;->(Ljava/lang/String;Lkotlin/Function;)V +Landroidx/compose/ui/semantics/AppendedSemanticsElement; +SPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->(Lkotlin/jvm/functions/Function1;Z)V +SPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; +PLandroidx/compose/ui/semantics/AppendedSemanticsElement;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/semantics/AppendedSemanticsElement;->update(Landroidx/compose/ui/Modifier$Node;)V +PLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->(Lkotlin/jvm/functions/Function1;)V +PLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; +Landroidx/compose/ui/semantics/CollectionInfo; +SPLandroidx/compose/ui/semantics/CollectionInfo;->(II)V +Landroidx/compose/ui/semantics/CoreSemanticsModifierNode; +SPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->(ZZLkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldClearDescendantSemantics()Z +SPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldMergeDescendantSemantics()Z +Landroidx/compose/ui/semantics/EmptySemanticsModifier; +Landroidx/compose/ui/semantics/Role; +SPLandroidx/compose/ui/semantics/Role;->(I)V +SPLandroidx/compose/ui/semantics/Role;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/semantics/ScrollAxisRange; +SPLandroidx/compose/ui/semantics/ScrollAxisRange;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V +Landroidx/compose/ui/semantics/SemanticsActions; +SPLandroidx/compose/ui/semantics/SemanticsActions;->()V +Landroidx/compose/ui/semantics/SemanticsConfiguration; +SPLandroidx/compose/ui/semantics/SemanticsConfiguration;->()V +PLandroidx/compose/ui/semantics/SemanticsConfiguration;->get(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; +HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->set(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Ljava/lang/Object;)V +Landroidx/compose/ui/semantics/SemanticsModifier; +Landroidx/compose/ui/semantics/SemanticsModifierKt; +SPLandroidx/compose/ui/semantics/SemanticsModifierKt;->()V +PLandroidx/compose/ui/semantics/SemanticsModifierKt;->clearAndSetSemantics(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +SPLandroidx/compose/ui/semantics/SemanticsModifierKt;->semantics(Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; +Landroidx/compose/ui/semantics/SemanticsNode; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->(Landroidx/compose/ui/Modifier$Node;ZLandroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/semantics/SemanticsConfiguration;)V +HSPLandroidx/compose/ui/semantics/SemanticsNode;->boundsInImportantForBoundsAncestor(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/geometry/Rect; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->fillOneLayerOfSemanticsWrappers(Landroidx/compose/ui/node/LayoutNode;Ljava/util/ArrayList;)V +HSPLandroidx/compose/ui/semantics/SemanticsNode;->findCoordinatorToGetBounds$ui()Landroidx/compose/ui/node/NodeCoordinator; +SPLandroidx/compose/ui/semantics/SemanticsNode;->getBoundsInRoot()Landroidx/compose/ui/geometry/Rect; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren$ui$default(ILandroidx/compose/ui/semantics/SemanticsNode;)Ljava/util/List; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren$ui(ZZ)Ljava/util/List; +SPLandroidx/compose/ui/semantics/SemanticsNode;->getConfig()Landroidx/compose/ui/semantics/SemanticsConfiguration; +HSPLandroidx/compose/ui/semantics/SemanticsNode;->getParent()Landroidx/compose/ui/semantics/SemanticsNode; +PLandroidx/compose/ui/semantics/SemanticsNode;->getUnmergedConfig$ui()Landroidx/compose/ui/semantics/SemanticsConfiguration; +SPLandroidx/compose/ui/semantics/SemanticsNode;->isMergingSemanticsOfDescendants()Z +PLandroidx/compose/ui/semantics/SemanticsNode;->isUnmergedLeafNode$ui()Z +HSPLandroidx/compose/ui/semantics/SemanticsNode;->unmergedChildren$ui(Ljava/util/ArrayList;Z)Ljava/util/List; +Landroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1; +SPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->(ILjava/lang/Object;)V +HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1; +SPLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->(Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/ui/semantics/SemanticsNodeKt; +SPLandroidx/compose/ui/semantics/SemanticsNodeKt;->()V +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->SemanticsNode(Landroidx/compose/ui/node/LayoutNode;Z)Landroidx/compose/ui/semantics/SemanticsNode; +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getAllUncoveredSemanticsNodesToIntObjectMap(Landroidx/compose/ui/semantics/SemanticsOwner;Lkotlin/jvm/functions/Function1;)Landroidx/collection/MutableIntObjectMap; +PLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOrNull(Landroidx/compose/ui/semantics/SemanticsConfiguration;Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->isHidden(Landroidx/compose/ui/semantics/SemanticsNode;)Z +HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->isImportantForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Z +Landroidx/compose/ui/semantics/SemanticsNodeWithAdjustedBounds; +SPLandroidx/compose/ui/semantics/SemanticsNodeWithAdjustedBounds;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/compose/ui/unit/IntRect;)V +Landroidx/compose/ui/semantics/SemanticsOwner; +SPLandroidx/compose/ui/semantics/SemanticsOwner;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/semantics/EmptySemanticsModifier;Landroidx/collection/MutableIntObjectMap;)V +SPLandroidx/compose/ui/semantics/SemanticsOwner;->getUnmergedRootSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; +HSPLandroidx/compose/ui/semantics/SemanticsOwner;->notifySemanticsChange$ui(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/semantics/SemanticsConfiguration;)V +Landroidx/compose/ui/semantics/SemanticsProperties; +SPLandroidx/compose/ui/semantics/SemanticsProperties;->()V +PLandroidx/compose/ui/semantics/SemanticsPropertiesAndroid;->()V +Landroidx/compose/ui/semantics/SemanticsPropertiesKt; +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->()V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->getTextLayoutResult$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Lkotlin/jvm/functions/Function1;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContainer(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContentDescription(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setPaneTitle(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setSelected(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Z)V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setShape(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/graphics/Shape;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setTraversalGroup(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setVerticalScrollAxisRange(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/semantics/ScrollAxisRange;)V +Landroidx/compose/ui/semantics/SemanticsPropertyKey; +SPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;I)V +SPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;ZLkotlin/jvm/functions/Function2;)V +Landroidx/compose/ui/semantics/SemanticsPropertyKey$1; +SPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->()V +SPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->(II)V +Landroidx/compose/ui/semantics/SemanticsPropertyReceiver; +Landroidx/compose/ui/spatial/RectListKt; +SPLandroidx/compose/ui/spatial/RectListKt;->()V +Landroidx/compose/ui/spatial/RectManager; +SPLandroidx/compose/ui/spatial/RectManager;->()V +HSPLandroidx/compose/ui/spatial/RectManager;->dispatchCallbacks()V +SPLandroidx/compose/ui/spatial/RectManager;->getOffsetFromRectListFor-Bjo55l4(Landroidx/compose/ui/node/LayoutNode;)J +HSPLandroidx/compose/ui/spatial/RectManager;->invalidateCallbacksFor(Landroidx/compose/ui/node/LayoutNode;)V +HSPLandroidx/compose/ui/spatial/RectManager;->onLayoutPositionChanged(Landroidx/compose/ui/node/LayoutNode;Z)V +SPLandroidx/compose/ui/spatial/RectManager;->outerToInnerOffset-Bjo55l4(Landroidx/compose/ui/node/LayoutNode;)J +HPLandroidx/compose/ui/spatial/RectManager;->remove(Landroidx/compose/ui/node/LayoutNode;)V +HSPLandroidx/compose/ui/spatial/RectManager;->scheduleDebounceCallback()V +Landroidx/compose/ui/spatial/ThrottledCallbacks; +SPLandroidx/compose/ui/spatial/ThrottledCallbacks;->()V +Landroidx/compose/ui/spatial/ThrottledCallbacks$Entry; +Landroidx/compose/ui/state/ToggleableState; +Landroidx/compose/ui/text/AndroidParagraph; +HSPLandroidx/compose/ui/text/AndroidParagraph;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;IIJ)V +HSPLandroidx/compose/ui/text/AndroidParagraph;->constructTextLayout(IILandroid/text/TextUtils$TruncateAt;IIIIILjava/lang/CharSequence;)Landroidx/compose/ui/text/android/TextLayout; +SPLandroidx/compose/ui/text/AndroidParagraph;->getHeight()F +SPLandroidx/compose/ui/text/AndroidParagraph;->getWidth()F +SPLandroidx/compose/ui/text/AndroidParagraph;->paint(Landroidx/compose/ui/graphics/Canvas;)V +SPLandroidx/compose/ui/text/AndroidParagraph;->paint-LG529CI(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V +Landroidx/compose/ui/text/AnnotatedString; +SPLandroidx/compose/ui/text/AnnotatedString;->()V +SPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;)V +SPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/List;)V +SPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/util/List;Ljava/lang/String;)V +PLandroidx/compose/ui/text/AnnotatedString;->charAt(I)C +PLandroidx/compose/ui/text/AnnotatedString;->equals(Ljava/lang/Object;)Z +PLandroidx/compose/ui/text/AnnotatedString;->length()I +PLandroidx/compose/ui/text/AnnotatedString;->toString()Ljava/lang/String; +Landroidx/compose/ui/text/AnnotatedString$Annotation; +PLandroidx/compose/ui/text/AnnotatedString$Range;->(IILjava/lang/Object;)V +PLandroidx/compose/ui/text/AnnotatedString$Range;->(Ljava/lang/Object;IILjava/lang/String;)V +PLandroidx/compose/ui/text/AnnotatedStringKt;->()V +PLandroidx/compose/ui/text/AnnotatedStringKt;->getLocalAnnotations(Landroidx/compose/ui/text/AnnotatedString;IILandroidx/compose/runtime/saveable/SaverKt$$ExternalSyntheticLambda1;)Ljava/util/List; +Landroidx/compose/ui/text/EmojiSupportMatch; +SPLandroidx/compose/ui/text/EmojiSupportMatch;->(I)V +HPLandroidx/compose/ui/text/MultiParagraph;->(Lokhttp3/Request$Builder;JII)V +Landroidx/compose/ui/text/MultiParagraph$$ExternalSyntheticLambda1; +SPLandroidx/compose/ui/text/MultiParagraph$$ExternalSyntheticLambda1;->(Ljava/lang/Object;III)V +SPLandroidx/compose/ui/text/MultiParagraph$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/compose/ui/text/MultiParagraphIntrinsics$$ExternalSyntheticLambda0;->(Lokhttp3/Request$Builder;I)V +PLandroidx/compose/ui/text/ParagraphInfo;->(Landroidx/compose/ui/text/AndroidParagraph;IIIIFF)V +PLandroidx/compose/ui/text/ParagraphIntrinsicInfo;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;II)V +Landroidx/compose/ui/text/ParagraphIntrinsics; +Landroidx/compose/ui/text/ParagraphKt; +SPLandroidx/compose/ui/text/ParagraphKt;->()V +SPLandroidx/compose/ui/text/ParagraphKt;->TextRange(II)J +SPLandroidx/compose/ui/text/ParagraphKt;->coerceIn-8ffj60Q(IJ)J +HSPLandroidx/compose/ui/text/ParagraphKt;->resolveDefaults(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/TextStyle; +Landroidx/compose/ui/text/ParagraphStyle; +HSPLandroidx/compose/ui/text/ParagraphStyle;->(IIJLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/PlatformParagraphStyle;Landroidx/compose/ui/text/style/LineHeightStyle;IILandroidx/compose/ui/text/style/TextMotion;)V +PLandroidx/compose/ui/text/ParagraphStyle;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/text/ParagraphStyle;->merge(Landroidx/compose/ui/text/ParagraphStyle;)Landroidx/compose/ui/text/ParagraphStyle; +Landroidx/compose/ui/text/ParagraphStyleKt; +SPLandroidx/compose/ui/text/ParagraphStyleKt;->()V +SPLandroidx/compose/ui/text/ParagraphStyleKt;->fastMerge-j5T8yCg(Landroidx/compose/ui/text/ParagraphStyle;IIJLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/PlatformParagraphStyle;Landroidx/compose/ui/text/style/LineHeightStyle;IILandroidx/compose/ui/text/style/TextMotion;)Landroidx/compose/ui/text/ParagraphStyle; +Landroidx/compose/ui/text/PlatformParagraphStyle; +SPLandroidx/compose/ui/text/PlatformParagraphStyle;->()V +SPLandroidx/compose/ui/text/PlatformParagraphStyle;->()V +SPLandroidx/compose/ui/text/PlatformParagraphStyle;->(IZ)V +PLandroidx/compose/ui/text/PlatformParagraphStyle;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/PlatformTextStyle; +SPLandroidx/compose/ui/text/PlatformTextStyle;->(Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/text/PlatformParagraphStyle;)V +PLandroidx/compose/ui/text/PlatformTextStyle;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/SaversKt; +SPLandroidx/compose/ui/text/SaversKt;->()V +Landroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda0; +SPLandroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda0;->(I)V +SPLandroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda2; +SPLandroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda2;->(I)V +Landroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda5; +SPLandroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda5;->(I)V +SPLandroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda5;->(IB)V +SPLandroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/text/SaversKt$ColorSaver$1; +SPLandroidx/compose/ui/text/SaversKt$ColorSaver$1;->()V +Landroidx/compose/ui/text/SaversKt$ColorSaver$2; +SPLandroidx/compose/ui/text/SaversKt$ColorSaver$2;->()V +Landroidx/compose/ui/text/SaversKt$NonNullValueClassSaver$1; +SPLandroidx/compose/ui/text/SaversKt$NonNullValueClassSaver$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V +Landroidx/compose/ui/text/SpanStyle; +SPLandroidx/compose/ui/text/SpanStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/SystemFontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;I)V +SPLandroidx/compose/ui/text/SpanStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/SystemFontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;)V +SPLandroidx/compose/ui/text/SpanStyle;->(Landroidx/compose/ui/text/style/TextForegroundStyle;JLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/SystemFontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V +SPLandroidx/compose/ui/text/SpanStyle;->equals(Ljava/lang/Object;)Z +HSPLandroidx/compose/ui/text/SpanStyle;->hasSameLayoutAffectingAttributes$ui_text(Landroidx/compose/ui/text/SpanStyle;)Z +PLandroidx/compose/ui/text/SpanStyle;->hasSameNonLayoutAttributes$ui_text(Landroidx/compose/ui/text/SpanStyle;)Z +SPLandroidx/compose/ui/text/SpanStyle;->merge(Landroidx/compose/ui/text/SpanStyle;)Landroidx/compose/ui/text/SpanStyle; +Landroidx/compose/ui/text/SpanStyleKt; +SPLandroidx/compose/ui/text/SpanStyleKt;->()V +HSPLandroidx/compose/ui/text/SpanStyleKt;->fastMerge-dSHsh3o(Landroidx/compose/ui/text/SpanStyle;JLandroidx/compose/ui/graphics/Brush;FJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/SystemFontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)Landroidx/compose/ui/text/SpanStyle; +PLandroidx/compose/ui/text/TextLayoutInput;->(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;IZILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/text/font/FontFamily$Resolver;J)V +HPLandroidx/compose/ui/text/TextLayoutResult;->(Landroidx/compose/ui/text/TextLayoutInput;Landroidx/compose/ui/text/MultiParagraph;J)V +Landroidx/compose/ui/text/TextRange; +SPLandroidx/compose/ui/text/TextRange;->()V +Landroidx/compose/ui/text/TextStyle; +SPLandroidx/compose/ui/text/TextStyle;->()V +SPLandroidx/compose/ui/text/TextStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;JIJI)V +HSPLandroidx/compose/ui/text/TextStyle;->(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;)V +SPLandroidx/compose/ui/text/TextStyle;->(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;Landroidx/compose/ui/text/PlatformTextStyle;)V +SPLandroidx/compose/ui/text/TextStyle;->copy-p1EtxEg$default(Landroidx/compose/ui/text/TextStyle;JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/SystemFontFamily;JJLandroidx/compose/ui/text/style/LineHeightStyle;I)Landroidx/compose/ui/text/TextStyle; +SPLandroidx/compose/ui/text/TextStyle;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/text/TextStyle;->getColor-0d7_KjU()J +PLandroidx/compose/ui/text/TextStyle;->hasSameLayoutAffectingAttributes(Landroidx/compose/ui/text/TextStyle;)Z +SPLandroidx/compose/ui/text/TextStyle;->merge(Landroidx/compose/ui/text/TextStyle;)Landroidx/compose/ui/text/TextStyle; +HSPLandroidx/compose/ui/text/TextStyle;->merge-dA7vx0o$default(Landroidx/compose/ui/text/TextStyle;JJLandroidx/compose/ui/text/font/FontWeight;JIJI)Landroidx/compose/ui/text/TextStyle; +Landroidx/compose/ui/text/android/CanvasCompatS$$ExternalSyntheticApiModelOutline0; +SPLandroidx/compose/ui/text/android/CanvasCompatS$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/res/Configuration;)I +SPLandroidx/compose/ui/text/android/CanvasCompatS$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/view/translation/ViewTranslationCallback;)V +Landroidx/compose/ui/text/android/LayoutCompat; +SPLandroidx/compose/ui/text/android/LayoutCompat;->()V +Landroidx/compose/ui/text/android/LayoutIntrinsics; +SPLandroidx/compose/ui/text/android/LayoutIntrinsics;->(Ljava/lang/CharSequence;Landroid/text/TextPaint;I)V +SPLandroidx/compose/ui/text/android/LayoutIntrinsics;->getBoringMetrics()Landroid/text/BoringLayout$Metrics; +HSPLandroidx/compose/ui/text/android/LayoutIntrinsics;->getCharSequenceForIntrinsicWidth()Ljava/lang/CharSequence; +HSPLandroidx/compose/ui/text/android/LayoutIntrinsics;->getMaxIntrinsicWidth()F +Landroidx/compose/ui/text/android/StaticLayoutFactory; +SPLandroidx/compose/ui/text/android/StaticLayoutFactory;->()V +HSPLandroidx/compose/ui/text/android/StaticLayoutFactory;->create(Ljava/lang/CharSequence;Landroid/text/TextPaint;IILandroid/text/TextDirectionHeuristic;Landroid/text/Layout$Alignment;ILandroid/text/TextUtils$TruncateAt;IIZIIII)Landroid/text/StaticLayout; +HSPLandroidx/compose/ui/text/android/StaticLayoutFactory;->hasSpan(Landroid/text/Spanned;Ljava/lang/Class;)Z +Landroidx/compose/ui/text/android/StaticLayoutFactory35$$ExternalSyntheticApiModelOutline0; +SPLandroidx/compose/ui/text/android/StaticLayoutFactory35$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;)V +Landroidx/compose/ui/text/android/TextAlignmentAdapter; +SPLandroidx/compose/ui/text/android/TextAlignmentAdapter;->()V +Landroidx/compose/ui/text/android/TextAndroidCanvas; +SPLandroidx/compose/ui/text/android/TextAndroidCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V +SPLandroidx/compose/ui/text/android/TextAndroidCanvas;->getClipBounds(Landroid/graphics/Rect;)Z +SPLandroidx/compose/ui/text/android/TextAndroidCanvas;->getNativeCanvas()Landroid/graphics/Canvas; +Landroidx/compose/ui/text/android/TextLayout; +HSPLandroidx/compose/ui/text/android/TextLayout;->(Ljava/lang/CharSequence;FLandroid/text/TextPaint;ILandroid/text/TextUtils$TruncateAt;IZIIIIIILandroidx/compose/ui/text/android/LayoutIntrinsics;)V +SPLandroidx/compose/ui/text/android/TextLayout;->getHeight()I +SPLandroidx/compose/ui/text/android/TextLayout;->getLineBaseline(I)F +SPLandroidx/compose/ui/text/android/TextLayout;->getLineBottom(I)F +SPLandroidx/compose/ui/text/android/TextLayout;->getLineTop(I)F +Landroidx/compose/ui/text/android/TextLayout_androidKt; +SPLandroidx/compose/ui/text/android/TextLayout_androidKt;->()V +SPLandroidx/compose/ui/text/android/TextLayout_androidKt;->VerticalPaddings(II)J +SPLandroidx/compose/ui/text/android/TextLayout_androidKt;->getTextDirectionHeuristic(I)Landroid/text/TextDirectionHeuristic; +Landroidx/compose/ui/text/android/selection/SegmentFinder; +Landroidx/compose/ui/text/android/style/LetterSpacingSpanEm; +Landroidx/compose/ui/text/android/style/LetterSpacingSpanPx; +Landroidx/compose/ui/text/android/style/LineHeightStyleSpan; +SPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->(FIZZFI)V +HSPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V +Landroidx/compose/ui/text/android/style/PlaceholderSpan; +Landroidx/compose/ui/text/android/style/SkewXSpan; +Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor; +SPLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor;->(I)V +Landroidx/compose/ui/text/font/DefaultFontFamily; +Landroidx/compose/ui/text/font/Font$ResourceLoader; +Landroidx/compose/ui/text/font/FontFamily$Resolver; +Landroidx/compose/ui/text/font/FontFamilyResolverImpl; +SPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->(Landroidx/collection/internal/Lock;Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor;)V +SPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve(Landroidx/compose/ui/text/font/TypefaceRequest;)Landroidx/compose/ui/text/font/TypefaceResult$Immutable; +HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve-DPcqOEQ(Landroidx/compose/ui/text/font/SystemFontFamily;Landroidx/compose/ui/text/font/FontWeight;II)Landroidx/compose/ui/text/font/TypefaceResult$Immutable; +Landroidx/compose/ui/text/font/FontFamilyResolverKt; +SPLandroidx/compose/ui/text/font/FontFamilyResolverKt;->()V +Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter; +SPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;->()V +Landroidx/compose/ui/text/font/FontStyle; +SPLandroidx/compose/ui/text/font/FontStyle;->(I)V +Landroidx/compose/ui/text/font/FontSynthesis; +SPLandroidx/compose/ui/text/font/FontSynthesis;->(I)V +Landroidx/compose/ui/text/font/FontWeight; +SPLandroidx/compose/ui/text/font/FontWeight;->()V +SPLandroidx/compose/ui/text/font/FontWeight;->(I)V +SPLandroidx/compose/ui/text/font/FontWeight;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/font/FontWeightAdjustmentHelperApi31; +SPLandroidx/compose/ui/text/font/FontWeightAdjustmentHelperApi31;->()V +SPLandroidx/compose/ui/text/font/FontWeightAdjustmentHelperApi31;->fontWeightAdjustment(Landroid/content/Context;)I +Landroidx/compose/ui/text/font/GenericFontFamily; +Landroidx/compose/ui/text/font/PlatformResolveInterceptor; +Landroidx/compose/ui/text/font/SystemFontFamily; +SPLandroidx/compose/ui/text/font/SystemFontFamily;->()V +Landroidx/compose/ui/text/font/TypefaceRequest; +SPLandroidx/compose/ui/text/font/TypefaceRequest;->(Landroidx/compose/ui/text/font/SystemFontFamily;Landroidx/compose/ui/text/font/FontWeight;IILjava/lang/Object;)V +HSPLandroidx/compose/ui/text/font/TypefaceRequest;->equals(Ljava/lang/Object;)Z +HSPLandroidx/compose/ui/text/font/TypefaceRequest;->hashCode()I +Landroidx/compose/ui/text/font/TypefaceResult$Immutable; +SPLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->(Landroid/graphics/Typeface;)V +Landroidx/compose/ui/text/input/CursorAnchorInfoController; +SPLandroidx/compose/ui/text/input/CursorAnchorInfoController;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/emoji2/text/EmojiProcessor;)V +Landroidx/compose/ui/text/input/GapBuffer; +SPLandroidx/compose/ui/text/input/GapBuffer;->(Landroidx/compose/runtime/changelist/Operations;)V +SPLandroidx/compose/ui/text/input/GapBuffer;->getInt(I)I +HSPLandroidx/compose/ui/text/input/GapBuffer;->getObject-31yXWZQ(I)Ljava/lang/Object; +Landroidx/compose/ui/text/input/ImeOptions; +SPLandroidx/compose/ui/text/input/ImeOptions;->()V +SPLandroidx/compose/ui/text/input/ImeOptions;->(ZIZIILandroidx/compose/ui/text/intl/LocaleList;)V +Landroidx/compose/ui/text/input/OffsetMapping; +Landroidx/compose/ui/text/input/PlatformTextInputService; +Landroidx/compose/ui/text/input/TextFieldValue; +SPLandroidx/compose/ui/text/input/TextFieldValue;->()V +SPLandroidx/compose/ui/text/input/TextFieldValue;->(Landroidx/compose/ui/text/AnnotatedString;JLandroidx/compose/ui/text/TextRange;)V +SPLandroidx/compose/ui/text/input/TextFieldValue;->(Ljava/lang/String;JI)V +Landroidx/compose/ui/text/input/TextInputService; +SPLandroidx/compose/ui/text/input/TextInputService;->(Landroidx/compose/ui/text/input/PlatformTextInputService;)V +Landroidx/compose/ui/text/input/TextInputServiceAndroid; +SPLandroidx/compose/ui/text/input/TextInputServiceAndroid;->(Landroid/view/View;Landroidx/compose/ui/platform/AndroidComposeView;)V +Landroidx/compose/ui/text/input/TextInputServiceAndroid$TextInputCommand; +Landroidx/compose/ui/text/input/TextInputServiceAndroid$stopInput$1; +SPLandroidx/compose/ui/text/input/TextInputServiceAndroid$stopInput$1;->()V +SPLandroidx/compose/ui/text/input/TextInputServiceAndroid$stopInput$1;->(II)V +Landroidx/compose/ui/text/input/TextInputServiceAndroid_androidKt$$ExternalSyntheticLambda0; +SPLandroidx/compose/ui/text/input/TextInputServiceAndroid_androidKt$$ExternalSyntheticLambda0;->(Landroid/view/Choreographer;)V +Landroidx/compose/ui/text/input/VisualTransformation; +Landroidx/compose/ui/text/intl/Locale; +SPLandroidx/compose/ui/text/intl/Locale;->(Ljava/util/Locale;)V +Landroidx/compose/ui/text/intl/LocaleList; +SPLandroidx/compose/ui/text/intl/LocaleList;->()V +SPLandroidx/compose/ui/text/intl/LocaleList;->(Ljava/util/List;)V +SPLandroidx/compose/ui/text/intl/LocaleList;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/intl/PlatformLocaleKt; +SPLandroidx/compose/ui/text/intl/PlatformLocaleKt;->()V +Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt; +SPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;->()V +Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1; +Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics; +HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Ljava/util/List;Landroidx/compose/ui/text/font/FontFamily$Resolver;Landroidx/compose/ui/unit/Density;)V +SPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getHasStaleResolvedFonts()Z +SPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getMaxIntrinsicWidth()F +Landroidx/compose/ui/text/platform/AndroidTextPaint; +SPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setBlendMode-s9anfk8(I)V +SPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setBrush-12SF9DM(Landroidx/compose/ui/graphics/Brush;JF)V +HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setColor-8_81llA(J)V +HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setDrawStyle(Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V +SPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setShadow(Landroidx/compose/ui/graphics/Shadow;)V +SPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setTextDecoration(Landroidx/compose/ui/text/style/TextDecoration;)V +Landroidx/compose/ui/text/platform/AndroidTextPaint_androidKt; +SPLandroidx/compose/ui/text/platform/AndroidTextPaint_androidKt;->()V +SPLandroidx/compose/ui/text/platform/AndroidTextPaint_androidKt;->access$getHasEmojiCompat(Landroidx/compose/ui/text/TextStyle;)Z +Landroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1; +SPLandroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;->(Landroidx/compose/runtime/ParcelableSnapshotMutableState;Lio/ktor/events/Events;)V +Landroidx/compose/ui/text/platform/DispatcherKt; +SPLandroidx/compose/ui/text/platform/DispatcherKt;->()V +Landroidx/compose/ui/text/platform/EmojiCompatStatus; +SPLandroidx/compose/ui/text/platform/EmojiCompatStatus;->()V +Landroidx/compose/ui/text/platform/ImmutableBool; +SPLandroidx/compose/ui/text/platform/ImmutableBool;->(Z)V +PLandroidx/compose/ui/text/platform/ImmutableBool;->getValue()Ljava/lang/Object; +Landroidx/compose/ui/text/platform/style/ShaderBrushSpan; +Landroidx/compose/ui/text/style/BaselineShift; +SPLandroidx/compose/ui/text/style/BaselineShift;->(F)V +Landroidx/compose/ui/text/style/BrushStyle; +Landroidx/compose/ui/text/style/ColorStyle; +SPLandroidx/compose/ui/text/style/ColorStyle;->(J)V +SPLandroidx/compose/ui/text/style/ColorStyle;->equals(Ljava/lang/Object;)Z +HSPLandroidx/compose/ui/text/style/ColorStyle;->getAlpha()F +SPLandroidx/compose/ui/text/style/ColorStyle;->getBrush()Landroidx/compose/ui/graphics/Brush; +SPLandroidx/compose/ui/text/style/ColorStyle;->getColor-0d7_KjU()J +Landroidx/compose/ui/text/style/LineBreak; +Landroidx/compose/ui/text/style/LineHeightStyle; +SPLandroidx/compose/ui/text/style/LineHeightStyle;->()V +SPLandroidx/compose/ui/text/style/LineHeightStyle;->(FII)V +PLandroidx/compose/ui/text/style/LineHeightStyle;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/style/LineHeightStyle$Alignment; +SPLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->()V +SPLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->constructor-impl(F)V +Landroidx/compose/ui/text/style/TextDecoration; +SPLandroidx/compose/ui/text/style/TextDecoration;->()V +SPLandroidx/compose/ui/text/style/TextDecoration;->(I)V +SPLandroidx/compose/ui/text/style/TextDecoration;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/style/TextForegroundStyle; +Landroidx/compose/ui/text/style/TextForegroundStyle$Unspecified; +SPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->()V +SPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getAlpha()F +SPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getBrush()Landroidx/compose/ui/graphics/Brush; +SPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getColor-0d7_KjU()J +Landroidx/compose/ui/text/style/TextGeometricTransform; +SPLandroidx/compose/ui/text/style/TextGeometricTransform;->()V +SPLandroidx/compose/ui/text/style/TextGeometricTransform;->(FF)V +SPLandroidx/compose/ui/text/style/TextGeometricTransform;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/style/TextIndent; +SPLandroidx/compose/ui/text/style/TextIndent;->()V +SPLandroidx/compose/ui/text/style/TextIndent;->(JJ)V +SPLandroidx/compose/ui/text/style/TextIndent;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/text/style/TextMotion; +SPLandroidx/compose/ui/text/style/TextMotion;->()V +SPLandroidx/compose/ui/text/style/TextMotion;->(IZ)V +Landroidx/compose/ui/unit/Constraints; +SPLandroidx/compose/ui/unit/Constraints;->(J)V +SPLandroidx/compose/ui/unit/Constraints;->copy-Zbe2FdA$default(JIIIII)J +SPLandroidx/compose/ui/unit/Constraints;->equals-impl0(JJ)Z +SPLandroidx/compose/ui/unit/Constraints;->getHasBoundedHeight-impl(J)Z +SPLandroidx/compose/ui/unit/Constraints;->getHasBoundedWidth-impl(J)Z +SPLandroidx/compose/ui/unit/Constraints;->getHasFixedHeight-impl(J)Z +SPLandroidx/compose/ui/unit/Constraints;->getHasFixedWidth-impl(J)Z +SPLandroidx/compose/ui/unit/Constraints;->getMaxHeight-impl(J)I +SPLandroidx/compose/ui/unit/Constraints;->getMaxWidth-impl(J)I +SPLandroidx/compose/ui/unit/Constraints;->getMinHeight-impl(J)I +SPLandroidx/compose/ui/unit/Constraints;->getMinWidth-impl(J)I +Landroidx/compose/ui/unit/ConstraintsKt; +SPLandroidx/compose/ui/unit/ConstraintsKt;->Constraints$default(III)J +HSPLandroidx/compose/ui/unit/ConstraintsKt;->Constraints(IIII)J +SPLandroidx/compose/ui/unit/ConstraintsKt;->bitsNeedForSizeUnchecked(I)I +HSPLandroidx/compose/ui/unit/ConstraintsKt;->constrain-4WqzIAM(JJ)J +SPLandroidx/compose/ui/unit/ConstraintsKt;->constrain-N9IONVI(JJ)J +SPLandroidx/compose/ui/unit/ConstraintsKt;->constrainHeight-K40F9xA(IJ)I +SPLandroidx/compose/ui/unit/ConstraintsKt;->constrainWidth-K40F9xA(IJ)I +HSPLandroidx/compose/ui/unit/ConstraintsKt;->createConstraints(IIII)J +HSPLandroidx/compose/ui/unit/ConstraintsKt;->offset-NN6Ew-U(IIJ)J +Landroidx/compose/ui/unit/Density; +HSPLandroidx/compose/ui/unit/Density;->roundToPx-0680j_4(F)I +SPLandroidx/compose/ui/unit/Density;->toDp-u2uoSUM(I)F +Landroidx/compose/ui/unit/DensityImpl; +SPLandroidx/compose/ui/unit/DensityImpl;->(FF)V +SPLandroidx/compose/ui/unit/DensityImpl;->equals(Ljava/lang/Object;)Z +Landroidx/compose/ui/unit/DensityKt; +SPLandroidx/compose/ui/unit/DensityKt;->Density$default()Landroidx/compose/ui/unit/DensityImpl; +SPLandroidx/compose/ui/unit/DensityKt;->LazyList(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/gestures/FlingBehavior;ZLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;III)V +SPLandroidx/compose/ui/unit/DensityKt;->Offset(FF)J +SPLandroidx/compose/ui/unit/DensityKt;->ReportDrawnWhen(Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/compose/ui/unit/DensityKt;->access$insertEntryAtIndex([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object; +SPLandroidx/compose/ui/unit/DensityKt;->getDelete()Landroidx/compose/ui/graphics/vector/ImageVector; +SPLandroidx/compose/ui/unit/DensityKt;->getEllipsizedLeftPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F +SPLandroidx/compose/ui/unit/DensityKt;->getEllipsizedRightPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F +SPLandroidx/compose/ui/unit/DensityKt;->indexSegment(II)I +HSPLandroidx/compose/ui/unit/DensityKt;->roundToIntRect(Landroidx/compose/ui/geometry/Rect;)Landroidx/compose/ui/unit/IntRect; +Landroidx/compose/ui/unit/DensityWithConverter; +SPLandroidx/compose/ui/unit/DensityWithConverter;->(FFLandroidx/compose/ui/unit/fontscaling/FontScaleConverter;)V +SPLandroidx/compose/ui/unit/DensityWithConverter;->equals(Ljava/lang/Object;)Z +HSPLandroidx/compose/ui/unit/DensityWithConverter;->getDensity()F +SPLandroidx/compose/ui/unit/DensityWithConverter;->getFontScale()F +Landroidx/compose/ui/unit/Dp; +SPLandroidx/compose/ui/unit/Dp;->(F)V +SPLandroidx/compose/ui/unit/Dp;->compareTo-0680j_4(FF)I +PLandroidx/compose/ui/unit/Dp;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/unit/Dp;->equals-impl0(FF)Z +Landroidx/compose/ui/unit/DpKt; +SPLandroidx/compose/ui/unit/DpKt;->Density(Landroid/content/Context;)Landroidx/compose/ui/unit/DensityWithConverter; +HSPLandroidx/compose/ui/unit/DpKt;->DpSize-YgX7TsA(FF)J +HSPLandroidx/compose/ui/unit/DpKt;->Rect-tz77jQw(JJ)Landroidx/compose/ui/geometry/Rect; +HSPLandroidx/compose/ui/unit/DpKt;->add-impl(Landroidx/collection/MutableScatterMap;Ljava/lang/Object;Ljava/lang/Object;)V +PLandroidx/compose/ui/unit/DpKt;->calculateIfHorizontallyStacked(Ljava/util/ArrayList;)Z +SPLandroidx/compose/ui/unit/DpKt;->checkElementIndex$runtime(II)V +SPLandroidx/compose/ui/unit/DpKt;->checkPositionIndex$runtime(II)V +SPLandroidx/compose/ui/unit/DpKt;->constructor-impl$default()Landroidx/collection/MutableScatterMap; +HSPLandroidx/compose/ui/unit/DpKt;->finalConstraints-tfFHcEY(JZIF)J +SPLandroidx/compose/ui/unit/DpKt;->getAdd()Landroidx/compose/ui/graphics/vector/ImageVector; +HSPLandroidx/compose/ui/unit/DpKt;->painterResource(ILandroidx/compose/runtime/ComposerImpl;)Landroidx/compose/ui/graphics/painter/Painter; +SPLandroidx/compose/ui/unit/DpKt;->remove-impl(Landroidx/collection/MutableScatterMap;Ljava/lang/Object;Ljava/lang/Object;)Z +HSPLandroidx/compose/ui/unit/DpKt;->removeScope-impl(Landroidx/collection/MutableScatterMap;Ljava/lang/Object;)V +PLandroidx/compose/ui/unit/DpKt;->setCollectionInfo(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +PLandroidx/compose/ui/unit/DpKt;->setCollectionItemInfo(Landroidx/compose/ui/semantics/SemanticsNode;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V +Landroidx/compose/ui/unit/IntOffset; +SPLandroidx/compose/ui/unit/IntOffset;->(J)V +HSPLandroidx/compose/ui/unit/IntOffset;->equals-impl0(JJ)Z +HSPLandroidx/compose/ui/unit/IntOffset;->plus-qkQi6aY(JJ)J +Landroidx/compose/ui/unit/IntRect; +SPLandroidx/compose/ui/unit/IntRect;->()V +SPLandroidx/compose/ui/unit/IntRect;->(IIII)V +Landroidx/compose/ui/unit/IntSize; +SPLandroidx/compose/ui/unit/IntSize;->(J)V +SPLandroidx/compose/ui/unit/IntSize;->equals(Ljava/lang/Object;)Z +SPLandroidx/compose/ui/unit/IntSize;->equals-impl0(JJ)Z +Landroidx/compose/ui/unit/LayoutDirection; +SPLandroidx/compose/ui/unit/LayoutDirection;->()V +Landroidx/compose/ui/unit/LinearFontScaleConverter; +SPLandroidx/compose/ui/unit/LinearFontScaleConverter;->(F)V +Landroidx/compose/ui/unit/TextUnit; +SPLandroidx/compose/ui/unit/TextUnit;->()V +SPLandroidx/compose/ui/unit/TextUnit;->equals-impl0(JJ)Z +SPLandroidx/compose/ui/unit/TextUnit;->getType-UIouoOA(J)J +SPLandroidx/compose/ui/unit/TextUnit;->getValue-impl(J)F +Landroidx/compose/ui/unit/TextUnitType; +SPLandroidx/compose/ui/unit/TextUnitType;->(J)V +SPLandroidx/compose/ui/unit/TextUnitType;->equals-impl0(JJ)Z +PLandroidx/compose/ui/unit/Velocity;->(J)V +PLandroidx/compose/ui/unit/Velocity;->copy-OhffZ5M$default(JFFI)J +PLandroidx/compose/ui/unit/Velocity;->getX-impl(J)F +PLandroidx/compose/ui/unit/Velocity;->getY-impl(J)F +PLandroidx/compose/ui/unit/Velocity;->minus-AH228Gc(JJ)J +PLandroidx/compose/ui/unit/Velocity;->times-adjELrA(FJ)J +Landroidx/compose/ui/unit/fontscaling/FontScaleConverter; +Landroidx/compose/ui/unit/fontscaling/FontScaleConverterFactory; +SPLandroidx/compose/ui/unit/fontscaling/FontScaleConverterFactory;->()V +SPLandroidx/compose/ui/unit/fontscaling/FontScaleConverterFactory;->forScale(F)Landroidx/compose/ui/unit/fontscaling/FontScaleConverter; +Landroidx/compose/ui/unit/fontscaling/FontScaleConverterTable; +SPLandroidx/compose/ui/unit/fontscaling/FontScaleConverterTable;->()V +SPLandroidx/compose/ui/unit/fontscaling/FontScaleConverterTable;->([F[F)V +Landroidx/compose/ui/util/ListUtilsKt; +HSPLandroidx/compose/ui/util/ListUtilsKt;->fastJoinToString$default(Ljava/util/List;Ljava/lang/String;Landroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda2;I)Ljava/lang/String; +Landroidx/compose/ui/window/PopupLayout$2; +SPLandroidx/compose/ui/window/PopupLayout$2;->(I)V +Landroidx/compose/ui/window/PopupLayout$Content$4; +SPLandroidx/compose/ui/window/PopupLayout$Content$4;->(ILjava/lang/Object;)V +SPLandroidx/compose/ui/window/PopupLayout$Content$4;->(Landroidx/compose/ui/platform/AbstractComposeView;II)V +SPLandroidx/compose/ui/window/PopupLayout$Content$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/compose/ui/window/PopupPositionProvider; +PLandroidx/concurrent/futures/AbstractResolvableFuture;->()V +PLandroidx/concurrent/futures/AbstractResolvableFuture;->complete(Landroidx/concurrent/futures/AbstractResolvableFuture;)V +PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;->()V +PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;)V +PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casListeners(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;)Z +PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casValue(Landroidx/concurrent/futures/AbstractResolvableFuture;Ljava/lang/Object;Ljava/lang/Object;)Z +PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casWaiters(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;)Z +PLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;->()V +Landroidx/core/app/ComponentActivity; +SPLandroidx/core/app/ComponentActivity;->()V +SPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V +Landroidx/core/app/CoreComponentFactory; +SPLandroidx/core/app/CoreComponentFactory;->()V +Landroidx/core/content/FileProvider; +SPLandroidx/core/content/FileProvider;->()V +SPLandroidx/core/content/FileProvider;->()V +SPLandroidx/core/content/FileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V +SPLandroidx/core/content/FileProvider;->onCreate()Z +Landroidx/core/content/res/CamUtils; +SPLandroidx/core/content/res/CamUtils;->()V +SPLandroidx/core/content/res/CamUtils;->hasAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Z +Landroidx/core/graphics/Insets; +SPLandroidx/core/graphics/Insets;->()V +SPLandroidx/core/graphics/Insets;->(IIII)V +SPLandroidx/core/graphics/Insets;->equals(Ljava/lang/Object;)Z +SPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; +SPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; +Landroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/Insets;)I +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/Insets;)I +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/RenderNode; +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)V +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;IIII)V +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Z)V +PLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/MotionEvent;)I +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)V +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/graphics/Matrix;)V +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/contentcapture/ContentCaptureSession; +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;J)V +Landroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3; +PLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +PLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +PLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m$3()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m()Landroid/view/WindowInsets$Builder; +PLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m(Landroid/app/Activity;Landroidx/lifecycle/ReportFragment$LifecycleCallbacks;)V +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m(Landroid/graphics/Insets;)I +SPLandroidx/core/graphics/Insets$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets; +Landroidx/core/graphics/Insets$Api29Impl; +SPLandroidx/core/graphics/Insets$Api29Impl;->getContentCaptureSession(Landroid/view/View;)Landroid/view/contentcapture/ContentCaptureSession; +SPLandroidx/core/graphics/Insets$Api29Impl;->newAutofillId(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/autofill/AutofillId;J)Landroid/view/autofill/AutofillId; +SPLandroidx/core/graphics/Insets$Api29Impl;->newVirtualViewStructure(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/autofill/AutofillId;J)Landroid/view/ViewStructure; +SPLandroidx/core/graphics/Insets$Api29Impl;->notifyViewAppeared(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/ViewStructure;)V +PLandroidx/core/graphics/Insets$Api29Impl;->notifyViewDisappeared(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/autofill/AutofillId;)V +PLandroidx/core/graphics/Insets$Api29Impl;->notifyViewTextChanged(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/autofill/AutofillId;Ljava/lang/String;)V +SPLandroidx/core/graphics/Insets$Api29Impl;->notifyViewsDisappeared(Landroid/view/contentcapture/ContentCaptureSession;Landroid/view/autofill/AutofillId;[J)V +PLandroidx/core/graphics/TypefaceCompat;->()V +PLandroidx/core/graphics/TypefaceCompatApi29Impl;->createFromFontInfo(Landroid/content/Context;[Landroidx/core/provider/FontsContractCompat$FontInfo;)Landroid/graphics/Typeface; +PLandroidx/core/graphics/TypefaceCompatApi29Impl;->getFontFamily([Landroidx/core/provider/FontsContractCompat$FontInfo;Landroid/content/ContentResolver;)Landroid/graphics/fonts/FontFamily; +PLandroidx/core/graphics/TypefaceCompatApi29Impl;->getMatchScore(Landroid/graphics/fonts/FontStyle;Landroid/graphics/fonts/FontStyle;)I +Landroidx/core/os/BundleKt; +SPLandroidx/core/os/BundleKt;->LocalOwnersProvider(Landroidx/navigation/NavBackStackEntry;Landroidx/compose/runtime/saveable/SaveableStateHolder;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/core/os/BundleKt;->NavHost(Landroidx/navigation/NavHostController;Landroidx/navigation/NavGraph;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/core/os/BundleKt;->NavHost(Landroidx/navigation/NavHostController;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/core/os/BundleKt;->SaveableStateProvider(Landroidx/compose/runtime/saveable/SaveableStateHolder;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/core/os/BundleKt;->access$runFileDiagnosticsIfNotCorruption(Ljava/io/File;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/core/os/BundleKt;->access$runMigrations(Ljava/util/List;Landroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1$api$1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/core/os/BundleKt;->bundleOf([Lkotlin/Pair;)Landroid/os/Bundle; +PLandroidx/core/os/BundleKt;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V +SPLandroidx/core/os/BundleKt;->checkNotNullFromProvides(Ljava/lang/Object;)V +SPLandroidx/core/os/BundleKt;->compatTransactionCoroutineExecute(Landroidx/room/RoomDatabase;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/core/os/BundleKt;->createClientPlugin(Ljava/lang/String;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Landroidx/emoji2/text/EmojiProcessor; +SPLandroidx/core/os/BundleKt;->createFlow(Landroidx/room/RoomDatabase;Z[Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1; +SPLandroidx/core/os/BundleKt;->createHiltViewModelFactory(Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/compose/runtime/ComposerImpl;)Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory; +SPLandroidx/core/os/BundleKt;->fastCbrt(F)F +SPLandroidx/core/os/BundleKt;->getSp(D)J +SPLandroidx/core/os/BundleKt;->getSp(I)J +SPLandroidx/core/os/BundleKt;->getWrappedDb(Lio/ktor/events/Events;Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; +SPLandroidx/core/os/BundleKt;->lerp(FFF)F +SPLandroidx/core/os/BundleKt;->missingRequiredArguments(Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/ArrayList; +SPLandroidx/core/os/BundleKt;->pack(FJ)J +SPLandroidx/core/os/BundleKt;->pretty(Ljava/time/LocalDate;)Ljava/lang/String; +Landroidx/core/os/HandlerCompat$Api28Impl; +SPLandroidx/core/os/HandlerCompat$Api28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +SPLandroidx/core/os/HandlerCompat$Api28Impl;->getBoundingRects(Landroid/view/DisplayCutout;)Ljava/util/List; +PLandroidx/core/os/TraceCompat;->()V +PLandroidx/core/provider/FontProvider;->()V +PLandroidx/core/provider/FontProvider;->getFontFamilyResult(Landroid/content/Context;Ljava/util/List;)Landroidx/core/provider/FontsContractCompat$FontFamilyResult; +PLandroidx/core/provider/FontProvider;->getProvider(Landroid/content/pm/PackageManager;Landroidx/core/provider/FontRequest;Landroid/content/res/Resources;)Landroid/content/pm/ProviderInfo; +PLandroidx/core/provider/FontProvider;->query(Landroid/content/Context;Landroidx/core/provider/FontRequest;Ljava/lang/String;)[Landroidx/core/provider/FontsContractCompat$FontInfo; +PLandroidx/core/provider/FontProvider$ProviderCacheKey;->hashCode()I +PLandroidx/core/provider/FontRequest;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V +PLandroidx/core/provider/FontsContractCompat$FontFamilyResult;->(Ljava/util/ArrayList;)V +PLandroidx/core/provider/FontsContractCompat$FontInfo;->(Landroid/net/Uri;IIZI)V +Landroidx/core/view/AccessibilityDelegateCompat; +SPLandroidx/core/view/AccessibilityDelegateCompat;->()V +SPLandroidx/core/view/AccessibilityDelegateCompat;->()V +Landroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter; +SPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V +PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; +PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z +PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V +Landroidx/core/view/DisplayCutoutCompat; +SPLandroidx/core/view/DisplayCutoutCompat;->(Landroid/view/DisplayCutout;)V +SPLandroidx/core/view/DisplayCutoutCompat;->getWaterfallInsets()Landroidx/core/graphics/Insets; +Landroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Typeface;IZ)Landroid/graphics/Typeface; +SPLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;)V +SPLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/DisplayCutout; +SPLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +PLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +PLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +Landroidx/core/view/DisplayCutoutCompat$Api31Impl; +SPLandroidx/core/view/DisplayCutoutCompat$Api31Impl;->getCutoutPath(Landroid/view/DisplayCutout;)Landroid/graphics/Path; +Landroidx/core/view/OnApplyWindowInsetsListener; +Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl30; +Landroidx/core/view/ViewCompat; +SPLandroidx/core/view/ViewCompat;->()V +SPLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +Landroidx/core/view/ViewCompat$Api21Impl; +SPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V +Landroidx/core/view/ViewCompat$Api21Impl$1; +SPLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V +SPLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; +Landroidx/core/view/ViewCompat$Api23Impl; +SPLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowCompat$Api30Impl; +SPLandroidx/core/view/WindowCompat$Api30Impl;->getWaterfallInsets(Landroid/view/DisplayCutout;)Landroid/graphics/Insets; +SPLandroidx/core/view/WindowCompat$Api30Impl;->setDecorFitsSystemWindows$1(Landroid/view/Window;Z)V +SPLandroidx/core/view/WindowCompat$Api30Impl;->setImportantForContentCapture(Landroid/view/View;)V +PLandroidx/core/view/WindowCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V +Landroidx/core/view/WindowInsetsAnimationCompat$Callback; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->(I)V +Landroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback; +SPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V +Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat;->()V +SPLandroidx/core/view/WindowInsetsCompat;->()V +SPLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; +SPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/View;Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V +Landroidx/core/view/WindowInsetsCompat$BuilderImpl29; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowInsetsCompat$BuilderImpl30; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V +Landroidx/core/view/WindowInsetsCompat$BuilderImpl34; +SPLandroidx/core/view/WindowInsetsCompat$BuilderImpl34;->()V +Landroidx/core/view/WindowInsetsCompat$Impl; +SPLandroidx/core/view/WindowInsetsCompat$Impl;->()V +SPLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V +Landroidx/core/view/WindowInsetsCompat$Impl20; +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl20;->setSystemUiVisibility(I)V +Landroidx/core/view/WindowInsetsCompat$Impl21; +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; +Landroidx/core/view/WindowInsetsCompat$Impl28; +SPLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; +SPLandroidx/core/view/WindowInsetsCompat$Impl28;->getDisplayCutout()Landroidx/core/view/DisplayCutoutCompat; +Landroidx/core/view/WindowInsetsCompat$Impl29; +SPLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +Landroidx/core/view/WindowInsetsCompat$Impl30; +SPLandroidx/core/view/WindowInsetsCompat$Impl30;->()V +SPLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V +Landroidx/core/view/WindowInsetsCompat$Impl34; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->()V +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->getInsets(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; +SPLandroidx/core/view/WindowInsetsCompat$Impl34;->isVisible(I)Z +Landroidx/core/view/WindowInsetsCompat$TypeImpl34; +SPLandroidx/core/view/WindowInsetsCompat$TypeImpl34;->toPlatformType(I)I +Landroidx/core/view/WindowInsetsCompat$TypeImpl34$$ExternalSyntheticApiModelOutline0; +SPLandroidx/core/view/WindowInsetsCompat$TypeImpl34$$ExternalSyntheticApiModelOutline0;->m()I +Landroidx/core/view/WindowInsetsControllerCompat$Impl30; +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->(Landroid/view/Window;)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightNavigationBars(Z)V +SPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightStatusBars(Z)V +Landroidx/core/view/WindowInsetsControllerCompat$Impl35; +PLandroidx/core/view/accessibility/AccessibilityEventCompat$Api34Impl;->getActionScrollInDirection()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +PLandroidx/core/view/accessibility/AccessibilityEventCompat$Api34Impl;->isRequestFromAccessibilityTool(Landroid/view/accessibility/AccessibilityManager;)Z +PLandroidx/core/view/accessibility/AccessibilityEventCompat$Api34Impl;->setAccessibilityDataSensitive(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->extrasIntList(Ljava/lang/String;)Ljava/util/ArrayList; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getText()Ljava/lang/CharSequence; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/String;)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->()V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/CharSequence;Ljava/lang/Class;)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/String;I)V +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline1;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline1;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat$$ExternalSyntheticApiModelOutline1;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19; +SPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19;->(Landroidx/paging/ConflatedEventBus;)V +PLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi19;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo; +Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat$AccessibilityNodeProviderApi26; +Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; +SPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V +Landroidx/datastore/core/Api26Impl; +SPLandroidx/datastore/core/Api26Impl;->getAutofillId(Landroid/view/View;)Landroid/view/autofill/AutofillId; +PLandroidx/datastore/core/Api26Impl;->move(Ljava/io/File;Ljava/io/File;)Z +Landroidx/datastore/core/Closeable; +Landroidx/datastore/core/CorruptionException; +Landroidx/datastore/core/Data; +SPLandroidx/datastore/core/Data;->(IILjava/lang/Object;)V +Landroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$1; +Landroidx/datastore/core/DataStore; +Landroidx/datastore/core/DataStoreImpl; +SPLandroidx/datastore/core/DataStoreImpl;->(Landroidx/datastore/core/FileStorage;Ljava/util/List;Landroidx/collection/internal/Lock;Lkotlinx/coroutines/CoroutineScope;)V +PLandroidx/datastore/core/DataStoreImpl;->access$decrementCollector(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/datastore/core/DataStoreImpl;->access$handleUpdate(Landroidx/datastore/core/DataStoreImpl;Landroidx/datastore/core/Message$Update;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl;->access$incrementCollector(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl;->access$readAndInitOrPropagateAndThrowFailure(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl;->access$readDataAndUpdateCache(Landroidx/datastore/core/DataStoreImpl;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl;->access$readDataOrHandleCorruption(Landroidx/datastore/core/DataStoreImpl;ZLkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl;->getCoordinator()Landroidx/datastore/core/SingleProcessCoordinator; +SPLandroidx/datastore/core/DataStoreImpl;->getData()Lkotlinx/coroutines/flow/Flow; +SPLandroidx/datastore/core/DataStoreImpl;->readDataFromFileOrDefault(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/datastore/core/DataStoreImpl;->updateData(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +PLandroidx/datastore/core/DataStoreImpl;->writeData$datastore_core(Ljava/lang/Object;ZLkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$$ExternalSyntheticLambda0; +SPLandroidx/datastore/core/DataStoreImpl$$ExternalSyntheticLambda0;->(Landroidx/datastore/core/DataStoreImpl;I)V +SPLandroidx/datastore/core/DataStoreImpl$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$1; +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$1;->(Lokhttp3/Dispatcher;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1; +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1;->(Landroidx/datastore/core/DataStoreImpl;Lokhttp3/Dispatcher;Lkotlin/coroutines/Continuation;)V +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1$api$1; +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1$api$1;->(Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/datastore/core/DataStoreImpl;)V +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1$api$1;->updateData(Landroidx/navigation/compose/NavHostKt$NavHost$25$1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1$api$1$updateData$1; +SPLandroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1$api$1$updateData$1;->(Landroidx/datastore/core/DataStoreImpl$InitDataStore$doRun$initData$1$api$1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/datastore/core/DataStoreImpl$data$1; +PLandroidx/datastore/core/DataStoreImpl$data$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +PLandroidx/datastore/core/DataStoreImpl$data$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/datastore/core/DataStoreImpl$data$1;->(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;IZ)V +SPLandroidx/datastore/core/DataStoreImpl$data$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +PLandroidx/datastore/core/DataStoreImpl$data$1;->(Lkotlinx/coroutines/Job;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/datastore/core/DataStoreImpl$data$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/datastore/core/DataStoreImpl$data$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/datastore/core/DataStoreImpl$data$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$data$1$1; +SPLandroidx/datastore/core/DataStoreImpl$data$1$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/datastore/core/DataStoreImpl$data$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/datastore/core/DataStoreImpl$data$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl$data$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$data$1$3; +SPLandroidx/datastore/core/DataStoreImpl$data$1$3;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/datastore/core/DataStoreImpl$data$1$3;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;I)V +SPLandroidx/datastore/core/DataStoreImpl$data$1$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/datastore/core/DataStoreImpl$data$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl$data$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$data$1$5; +SPLandroidx/datastore/core/DataStoreImpl$data$1$5;->(ILkotlin/coroutines/Continuation;)V +SPLandroidx/datastore/core/DataStoreImpl$data$1$5;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/Continuation;)V +SPLandroidx/datastore/core/DataStoreImpl$data$1$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/datastore/core/DataStoreImpl$data$1$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/datastore/core/DataStoreImpl$data$1$invokeSuspend$$inlined$map$1$2$1;->(Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +PLandroidx/datastore/core/DataStoreImpl$decrementCollector$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/datastore/core/DataStoreImpl$handleUpdate$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/datastore/core/DataStoreImpl$handleUpdate$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$incrementCollector$1; +SPLandroidx/datastore/core/DataStoreImpl$incrementCollector$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/datastore/core/DataStoreImpl$readAndInitOrPropagateAndThrowFailure$1; +SPLandroidx/datastore/core/DataStoreImpl$readAndInitOrPropagateAndThrowFailure$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +SPLandroidx/datastore/core/DataStoreImpl$readAndInitOrPropagateAndThrowFailure$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/DataStoreImpl$readDataAndUpdateCache$1; +SPLandroidx/datastore/core/DataStoreImpl$readDataAndUpdateCache$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/Continuation;)V +Landroidx/datastore/core/DataStoreImpl$readDataAndUpdateCache$4; +SPLandroidx/datastore/core/DataStoreImpl$readDataAndUpdateCache$4;->(ILkotlin/coroutines/Continuation;)V +Landroidx/datastore/core/DataStoreImpl$readDataOrHandleCorruption$1; +SPLandroidx/datastore/core/DataStoreImpl$readDataOrHandleCorruption$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/datastore/core/DataStoreImpl$writeData$1;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/datastore/core/DataStoreImpl$writeData$2;->(Lkotlin/jvm/internal/Ref$IntRef;Landroidx/datastore/core/DataStoreImpl;Ljava/lang/Object;ZLkotlin/coroutines/Continuation;)V +PLandroidx/datastore/core/DataStoreImpl$writeData$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/datastore/core/DataStoreImpl$writeData$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/datastore/core/DataStoreImpl$writeData$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/FileReadScope; +SPLandroidx/datastore/core/FileReadScope;->(Ljava/io/File;)V +SPLandroidx/datastore/core/FileReadScope;->close()V +Landroidx/datastore/core/FileReadScope$readData$2; +SPLandroidx/datastore/core/FileReadScope$readData$2;->(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/datastore/core/FileReadScope$readData$2;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/datastore/core/FileReadScope$readData$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/datastore/core/FileReadScope$readData$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/datastore/core/FileReadScope$readData$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/FileStorage; +SPLandroidx/datastore/core/FileStorage;->()V +SPLandroidx/datastore/core/FileStorage;->(Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;)V +Landroidx/datastore/core/FileStorageConnection; +SPLandroidx/datastore/core/FileStorageConnection;->(Ljava/io/File;Landroidx/datastore/core/SingleProcessCoordinator;Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;)V +SPLandroidx/datastore/core/FileStorageConnection;->readScope(Landroidx/datastore/core/DataStoreImpl$data$1$5;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/datastore/core/FileStorageConnection;->writeScope(Landroidx/datastore/core/DataStoreImpl$writeData$2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/datastore/core/FileStorageConnection$readScope$1; +SPLandroidx/datastore/core/FileStorageConnection$readScope$1;->(Landroidx/datastore/core/FileStorageConnection;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/datastore/core/FileStorageConnection$writeScope$1;->(Landroidx/datastore/core/FileStorageConnection;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/datastore/core/FileStorageKt$runFileDiagnosticsIfNotCorruption$1; +PLandroidx/datastore/core/FileWriteScope$writeData$2;->(Landroidx/datastore/core/DataStoreImpl;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +PLandroidx/datastore/core/FileWriteScope$writeData$2;->(Landroidx/datastore/core/FileWriteScope;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +PLandroidx/datastore/core/FileWriteScope$writeData$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/datastore/core/FileWriteScope$writeData$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/datastore/core/FileWriteScope$writeData$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/Final; +PLandroidx/datastore/core/Message$Update;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/CompletableDeferredImpl;Landroidx/datastore/core/State;Lkotlin/coroutines/CoroutineContext;)V +Landroidx/datastore/core/ReadException; +Landroidx/datastore/core/RunOnce$runIfNeeded$1; +SPLandroidx/datastore/core/RunOnce$runIfNeeded$1;->(Lokhttp3/Dispatcher;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +SPLandroidx/datastore/core/RunOnce$runIfNeeded$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/SimpleActor$$ExternalSyntheticLambda0; +SPLandroidx/datastore/core/SimpleActor$$ExternalSyntheticLambda0;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +PLandroidx/datastore/core/SimpleActor$$ExternalSyntheticLambda0;->(Lkotlin/jvm/internal/Ref$FloatRef;Landroidx/compose/foundation/lazy/LazyListScrollScopeKt$LazyLayoutScrollScope$1;Lkotlin/jvm/internal/Ref$FloatRef;Landroidx/compose/foundation/gestures/DefaultFlingBehavior;)V +HSPLandroidx/datastore/core/SimpleActor$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/SimpleActor$offer$2; +SPLandroidx/datastore/core/SimpleActor$offer$2;->(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/datastore/core/SimpleActor$offer$2;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +PLandroidx/datastore/core/SimpleActor$offer$2;->(Lkotlin/jvm/functions/Function2;Landroidx/datastore/core/Data;Lkotlin/coroutines/Continuation;)V +SPLandroidx/datastore/core/SimpleActor$offer$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/datastore/core/SimpleActor$offer$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/datastore/core/SimpleActor$offer$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/SingleProcessCoordinator; +SPLandroidx/datastore/core/SingleProcessCoordinator;->(Ljava/lang/String;)V +SPLandroidx/datastore/core/SingleProcessCoordinator;->getVersion()Ljava/lang/Integer; +SPLandroidx/datastore/core/SingleProcessCoordinator;->lock(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/datastore/core/SingleProcessCoordinator$lock$1; +SPLandroidx/datastore/core/SingleProcessCoordinator$lock$1;->(Landroidx/datastore/core/SingleProcessCoordinator;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/datastore/core/SingleProcessCoordinator$lock$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/datastore/core/State; +SPLandroidx/datastore/core/State;->(I)V +Landroidx/datastore/core/UnInitialized; +SPLandroidx/datastore/core/UnInitialized;->()V +PLandroidx/datastore/core/UncloseableOutputStream;->(ILjava/lang/Object;)V +PLandroidx/datastore/core/UncloseableOutputStream;->write([BII)V +PLandroidx/datastore/core/UpdatingDataContextElement;->(Landroidx/datastore/core/UpdatingDataContextElement;Landroidx/datastore/core/DataStoreImpl;)V +PLandroidx/datastore/core/UpdatingDataContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +PLandroidx/datastore/core/UpdatingDataContextElement;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +PLandroidx/datastore/core/UpdatingDataContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +PLandroidx/datastore/core/UpdatingDataContextElement;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +PLandroidx/datastore/core/UpdatingDataContextElement$Companion$Key;->()V +Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate; +SPLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CoroutineScope;)V +PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->()V +PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->()V +PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->access$100(Landroidx/datastore/preferences/PreferencesProto$PreferenceMap;)Landroidx/datastore/preferences/protobuf/MapFieldLite; +PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->dynamicMethod(I)Ljava/lang/Object; +PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap;->newBuilder()Landroidx/datastore/preferences/PreferencesProto$PreferenceMap$Builder; +PLandroidx/datastore/preferences/PreferencesProto$PreferenceMap$PreferencesDefaultEntryHolder;->()V +PLandroidx/datastore/preferences/PreferencesProto$Value;->()V +PLandroidx/datastore/preferences/PreferencesProto$Value;->()V +PLandroidx/datastore/preferences/PreferencesProto$Value;->access$900(Landroidx/datastore/preferences/PreferencesProto$Value;I)V +PLandroidx/datastore/preferences/PreferencesProto$Value;->dynamicMethod(I)Ljava/lang/Object; +PLandroidx/datastore/preferences/PreferencesProto$Value;->getDefaultInstance()Landroidx/datastore/preferences/PreferencesProto$Value; +PLandroidx/datastore/preferences/PreferencesProto$Value;->newBuilder()Landroidx/datastore/preferences/PreferencesProto$Value$Builder; +Landroidx/datastore/preferences/core/MutablePreferences; +SPLandroidx/datastore/preferences/core/MutablePreferences;->(Ljava/util/LinkedHashMap;Z)V +SPLandroidx/datastore/preferences/core/MutablePreferences;->(Z)V +PLandroidx/datastore/preferences/core/MutablePreferences;->asMap()Ljava/util/Map; +PLandroidx/datastore/preferences/core/MutablePreferences;->checkNotFrozen$datastore_preferences_core()V +SPLandroidx/datastore/preferences/core/MutablePreferences;->equals(Ljava/lang/Object;)Z +SPLandroidx/datastore/preferences/core/MutablePreferences;->get(Landroidx/datastore/preferences/core/Preferences$Key;)Ljava/lang/Object; +SPLandroidx/datastore/preferences/core/MutablePreferences;->hashCode()I +PLandroidx/datastore/preferences/core/MutablePreferences;->setUnchecked$datastore_preferences_core(Landroidx/datastore/preferences/core/Preferences$Key;Ljava/lang/Object;)V +Landroidx/datastore/preferences/core/Preferences$Key; +SPLandroidx/datastore/preferences/core/Preferences$Key;->(Ljava/lang/String;)V +PLandroidx/datastore/preferences/core/Preferences$Key;->hashCode()I +Landroidx/datastore/preferences/core/PreferencesFileSerializer; +SPLandroidx/datastore/preferences/core/PreferencesFileSerializer;->()V +PLandroidx/datastore/preferences/core/PreferencesFileSerializer;->writeTo(Ljava/lang/Object;Landroidx/datastore/core/UncloseableOutputStream;)V +PLandroidx/datastore/preferences/protobuf/Android;->()V +PLandroidx/datastore/preferences/protobuf/Android;->isOnAndroidDevice()Z +PLandroidx/datastore/preferences/protobuf/ByteString$ArraysByteArrayCopier;->(I)V +PLandroidx/datastore/preferences/protobuf/ByteString$LiteralByteString;->()V +PLandroidx/datastore/preferences/protobuf/ByteString$LiteralByteString;->([B)V +PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->([BIIZ)V +PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->getTotalBytesRead()I +PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->pushLimit(I)I +PLandroidx/datastore/preferences/protobuf/CodedInputStream$ArrayDecoder;->recomputeBufferSizeAfterLimit()V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->()V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->(Landroidx/datastore/core/UncloseableOutputStream;I)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->bufferTag(II)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->bufferUInt32NoTag(I)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->computeStringSizeNoTag(Ljava/lang/String;)I +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->computeTagSize(I)I +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->computeUInt32SizeNoTag(I)I +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->computeUInt64SizeNoTag(J)I +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->doFlush()V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->flushIfNotAvailable(I)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->write([BII)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->writeInt32(II)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->writeStringNoTag(Ljava/lang/String;)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->writeTag(II)V +PLandroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;->writeUInt32NoTag(I)V +PLandroidx/datastore/preferences/protobuf/ExtensionSchemas;->()V +PLandroidx/datastore/preferences/protobuf/FieldSet;->()V +PLandroidx/datastore/preferences/protobuf/FieldSet;->(I)V +PLandroidx/datastore/preferences/protobuf/FieldSet;->makeImmutable()V +PLandroidx/datastore/preferences/protobuf/FieldSet;->writeElement(Landroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;ILjava/lang/Object;)V +PLandroidx/datastore/preferences/protobuf/FieldType;->()V +PLandroidx/datastore/preferences/protobuf/FieldType;->(Ljava/lang/String;IIILandroidx/datastore/preferences/protobuf/JavaType;)V +PLandroidx/datastore/preferences/protobuf/FieldType;->values()[Landroidx/datastore/preferences/protobuf/FieldType; +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->()V +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->()V +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->getDefaultInstance(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/GeneratedMessageLite; +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->getSerializedSize(Landroidx/datastore/preferences/protobuf/Schema;)I +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->isInitialized(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;Z)Z +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->isMutable()Z +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->markImmutable()V +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->newMutableInstance$1()Landroidx/datastore/preferences/protobuf/GeneratedMessageLite; +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->registerDefaultInstance(Ljava/lang/Class;Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;)V +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->setMemoizedSerializedSize(I)V +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite;->writeTo(Landroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;)V +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$Builder;->(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;)V +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$Builder;->build()Landroidx/datastore/preferences/protobuf/GeneratedMessageLite; +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$Builder;->buildPartial()Landroidx/datastore/preferences/protobuf/GeneratedMessageLite; +PLandroidx/datastore/preferences/protobuf/GeneratedMessageLite$Builder;->copyOnWrite()V +PLandroidx/datastore/preferences/protobuf/Internal;->()V +PLandroidx/datastore/preferences/protobuf/Internal;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V +Landroidx/datastore/preferences/protobuf/InvalidProtocolBufferException; +PLandroidx/datastore/preferences/protobuf/JavaType;->()V +PLandroidx/datastore/preferences/protobuf/ListFieldSchemas;->()V +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;->()V +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;->()V +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory;->(Landroidx/datastore/preferences/protobuf/CodedOutputStream$OutputStreamEncoder;)V +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$1;->()V +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$1;->(I)V +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$1;->isSupported(Ljava/lang/Class;)Z +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$1;->messageInfoFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/RawMessageInfo; +PLandroidx/datastore/preferences/protobuf/ManifestSchemaFactory$CompositeMessageInfoFactory;->messageInfoFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/RawMessageInfo; +PLandroidx/datastore/preferences/protobuf/MapEntryLite;->(Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Landroidx/datastore/preferences/PreferencesProto$Value;)V +PLandroidx/datastore/preferences/protobuf/MapEntryLite;->computeSerializedSize(Landroidx/datastore/preferences/protobuf/MapEntryLite$Metadata;Ljava/lang/Object;Ljava/lang/Object;)I +PLandroidx/datastore/preferences/protobuf/MapEntryLite$Metadata;->(Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Landroidx/datastore/preferences/protobuf/WireFormat$FieldType;Ljava/lang/Object;)V +PLandroidx/datastore/preferences/protobuf/MapFieldLite;->()V +PLandroidx/datastore/preferences/protobuf/MapFieldLite;->()V +PLandroidx/datastore/preferences/protobuf/MapFieldLite;->ensureMutable()V +PLandroidx/datastore/preferences/protobuf/MapFieldLite;->entrySet()Ljava/util/Set; +PLandroidx/datastore/preferences/protobuf/MapFieldLite;->mutableCopy()Landroidx/datastore/preferences/protobuf/MapFieldLite; +PLandroidx/datastore/preferences/protobuf/MapFieldLite;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/datastore/preferences/protobuf/MapFieldSchemas;->()V +PLandroidx/datastore/preferences/protobuf/MessageSchema;->()V +PLandroidx/datastore/preferences/protobuf/MessageSchema;->([I[Ljava/lang/Object;IILandroidx/datastore/preferences/protobuf/AbstractMessageLite;[IIILandroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchemaLite;Landroidx/datastore/preferences/protobuf/UnknownFieldSetLiteSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)V +PLandroidx/datastore/preferences/protobuf/MessageSchema;->getSerializedSize(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;)I +PLandroidx/datastore/preferences/protobuf/MessageSchema;->isMutable(Ljava/lang/Object;)Z +PLandroidx/datastore/preferences/protobuf/MessageSchema;->isOneofPresent(IILjava/lang/Object;)Z +PLandroidx/datastore/preferences/protobuf/MessageSchema;->makeImmutable(Ljava/lang/Object;)V +PLandroidx/datastore/preferences/protobuf/MessageSchema;->newSchemaForRawMessageInfo(Landroidx/datastore/preferences/protobuf/RawMessageInfo;Landroidx/datastore/preferences/protobuf/NewInstanceSchemaLite;Landroidx/datastore/preferences/protobuf/ListFieldSchemaLite;Landroidx/datastore/preferences/protobuf/UnknownFieldSetLiteSchema;Landroidx/datastore/preferences/protobuf/ExtensionSchemaLite;Landroidx/datastore/preferences/protobuf/MapFieldSchemaLite;)Landroidx/datastore/preferences/protobuf/MessageSchema; +PLandroidx/datastore/preferences/protobuf/MessageSchema;->oneofIntAt(JLjava/lang/Object;)I +PLandroidx/datastore/preferences/protobuf/MessageSchema;->reflectField(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field; +PLandroidx/datastore/preferences/protobuf/MessageSchema;->type(I)I +PLandroidx/datastore/preferences/protobuf/MessageSchema;->typeAndOffsetAt(I)I +PLandroidx/datastore/preferences/protobuf/MessageSchema;->writeFieldsInAscendingOrder(Ljava/lang/Object;Landroidx/datastore/preferences/protobuf/ManifestSchemaFactory;)V +PLandroidx/datastore/preferences/protobuf/MessageSchema;->writeTo(Ljava/lang/Object;Landroidx/datastore/preferences/protobuf/ManifestSchemaFactory;)V +PLandroidx/datastore/preferences/protobuf/NewInstanceSchemas;->()V +PLandroidx/datastore/preferences/protobuf/Protobuf;->()V +PLandroidx/datastore/preferences/protobuf/Protobuf;->()V +PLandroidx/datastore/preferences/protobuf/Protobuf;->schemaFor(Ljava/lang/Class;)Landroidx/datastore/preferences/protobuf/Schema; +PLandroidx/datastore/preferences/protobuf/RawMessageInfo;->(Landroidx/datastore/preferences/protobuf/GeneratedMessageLite;Ljava/lang/String;[Ljava/lang/Object;)V +PLandroidx/datastore/preferences/protobuf/RawMessageInfo;->getSyntax()I +PLandroidx/datastore/preferences/protobuf/SchemaUtil;->()V +PLandroidx/datastore/preferences/protobuf/SmallSortedMap$1;->getOverflowEntries()Ljava/util/Set; +PLandroidx/datastore/preferences/protobuf/SmallSortedMap$1;->newFieldMap()Landroidx/datastore/preferences/protobuf/SmallSortedMap$1; +PLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;->()V +PLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;->(I[I[Ljava/lang/Object;Z)V +PLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;->getSerializedSize()I +PLandroidx/datastore/preferences/protobuf/UnknownFieldSetLite;->writeTo(Landroidx/datastore/preferences/protobuf/ManifestSchemaFactory;)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->()V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->arrayBaseOffset(Ljava/lang/Class;)I +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->arrayIndexScale(Ljava/lang/Class;)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->bufferAddressField()Ljava/lang/reflect/Field; +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->determineAndroidSupportByAddressSize(Ljava/lang/Class;)Z +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->getUnsafe()Lsun/misc/Unsafe; +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->putByte([BJB)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->putByteLittleEndian(Ljava/lang/Object;JB)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil;->putInt(IJLjava/lang/Object;)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;->run()Ljava/lang/Object; +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$1;->run()Lsun/misc/Unsafe; +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$Android32MemoryAccessor;->(Lsun/misc/Unsafe;I)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$Android32MemoryAccessor;->putByte(Ljava/lang/Object;JB)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$Android32MemoryAccessor;->supportsUnsafeByteBufferOperations()Z +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->(Lsun/misc/Unsafe;)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->arrayBaseOffset(Ljava/lang/Class;)I +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->arrayIndexScale(Ljava/lang/Class;)I +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->getInt(JLjava/lang/Object;)I +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->getObject(JLjava/lang/Object;)Ljava/lang/Object; +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->objectFieldOffset(Ljava/lang/reflect/Field;)J +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->putInt(IJLjava/lang/Object;)V +PLandroidx/datastore/preferences/protobuf/UnsafeUtil$MemoryAccessor;->supportsUnsafeArrayOperations()Z +PLandroidx/datastore/preferences/protobuf/Utf8;->()V +PLandroidx/datastore/preferences/protobuf/Utf8;->encodedLength(Ljava/lang/String;)I +PLandroidx/datastore/preferences/protobuf/Utf8$SafeProcessor;->(I)V +PLandroidx/datastore/preferences/protobuf/Utf8$SafeProcessor;->encodeUtf8(Ljava/lang/String;[BII)I +PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;->()V +PLandroidx/datastore/preferences/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILandroidx/datastore/preferences/protobuf/WireFormat$JavaType;I)V +PLandroidx/datastore/preferences/protobuf/WireFormat$JavaType;->()V +PLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->(Ljava/lang/String;)V +PLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; +Landroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl; +SPLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +Landroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl$$ExternalSyntheticApiModelOutline0; +PLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +PLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Looper;)Landroid/os/Handler; +PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->getSigningSignatures(Landroid/content/pm/PackageManager;Ljava/lang/String;)[Landroid/content/pm/Signature; +Landroidx/emoji2/text/DefaultGlyphChecker; +SPLandroidx/emoji2/text/DefaultGlyphChecker;->()V +SPLandroidx/emoji2/text/DefaultGlyphChecker;->()V +Landroidx/emoji2/text/EmojiCompat; +SPLandroidx/emoji2/text/EmojiCompat;->()V +SPLandroidx/emoji2/text/EmojiCompat;->(Landroidx/emoji2/text/FontRequestEmojiCompatConfig;)V +SPLandroidx/emoji2/text/EmojiCompat;->get()Landroidx/emoji2/text/EmojiCompat; +HSPLandroidx/emoji2/text/EmojiCompat;->getLoadState()I +SPLandroidx/emoji2/text/EmojiCompat;->isConfigured()Z +PLandroidx/emoji2/text/EmojiCompat;->load()V +Landroidx/emoji2/text/EmojiCompat$CompatInternal19; +SPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->(Landroidx/emoji2/text/EmojiCompat;)V +PLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->(Landroidx/emoji2/text/EmojiCompat$CompatInternal19;)V +PLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->onLoaded(Lokhttp3/Dispatcher;)V +Landroidx/emoji2/text/EmojiCompat$GlyphChecker; +PLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->(Ljava/util/List;ILjava/lang/Throwable;)V +PLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->run()V +Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader; +Landroidx/emoji2/text/EmojiCompatInitializer; +SPLandroidx/emoji2/text/EmojiCompatInitializer;->()V +SPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLandroidx/emoji2/text/EmojiCompatInitializer;->dependencies()Ljava/util/List; +Landroidx/emoji2/text/EmojiCompatInitializer$1; +SPLandroidx/emoji2/text/EmojiCompatInitializer$1;->(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/LifecycleRegistry;)V +SPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->run()V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->(Landroidx/core/os/BundleKt;Ljava/util/concurrent/ThreadPoolExecutor;)V +PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$1;->onLoaded(Lokhttp3/Dispatcher;)V +Landroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable; +PLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->run()V +PLandroidx/emoji2/text/EmojiExclusions$EmojiExclusions_Api34;->getExclusions()Ljava/util/Set; +Landroidx/emoji2/text/EmojiProcessor; +SPLandroidx/emoji2/text/EmojiProcessor;->(I)V +SPLandroidx/emoji2/text/EmojiProcessor;->(Landroid/view/View;)V +SPLandroidx/emoji2/text/EmojiProcessor;->(Landroidx/compose/runtime/Recomposer$$ExternalSyntheticLambda1;)V +SPLandroidx/emoji2/text/EmojiProcessor;->(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;)V +SPLandroidx/emoji2/text/EmojiProcessor;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLandroidx/emoji2/text/EmojiProcessor;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V +PLandroidx/emoji2/text/EmojiProcessor;->(Lokhttp3/Dispatcher;Landroidx/collection/internal/Lock;Landroidx/emoji2/text/DefaultGlyphChecker;Ljava/util/Set;)V +HSPLandroidx/emoji2/text/EmojiProcessor;->add(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/Invalidation;)V +SPLandroidx/emoji2/text/EmojiProcessor;->computeHelperState(Landroidx/paging/LoadState;Landroidx/paging/LoadState;Landroidx/paging/LoadState;Landroidx/paging/LoadState;)Landroidx/paging/LoadState; +SPLandroidx/emoji2/text/EmojiProcessor;->computeNewState(Landroidx/paging/CombinedLoadStates;Landroidx/paging/LoadStates;Landroidx/paging/LoadStates;)Landroidx/paging/CombinedLoadStates; +HSPLandroidx/emoji2/text/EmojiProcessor;->get()Ljava/lang/Object; +SPLandroidx/emoji2/text/EmojiProcessor;->get(Landroidx/paging/LoadType;)Landroidx/paging/LoadState; +SPLandroidx/emoji2/text/EmojiProcessor;->getCanvas()Landroidx/compose/ui/graphics/Canvas; +HSPLandroidx/emoji2/text/EmojiProcessor;->getCurrent()Landroidx/compose/ui/text/intl/LocaleList; +SPLandroidx/emoji2/text/EmojiProcessor;->getKey()Lio/ktor/util/AttributeKey; +SPLandroidx/emoji2/text/EmojiProcessor;->getSize-NH-jbRc()J +SPLandroidx/emoji2/text/EmojiProcessor;->install(Ljava/lang/Object;Lio/ktor/client/HttpClient;)V +HSPLandroidx/emoji2/text/EmojiProcessor;->isNotEmpty()Z +SPLandroidx/emoji2/text/EmojiProcessor;->prepare(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +SPLandroidx/emoji2/text/EmojiProcessor;->set(Landroidx/paging/LoadStates;)V +SPLandroidx/emoji2/text/EmojiProcessor;->set(Landroidx/paging/LoadStates;Landroidx/paging/LoadStates;)V +SPLandroidx/emoji2/text/EmojiProcessor;->set(Landroidx/paging/LoadType;Landroidx/paging/LoadState;)V +HSPLandroidx/emoji2/text/EmojiProcessor;->set(Ljava/lang/Object;)V +SPLandroidx/emoji2/text/EmojiProcessor;->setCanvas(Landroidx/compose/ui/graphics/Canvas;)V +SPLandroidx/emoji2/text/EmojiProcessor;->setDensity(Landroidx/compose/ui/unit/Density;)V +SPLandroidx/emoji2/text/EmojiProcessor;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V +SPLandroidx/emoji2/text/EmojiProcessor;->setSize-uvyYCjk(J)V +SPLandroidx/emoji2/text/EmojiProcessor;->snapshot()Landroidx/paging/LoadStates; +PLandroidx/emoji2/text/EmojiProcessor;->unregister()V +Landroidx/emoji2/text/EmojiProcessor$EmojiProcessCallback; +PLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->(Landroidx/emoji2/text/MetadataRepo$Node;)V +PLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->reset()V +PLandroidx/emoji2/text/EmojiProcessor$ProcessorSm;->shouldUseEmojiPresentationStyleForSingleCodepoint()Z +Landroidx/emoji2/text/FontRequestEmojiCompatConfig; +SPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->()V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->(Landroid/content/Context;Landroidx/core/provider/FontRequest;)V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->cleanUp()V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->load(Landroidx/core/os/BundleKt;)V +PLandroidx/emoji2/text/FontRequestEmojiCompatConfig$FontRequestMetadataLoader;->retrieveFontInfo()Landroidx/core/provider/FontsContractCompat$FontInfo; +PLandroidx/emoji2/text/MetadataRepo$Node;->(I)V +PLandroidx/emoji2/text/MetadataRepo$Node;->put(Landroidx/emoji2/text/TypefaceEmojiRasterizer;II)V +PLandroidx/emoji2/text/TypefaceEmojiRasterizer;->()V +PLandroidx/emoji2/text/TypefaceEmojiRasterizer;->(Lokhttp3/Dispatcher;I)V +PLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getCodepointAt(I)I +HPLandroidx/emoji2/text/TypefaceEmojiRasterizer;->getMetadataItem()Landroidx/emoji2/text/flatbuffer/MetadataItem; +Landroidx/emoji2/text/TypefaceEmojiSpan; +Landroidx/emoji2/text/flatbuffer/Table; +PLandroidx/emoji2/text/flatbuffer/Table;->()V +HPLandroidx/emoji2/text/flatbuffer/Table;->__offset(I)I +SPLandroidx/emoji2/text/flatbuffer/Table;->checkForComodification$kotlin_stdlib()V +SPLandroidx/emoji2/text/flatbuffer/Table;->hasNext()Z +SPLandroidx/emoji2/text/flatbuffer/Table;->initNext$kotlin_stdlib()V +Landroidx/lifecycle/DefaultLifecycleObserver; +SPLandroidx/lifecycle/DefaultLifecycleObserver;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/DefaultLifecycleObserver;->onStart(Landroidx/lifecycle/LifecycleOwner;)V +Landroidx/lifecycle/DefaultLifecycleObserverAdapter; +SPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleEventObserver;)V +SPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings; +SPLandroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;->()V +Landroidx/lifecycle/EmptyActivityLifecycleCallbacks; +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V +Landroidx/lifecycle/HasDefaultViewModelProviderFactory; +Landroidx/lifecycle/Lifecycle$Event; +SPLandroidx/lifecycle/Lifecycle$Event;->()V +SPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/Lifecycle$Event;->values()[Landroidx/lifecycle/Lifecycle$Event; +Landroidx/lifecycle/Lifecycle$Event$Companion; +Landroidx/lifecycle/Lifecycle$Event$WhenMappings; +SPLandroidx/lifecycle/Lifecycle$Event$WhenMappings;->()V +Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/Lifecycle$State;->()V +Landroidx/lifecycle/LifecycleDispatcher; +SPLandroidx/lifecycle/LifecycleDispatcher;->()V +Landroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback; +SPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->()V +SPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +Landroidx/lifecycle/LifecycleEventObserver; +Landroidx/lifecycle/LifecycleObserver; +Landroidx/lifecycle/LifecycleOwner; +Landroidx/lifecycle/LifecycleRegistry; +SPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;Z)V +SPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V +SPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V +SPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V +SPLandroidx/lifecycle/LifecycleRegistry;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V +SPLandroidx/lifecycle/LifecycleRegistry;->sync()V +Landroidx/lifecycle/LifecycleRegistry$ObserverWithState; +SPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/lifecycle/Lifecycling; +SPLandroidx/lifecycle/Lifecycling;->()V +Landroidx/lifecycle/ProcessLifecycleInitializer; +SPLandroidx/lifecycle/ProcessLifecycleInitializer;->()V +SPLandroidx/lifecycle/ProcessLifecycleInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLandroidx/lifecycle/ProcessLifecycleInitializer;->dependencies()Ljava/util/List; +Landroidx/lifecycle/ProcessLifecycleOwner; +SPLandroidx/lifecycle/ProcessLifecycleOwner;->()V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->()V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->activityResumed$lifecycle_process_release()V +SPLandroidx/lifecycle/ProcessLifecycleOwner;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry; +Landroidx/lifecycle/ProcessLifecycleOwner$Api29Impl; +SPLandroidx/lifecycle/ProcessLifecycleOwner$Api29Impl;->registerActivityLifecycleCallbacks(Landroid/app/Activity;Landroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;)V +Landroidx/lifecycle/ProcessLifecycleOwner$attach$1; +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +Landroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1; +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostStarted(Landroid/app/Activity;)V +Landroidx/lifecycle/ReportFragment; +SPLandroidx/lifecycle/ReportFragment;->()V +SPLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ReportFragment;->onResume()V +SPLandroidx/lifecycle/ReportFragment;->onStart()V +Landroidx/lifecycle/ReportFragment$Companion; +SPLandroidx/lifecycle/ReportFragment$Companion;->dispatch$lifecycle_runtime_release(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V +SPLandroidx/lifecycle/ReportFragment$Companion;->injectIfNeededIn(Landroid/app/Activity;)V +Landroidx/lifecycle/ReportFragment$LifecycleCallbacks; +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V +SPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V +Landroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion; +Landroidx/lifecycle/SavedStateHandle; +SPLandroidx/lifecycle/SavedStateHandle;->()V +PLandroidx/lifecycle/SavedStateHandle;->(Lkotlin/collections/builders/MapBuilder;)V +Landroidx/lifecycle/SavedStateHandleAttacher; +SPLandroidx/lifecycle/SavedStateHandleAttacher;->(ILjava/lang/Object;)V +SPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1; +SPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1;->create(Lkotlin/jvm/internal/ClassReference;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/SavedStateHandlesProvider; +SPLandroidx/lifecycle/SavedStateHandlesProvider;->(Lio/ktor/utils/io/WriterJob;Landroidx/lifecycle/ViewModelStoreOwner;)V +SPLandroidx/lifecycle/SavedStateHandlesProvider;->performRestore()V +Landroidx/lifecycle/SavedStateHandlesVM; +SPLandroidx/lifecycle/SavedStateHandlesVM;->()V +Landroidx/lifecycle/SavedStateViewModelFactory; +SPLandroidx/lifecycle/SavedStateViewModelFactory;->()V +SPLandroidx/lifecycle/SavedStateViewModelFactory;->(Landroid/app/Application;Lcc/n0th1ng/tripmoney/MainActivity;Landroid/os/Bundle;)V +Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModel;->()V +SPLandroidx/lifecycle/ViewModel;->addCloseable(Ljava/lang/String;Ljava/lang/AutoCloseable;)V +PLandroidx/lifecycle/ViewModel;->clear$lifecycle_viewmodel_release()V +SPLandroidx/lifecycle/ViewModel;->getCloseable(Ljava/lang/String;)Ljava/lang/AutoCloseable; +PLandroidx/lifecycle/ViewModel;->onCleared()V +Landroidx/lifecycle/ViewModelKt; +SPLandroidx/lifecycle/ViewModelKt;->()V +SPLandroidx/lifecycle/ViewModelKt;->createSavedStateHandle(Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/SavedStateHandle; +SPLandroidx/lifecycle/ViewModelKt;->enableSavedStateHandles(Landroidx/savedstate/SavedStateRegistryOwner;)V +SPLandroidx/lifecycle/ViewModelKt;->get(Landroid/view/View;)Landroidx/lifecycle/LifecycleOwner; +SPLandroidx/lifecycle/ViewModelKt;->get(Landroid/view/View;)Landroidx/lifecycle/ViewModelStoreOwner; +SPLandroidx/lifecycle/ViewModelKt;->getSavedStateHandlesVM(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; +SPLandroidx/lifecycle/ViewModelKt;->getViewModelScope(Landroidx/lifecycle/ViewModel;)Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope; +SPLandroidx/lifecycle/ViewModelKt;->set(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/lifecycle/ViewModelKt;->set(Landroid/view/View;Landroidx/lifecycle/ViewModelStoreOwner;)V +Landroidx/lifecycle/ViewModelProvider; +SPLandroidx/lifecycle/ViewModelProvider;->()V +SPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V +SPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V +SPLandroidx/lifecycle/ViewModelProvider;->get(Lkotlin/jvm/internal/ClassReference;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory; +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->()V +SPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->(Landroid/app/Application;)V +Landroidx/lifecycle/ViewModelProvider$Factory; +SPLandroidx/lifecycle/ViewModelProvider$Factory;->create(Lkotlin/jvm/internal/ClassReference;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelProvider$NewInstanceFactory; +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; +SPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->create(Lkotlin/jvm/internal/ClassReference;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/ViewModelStore; +SPLandroidx/lifecycle/ViewModelStore;->()V +PLandroidx/lifecycle/ViewModelStore;->clear()V +Landroidx/lifecycle/ViewModelStoreOwner; +Landroidx/lifecycle/compose/LocalLifecycleOwnerKt; +SPLandroidx/lifecycle/compose/LocalLifecycleOwnerKt;->()V +Landroidx/lifecycle/internal/SavedStateHandleImpl_androidKt; +SPLandroidx/lifecycle/internal/SavedStateHandleImpl_androidKt;->()V +Landroidx/lifecycle/viewmodel/CreationExtras; +SPLandroidx/lifecycle/viewmodel/CreationExtras;->()V +Landroidx/lifecycle/viewmodel/CreationExtras$Empty; +SPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V +Landroidx/lifecycle/viewmodel/CreationExtras$Key; +Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->(ILjava/lang/Object;)V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->([Landroidx/lifecycle/viewmodel/ViewModelInitializer;)V +SPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; +Landroidx/lifecycle/viewmodel/MutableCreationExtras; +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->()V +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Landroidx/lifecycle/viewmodel/CreationExtras;)V +SPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->get(Landroidx/lifecycle/viewmodel/CreationExtras$Key;)Ljava/lang/Object; +Landroidx/lifecycle/viewmodel/ViewModelInitializer; +SPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->(Lkotlin/jvm/internal/ClassReference;Lkotlin/jvm/functions/Function1;)V +Landroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner; +SPLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner;->()V +SPLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner;->getCurrent(Landroidx/compose/runtime/ComposerImpl;)Landroidx/lifecycle/ViewModelStoreOwner; +Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope; +SPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->(Lkotlin/coroutines/CoroutineContext;)V +PLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->close()V +SPLandroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +Landroidx/lifecycle/viewmodel/internal/SynchronizedObject; +Landroidx/lifecycle/viewmodel/internal/ViewModelImpl; +SPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->()V +SPLandroidx/lifecycle/viewmodel/internal/ViewModelImpl;->closeWithRuntimeException(Ljava/lang/AutoCloseable;)V +Landroidx/navigation/ActivityNavigator; +SPLandroidx/navigation/ActivityNavigator;->(Landroid/content/Context;)V +Landroidx/navigation/FloatingWindow; +Landroidx/navigation/NavBackStackEntry; +SPLandroidx/navigation/NavBackStackEntry;->()V +SPLandroidx/navigation/NavBackStackEntry;->(Landroidx/navigation/internal/NavContext;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavControllerViewModel;Ljava/lang/String;Landroid/os/Bundle;)V +SPLandroidx/navigation/NavBackStackEntry;->equals(Ljava/lang/Object;)Z +SPLandroidx/navigation/NavBackStackEntry;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/MutableCreationExtras; +SPLandroidx/navigation/NavBackStackEntry;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLandroidx/navigation/NavBackStackEntry;->getLifecycle()Landroidx/lifecycle/LifecycleRegistry; +SPLandroidx/navigation/NavBackStackEntry;->getSavedStateRegistry()Lio/ktor/utils/io/WriterJob; +SPLandroidx/navigation/NavBackStackEntry;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; +SPLandroidx/navigation/NavBackStackEntry;->hashCode()I +SPLandroidx/navigation/NavBackStackEntry;->setMaxLifecycle(Landroidx/lifecycle/Lifecycle$State;)V +Landroidx/navigation/NavController$$ExternalSyntheticLambda0; +SPLandroidx/navigation/NavController$$ExternalSyntheticLambda0;->(Landroidx/navigation/NavHostController;I)V +SPLandroidx/navigation/NavController$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/navigation/NavController$$ExternalSyntheticLambda3; +SPLandroidx/navigation/NavController$$ExternalSyntheticLambda3;->(Landroidx/navigation/NavHostController;Landroidx/lifecycle/LifecycleOwner;)V +SPLandroidx/navigation/NavController$$ExternalSyntheticLambda3;->(Ljava/lang/Object;ILjava/lang/Object;)V +HSPLandroidx/navigation/NavController$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/NavController$NavControllerNavigatorState; +SPLandroidx/navigation/NavController$NavControllerNavigatorState;->(Landroidx/navigation/NavHostController;Landroidx/navigation/Navigator;)V +SPLandroidx/navigation/NavController$NavControllerNavigatorState;->addInternal(Landroidx/navigation/NavBackStackEntry;)V +SPLandroidx/navigation/NavController$NavControllerNavigatorState;->createBackStackEntry(Landroidx/navigation/NavDestination;Landroid/os/Bundle;)Landroidx/navigation/NavBackStackEntry; +SPLandroidx/navigation/NavController$NavControllerNavigatorState;->markTransitionComplete(Landroidx/navigation/NavBackStackEntry;)V +PLandroidx/navigation/NavController$NavControllerNavigatorState;->pop(Landroidx/navigation/NavBackStackEntry;Z)V +PLandroidx/navigation/NavController$NavControllerNavigatorState;->popWithTransition(Landroidx/navigation/NavBackStackEntry;Z)V +SPLandroidx/navigation/NavController$NavControllerNavigatorState;->push(Landroidx/navigation/NavBackStackEntry;)V +Landroidx/navigation/NavController$NavControllerNavigatorState$$ExternalSyntheticLambda0; +SPLandroidx/navigation/NavController$NavControllerNavigatorState$$ExternalSyntheticLambda0;->(Landroidx/navigation/NavController$NavControllerNavigatorState;Landroidx/navigation/NavBackStackEntry;)V +PLandroidx/navigation/NavController$NavControllerNavigatorState$$ExternalSyntheticLambda0;->(Landroidx/navigation/NavController$NavControllerNavigatorState;Landroidx/navigation/NavBackStackEntry;Z)V +SPLandroidx/navigation/NavController$NavControllerNavigatorState$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/navigation/NavController$onBackPressedCallback$1; +SPLandroidx/navigation/NavController$onBackPressedCallback$1;->(Landroidx/navigation/NavHostController;)V +Landroidx/navigation/NavControllerViewModel; +SPLandroidx/navigation/NavControllerViewModel;->()V +Landroidx/navigation/NavControllerViewModelKt; +SPLandroidx/navigation/NavControllerViewModelKt;->()V +Landroidx/navigation/NavDeepLink; +SPLandroidx/navigation/NavDeepLink;->()V +SPLandroidx/navigation/NavDeepLink;->(Ljava/lang/String;)V +SPLandroidx/navigation/NavDeepLink;->buildRegex(Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/StringBuilder;)V +PLandroidx/navigation/NavDeepLink;->calculateMatchingPathSegments$navigation_common_release(Landroid/net/Uri;)I +SPLandroidx/navigation/NavDeepLink;->getMatchingArguments(Landroid/net/Uri;Ljava/util/LinkedHashMap;)Landroid/os/Bundle; +PLandroidx/navigation/NavDeepLink;->getMatchingPathArguments(Lokhttp3/Dispatcher;Landroid/os/Bundle;Ljava/util/Map;)Z +SPLandroidx/navigation/NavDeepLink;->saveWildcardInRegex(Ljava/lang/String;)Ljava/lang/String; +Landroidx/navigation/NavDeepLink$$ExternalSyntheticLambda0; +SPLandroidx/navigation/NavDeepLink$$ExternalSyntheticLambda0;->(Landroidx/navigation/NavDeepLink;I)V +SPLandroidx/navigation/NavDeepLink$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +PLandroidx/navigation/NavDeepLink$$ExternalSyntheticLambda8;->(Landroid/os/Bundle;I)V +Landroidx/navigation/NavDestination; +SPLandroidx/navigation/NavDestination;->()V +SPLandroidx/navigation/NavDestination;->(Landroidx/navigation/Navigator;)V +SPLandroidx/navigation/NavDestination;->addInDefaultArgs(Landroid/os/Bundle;)Landroid/os/Bundle; +SPLandroidx/navigation/NavDestination;->equals(Ljava/lang/Object;)Z +SPLandroidx/navigation/NavDestination;->getArguments()Ljava/util/Map; +SPLandroidx/navigation/NavDestination;->hashCode()I +SPLandroidx/navigation/NavDestination;->matchDeepLink(Landroidx/emoji2/text/EmojiProcessor;)Landroidx/navigation/NavDestination$DeepLinkMatch; +Landroidx/navigation/NavDestination$DeepLinkMatch; +PLandroidx/navigation/NavDestination$DeepLinkMatch;->(Landroidx/navigation/NavDestination;Landroid/os/Bundle;ZIZ)V +Landroidx/navigation/NavDestinationBuilder; +SPLandroidx/navigation/NavDestinationBuilder;->(Landroidx/navigation/Navigator;Ljava/lang/String;)V +SPLandroidx/navigation/NavDestinationBuilder;->build()Landroidx/navigation/NavDestination; +SPLandroidx/navigation/NavDestinationBuilder;->instantiateDestination()Landroidx/navigation/NavDestination; +Landroidx/navigation/NavGraph; +SPLandroidx/navigation/NavGraph;->(Landroidx/navigation/NavGraphNavigator;)V +SPLandroidx/navigation/NavGraph;->equals(Ljava/lang/Object;)Z +SPLandroidx/navigation/NavGraph;->hashCode()I +SPLandroidx/navigation/NavGraph;->iterator()Ljava/util/Iterator; +SPLandroidx/navigation/NavGraph;->matchDeepLinkComprehensive(Landroidx/emoji2/text/EmojiProcessor;Landroidx/navigation/NavDestination;)Landroidx/navigation/NavDestination$DeepLinkMatch; +PLandroidx/navigation/NavGraph;->matchRouteComprehensive(Ljava/lang/String;ZLandroidx/navigation/NavDestination;)Landroidx/navigation/NavDestination$DeepLinkMatch; +Landroidx/navigation/NavGraphBuilder; +SPLandroidx/navigation/NavGraphBuilder;->(Landroidx/navigation/NavigatorProvider;Ljava/lang/String;)V +SPLandroidx/navigation/NavGraphBuilder;->build()Landroidx/navigation/NavGraph; +Landroidx/navigation/NavGraphNavigator; +SPLandroidx/navigation/NavGraphNavigator;->(Landroidx/navigation/NavigatorProvider;)V +SPLandroidx/navigation/NavGraphNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;)V +PLandroidx/navigation/NavGraphNavigator$$ExternalSyntheticLambda0;->(Lkotlin/jvm/internal/Ref$ObjectRef;I)V +Landroidx/navigation/NavHostController; +SPLandroidx/navigation/NavHostController;->(Landroid/content/Context;)V +PLandroidx/navigation/NavHostController;->navigate$default(Landroidx/navigation/NavHostController;Ljava/lang/String;)V +Landroidx/navigation/NavOptions$Builder; +SPLandroidx/navigation/NavOptions$Builder;->(II)V +Landroidx/navigation/Navigator; +SPLandroidx/navigation/Navigator;->getState()Landroidx/navigation/NavController$NavControllerNavigatorState; +PLandroidx/navigation/Navigator;->popBackStack()Z +PLandroidx/navigation/Navigator;->popBackStack(Landroidx/navigation/NavBackStackEntry;Z)V +Landroidx/navigation/Navigator$Name; +Landroidx/navigation/NavigatorProvider; +SPLandroidx/navigation/NavigatorProvider;->()V +SPLandroidx/navigation/NavigatorProvider;->()V +SPLandroidx/navigation/NavigatorProvider;->addNavigator(Landroidx/navigation/Navigator;)V +SPLandroidx/navigation/NavigatorProvider;->getNavigator(Ljava/lang/String;)Landroidx/navigation/Navigator; +Landroidx/navigation/compose/BackStackEntryIdViewModel; +SPLandroidx/navigation/compose/BackStackEntryIdViewModel;->(Landroidx/lifecycle/SavedStateHandle;)V +PLandroidx/navigation/compose/BackStackEntryIdViewModel;->onCleared()V +Landroidx/navigation/compose/ComposeNavGraphNavigator; +SPLandroidx/navigation/compose/ComposeNavGraphNavigator;->createDestination()Landroidx/navigation/NavDestination; +Landroidx/navigation/compose/ComposeNavGraphNavigator$ComposeNavGraph; +Landroidx/navigation/compose/ComposeNavigator; +SPLandroidx/navigation/compose/ComposeNavigator;->()V +SPLandroidx/navigation/compose/ComposeNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;)V +PLandroidx/navigation/compose/ComposeNavigator;->popBackStack(Landroidx/navigation/NavBackStackEntry;Z)V +Landroidx/navigation/compose/ComposeNavigator$Destination; +SPLandroidx/navigation/compose/ComposeNavigator$Destination;->(Landroidx/navigation/compose/ComposeNavigator;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +Landroidx/navigation/compose/ComposeNavigatorDestinationBuilder; +SPLandroidx/navigation/compose/ComposeNavigatorDestinationBuilder;->(Landroidx/navigation/compose/ComposeNavigator;Ljava/lang/String;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/navigation/compose/ComposeNavigatorDestinationBuilder;->build()Landroidx/navigation/NavDestination; +SPLandroidx/navigation/compose/ComposeNavigatorDestinationBuilder;->instantiateDestination()Landroidx/navigation/NavDestination; +Landroidx/navigation/compose/DialogHostKt$DialogHost$2$1; +SPLandroidx/navigation/compose/DialogHostKt$DialogHost$2$1;->(Landroidx/compose/runtime/MutableState;Landroidx/navigation/compose/DialogNavigator;Landroidx/compose/runtime/snapshots/SnapshotStateList;Lkotlin/coroutines/Continuation;)V +SPLandroidx/navigation/compose/DialogHostKt$DialogHost$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/navigation/compose/DialogHostKt$DialogHost$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/DialogNavigator; +SPLandroidx/navigation/compose/DialogNavigator;->()V +Landroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda13; +SPLandroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda13;->(Landroidx/collection/MutableObjectFloatMap;Landroidx/navigation/compose/ComposeNavigator;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/State;Landroidx/compose/runtime/MutableState;)V +SPLandroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda13;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda4; +SPLandroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda4;->(Landroidx/navigation/NavHostController;Landroidx/navigation/NavGraph;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;II)V +PLandroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda9; +SPLandroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda9;->(Landroidx/navigation/compose/ComposeNavigator;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/MutableState;I)V +SPLandroidx/navigation/compose/NavHostKt$$ExternalSyntheticLambda9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$NavHost$25$1; +PLandroidx/navigation/compose/NavHostKt$NavHost$25$1;->(Landroidx/compose/animation/core/SeekableTransitionState;Ljava/lang/Object;Landroidx/compose/animation/core/Transition;Lkotlin/coroutines/Continuation;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$25$1;->(Landroidx/compose/runtime/Recomposer;Landroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;Landroidx/compose/runtime/BroadcastFrameClock;Lkotlin/coroutines/Continuation;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$25$1;->(Landroidx/navigation/compose/ComposeNavigator;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/ParcelableSnapshotMutableFloatState;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$25$1;->(Ljava/util/List;Ljava/util/ArrayList;Lkotlin/coroutines/Continuation;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$25$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/navigation/compose/NavHostKt$NavHost$25$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/navigation/compose/NavHostKt$NavHost$25$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$NavHost$29$1$1$1; +SPLandroidx/navigation/compose/NavHostKt$NavHost$29$1$1$1;->(FLandroidx/compose/animation/core/SeekableTransitionState;Landroidx/navigation/NavBackStackEntry;Lkotlin/coroutines/Continuation;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$29$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/navigation/compose/NavHostKt$NavHost$29$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$NavHost$32; +SPLandroidx/navigation/compose/NavHostKt$NavHost$32;->(Landroidx/compose/animation/core/SeekableTransitionState;Landroidx/navigation/NavBackStackEntry;Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/State;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$32;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$NavHost$32$1; +SPLandroidx/navigation/compose/NavHostKt$NavHost$32$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$32$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$NavHost$33$1; +SPLandroidx/navigation/compose/NavHostKt$NavHost$33$1;->(Landroidx/compose/animation/core/Transition;Landroidx/navigation/NavHostController;Landroidx/navigation/NavBackStackEntry;Landroidx/collection/MutableObjectFloatMap;Landroidx/compose/runtime/State;Landroidx/navigation/compose/ComposeNavigator;Lkotlin/coroutines/Continuation;)V +SPLandroidx/navigation/compose/NavHostKt$NavHost$33$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/navigation/compose/NavHostKt$NavHost$33$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/compose/NavHostKt$NavHost$lambda$48$lambda$47$$inlined$onDispose$1; +Landroidx/navigation/compose/NavHostKt$NavHost$lambda$69$lambda$68$$inlined$onDispose$1; +SPLandroidx/navigation/compose/NavHostKt$NavHost$lambda$69$lambda$68$$inlined$onDispose$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +PLandroidx/navigation/compose/NavHostKt$NavHost$lambda$69$lambda$68$$inlined$onDispose$1;->dispose()V +Landroidx/navigation/internal/AtomicInt; +SPLandroidx/navigation/internal/AtomicInt;->()V +Landroidx/navigation/internal/NavBackStackEntryImpl; +SPLandroidx/navigation/internal/NavBackStackEntryImpl;->(Landroidx/navigation/NavBackStackEntry;)V +SPLandroidx/navigation/internal/NavBackStackEntryImpl;->getArguments$navigation_common_release()Landroid/os/Bundle; +SPLandroidx/navigation/internal/NavBackStackEntryImpl;->updateState$navigation_common_release()V +Landroidx/navigation/internal/NavContext; +SPLandroidx/navigation/internal/NavContext;->(Landroid/content/Context;)V +SPLandroidx/navigation/internal/NavContext;->(Landroid/content/Context;Z)V +PLandroidx/navigation/internal/NavContext;->load(Landroidx/core/os/BundleKt;)V +Landroidx/navigation/internal/NavControllerImpl; +SPLandroidx/navigation/internal/NavControllerImpl;->(Landroidx/navigation/NavHostController;Landroidx/navigation/NavController$$ExternalSyntheticLambda0;)V +SPLandroidx/navigation/internal/NavControllerImpl;->addEntryToBackStack(Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/navigation/NavBackStackEntry;Ljava/util/List;)V +SPLandroidx/navigation/internal/NavControllerImpl;->dispatchOnDestinationChanged$navigation_runtime_release()Z +SPLandroidx/navigation/internal/NavControllerImpl;->findDestination$navigation_runtime_release(ILandroidx/navigation/NavDestination;)Landroidx/navigation/NavDestination; +PLandroidx/navigation/internal/NavControllerImpl;->findDestinationComprehensive$navigation_runtime_release(ILandroidx/navigation/NavDestination;Landroidx/navigation/NavDestination;Z)Landroidx/navigation/NavDestination; +SPLandroidx/navigation/internal/NavControllerImpl;->getBackStackEntry$navigation_runtime_release(I)Landroidx/navigation/NavBackStackEntry; +SPLandroidx/navigation/internal/NavControllerImpl;->getHostLifecycleState$navigation_runtime_release()Landroidx/lifecycle/Lifecycle$State; +SPLandroidx/navigation/internal/NavControllerImpl;->getTopGraph$navigation_runtime_release()Landroidx/navigation/NavGraph; +SPLandroidx/navigation/internal/NavControllerImpl;->linkChildToParent$navigation_runtime_release(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavBackStackEntry;)V +SPLandroidx/navigation/internal/NavControllerImpl;->navigate$navigation_runtime_release(Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/navigation/NavOptions;)V +PLandroidx/navigation/internal/NavControllerImpl;->popBackStackInternal$navigation_runtime_release(IZZ)Z +PLandroidx/navigation/internal/NavControllerImpl;->popEntryFromBackStack$navigation_runtime_release(Landroidx/navigation/NavBackStackEntry;ZLkotlin/collections/ArrayDeque;)V +SPLandroidx/navigation/internal/NavControllerImpl;->populateVisibleEntries$navigation_runtime_release()Ljava/util/ArrayList; +PLandroidx/navigation/internal/NavControllerImpl;->unlinkChildFromParent$navigation_runtime_release(Landroidx/navigation/NavBackStackEntry;)V +SPLandroidx/navigation/internal/NavControllerImpl;->updateBackStackLifecycle$navigation_runtime_release()V +Landroidx/navigation/internal/NavControllerImpl$$ExternalSyntheticLambda0; +SPLandroidx/navigation/internal/NavControllerImpl$$ExternalSyntheticLambda0;->(ILjava/lang/Object;)V +SPLandroidx/navigation/internal/NavControllerImpl$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/navigation/internal/NavControllerImpl$$ExternalSyntheticLambda6; +SPLandroidx/navigation/internal/NavControllerImpl$$ExternalSyntheticLambda6;->(Landroidx/compose/animation/core/Animatable;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/Ref$BooleanRef;)V +SPLandroidx/navigation/internal/NavControllerImpl$$ExternalSyntheticLambda6;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLandroidx/navigation/internal/NavControllerImpl$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/navigation/internal/NavDestinationImpl$$ExternalSyntheticLambda0; +SPLandroidx/navigation/internal/NavDestinationImpl$$ExternalSyntheticLambda0;->(Landroidx/navigation/NavDeepLink;I)V +Landroidx/navigation/internal/NavGraphImpl; +SPLandroidx/navigation/internal/NavGraphImpl;->(Landroidx/navigation/NavGraph;)V +PLandroidx/navigation/internal/NavGraphImpl;->findNode$navigation_common_release(I)Landroidx/navigation/NavDestination; +SPLandroidx/navigation/internal/NavGraphImpl;->findNode$navigation_common_release(Ljava/lang/String;Z)Landroidx/navigation/NavDestination; +PLandroidx/navigation/internal/NavGraphImpl;->findNodeComprehensive$navigation_common_release(ILandroidx/navigation/NavDestination;Landroidx/navigation/NavDestination;Z)Landroidx/navigation/NavDestination; +SPLandroidx/navigation/internal/NavGraphImpl;->matchDeepLinkComprehensive$navigation_common_release(Landroidx/navigation/NavDestination$DeepLinkMatch;Landroidx/emoji2/text/EmojiProcessor;ZLandroidx/navigation/NavDestination;)Landroidx/navigation/NavDestination$DeepLinkMatch; +Landroidx/navigation/internal/NavGraphImpl$iterator$1; +SPLandroidx/navigation/internal/NavGraphImpl$iterator$1;->(Landroidx/navigation/internal/NavGraphImpl;)V +SPLandroidx/navigation/internal/NavGraphImpl$iterator$1;->hasNext()Z +SPLandroidx/navigation/internal/NavGraphImpl$iterator$1;->next()Ljava/lang/Object; +Landroidx/paging/CachedPageEventFlow$downstreamFlow$1$2; +SPLandroidx/paging/CachedPageEventFlow$downstreamFlow$1$2;->(Lkotlin/jvm/internal/Ref$IntRef;Lkotlinx/coroutines/flow/FlowCollector;)V +SPLandroidx/paging/CachedPageEventFlow$downstreamFlow$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/internal/Ref$IntRef;)V +SPLandroidx/paging/CachedPageEventFlow$downstreamFlow$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/paging/CachedPageEventFlow$downstreamFlow$1$2;->emit(Lkotlin/collections/IndexedValue;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/CachedPageEventFlow$downstreamFlow$1$2$emit$1; +SPLandroidx/paging/CachedPageEventFlow$downstreamFlow$1$2$emit$1;->(Landroidx/paging/CachedPageEventFlow$downstreamFlow$1$2;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/CachedPageEventFlow$job$1$1$emit$1; +SPLandroidx/paging/CachedPageEventFlow$job$1$1$emit$1;->(Landroidx/paging/ChannelFlowCollector;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1; +SPLandroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1;->(Lkotlinx/coroutines/flow/SafeFlow;I)V +SPLandroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2; +SPLandroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;I)V +SPLandroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2$1; +SPLandroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2$1;->(Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/CachedPagingDataKt$cachedIn$4; +SPLandroidx/paging/CachedPagingDataKt$cachedIn$4;->(ILkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/CachedPagingDataKt$cachedIn$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/CachedPagingDataKt$cachedIn$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/CachedPagingDataKt$cachedIn$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/CachedPagingDataKt$cachedIn$5; +SPLandroidx/paging/CachedPagingDataKt$cachedIn$5;->(ILkotlin/coroutines/Continuation;I)V +PLandroidx/paging/CachedPagingDataKt$cachedIn$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/paging/CachedPagingDataKt$cachedIn$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/ChannelFlowCollector; +SPLandroidx/paging/ChannelFlowCollector;->(ILjava/lang/Object;)V +SPLandroidx/paging/ChannelFlowCollector;->(Lkotlinx/coroutines/channels/SendChannel;)V +SPLandroidx/paging/ChannelFlowCollector;->emit(Landroidx/paging/PageEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/paging/ChannelFlowCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/paging/ChannelFlowCollector;->emit(Lkotlin/collections/IndexedValue;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/CombinedLoadStates; +SPLandroidx/paging/CombinedLoadStates;->(Landroidx/paging/LoadState;Landroidx/paging/LoadState;Landroidx/paging/LoadState;Landroidx/paging/LoadStates;Landroidx/paging/LoadStates;)V +SPLandroidx/paging/CombinedLoadStates;->equals(Ljava/lang/Object;)Z +Landroidx/paging/ConflatedEventBus; +SPLandroidx/paging/ConflatedEventBus;->(I)V +SPLandroidx/paging/ConflatedEventBus;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;)V +SPLandroidx/paging/ConflatedEventBus;->(Landroidx/compose/material3/internal/AnchoredDraggableState;)V +SPLandroidx/paging/ConflatedEventBus;->(Landroidx/compose/runtime/ComposerImpl$$ExternalSyntheticLambda0;)V +SPLandroidx/paging/ConflatedEventBus;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V +SPLandroidx/paging/ConflatedEventBus;->(Landroidx/paging/PageFetcher;Landroidx/paging/ConflatedEventBus;)V +SPLandroidx/paging/ConflatedEventBus;->(Ljava/lang/Object;ILjava/lang/Object;)V +PLandroidx/paging/ConflatedEventBus;->activeHoverEvent-0FcD4WY(J)Z +PLandroidx/paging/ConflatedEventBus;->areCompatible(Ljava/lang/Object;Ljava/lang/Object;)Z +PLandroidx/paging/ConflatedEventBus;->cancel()V +HPLandroidx/paging/ConflatedEventBus;->createAccessibilityNodeInfo(I)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; +PLandroidx/paging/ConflatedEventBus;->getResult()Ljava/lang/Object; +HPLandroidx/paging/ConflatedEventBus;->getSlotsToRetain(Landroidx/collection/Values;)V +PLandroidx/paging/ConflatedEventBus;->restore(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/ConflatedEventBus;->save(Landroidx/compose/runtime/saveable/SaveableHolder;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/ConflatedEventBus;->upsert(Landroidx/sqlite/SQLiteConnection;Ljava/lang/Object;)V +Landroidx/paging/ConflatedEventBus$special$$inlined$mapNotNull$1$2$1; +SPLandroidx/paging/ConflatedEventBus$special$$inlined$mapNotNull$1$2$1;->(Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/FlattenedPageController$getStateAsEvents$1; +SPLandroidx/paging/FlattenedPageController$getStateAsEvents$1;->(Lokhttp3/internal/http/StatusLine;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/paging/FlattenedPageController$record$1; +SPLandroidx/paging/FlattenedPageController$record$1;->(Lokhttp3/internal/http/StatusLine;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/paging/FlattenedPageEventStorage; +SPLandroidx/paging/FlattenedPageEventStorage;->()V +SPLandroidx/paging/FlattenedPageEventStorage;->add(Landroidx/paging/PageEvent;)V +SPLandroidx/paging/FlattenedPageEventStorage;->getAsEvents()Ljava/util/List; +Landroidx/paging/FlowExtKt; +SPLandroidx/paging/FlowExtKt;->()V +SPLandroidx/paging/FlowExtKt;->Refresh(Ljava/util/List;IILandroidx/paging/LoadStates;Landroidx/paging/LoadStates;)Landroidx/paging/PageEvent$Insert; +PLandroidx/paging/FlowExtKt;->addSeparatorPage(Ljava/util/List;Ljava/lang/Object;Landroidx/paging/TransformablePage;Landroidx/paging/TransformablePage;II)V +SPLandroidx/paging/FlowExtKt;->cachedIn(Lkotlinx/coroutines/flow/Flow;Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;)Lkotlinx/coroutines/flow/ReadonlySharedFlow; +PLandroidx/paging/FlowExtKt;->insertInternalSeparators(Landroidx/paging/TransformablePage;Lio/ktor/client/HttpClient$2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/paging/FlowExtKt;->shouldPrioritizeOver(Landroidx/paging/ViewportHint;Landroidx/paging/ViewportHint;Landroidx/paging/LoadType;)Z +SPLandroidx/paging/FlowExtKt;->simpleChannelFlow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/paging/FlowExtKt;->simpleTransformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; +Landroidx/paging/FlowExtKt$simpleRunningReduce$1; +SPLandroidx/paging/FlowExtKt$simpleRunningReduce$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/FlowExtKt$simpleRunningReduce$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/FlowExtKt$simpleRunningReduce$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/FlowExtKt$simpleRunningReduce$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/FlowExtKt$simpleRunningReduce$1$1$emit$1; +SPLandroidx/paging/FlowExtKt$simpleRunningReduce$1$1$emit$1;->(Landroidx/paging/FlowExtKt$simpleScan$1$1;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/FlowExtKt$simpleScan$1; +SPLandroidx/paging/FlowExtKt$simpleScan$1;->(Landroidx/paging/PageFetcherSnapshot;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/FlowExtKt$simpleScan$1;->(Ljava/lang/Object;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/FlowExtKt$simpleScan$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;Lio/ktor/client/HttpClient$2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1;->(Lkotlinx/coroutines/flow/SharingStarted;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/FlowExtKt$simpleScan$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/FlowExtKt$simpleScan$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/FlowExtKt$simpleScan$1$1; +SPLandroidx/paging/FlowExtKt$simpleScan$1$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLandroidx/paging/FlowExtKt$simpleScan$1$1;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1$1;->(Lkotlin/jvm/internal/Ref$IntRef;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;)V +SPLandroidx/paging/FlowExtKt$simpleScan$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/FlowExtKt$simpleScan$1$1$emit$1; +SPLandroidx/paging/FlowExtKt$simpleScan$1$1$emit$1;->(Landroidx/paging/FlowExtKt$simpleScan$1$1;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/GenerationalViewportHint; +PLandroidx/paging/GenerationalViewportHint;->(ILandroidx/paging/ViewportHint;)V +Landroidx/paging/HintHandler$$ExternalSyntheticLambda1; +SPLandroidx/paging/HintHandler$$ExternalSyntheticLambda1;->(IILjava/lang/Object;Ljava/lang/Object;)V +SPLandroidx/paging/HintHandler$$ExternalSyntheticLambda1;->(Ljava/lang/Object;ILjava/lang/Object;)V +Landroidx/paging/HintHandler$HintFlow; +SPLandroidx/paging/HintHandler$HintFlow;->()V +Landroidx/paging/HintReceiver; +Landroidx/paging/ItemSnapshotList; +SPLandroidx/paging/ItemSnapshotList;->(Ljava/util/ArrayList;II)V +SPLandroidx/paging/ItemSnapshotList;->get(I)Ljava/lang/Object; +SPLandroidx/paging/ItemSnapshotList;->getSize()I +Landroidx/paging/LoadState; +SPLandroidx/paging/LoadState;->(Z)V +Landroidx/paging/LoadState$Error; +Landroidx/paging/LoadState$Loading; +SPLandroidx/paging/LoadState$Loading;->()V +SPLandroidx/paging/LoadState$Loading;->equals(Ljava/lang/Object;)Z +Landroidx/paging/LoadState$NotLoading; +SPLandroidx/paging/LoadState$NotLoading;->()V +SPLandroidx/paging/LoadState$NotLoading;->equals(Ljava/lang/Object;)Z +Landroidx/paging/LoadStates; +SPLandroidx/paging/LoadStates;->()V +SPLandroidx/paging/LoadStates;->(Landroidx/paging/LoadState;Landroidx/paging/LoadState;Landroidx/paging/LoadState;)V +SPLandroidx/paging/LoadStates;->equals(Ljava/lang/Object;)Z +Landroidx/paging/LoadType; +SPLandroidx/paging/LoadType;->()V +Landroidx/paging/MulticastedPagingData; +SPLandroidx/paging/MulticastedPagingData;->(Landroidx/lifecycle/viewmodel/internal/CloseableCoroutineScope;Landroidx/paging/PagingData;)V +Landroidx/paging/MulticastedPagingData$asPagingData$1; +SPLandroidx/paging/MulticastedPagingData$asPagingData$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/MulticastedPagingData$asPagingData$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/MulticastedPagingData$asPagingData$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/MulticastedPagingData$asPagingData$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/PageEvent; +PLandroidx/paging/PageEvent;->map(Landroidx/compose/runtime/Recomposer$join$2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/PageEvent$Drop; +Landroidx/paging/PageEvent$Insert; +SPLandroidx/paging/PageEvent$Insert;->()V +SPLandroidx/paging/PageEvent$Insert;->(Landroidx/paging/LoadType;Ljava/util/List;IILandroidx/paging/LoadStates;Landroidx/paging/LoadStates;)V +PLandroidx/paging/PageEvent$Insert;->map(Landroidx/compose/runtime/Recomposer$join$2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLandroidx/paging/PageEvent$Insert$map$1;->(Landroidx/paging/PageEvent$Insert;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/paging/PageEvent$LoadStateUpdate; +SPLandroidx/paging/PageEvent$LoadStateUpdate;->(Landroidx/paging/LoadStates;Landroidx/paging/LoadStates;)V +Landroidx/paging/PageEvent$StaticList; +Landroidx/paging/PageFetcher; +SPLandroidx/paging/PageFetcher;->(Landroidx/paging/Pager$flow$2;Landroidx/paging/PagingConfig;)V +SPLandroidx/paging/PageFetcher;->access$generateNewPagingSource(Landroidx/paging/PageFetcher;Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$tripsPaged$1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/paging/PageFetcher$GenerationInfo; +SPLandroidx/paging/PageFetcher$GenerationInfo;->(Landroidx/paging/PageFetcherSnapshot;Landroidx/paging/PagingState;Lkotlinx/coroutines/JobImpl;)V +Landroidx/paging/PageFetcher$flow$1; +SPLandroidx/paging/PageFetcher$flow$1;->(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/PageFetcher$flow$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/PageFetcher$flow$1;->(Lkotlin/jvm/functions/Function2;Landroidx/room/coroutines/PassthroughConnection;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/PageFetcher$flow$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/PageFetcher$flow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/PageFetcher$flow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/PageFetcher$flow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/PageFetcher$flow$1$1; +PLandroidx/paging/PageFetcher$flow$1$1;->(ILkotlin/coroutines/Continuation;)V +SPLandroidx/paging/PageFetcher$flow$1$1;->(ILkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/PageFetcher$flow$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/PageFetcher$flow$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/PageFetcher$flow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/PageFetcher$flow$1$2$1; +SPLandroidx/paging/PageFetcher$flow$1$2$1;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;III)V +SPLandroidx/paging/PageFetcher$flow$1$2$1;->invoke()Ljava/lang/Object; +Landroidx/paging/PageFetcher$flow$1$4; +SPLandroidx/paging/PageFetcher$flow$1$4;->(Landroidx/paging/SimpleProducerScopeImpl;)V +SPLandroidx/paging/PageFetcher$flow$1$4;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/PageFetcher$generateNewPagingSource$1; +SPLandroidx/paging/PageFetcher$generateNewPagingSource$1;->(Landroidx/paging/PageFetcher;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/paging/PageFetcherSnapshot; +SPLandroidx/paging/PageFetcherSnapshot;->(Ljava/lang/Object;Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$tripsPaged$1;Landroidx/paging/PagingConfig;Lkotlinx/coroutines/flow/SafeFlow;Landroidx/paging/PagingState;Landroidx/paging/PageFetcher$flow$1$2$1;)V +SPLandroidx/paging/PageFetcherSnapshot;->access$collectAsGenerationalViewportHints(Landroidx/paging/PageFetcherSnapshot;Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;Landroidx/paging/LoadType;Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +PLandroidx/paging/PageFetcherSnapshot;->access$doLoad(Landroidx/paging/PageFetcherSnapshot;Landroidx/paging/LoadType;Landroidx/paging/GenerationalViewportHint;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/paging/PageFetcherSnapshot;->access$startConsumingHints(Landroidx/paging/PageFetcherSnapshot;Lkotlinx/coroutines/CoroutineScope;)V +SPLandroidx/paging/PageFetcherSnapshot;->doInitialLoad(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/paging/PageFetcherSnapshot;->loadParams(Landroidx/paging/LoadType;Ljava/lang/Object;)Landroidx/paging/PagingSource$LoadParams; +PLandroidx/paging/PageFetcherSnapshot;->nextLoadKeyOrNull(Landroidx/paging/PageFetcherSnapshotState;Landroidx/paging/LoadType;II)Ljava/lang/Object; +SPLandroidx/paging/PageFetcherSnapshot;->setLoading(Landroidx/paging/PageFetcherSnapshotState;Landroidx/paging/LoadType;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$$inlined$simpleFlatMapLatest$1; +SPLandroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$$inlined$simpleFlatMapLatest$1;->(Lkotlin/coroutines/Continuation;Landroidx/paging/PageFetcherSnapshot;Landroidx/paging/LoadType;)V +SPLandroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$$inlined$simpleFlatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$$inlined$simpleFlatMapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$3; +SPLandroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$3;->(Landroidx/paging/LoadType;Lkotlin/coroutines/Continuation;)V +PLandroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/paging/PageFetcherSnapshot$collectAsGenerationalViewportHints$lambda$0$$inlined$map$1$2$1;->(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/PageFetcherSnapshot$doInitialLoad$1; +SPLandroidx/paging/PageFetcherSnapshot$doInitialLoad$1;->(Landroidx/paging/PageFetcherSnapshot;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +SPLandroidx/paging/PageFetcherSnapshot$doInitialLoad$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/paging/PageFetcherSnapshot$doLoad$1;->(Landroidx/paging/PageFetcherSnapshot;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/PageFetcherSnapshot$pageEventFlow$1$2$1$emit$1; +SPLandroidx/paging/PageFetcherSnapshot$pageEventFlow$1$2$1$emit$1;->(Landroidx/paging/ChannelFlowCollector;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/PageFetcherSnapshot$startConsumingHints$2; +SPLandroidx/paging/PageFetcherSnapshot$startConsumingHints$2;->(Landroidx/paging/PageFetcherSnapshot;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/PageFetcherSnapshot$startConsumingHints$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/PageFetcherSnapshot$startConsumingHints$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/PageFetcherSnapshotState; +SPLandroidx/paging/PageFetcherSnapshotState;->(Landroidx/paging/PagingConfig;)V +SPLandroidx/paging/PageFetcherSnapshotState;->insert(ILandroidx/paging/LoadType;Landroidx/paging/PagingSource$LoadResult$Page;)Z +SPLandroidx/paging/PageFetcherSnapshotState;->toPageEvent$paging_common(Landroidx/paging/PagingSource$LoadResult$Page;Landroidx/paging/LoadType;)Landroidx/paging/PageEvent$Insert; +Landroidx/paging/PageFetcherSnapshotState$Holder; +SPLandroidx/paging/PageFetcherSnapshotState$Holder;->(Landroidx/paging/PagingConfig;)V +Landroidx/paging/PageFetcherSnapshotState$consumeAppendGenerationIdAsFlow$1; +SPLandroidx/paging/PageFetcherSnapshotState$consumeAppendGenerationIdAsFlow$1;->(Landroidx/paging/PageFetcherSnapshotState;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/PageFetcherSnapshotState$consumeAppendGenerationIdAsFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/PageFetcherSnapshotState$consumeAppendGenerationIdAsFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/PageFetcherSnapshotState$consumeAppendGenerationIdAsFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/PageStore; +SPLandroidx/paging/PageStore;->()V +SPLandroidx/paging/PageStore;->(Landroidx/paging/PageEvent$Insert;)V +SPLandroidx/paging/PageStore;->(Ljava/util/List;II)V +HSPLandroidx/paging/PageStore;->accessHintForPresenterIndex(I)Landroidx/paging/ViewportHint$Access; +SPLandroidx/paging/PageStore;->getItem(I)Ljava/lang/Object; +SPLandroidx/paging/PageStore;->getOriginalPageOffsetFirst()I +SPLandroidx/paging/PageStore;->getOriginalPageOffsetLast()I +SPLandroidx/paging/PageStore;->getSize()I +Landroidx/paging/Pager$flow$2; +SPLandroidx/paging/Pager$flow$2;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/Pager$flow$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/Pager$flow$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/Pager$flow$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/PagingConfig; +SPLandroidx/paging/PagingConfig;->()V +Landroidx/paging/PagingData; +SPLandroidx/paging/PagingData;->()V +SPLandroidx/paging/PagingData;->(Lkotlinx/coroutines/flow/Flow;Landroidx/paging/UiReceiver;Landroidx/paging/HintReceiver;Lkotlin/jvm/functions/Function0;)V +Landroidx/paging/PagingData$1; +SPLandroidx/paging/PagingData$1;->()V +Landroidx/paging/PagingDataPresenter$InitialUiReceiver; +Landroidx/paging/PagingDataPresenter$presentNewList$1; +SPLandroidx/paging/PagingDataPresenter$presentNewList$1;->(Landroidx/paging/compose/LazyPagingItems$pagingDataPresenter$1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/paging/PagingDataTransforms__PagingDataTransformsKt$map$$inlined$transform$1$2$1;->(Landroidx/compose/material3/ThumbNode$onAttach$1$1;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/PagingSource$LoadParams; +SPLandroidx/paging/PagingSource$LoadParams;->(I)V +Landroidx/paging/PagingSource$LoadParams$Append; +Landroidx/paging/PagingSource$LoadParams$Prepend; +Landroidx/paging/PagingSource$LoadParams$Refresh; +SPLandroidx/paging/PagingSource$LoadParams$Refresh;->(ILjava/lang/Object;)V +SPLandroidx/paging/PagingSource$LoadParams$Refresh;->getKey()Ljava/lang/Object; +Landroidx/paging/PagingSource$LoadResult; +Landroidx/paging/PagingSource$LoadResult$Invalid; +Landroidx/paging/PagingSource$LoadResult$Page; +SPLandroidx/paging/PagingSource$LoadResult$Page;->()V +SPLandroidx/paging/PagingSource$LoadResult$Page;->(Ljava/util/List;Ljava/lang/Integer;Ljava/lang/Integer;II)V +Landroidx/paging/RemoteMediator$InitializeAction; +SPLandroidx/paging/RemoteMediator$InitializeAction;->()V +PLandroidx/paging/SeparatorState;->(Landroidx/paging/TerminalSeparatorType;Lio/ktor/client/HttpClient$2;)V +PLandroidx/paging/SeparatorState;->onEvent(Landroidx/paging/PageEvent;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/paging/SeparatorState;->onInsert(Landroidx/paging/PageEvent$Insert;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLandroidx/paging/SeparatorState;->transformablePageToStash(Landroidx/paging/TransformablePage;)Landroidx/paging/TransformablePage; +PLandroidx/paging/SeparatorState$onEvent$1;->(Landroidx/paging/SeparatorState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/paging/SeparatorState$onInsert$1;->(Landroidx/paging/SeparatorState;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/paging/SeparatorsKt$insertEventSeparators$$inlined$map$1; +SPLandroidx/paging/SeparatorsKt$insertEventSeparators$$inlined$map$1;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLandroidx/paging/SeparatorsKt$insertEventSeparators$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLandroidx/paging/SeparatorsKt$insertEventSeparators$$inlined$map$1$2$1;->(Landroidx/compose/material3/ThumbNode$onAttach$1$1;Lkotlin/coroutines/Continuation;)V +Landroidx/paging/SimpleChannelFlowKt$simpleChannelFlow$1; +SPLandroidx/paging/SimpleChannelFlowKt$simpleChannelFlow$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/SimpleChannelFlowKt$simpleChannelFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/SimpleChannelFlowKt$simpleChannelFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/SimpleChannelFlowKt$simpleChannelFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/SimpleProducerScopeImpl; +SPLandroidx/paging/SimpleProducerScopeImpl;->(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/channels/BufferedChannel;)V +SPLandroidx/paging/SimpleProducerScopeImpl;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +SPLandroidx/paging/SimpleProducerScopeImpl;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/paging/SingleRunner$CancelIsolatedRunnerException; +PLandroidx/paging/SingleRunner$Holder$onFinish$1;->(Landroidx/compose/runtime/Latch;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/paging/SingleRunner$Holder$tryEnqueue$1; +SPLandroidx/paging/SingleRunner$Holder$tryEnqueue$1;->(Landroidx/compose/runtime/Latch;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/paging/SingleRunner$runInIsolation$1; +SPLandroidx/paging/SingleRunner$runInIsolation$1;->(Lio/ktor/events/Events;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/paging/SingleRunner$runInIsolation$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/SingleRunner$runInIsolation$2; +SPLandroidx/paging/SingleRunner$runInIsolation$2;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/SingleRunner$runInIsolation$2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/SingleRunner$runInIsolation$2;->(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/SingleRunner$runInIsolation$2;->(Lkotlin/jvm/functions/Function3;Landroidx/paging/ChannelFlowCollector;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/SingleRunner$runInIsolation$2;->(Lkotlinx/coroutines/JobImpl;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/SingleRunner$runInIsolation$2;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/paging/SingleRunner$runInIsolation$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/SingleRunner$runInIsolation$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/paging/SingleRunner$runInIsolation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/paging/TerminalSeparatorType;->()V +Landroidx/paging/TransformablePage; +SPLandroidx/paging/TransformablePage;->()V +SPLandroidx/paging/TransformablePage;->(ILjava/util/List;)V +SPLandroidx/paging/TransformablePage;->([ILjava/util/List;ILjava/util/List;)V +Landroidx/paging/UiReceiver; +Landroidx/paging/ViewportHint; +SPLandroidx/paging/ViewportHint;->(IIII)V +PLandroidx/paging/ViewportHint;->presentedItemsBeyondAnchor$paging_common(Landroidx/paging/LoadType;)I +Landroidx/paging/ViewportHint$Access; +SPLandroidx/paging/ViewportHint$Access;->(IIIIII)V +Landroidx/paging/compose/LazyPagingItems; +SPLandroidx/paging/compose/LazyPagingItems;->(Lkotlinx/coroutines/flow/Flow;)V +SPLandroidx/paging/compose/LazyPagingItems;->collectLoadState$paging_compose(Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +HSPLandroidx/paging/compose/LazyPagingItems;->get(I)Ljava/lang/Object; +Landroidx/paging/compose/LazyPagingItems$pagingDataPresenter$1; +SPLandroidx/paging/compose/LazyPagingItems$pagingDataPresenter$1;->(Landroidx/paging/compose/LazyPagingItems;Lkotlin/coroutines/CoroutineContext;Landroidx/paging/PagingData;)V +SPLandroidx/paging/compose/LazyPagingItems$pagingDataPresenter$1;->access$presentNewList(Landroidx/paging/compose/LazyPagingItems$pagingDataPresenter$1;Ljava/util/List;IIZLandroidx/paging/LoadStates;Landroidx/paging/LoadStates;Landroidx/paging/HintReceiver;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/paging/compose/LazyPagingItems$pagingDataPresenter$1;->snapshot()Landroidx/paging/ItemSnapshotList; +Landroidx/paging/compose/LazyPagingItemsKt; +SPLandroidx/paging/compose/LazyPagingItemsKt;->()V +SPLandroidx/paging/compose/LazyPagingItemsKt;->collectAsLazyPagingItems(Lkotlinx/coroutines/flow/Flow;Landroidx/compose/runtime/ComposerImpl;)Landroidx/paging/compose/LazyPagingItems; +Landroidx/paging/compose/LazyPagingItemsKt$collectAsLazyPagingItems$1$1; +SPLandroidx/paging/compose/LazyPagingItemsKt$collectAsLazyPagingItems$1$1;->(Landroidx/paging/compose/LazyPagingItems;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/paging/compose/LazyPagingItemsKt$collectAsLazyPagingItems$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/paging/compose/LazyPagingItemsKt$collectAsLazyPagingItems$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/paging/compose/UiDispatcher_androidKt; +SPLandroidx/paging/compose/UiDispatcher_androidKt;->()V +PLandroidx/profileinstaller/Encoding;->()V +PLandroidx/profileinstaller/Encoding;->writeProfile(Landroid/content/Context;Ljava/util/concurrent/Executor;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V +PLandroidx/profileinstaller/ProfileInstallReceiver;->()V +PLandroidx/profileinstaller/ProfileInstallReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V +Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback; +Landroidx/profileinstaller/ProfileInstallerInitializer; +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->()V +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLandroidx/profileinstaller/ProfileInstallerInitializer;->dependencies()Ljava/util/List; +Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0; +SPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->(Landroidx/profileinstaller/ProfileInstallerInitializer;Landroid/content/Context;)V +SPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->doFrame(J)V +Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1; +SPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->(Landroid/content/Context;I)V +PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda1;->run()V +PLandroidx/profileinstaller/ProfileVerifier;->()V +PLandroidx/profileinstaller/ProfileVerifier;->getPackageLastUpdateTime(Landroid/content/Context;)J +PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus()Lio/ktor/events/EventDefinition; +PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)V +PLandroidx/profileinstaller/ProfileVerifier$Api33Impl;->getPackageInfo(Landroid/content/pm/PackageManager;Landroid/content/Context;)Landroid/content/pm/PackageInfo; +PLandroidx/profileinstaller/ProfileVerifier$Cache;->(IIJJ)V +PLandroidx/profileinstaller/ProfileVerifier$Cache;->writeOnFile(Ljava/io/File;)V +Landroidx/room/BindOnlySQLiteStatement; +SPLandroidx/room/BindOnlySQLiteStatement;->(Landroidx/sqlite/SQLiteStatement;I)V +PLandroidx/room/BindOnlySQLiteStatement;->bindDouble(DI)V +PLandroidx/room/BindOnlySQLiteStatement;->bindLong(IJ)V +PLandroidx/room/BindOnlySQLiteStatement;->bindNull(I)V +Landroidx/room/DatabaseConfiguration; +SPLandroidx/room/DatabaseConfiguration;->(Landroid/content/Context;Ljava/lang/String;Lio/ktor/events/EventDefinition;Ldagger/internal/MapBuilder;Ljava/util/List;ZLandroidx/room/RoomDatabase$JournalMode;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Landroid/content/Intent;ZZLjava/util/Set;Ljava/lang/String;Ljava/io/File;Ljava/util/concurrent/Callable;Ljava/util/List;Ljava/util/List;ZLandroidx/sqlite/SQLiteDriver;Lkotlin/coroutines/CoroutineContext;)V +Landroidx/room/DelegatingOpenHelper; +Landroidx/room/InvalidationTracker; +SPLandroidx/room/InvalidationTracker;->(Lcc/n0th1ng/tripmoney/data/TripDatabase_Impl;Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;[Ljava/lang/String;)V +SPLandroidx/room/InvalidationTracker;->createFlow([Ljava/lang/String;Z)Lkotlinx/coroutines/flow/Flow; +SPLandroidx/room/InvalidationTracker;->refreshAsync()V +Landroidx/room/InvalidationTracker$$ExternalSyntheticLambda0; +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->(I)V +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->(Landroidx/room/InvalidationTracker;)V +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Landroidx/room/InvalidationTracker$$ExternalSyntheticLambda1; +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda1;->(Landroidx/room/InvalidationTracker;I)V +SPLandroidx/room/InvalidationTracker$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Landroidx/room/InvalidationTracker$implementation$1; +SPLandroidx/room/InvalidationTracker$implementation$1;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;III)V +SPLandroidx/room/InvalidationTracker$implementation$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/ObservedTableStates; +SPLandroidx/room/ObservedTableStates;->(I)V +Landroidx/room/ObservedTableStates$ObserveOp; +SPLandroidx/room/ObservedTableStates$ObserveOp;->()V +Landroidx/room/ObservedTableVersions; +SPLandroidx/room/ObservedTableVersions;->()V +SPLandroidx/room/ObservedTableVersions;->(I)V +SPLandroidx/room/ObservedTableVersions;->collect(Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +SPLandroidx/room/ObservedTableVersions;->getCurrentState()Landroidx/datastore/core/State; +SPLandroidx/room/ObservedTableVersions;->tryUpdate(Landroidx/datastore/core/State;)V +Landroidx/room/ObservedTableVersions$collect$1; +SPLandroidx/room/ObservedTableVersions$collect$1;->(Landroidx/room/ObservedTableVersions;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLandroidx/room/ObservedTableVersions$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/PooledConnection; +Landroidx/room/RoomConnectionManager; +SPLandroidx/room/RoomConnectionManager;->(Landroidx/room/DatabaseConfiguration;Landroidx/room/RoomOpenDelegate;Landroidx/room/RoomDatabase$createConnectionManager$2;)V +SPLandroidx/room/RoomConnectionManager;->onCreate(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/RoomConnectionManager;->onOpen(Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/RoomConnectionManager;->updateIdentity(Landroidx/sqlite/SQLiteConnection;)V +Landroidx/room/RoomDatabase; +SPLandroidx/room/RoomDatabase;->()V +SPLandroidx/room/RoomDatabase;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; +SPLandroidx/room/RoomDatabase;->getInvalidationTracker()Landroidx/room/InvalidationTracker; +SPLandroidx/room/RoomDatabase;->inCompatibilityMode()Z +SPLandroidx/room/RoomDatabase;->inTransaction()Z +SPLandroidx/room/RoomDatabase;->isOpenInternal$room_runtime()Z +SPLandroidx/room/RoomDatabase;->useConnection(ZLkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/room/RoomDatabase$$ExternalSyntheticLambda0; +SPLandroidx/room/RoomDatabase$$ExternalSyntheticLambda0;->(I)V +SPLandroidx/room/RoomDatabase$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/RoomDatabase$JournalMode; +SPLandroidx/room/RoomDatabase$JournalMode;->()V +Landroidx/room/RoomDatabase$createConnectionManager$2; +SPLandroidx/room/RoomDatabase$createConnectionManager$2;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;III)V +SPLandroidx/room/RoomDatabase$createConnectionManager$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/RoomExternalOperationElement; +SPLandroidx/room/RoomExternalOperationElement;->()V +Landroidx/room/RoomOpenDelegate; +SPLandroidx/room/RoomOpenDelegate;->(ILjava/lang/String;Ljava/lang/String;)V +SPLandroidx/room/RoomOpenDelegate;->(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader;)V +Landroidx/room/RoomOpenDelegate$ValidationResult; +SPLandroidx/room/RoomOpenDelegate$ValidationResult;->(Landroidx/lifecycle/viewmodel/MutableCreationExtras;)V +Landroidx/room/RoomRawQuery; +SPLandroidx/room/RoomRawQuery;->(Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V +Landroidx/room/RoomRawQuery$$ExternalSyntheticLambda0; +SPLandroidx/room/RoomRawQuery$$ExternalSyntheticLambda0;->(ILkotlin/jvm/functions/Function1;)V +HSPLandroidx/room/RoomRawQuery$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TransactionElement; +SPLandroidx/room/TransactionElement;->()V +Landroidx/room/TransactionElement$Key; +Landroidx/room/TransactionExecutor; +SPLandroidx/room/TransactionExecutor;->(Ljava/util/concurrent/Executor;)V +SPLandroidx/room/TransactionExecutor;->execute(Ljava/lang/Runnable;)V +SPLandroidx/room/TransactionExecutor;->scheduleNext()V +Landroidx/room/TransactionExecutor$$ExternalSyntheticLambda0; +SPLandroidx/room/TransactionExecutor$$ExternalSyntheticLambda0;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLandroidx/room/TransactionExecutor$$ExternalSyntheticLambda0;->run()V +Landroidx/room/Transactor; +Landroidx/room/Transactor$SQLiteTransactionType; +SPLandroidx/room/Transactor$SQLiteTransactionType;->()V +Landroidx/room/TriggerBasedInvalidationTracker; +SPLandroidx/room/TriggerBasedInvalidationTracker;->()V +SPLandroidx/room/TriggerBasedInvalidationTracker;->(Lcc/n0th1ng/tripmoney/data/TripDatabase_Impl;Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;[Ljava/lang/String;ZLandroidx/room/InvalidationTracker$implementation$1;)V +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$checkInvalidatedTables(Landroidx/room/TriggerBasedInvalidationTracker;Landroidx/room/PooledConnection;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->access$startTrackingTable(Landroidx/room/TriggerBasedInvalidationTracker;Landroidx/room/Transactor;ILkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->notifyInvalidation(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->syncTriggers$room_runtime(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker;->validateTableNames$room_runtime([Ljava/lang/String;)Lkotlin/Pair; +Landroidx/room/TriggerBasedInvalidationTracker$checkInvalidatedTables$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$checkInvalidatedTables$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->(Landroidx/room/TriggerBasedInvalidationTracker;[IZ[Ljava/lang/String;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;->(Lkotlin/jvm/internal/Ref$ObjectRef;ZLkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/String;[I)V +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;->emit([ILkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2$emit$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2$emit$1;->(Landroidx/room/TriggerBasedInvalidationTracker$createFlow$1$2;Lkotlin/coroutines/Continuation;)V +Landroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$notifyInvalidation$2$invalidatedTableIds$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/TriggerBasedInvalidationTracker$startTrackingTable$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$startTrackingTable$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/room/TriggerBasedInvalidationTracker$syncTriggers$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$1;->(Landroidx/room/TriggerBasedInvalidationTracker;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1$1; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1$1;->([Landroidx/room/ObservedTableStates$ObserveOp;Landroidx/room/TriggerBasedInvalidationTracker;Landroidx/room/Transactor;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/TriggerBasedInvalidationTracker$syncTriggers$2$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/coroutines/ConnectionPool; +Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1; +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;Landroidx/room/RoomDatabase;ZLkotlin/jvm/functions/Function1;)V +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2; +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Landroidx/room/RoomDatabase;ZLkotlin/jvm/functions/Function1;)V +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2$1; +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2$1;->(Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/coroutines/PassthroughConnection; +SPLandroidx/room/coroutines/PassthroughConnection;->(Lkotlin/jvm/functions/Function2;Landroidx/sqlite/SQLiteConnection;)V +SPLandroidx/room/coroutines/PassthroughConnection;->getRawConnection()Landroidx/sqlite/SQLiteConnection; +SPLandroidx/room/coroutines/PassthroughConnection;->inTransaction(Lkotlin/coroutines/Continuation;)Ljava/lang/Boolean; +HSPLandroidx/room/coroutines/PassthroughConnection;->transaction(Landroidx/room/Transactor$SQLiteTransactionType;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/room/coroutines/PassthroughConnection;->usePrepared(Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/room/coroutines/PassthroughConnection;->withTransaction(Landroidx/room/Transactor$SQLiteTransactionType;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +Landroidx/room/coroutines/PassthroughConnection$transaction$1; +SPLandroidx/room/coroutines/PassthroughConnection$transaction$1;->(Landroidx/room/coroutines/PassthroughConnection;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/room/coroutines/PassthroughConnection$usePrepared$1; +SPLandroidx/room/coroutines/PassthroughConnection$usePrepared$1;->(Landroidx/room/coroutines/PassthroughConnection;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Landroidx/room/coroutines/PassthroughConnection$usePrepared$2; +SPLandroidx/room/coroutines/PassthroughConnection$usePrepared$2;->(Landroidx/room/coroutines/PassthroughConnection;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/coroutines/PassthroughConnection$usePrepared$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/coroutines/PassthroughConnection$usePrepared$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/coroutines/PassthroughConnection$usePrepared$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/coroutines/PassthroughConnection$withTransaction$2; +SPLandroidx/room/coroutines/PassthroughConnection$withTransaction$2;->(Landroidx/room/coroutines/PassthroughConnection;Landroidx/room/Transactor$SQLiteTransactionType;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLandroidx/room/coroutines/PassthroughConnection$withTransaction$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/coroutines/PassthroughConnection$withTransaction$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/coroutines/PassthroughConnection$withTransaction$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/coroutines/PassthroughConnectionPool; +SPLandroidx/room/coroutines/PassthroughConnectionPool;->(Landroidx/sqlite/SQLiteDriver;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V +SPLandroidx/room/coroutines/PassthroughConnectionPool;->useConnection(ZLkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/room/coroutines/PassthroughConnectionPool$ConnectionElement; +SPLandroidx/room/coroutines/PassthroughConnectionPool$ConnectionElement;->()V +SPLandroidx/room/coroutines/PassthroughConnectionPool$ConnectionElement;->(Landroidx/room/coroutines/PassthroughConnection;)V +SPLandroidx/room/coroutines/PassthroughConnectionPool$ConnectionElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLandroidx/room/coroutines/PassthroughConnectionPool$ConnectionElement;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLandroidx/room/coroutines/PassthroughConnectionPool$ConnectionElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +Landroidx/room/coroutines/PooledConnectionImpl$TransactionImpl; +SPLandroidx/room/coroutines/PooledConnectionImpl$TransactionImpl;->(ILjava/lang/Object;)V +SPLandroidx/room/coroutines/PooledConnectionImpl$TransactionImpl;->getRawConnection()Landroidx/sqlite/SQLiteConnection; +SPLandroidx/room/coroutines/PooledConnectionImpl$TransactionImpl;->usePrepared(Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/room/coroutines/RawConnectionAccessor; +Landroidx/room/paging/CommonLimitOffsetImpl; +SPLandroidx/room/paging/CommonLimitOffsetImpl;->()V +SPLandroidx/room/paging/CommonLimitOffsetImpl;->([Ljava/lang/String;Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$tripsPaged$1;Landroidx/room/paging/LimitOffsetPagingSource$implementation$1;)V +SPLandroidx/room/paging/CommonLimitOffsetImpl;->load(Landroidx/paging/PagingSource$LoadParams;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Landroidx/room/paging/CommonLimitOffsetImpl$1; +SPLandroidx/room/paging/CommonLimitOffsetImpl$1;->(Landroidx/room/paging/CommonLimitOffsetImpl;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/room/paging/CommonLimitOffsetImpl$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/paging/CommonLimitOffsetImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/paging/CommonLimitOffsetImpl$initialLoad$2; +SPLandroidx/room/paging/CommonLimitOffsetImpl$initialLoad$2;->(Landroidx/room/paging/CommonLimitOffsetImpl;Landroidx/paging/PagingSource$LoadParams;Lkotlin/coroutines/Continuation;I)V +SPLandroidx/room/paging/CommonLimitOffsetImpl$initialLoad$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/paging/CommonLimitOffsetImpl$initialLoad$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/paging/CommonLimitOffsetImpl$initialLoad$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/paging/CommonLimitOffsetImpl$load$1; +SPLandroidx/room/paging/CommonLimitOffsetImpl$load$1;->(Landroidx/room/paging/CommonLimitOffsetImpl;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +SPLandroidx/room/paging/CommonLimitOffsetImpl$load$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/paging/LimitOffsetPagingSource$implementation$1; +SPLandroidx/room/paging/LimitOffsetPagingSource$implementation$1;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;III)V +SPLandroidx/room/paging/LimitOffsetPagingSource$implementation$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/paging/util/RoomPagingUtil__RoomPagingUtilKt$queryDatabase$1; +Landroidx/room/support/AutoClosingRoomOpenHelper; +Landroidx/room/support/PrePackagedCopyOpenHelper; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->(Landroidx/room/RoomDatabase;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;ZZ)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$$inlined$compatCoroutineExecute$DBUtil__DBUtil_androidKt$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->(Landroidx/room/RoomDatabase;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;ZZ)V +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLandroidx/room/util/DBUtil__DBUtil_androidKt$performSuspending$lambda$1$$inlined$internalPerform$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/savedstate/Recreator; +SPLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;I)V +SPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; +Landroidx/savedstate/SavedStateRegistryOwner; +Landroidx/savedstate/compose/LocalSavedStateRegistryOwnerKt; +SPLandroidx/savedstate/compose/LocalSavedStateRegistryOwnerKt;->()V +Landroidx/savedstate/internal/SavedStateRegistryImpl; +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->(Landroidx/savedstate/SavedStateRegistryOwner;Lio/ktor/http/Url$$ExternalSyntheticLambda0;)V +SPLandroidx/savedstate/internal/SavedStateRegistryImpl;->performAttach()V +Landroidx/sqlite/SQLite; +SPLandroidx/sqlite/SQLite;->DialogHost(Landroidx/navigation/compose/DialogNavigator;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/sqlite/SQLite;->PopulateVisibleList(Ljava/util/List;Ljava/util/Collection;Landroidx/compose/runtime/ComposerImpl;I)V +SPLandroidx/sqlite/SQLite;->columnIndexOf(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +SPLandroidx/sqlite/SQLite;->columnIndexOfCommon(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +PLandroidx/sqlite/SQLite;->create(Landroid/content/Context;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig; +SPLandroidx/sqlite/SQLite;->createNavController$NavHostControllerKt__NavHostController_androidKt(Landroid/content/Context;)Landroidx/navigation/NavHostController; +SPLandroidx/sqlite/SQLite;->createViewModel(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; +SPLandroidx/sqlite/SQLite;->execSQL(Landroidx/sqlite/SQLiteConnection;Ljava/lang/String;)V +PLandroidx/sqlite/SQLite;->getCenter-ozmzZPI(J)J +SPLandroidx/sqlite/SQLite;->getColumnIndexOrThrow(Landroidx/sqlite/SQLiteStatement;Ljava/lang/String;)I +SPLandroidx/sqlite/SQLite;->getCoroutineContext(Landroidx/room/RoomDatabase;ZLkotlin/coroutines/jvm/internal/ContinuationImpl;)Lkotlin/coroutines/CoroutineContext; +SPLandroidx/sqlite/SQLite;->getHierarchy(Landroidx/navigation/NavDestination;)Lkotlin/sequences/Sequence; +SPLandroidx/sqlite/SQLite;->getPoolingContainerListenerHolder(Landroid/view/View;)Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; +PLandroidx/sqlite/SQLite;->mmap(Landroid/content/Context;Landroid/net/Uri;)Ljava/nio/MappedByteBuffer; +SPLandroidx/sqlite/SQLite;->performSuspending(Landroidx/room/RoomDatabase;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;ZZ)Ljava/lang/Object; +PLandroidx/sqlite/SQLite;->read(Ljava/nio/MappedByteBuffer;)Landroidx/emoji2/text/flatbuffer/MetadataList; +SPLandroidx/sqlite/SQLite;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V +HSPLandroidx/sqlite/SQLite;->toSize-ozmzZPI(J)J +SPLandroidx/sqlite/SQLite;->traceValue(Ljava/lang/String;J)V +Landroidx/sqlite/SQLiteConnection; +Landroidx/sqlite/SQLiteDriver; +Landroidx/sqlite/SQLiteStatement; +SPLandroidx/sqlite/SQLiteStatement;->getBoolean()Z +SPLandroidx/sqlite/SQLiteStatement;->getInt()I +Landroidx/sqlite/db/SupportSQLiteDatabase; +Landroidx/sqlite/db/SupportSQLiteOpenHelper; +Landroidx/sqlite/db/SupportSQLiteProgram; +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->(Landroid/database/sqlite/SQLiteDatabase;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionNonExclusive()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionReadOnly()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/framework/FrameworkSQLiteStatement; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->endTransaction()V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->inTransaction()Z +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isOpen()Z +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Lio/ktor/events/Events;)Landroid/database/Cursor; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->setTransactionSuccessful()V +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0;->(ILjava/lang/Object;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda1; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda1;->(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda1;->newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Lokio/PriorityQueue;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getDatabaseName()Ljava/lang/String; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->(Landroid/content/Context;Ljava/lang/String;Lio/ktor/events/Events;Lokio/PriorityQueue;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getSupportDatabase(Z)Landroidx/sqlite/db/SupportSQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->innerGetDatabase(Z)Landroid/database/sqlite/SQLiteDatabase; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onCreate(Landroid/database/sqlite/SQLiteDatabase;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V +Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$$ExternalSyntheticLambda0; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$$ExternalSyntheticLambda0;->(Lokio/PriorityQueue;Lio/ktor/events/Events;)V +Landroidx/sqlite/db/framework/FrameworkSQLiteProgram; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->(Landroid/database/sqlite/SQLiteProgram;)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindDouble(DI)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindLong(IJ)V +PLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindNull(I)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindString(Ljava/lang/String;I)V +SPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->close()V +Landroidx/sqlite/db/framework/FrameworkSQLiteStatement; +SPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->(Landroid/database/sqlite/SQLiteStatement;)V +Landroidx/sqlite/driver/SupportSQLiteConnection; +SPLandroidx/sqlite/driver/SupportSQLiteConnection;->(Landroidx/sqlite/db/SupportSQLiteDatabase;)V +SPLandroidx/sqlite/driver/SupportSQLiteConnection;->inTransaction()Z +HSPLandroidx/sqlite/driver/SupportSQLiteConnection;->prepare(Ljava/lang/String;)Landroidx/sqlite/SQLiteStatement; +Landroidx/sqlite/driver/SupportSQLiteStatement; +SPLandroidx/sqlite/driver/SupportSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement;->throwIfClosed()V +Landroidx/sqlite/driver/SupportSQLiteStatement$Companion$SpecialOperation$JournalModeOperation; +Landroidx/sqlite/driver/SupportSQLiteStatement$Companion$TransactionOperation; +SPLandroidx/sqlite/driver/SupportSQLiteStatement$Companion$TransactionOperation;->()V +Landroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement; +SPLandroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;Landroidx/sqlite/driver/SupportSQLiteStatement$Companion$TransactionOperation;)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement;->bindDouble(DI)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement;->bindLong(IJ)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement;->bindText(Ljava/lang/String;I)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement;->close()V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$OtherSQLiteStatement;->step()Z +Landroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement; +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V +PLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->bindDouble(DI)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->bindLong(IJ)V +PLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->bindNull(I)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->clearBindings()V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->close()V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->ensureCapacity(II)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->ensureCursor()V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->getColumnCount()I +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->getColumnName(I)Ljava/lang/String; +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->getDouble(I)D +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->getLong(I)J +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->getText(I)Ljava/lang/String; +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->reset()V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->step()Z +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->throwIfInvalidColumn(Landroid/database/Cursor;I)V +SPLandroidx/sqlite/driver/SupportSQLiteStatement$RowSQLiteStatement;->throwIfNoRow()Landroid/database/Cursor; +Landroidx/sqlite/util/ProcessLock; +SPLandroidx/sqlite/util/ProcessLock;->()V +SPLandroidx/sqlite/util/ProcessLock;->(Ljava/lang/String;Ljava/io/File;Z)V +SPLandroidx/sqlite/util/ProcessLock;->lock(Z)V +SPLandroidx/sqlite/util/ProcessLock;->unlock()V +Landroidx/startup/AppInitializer; +SPLandroidx/startup/AppInitializer;->()V +SPLandroidx/startup/AppInitializer;->(Landroid/content/Context;)V +SPLandroidx/startup/AppInitializer;->discoverAndInitialize(Landroid/os/Bundle;)V +SPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/HashSet;)Ljava/lang/Object; +SPLandroidx/startup/AppInitializer;->getInstance(Landroid/content/Context;)Landroidx/startup/AppInitializer; +Landroidx/startup/InitializationProvider; +SPLandroidx/startup/InitializationProvider;->()V +SPLandroidx/startup/InitializationProvider;->onCreate()Z +Landroidx/startup/Initializer; +Landroidx/startup/StartupException; +Landroidx/tracing/Trace; +PLandroidx/tracing/Trace;->()V +SPLandroidx/tracing/Trace;->PredictiveBackHandler(ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +PLandroidx/tracing/Trace;->Velocity(FF)J +PLandroidx/tracing/Trace;->appendPlaceholders(ILjava/lang/StringBuilder;)V +SPLandroidx/tracing/Trace;->beginSection(Ljava/lang/String;)V +SPLandroidx/tracing/Trace;->composable$default(Landroidx/navigation/NavGraphBuilder;Ljava/lang/String;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V +SPLandroidx/tracing/Trace;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; +SPLandroidx/tracing/Trace;->execSQL(Landroidx/room/PooledConnection;Ljava/lang/String;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/tracing/Trace;->get(Landroid/view/View;)Landroidx/savedstate/SavedStateRegistryOwner; +SPLandroidx/tracing/Trace;->get(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; +PLandroidx/tracing/Trace;->getExclusions()Ljava/util/Set; +SPLandroidx/tracing/Trace;->getInstance(Landroidx/lifecycle/ViewModelStore;)Landroidx/navigation/NavControllerViewModel; +SPLandroidx/tracing/Trace;->getNameForNavigator$navigation_common_release(Ljava/lang/Class;)Ljava/lang/String; +SPLandroidx/tracing/Trace;->getParentOrViewTreeDisjointParent(Landroid/view/View;)Landroid/view/ViewParent; +SPLandroidx/tracing/Trace;->isEnabled()Z +SPLandroidx/tracing/Trace;->queryDatabase(Landroidx/paging/PagingSource$LoadParams;Landroidx/room/RoomRawQuery;ILandroidx/room/paging/LimitOffsetPagingSource$implementation$1;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLandroidx/tracing/Trace;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V +SPLandroidx/tracing/Trace;->viewModel(Lkotlin/jvm/internal/ClassReference;Landroidx/lifecycle/ViewModelStoreOwner;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;Landroidx/compose/runtime/ComposerImpl;)Landroidx/lifecycle/ViewModel; +Landroidx/tracing/TraceApi29Impl; +SPLandroidx/tracing/TraceApi29Impl;->isEnabled()Z +Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityCImpl; +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityCImpl;->(Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl;Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;)V +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityCImpl;->getViewModelKeys()Ldagger/internal/LazyClassKeyMap; +Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityRetainedCImpl; +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;->(Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl;)V +Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityRetainedCImpl$SwitchingProvider; +Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl; +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl;->(Landroidx/navigation/internal/NavContext;)V +Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider; +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider;->(Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl;I)V +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider;->get()Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ViewModelCImpl; +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ViewModelCImpl;->(Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl;Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;)V +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ViewModelCImpl;->expenseRepository()Lio/ktor/utils/io/WriterJob; +Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider; +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->(Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl;Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ViewModelCImpl;I)V +SPLcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider;->get()Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/Filter; +SPLcc/n0th1ng/tripmoney/Filter;->()V +SPLcc/n0th1ng/tripmoney/Filter;->(Ljava/util/List;DD)V +PLcc/n0th1ng/tripmoney/Filter;->equals(Ljava/lang/Object;)Z +Lcc/n0th1ng/tripmoney/Hilt_MainActivity$1; +SPLcc/n0th1ng/tripmoney/Hilt_MainActivity$1;->(Lcc/n0th1ng/tripmoney/MainActivity;)V +SPLcc/n0th1ng/tripmoney/Hilt_MainActivity$1;->onContextAvailable()V +Lcc/n0th1ng/tripmoney/MainActivity; +SPLcc/n0th1ng/tripmoney/MainActivity;->()V +SPLcc/n0th1ng/tripmoney/MainActivity;->componentManager()Ldagger/hilt/android/internal/managers/ActivityComponentManager; +SPLcc/n0th1ng/tripmoney/MainActivity;->generatedComponent()Ljava/lang/Object; +SPLcc/n0th1ng/tripmoney/MainActivity;->getDefaultViewModelProviderFactory()Landroidx/lifecycle/ViewModelProvider$Factory; +SPLcc/n0th1ng/tripmoney/MainActivity;->onCreate$cc$n0th1ng$tripmoney$Hilt_MainActivity(Landroid/os/Bundle;)V +SPLcc/n0th1ng/tripmoney/MainActivity;->onCreate(Landroid/os/Bundle;)V +Lcc/n0th1ng/tripmoney/MainActivityKt; +SPLcc/n0th1ng/tripmoney/MainActivityKt;->()V +SPLcc/n0th1ng/tripmoney/MainActivityKt;->NavigationDrawer(ILandroidx/compose/runtime/ComposerImpl;)V +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda1; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda1;->(Landroidx/compose/runtime/State;I)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda10; +PLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda10;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/jvm/internal/Ref$BooleanRef;Landroidx/navigation/internal/NavControllerImpl;ZLkotlin/collections/ArrayDeque;)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda10;->(ZLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/navigation/NavHostController;)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda10;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda11; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda11;->(ZLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +PLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda11;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda12; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda12;->(Landroidx/navigation/NavHostController;I)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda12;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda14; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda14;->(Landroidx/compose/runtime/MutableState;I)V +HSPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda14;->invoke()Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda2; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda2;->(Ljava/lang/String;Landroidx/navigation/NavHostController;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/DrawerState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;ZLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda4; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda4;->(Ljava/lang/String;Landroidx/navigation/NavHostController;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/DrawerState;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda5; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda5;->(Landroidx/navigation/NavHostController;I)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda5;->(Landroidx/navigation/NavHostController;II)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda6; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda6;->(Landroidx/navigation/NavHostController;ZLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda8; +SPLcc/n0th1ng/tripmoney/MainActivityKt$$ExternalSyntheticLambda8;->(Landroidx/compose/runtime/MutableState;I)V +Lcc/n0th1ng/tripmoney/MainActivity_GeneratedInjector; +Lcc/n0th1ng/tripmoney/MyApplication; +SPLcc/n0th1ng/tripmoney/MyApplication;->()V +SPLcc/n0th1ng/tripmoney/MyApplication;->generatedComponent()Ljava/lang/Object; +SPLcc/n0th1ng/tripmoney/MyApplication;->onCreate()V +Lcc/n0th1ng/tripmoney/MyApplication_GeneratedInjector; +Lcc/n0th1ng/tripmoney/data/Converters; +SPLcc/n0th1ng/tripmoney/data/Converters;->fromLocalDatetime(Ljava/time/LocalDateTime;)J +SPLcc/n0th1ng/tripmoney/data/Converters;->toLocalDate(J)Ljava/time/LocalDate; +Lcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0; +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m$1()Ljava/time/LocalDate; +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager$AutofillCallback;)V +PLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m()Ljava/time/LocalDate; +PLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m()Ljava/time/ZoneId; +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(IILandroid/graphics/Bitmap$Config;Landroid/graphics/ColorSpace;)Landroid/graphics/Bitmap; +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(J)Ljava/time/LocalDate; +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;I)V +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;I)V +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Z)V +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;)V +PLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/ArrayList;)V +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/autofill/AutofillId; +SPLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Ljava/time/LocalDate;)J +PLcc/n0th1ng/tripmoney/data/Converters$$ExternalSyntheticApiModelOutline0;->m(Ljava/time/ZonedDateTime;)Ljava/time/LocalDateTime; +Lcc/n0th1ng/tripmoney/data/DatabasePrepopulator; +SPLcc/n0th1ng/tripmoney/data/DatabasePrepopulator;->(Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl;Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;)V +SPLcc/n0th1ng/tripmoney/data/DatabasePrepopulator;->prepopulate(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/DatabasePrepopulator$prepopulate$1; +SPLcc/n0th1ng/tripmoney/data/DatabasePrepopulator$prepopulate$1;->(Lcc/n0th1ng/tripmoney/data/DatabasePrepopulator;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +SPLcc/n0th1ng/tripmoney/data/DatabasePrepopulator$prepopulate$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/TripDatabase; +SPLcc/n0th1ng/tripmoney/data/TripDatabase;->()V +Lcc/n0th1ng/tripmoney/data/TripDatabase_Impl; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->()V +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->categoryDao()Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->createAutoMigrations(Ljava/util/LinkedHashMap;)Ljava/util/List; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->createOpenDelegate()Landroidx/room/RoomOpenDelegate; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->exchangeRateDao()Lcc/n0th1ng/tripmoney/data/dao/ExchangeRateDao_Impl; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->expenseDao()Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->getRequiredAutoMigrationSpecClasses()Ljava/util/Set; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->getRequiredTypeConverterClasses()Ljava/util/LinkedHashMap; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl;->tripDao()Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl; +Lcc/n0th1ng/tripmoney/data/TripDatabase_Impl$$ExternalSyntheticLambda0; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl$$ExternalSyntheticLambda0;->(Lcc/n0th1ng/tripmoney/data/TripDatabase_Impl;I)V +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/TripDatabase_Impl$createOpenDelegate$_openDelegate$1; +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl$createOpenDelegate$_openDelegate$1;->(Lcc/n0th1ng/tripmoney/data/TripDatabase_Impl;)V +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl$createOpenDelegate$_openDelegate$1;->createAllTables(Landroidx/sqlite/SQLiteConnection;)V +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl$createOpenDelegate$_openDelegate$1;->onCreate(Landroidx/sqlite/SQLiteConnection;)V +SPLcc/n0th1ng/tripmoney/data/TripDatabase_Impl$createOpenDelegate$_openDelegate$1;->onOpen(Landroidx/sqlite/SQLiteConnection;)V +Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl; +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;->(Landroidx/room/RoomDatabase;)V +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;->__Icons_stringToEnum(Ljava/lang/String;)Lcc/n0th1ng/tripmoney/utils/Icons; +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;->access$__Icons_enumToString(Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;Lcc/n0th1ng/tripmoney/utils/Icons;)Ljava/lang/String; +Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$$ExternalSyntheticLambda0; +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$$ExternalSyntheticLambda0;->(Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;Lcc/n0th1ng/tripmoney/data/entity/Category;I)V +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$$ExternalSyntheticLambda1; +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$$ExternalSyntheticLambda1;->(Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;I)V +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$2; +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$2;->(Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;)V +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$2;->bind(Landroidx/sqlite/SQLiteStatement;Ljava/lang/Object;)V +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$2;->createQuery()Ljava/lang/String; +Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$3; +SPLcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl$3;->(Lcc/n0th1ng/tripmoney/data/dao/CategoryDao_Impl;)V +Lcc/n0th1ng/tripmoney/data/dao/ExchangeRateDao_Impl; +SPLcc/n0th1ng/tripmoney/data/dao/ExchangeRateDao_Impl;->(Landroidx/room/RoomDatabase;)V +Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl; +SPLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;->(Landroidx/room/RoomDatabase;)V +PLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;->__Icons_stringToEnum(Ljava/lang/String;)Lcc/n0th1ng/tripmoney/utils/Icons; +PLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;->__fetchRelationshipcategoryAsccN0th1ngTripmoneyDataEntityCategory(Landroidx/sqlite/SQLiteConnection;Landroidx/collection/LongSparseArray;)V +PLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;->__fetchRelationshiptripAsccN0th1ngTripmoneyDataEntityTrip(Landroidx/sqlite/SQLiteConnection;Landroidx/collection/LongSparseArray;)V +Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda0; +SPLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda0;->(Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;Lcc/n0th1ng/tripmoney/data/entity/Expense;I)V +SPLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda1; +SPLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda1;->(Landroidx/compose/foundation/lazy/LazyListState;I)V +PLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda2;->(Ljava/lang/String;ILjava/lang/String;ZLjava/util/ArrayList;ILjava/lang/Double;Ljava/lang/Double;Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;)V +PLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda6;->(ILjava/lang/String;ZLjava/util/ArrayList;ILjava/lang/Double;Ljava/lang/Double;)V +PLcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl$$ExternalSyntheticLambda6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl; +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl;->(Landroidx/room/RoomDatabase;)V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl;->insert(Lcc/n0th1ng/tripmoney/data/entity/Trip;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$$ExternalSyntheticLambda0; +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$$ExternalSyntheticLambda0;->(Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl;Lcc/n0th1ng/tripmoney/data/entity/Trip;I)V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$$ExternalSyntheticLambda1; +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$$ExternalSyntheticLambda1;->(IILjava/lang/Object;)V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$1; +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$1;->(I)V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$1;->(ILjava/lang/Object;)V +Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$2; +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$2;->()V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$2;->(ILjava/lang/Object;)V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$2;->bind(Landroidx/sqlite/SQLiteStatement;Ljava/lang/Object;)V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$2;->createQuery()Ljava/lang/String; +Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$tripsPaged$1; +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$tripsPaged$1;->(Landroidx/room/RoomRawQuery;Ljava/lang/Object;Landroidx/room/RoomDatabase;[Ljava/lang/String;I)V +SPLcc/n0th1ng/tripmoney/data/dao/TripDao_Impl$tripsPaged$1;->registerInvalidatedCallback(Lkotlin/jvm/functions/Function0;)V +Lcc/n0th1ng/tripmoney/data/entity/Category; +SPLcc/n0th1ng/tripmoney/data/entity/Category;->(ILjava/lang/String;Lcc/n0th1ng/tripmoney/utils/Icons;Ljava/lang/String;Z)V +SPLcc/n0th1ng/tripmoney/data/entity/Category;->(ILjava/lang/String;Lcc/n0th1ng/tripmoney/utils/Icons;Ljava/lang/String;ZI)V +PLcc/n0th1ng/tripmoney/data/entity/Category;->equals(Ljava/lang/Object;)Z +Lcc/n0th1ng/tripmoney/data/entity/Expense; +SPLcc/n0th1ng/tripmoney/data/entity/Expense;->(DLjava/lang/String;Ljava/lang/String;Ljava/time/LocalDateTime;IIDI)V +SPLcc/n0th1ng/tripmoney/data/entity/Expense;->(IDLjava/lang/String;Ljava/lang/String;Ljava/time/LocalDateTime;IID)V +PLcc/n0th1ng/tripmoney/data/entity/ExpenseDto;->(Lcc/n0th1ng/tripmoney/data/entity/Expense;Lcc/n0th1ng/tripmoney/data/entity/Category;Lcc/n0th1ng/tripmoney/data/entity/Trip;)V +Lcc/n0th1ng/tripmoney/data/entity/Trip; +SPLcc/n0th1ng/tripmoney/data/entity/Trip;->()V +SPLcc/n0th1ng/tripmoney/data/entity/Trip;->(ILjava/lang/String;Ljava/time/LocalDate;Ljava/time/LocalDate;Ljava/lang/String;D)V +SPLcc/n0th1ng/tripmoney/data/entity/Trip;->(Ljava/lang/String;Ljava/time/LocalDate;Ljava/time/LocalDate;Ljava/lang/String;DI)V +PLcc/n0th1ng/tripmoney/data/entity/Trip;->equals(Ljava/lang/Object;)Z +Lcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0; +SPLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m$1()Ljava/time/LocalDate; +PLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m$1()Ljava/time/format/DateTimeFormatter; +SPLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m$2()Ljava/time/LocalDate; +PLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m$2()Ljava/time/format/DateTimeFormatter; +SPLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m$3()Ljava/time/format/DateTimeFormatter; +SPLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m()Ljava/time/LocalDate; +PLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m(Ljava/time/LocalDateTime;)Ljava/time/LocalDate; +PLcc/n0th1ng/tripmoney/data/entity/Trip$$ExternalSyntheticApiModelOutline0;->m(Ljava/time/LocalDateTime;Ljava/time/format/DateTimeFormatter;)Ljava/lang/String; +Lcc/n0th1ng/tripmoney/data/repository/AppTheme; +SPLcc/n0th1ng/tripmoney/data/repository/AppTheme;->()V +SPLcc/n0th1ng/tripmoney/data/repository/AppTheme;->(IILjava/lang/String;)V +PLcc/n0th1ng/tripmoney/data/repository/ExpenseRepository$$ExternalSyntheticLambda1;->(Lcc/n0th1ng/tripmoney/Filter;Lio/ktor/utils/io/WriterJob;ILjava/lang/String;)V +PLcc/n0th1ng/tripmoney/data/repository/ExpenseRepository$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/data/repository/PreferenceKeys; +SPLcc/n0th1ng/tripmoney/data/repository/PreferenceKeys;->()V +Lcc/n0th1ng/tripmoney/data/repository/PreferencesRepository$special$$inlined$map$2$2$1; +SPLcc/n0th1ng/tripmoney/data/repository/PreferencesRepository$special$$inlined$map$2$2$1;->(Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +Lcc/n0th1ng/tripmoney/data/repository/PreferencesRepository$special$$inlined$map$3$2$1; +SPLcc/n0th1ng/tripmoney/data/repository/PreferencesRepository$special$$inlined$map$3$2$1;->(Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +Lcc/n0th1ng/tripmoney/data/repository/PreferencesRepositoryKt; +SPLcc/n0th1ng/tripmoney/data/repository/PreferencesRepositoryKt;->()V +SPLcc/n0th1ng/tripmoney/data/repository/PreferencesRepositoryKt;->getPreferencesDataStore(Landroid/content/Context;)Lio/ktor/events/Events; +Lcc/n0th1ng/tripmoney/navigation/CustomNavigationDrawerKt$$ExternalSyntheticLambda3; +SPLcc/n0th1ng/tripmoney/navigation/CustomNavigationDrawerKt$$ExternalSyntheticLambda3;->(Landroidx/navigation/NavHostController;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/DrawerState;)V +SPLcc/n0th1ng/tripmoney/navigation/CustomNavigationDrawerKt$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/navigation/CustomNavigationDrawerKt$$ExternalSyntheticLambda4; +SPLcc/n0th1ng/tripmoney/navigation/CustomNavigationDrawerKt$$ExternalSyntheticLambda4;->(Landroidx/navigation/NavHostController;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/DrawerState;I)V +Lcc/n0th1ng/tripmoney/navigation/TopBarKt; +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt;->()V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt;->BottomNavigation(Landroidx/navigation/NavHostController;Landroidx/compose/runtime/ComposerImpl;I)V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt;->CustomNavigationDrawer(Landroidx/navigation/NavHostController;Landroidx/compose/material3/DrawerState;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/ComposerImpl;I)V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt;->TopBar(Lkotlin/jvm/functions/Function0;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;Lcc/n0th1ng/tripmoney/Filter;Lkotlin/jvm/functions/Function1;Ljava/util/List;Landroidx/compose/runtime/ComposerImpl;I)V +Lcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda0; +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda0;->(ZLandroidx/compose/ui/focus/FocusRequester;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda1; +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda1;->(ILkotlin/jvm/functions/Function0;)V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda15; +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda15;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +PLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda15;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;II)V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda15;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda2; +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda2;->(Lcc/n0th1ng/tripmoney/data/entity/Trip;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda2;->(ZLandroidx/compose/runtime/MutableState;Lcc/n0th1ng/tripmoney/Filter;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda6; +SPLcc/n0th1ng/tripmoney/navigation/TopBarKt$$ExternalSyntheticLambda6;->(Lkotlin/jvm/functions/Function0;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;Lcc/n0th1ng/tripmoney/Filter;Lkotlin/jvm/functions/Function1;Ljava/util/List;I)V +Lcc/n0th1ng/tripmoney/screens/AddCetegoryDialogKt$$ExternalSyntheticLambda9; +SPLcc/n0th1ng/tripmoney/screens/AddCetegoryDialogKt$$ExternalSyntheticLambda9;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V +SPLcc/n0th1ng/tripmoney/screens/AddCetegoryDialogKt$$ExternalSyntheticLambda9;->invoke()Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt;->()V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt;->CustomDivider(Ljava/time/LocalDate;DLjava/lang/String;Landroidx/compose/runtime/ComposerImpl;I)V +HPLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt;->ExpenseCard(Lcc/n0th1ng/tripmoney/data/entity/ExpenseDto;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt;->ListExpenseScreen(Lcc/n0th1ng/tripmoney/Filter;Ljava/lang/String;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;I)V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt;->ListExpenseScreen(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ZZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/ComposerImpl;I)V +HPLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt;->SwipeToDeleteExpenseCard(Lcc/n0th1ng/tripmoney/data/entity/ExpenseDto;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$$ExternalSyntheticLambda15;->(Lkotlin/jvm/functions/Function1;Lcc/n0th1ng/tripmoney/data/entity/ExpenseDto;I)V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$$ExternalSyntheticLambda20;->(Lcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel;I)V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$$ExternalSyntheticLambda23;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/material3/SheetState;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/paging/compose/LazyPagingItems;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$$ExternalSyntheticLambda23;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$$ExternalSyntheticLambda3;->(Landroidx/paging/compose/LazyPagingItems;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +HPLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$$ExternalSyntheticLambda3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$ListExpenseScreen$4$1;->(ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$ListExpenseScreen$4$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLcc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreenKt$ListExpenseScreen$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/screens/settings/SettingsScreenKt$$ExternalSyntheticLambda14; +SPLcc/n0th1ng/tripmoney/screens/settings/SettingsScreenKt$$ExternalSyntheticLambda14;->(Landroidx/compose/runtime/MutableState;I)V +SPLcc/n0th1ng/tripmoney/screens/settings/SettingsScreenKt$$ExternalSyntheticLambda14;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/screens/settings/SettingsScreenKt$$ExternalSyntheticLambda28; +SPLcc/n0th1ng/tripmoney/screens/settings/SettingsScreenKt$$ExternalSyntheticLambda28;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;II)V +SPLcc/n0th1ng/tripmoney/screens/settings/SettingsScreenKt$$ExternalSyntheticLambda28;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt;->()V +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt;->SwipeToDeleteTripCard(Lcc/n0th1ng/tripmoney/data/entity/Trip;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt;->TripCard(Lcc/n0th1ng/tripmoney/data/entity/Trip;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt;->TripPickerScreen(Landroidx/navigation/NavHostController;Landroidx/compose/runtime/ComposerImpl;I)V +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt;->TripPickerScreen(Lkotlinx/coroutines/flow/ReadonlySharedFlow;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;I)V +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda0; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;Lcc/n0th1ng/tripmoney/data/entity/Trip;I)V +PLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda11;->(Lcc/n0th1ng/tripmoney/Filter;Ljava/lang/String;ZLkotlin/jvm/functions/Function0;I)V +PLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda11;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda12; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda12;->(Lcc/n0th1ng/tripmoney/viewmodel/TripViewModel;I)V +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda17; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda17;->(Landroidx/paging/compose/LazyPagingItems;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda17;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda19; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda19;->(Landroidx/paging/compose/LazyPagingItems;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda19;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda2; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda2;->(Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;I)V +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda24; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda24;->(Landroidx/paging/compose/LazyPagingItems;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda24;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda5; +SPLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda5;->(Landroidx/compose/runtime/MutableState;I)V +PLcc/n0th1ng/tripmoney/screens/trippicker/TripPickerScreenKt$$ExternalSyntheticLambda7;->(Lcc/n0th1ng/tripmoney/data/entity/Trip;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function1;I)V +Lcc/n0th1ng/tripmoney/theme/ColorKt; +SPLcc/n0th1ng/tripmoney/theme/ColorKt;->()V +Lcc/n0th1ng/tripmoney/theme/ThemeKt; +SPLcc/n0th1ng/tripmoney/theme/ThemeKt;->()V +SPLcc/n0th1ng/tripmoney/theme/ThemeKt;->TripMoneyTheme(ZLandroidx/compose/runtime/ComposerImpl;I)V +Lcc/n0th1ng/tripmoney/theme/ThemeKt$$ExternalSyntheticLambda0; +SPLcc/n0th1ng/tripmoney/theme/ThemeKt$$ExternalSyntheticLambda0;->(IZ)V +Lcc/n0th1ng/tripmoney/theme/TypeKt; +SPLcc/n0th1ng/tripmoney/theme/TypeKt;->()V +Lcc/n0th1ng/tripmoney/utils/ColorsKt; +SPLcc/n0th1ng/tripmoney/utils/ColorsKt;->()V +Lcc/n0th1ng/tripmoney/utils/Currencies; +SPLcc/n0th1ng/tripmoney/utils/Currencies;->()V +Lcc/n0th1ng/tripmoney/utils/Icons; +SPLcc/n0th1ng/tripmoney/utils/Icons;->()V +SPLcc/n0th1ng/tripmoney/utils/Icons;->(IILjava/lang/String;)V +Lcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel; +SPLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel;->(Lio/ktor/utils/io/WriterJob;Lio/ktor/events/Events;Lio/ktor/utils/io/WriterJob;Lio/ktor/events/Events;)V +SPLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel;->getCategories()Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1; +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$ExpenseListItemUi$Header;->(Ljava/time/LocalDate;DLjava/lang/String;)V +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$ExpenseListItemUi$Item;->(Lcc/n0th1ng/tripmoney/data/entity/ExpenseDto;)V +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$getDailySums$$inlined$map$1;->(Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1;I)V +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$getDailySums$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$getDailySums$$inlined$map$1$2$1;->(Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$getDailySums$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$getExpensesWithHeadersPaged$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLcc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel$getExpensesWithHeadersPaged$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/viewmodel/SettingsViewModel; +SPLcc/n0th1ng/tripmoney/viewmodel/SettingsViewModel;->(Lokhttp3/Request$Builder;Landroid/content/Context;)V +PLcc/n0th1ng/tripmoney/viewmodel/SettingsViewModel$setCurrentTrip$1;->(Ljava/lang/Object;ILkotlin/coroutines/Continuation;I)V +PLcc/n0th1ng/tripmoney/viewmodel/SettingsViewModel$setCurrentTrip$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLcc/n0th1ng/tripmoney/viewmodel/SettingsViewModel$setCurrentTrip$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lcc/n0th1ng/tripmoney/viewmodel/TripViewModel; +SPLcc/n0th1ng/tripmoney/viewmodel/TripViewModel;->(Lio/ktor/events/Events;Lio/ktor/utils/io/WriterJob;)V +Ldagger/hilt/android/internal/lifecycle/DefaultViewModelFactories$ActivityEntryPoint; +Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory; +SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->()V +SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->(Ldagger/internal/LazyClassKeyMap;Landroidx/lifecycle/ViewModelProvider$Factory;Lio/ktor/utils/io/WriterJob;)V +SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; +SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory;->createInternal(Landroidx/activity/ComponentActivity;Landroidx/lifecycle/ViewModelProvider$Factory;)Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory; +Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2$$ExternalSyntheticLambda0; +SPLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2$$ExternalSyntheticLambda0;->(Ldagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl;)V +PLdagger/hilt/android/internal/lifecycle/HiltViewModelFactory$2$$ExternalSyntheticLambda0;->close()V +Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$ActivityCreatorEntryPoint; +Ldagger/hilt/android/internal/lifecycle/HiltViewModelFactory$ViewModelFactoriesEntryPoint; +Ldagger/hilt/android/internal/lifecycle/HiltWrapper_HiltViewModelFactory_ActivityCreatorEntryPoint; +Ldagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl; +SPLdagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl;->()V +PLdagger/hilt/android/internal/lifecycle/RetainedLifecycleImpl;->dispatchOnCleared()V +Ldagger/hilt/android/internal/managers/ActivityComponentManager; +SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->(Lcc/n0th1ng/tripmoney/MainActivity;I)V +SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->createComponent()Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityCImpl; +SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->generatedComponent()Ljava/lang/Object; +SPLdagger/hilt/android/internal/managers/ActivityComponentManager;->getViewModelProvider(Lcc/n0th1ng/tripmoney/MainActivity;Lcc/n0th1ng/tripmoney/MainActivity;)Landroidx/lifecycle/ViewModelProvider; +Ldagger/hilt/android/internal/managers/ActivityComponentManager$ActivityComponentBuilderEntryPoint; +Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentBuilderEntryPoint; +Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel; +SPLdagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedComponentViewModel;->(Lcc/n0th1ng/tripmoney/DaggerMyApplication_HiltComponents_SingletonC$ActivityRetainedCImpl;Landroidx/room/RoomOpenDelegate$ValidationResult;)V +Ldagger/hilt/android/internal/managers/ActivityRetainedComponentManager$ActivityRetainedLifecycleEntryPoint; +Ldagger/hilt/android/internal/managers/ApplicationComponentManager; +SPLdagger/hilt/android/internal/managers/ApplicationComponentManager;->(Lio/ktor/events/Events;)V +SPLdagger/hilt/android/internal/managers/ApplicationComponentManager;->generatedComponent()Ljava/lang/Object; +Ldagger/hilt/internal/GeneratedComponent; +Ldagger/hilt/internal/GeneratedComponentManager; +Ldagger/internal/DoubleCheck; +SPLdagger/internal/DoubleCheck;->()V +SPLdagger/internal/DoubleCheck;->get()Ljava/lang/Object; +SPLdagger/internal/DoubleCheck;->provider(Ldagger/internal/Provider;)Ldagger/internal/Provider; +Ldagger/internal/LazyClassKeyMap; +SPLdagger/internal/LazyClassKeyMap;->(Ljava/util/Map;)V +SPLdagger/internal/LazyClassKeyMap;->containsKey(Ljava/lang/Object;)Z +Ldagger/internal/MapBuilder; +SPLdagger/internal/MapBuilder;->(I)V +SPLdagger/internal/MapBuilder;->addInitializer(Lkotlin/jvm/internal/ClassReference;Lkotlin/jvm/functions/Function1;)V +SPLdagger/internal/MapBuilder;->build()Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; +Ldagger/internal/Provider; +Lio/ktor/client/HttpClient; +SPLio/ktor/client/HttpClient;->()V +SPLio/ktor/client/HttpClient;->(Lio/ktor/client/engine/okhttp/OkHttpEngine;Lio/ktor/client/HttpClientConfig;)V +Lio/ktor/client/HttpClient$2; +SPLio/ktor/client/HttpClient$2;->(ILkotlin/coroutines/Continuation;)V +SPLio/ktor/client/HttpClient$2;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLio/ktor/client/HttpClient$2;->(Lkotlin/coroutines/Continuation;Ljava/lang/Object;I)V +SPLio/ktor/client/HttpClient$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V +SPLio/ktor/client/HttpClient$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLio/ktor/client/HttpClient$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/HttpClient$4; +SPLio/ktor/client/HttpClient$4;->(ILkotlin/coroutines/Continuation;I)V +SPLio/ktor/client/HttpClient$4;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +Lio/ktor/client/HttpClientConfig; +SPLio/ktor/client/HttpClientConfig;->()V +SPLio/ktor/client/HttpClientConfig;->install(Lio/ktor/client/plugins/HttpClientPlugin;Lkotlin/jvm/functions/Function1;)V +Lio/ktor/client/HttpClientConfig$$ExternalSyntheticLambda0; +SPLio/ktor/client/HttpClientConfig$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;I)V +SPLio/ktor/client/HttpClientConfig$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/HttpClientEngineContainer; +Lio/ktor/client/HttpClientJvmKt; +SPLio/ktor/client/HttpClientJvmKt;->()V +Lio/ktor/client/content/ProgressListener; +Lio/ktor/client/engine/HttpClientEngine; +Lio/ktor/client/engine/HttpClientEngine$install$1; +SPLio/ktor/client/engine/HttpClientEngine$install$1;->(Lio/ktor/client/HttpClient;Lio/ktor/client/engine/okhttp/OkHttpEngine;Lkotlin/coroutines/Continuation;)V +Lio/ktor/client/engine/HttpClientEngineBase; +SPLio/ktor/client/engine/HttpClientEngineBase;->()V +SPLio/ktor/client/engine/HttpClientEngineBase;->()V +SPLio/ktor/client/engine/HttpClientEngineBase;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +Lio/ktor/client/engine/HttpClientEngineBase$$ExternalSyntheticLambda0; +SPLio/ktor/client/engine/HttpClientEngineBase$$ExternalSyntheticLambda0;->(Lio/ktor/client/engine/HttpClientEngineBase;I)V +SPLio/ktor/client/engine/HttpClientEngineBase$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lio/ktor/client/engine/HttpClientEngineCapability; +Lio/ktor/client/engine/UtilsKt$attachToUserJob$2; +SPLio/ktor/client/engine/UtilsKt$attachToUserJob$2;->(ILjava/lang/Object;)V +PLio/ktor/client/engine/UtilsKt$attachToUserJob$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/engine/okhttp/OkHttp; +SPLio/ktor/client/engine/okhttp/OkHttp;->()V +Lio/ktor/client/engine/okhttp/OkHttpConfig; +Lio/ktor/client/engine/okhttp/OkHttpEngine; +SPLio/ktor/client/engine/okhttp/OkHttpEngine;->()V +SPLio/ktor/client/engine/okhttp/OkHttpEngine;->(Lio/ktor/client/engine/okhttp/OkHttpConfig;)V +Lio/ktor/client/engine/okhttp/OkHttpEngine$1; +SPLio/ktor/client/engine/okhttp/OkHttpEngine$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLio/ktor/client/engine/okhttp/OkHttpEngine$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLio/ktor/client/engine/okhttp/OkHttpEngine$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLio/ktor/client/engine/okhttp/OkHttpEngine$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/engine/okhttp/OkHttpEngineContainer; +SPLio/ktor/client/engine/okhttp/OkHttpEngineContainer;->()V +Lio/ktor/client/plugins/AfterRenderHook$install$1; +SPLio/ktor/client/plugins/AfterRenderHook$install$1;->(Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;I)V +Lio/ktor/client/plugins/BodyProgressKt; +SPLio/ktor/client/plugins/BodyProgressKt;->()V +Lio/ktor/client/plugins/DefaultResponseValidationKt; +SPLio/ktor/client/plugins/DefaultResponseValidationKt;->()V +Lio/ktor/client/plugins/DefaultTransformKt; +SPLio/ktor/client/plugins/DefaultTransformKt;->()V +Lio/ktor/client/plugins/DefaultTransformKt$defaultTransformers$2; +SPLio/ktor/client/plugins/DefaultTransformKt$defaultTransformers$2;->(Lio/ktor/client/HttpClient;Lkotlin/coroutines/Continuation;)V +Lio/ktor/client/plugins/DoubleReceivePluginKt; +SPLio/ktor/client/plugins/DoubleReceivePluginKt;->()V +Lio/ktor/client/plugins/DoubleReceivePluginKt$SaveBodyPlugin$1; +SPLio/ktor/client/plugins/DoubleReceivePluginKt$SaveBodyPlugin$1;->()V +Lio/ktor/client/plugins/HttpCallValidatorConfig; +SPLio/ktor/client/plugins/HttpCallValidatorConfig;->()V +Lio/ktor/client/plugins/HttpCallValidatorKt; +SPLio/ktor/client/plugins/HttpCallValidatorKt;->()V +Lio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$1; +SPLio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$1;->()V +SPLio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$1;->invoke()Ljava/lang/Object; +Lio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$2$1; +SPLio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$2$1;->(Landroidx/activity/compose/PredictiveBackHandlerKt$PredictiveBackHandler$backCallBack$1$1;ZLkotlin/coroutines/Continuation;)V +SPLio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$2$1;->(ZLkotlin/coroutines/Continuation;I)V +SPLio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$2$3; +SPLio/ktor/client/plugins/HttpCallValidatorKt$HttpCallValidator$2$3;->(Ljava/util/List;Lkotlin/coroutines/Continuation;I)V +Lio/ktor/client/plugins/HttpClientPlugin; +Lio/ktor/client/plugins/HttpClientPluginKt; +SPLio/ktor/client/plugins/HttpClientPluginKt;->()V +Lio/ktor/client/plugins/HttpPlainTextConfig; +SPLio/ktor/client/plugins/HttpPlainTextConfig;->()V +Lio/ktor/client/plugins/HttpPlainTextKt; +SPLio/ktor/client/plugins/HttpPlainTextKt;->()V +Lio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$1; +SPLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$1;->()V +SPLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$1;->invoke()Ljava/lang/Object; +Lio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$2$1; +SPLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$2$1;->(Ljava/lang/String;Ljava/nio/charset/Charset;Lkotlin/coroutines/Continuation;)V +PLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$2$1;->(Ljava/util/Map;Ljava/lang/String;Lkotlin/coroutines/Continuation;)V +PLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$2$2; +SPLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$2$2;->(Ljava/nio/charset/Charset;Lkotlin/coroutines/Continuation;)V +Lio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$lambda$0$$inlined$sortedBy$1; +SPLio/ktor/client/plugins/HttpPlainTextKt$HttpPlainText$lambda$0$$inlined$sortedBy$1;->(I)V +Lio/ktor/client/plugins/HttpRedirectConfig; +Lio/ktor/client/plugins/HttpRedirectKt; +SPLio/ktor/client/plugins/HttpRedirectKt;->()V +Lio/ktor/client/plugins/HttpRedirectKt$HttpRedirect$1; +SPLio/ktor/client/plugins/HttpRedirectKt$HttpRedirect$1;->()V +SPLio/ktor/client/plugins/HttpRedirectKt$HttpRedirect$1;->invoke()Ljava/lang/Object; +Lio/ktor/client/plugins/HttpRequestLifecycleKt; +SPLio/ktor/client/plugins/HttpRequestLifecycleKt;->()V +Lio/ktor/client/plugins/HttpRequestRetryConfig$$ExternalSyntheticLambda0; +SPLio/ktor/client/plugins/HttpRequestRetryConfig$$ExternalSyntheticLambda0;->(I)V +SPLio/ktor/client/plugins/HttpRequestRetryConfig$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/plugins/HttpRequestRetryConfig$$ExternalSyntheticLambda1; +SPLio/ktor/client/plugins/HttpRequestRetryConfig$$ExternalSyntheticLambda1;->(I)V +HSPLio/ktor/client/plugins/HttpRequestRetryConfig$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/client/plugins/HttpRetryDelayContext; +Lio/ktor/client/plugins/HttpSend; +SPLio/ktor/client/plugins/HttpSend;->()V +SPLio/ktor/client/plugins/HttpSend;->()V +Lio/ktor/client/plugins/HttpSend$Plugin$install$1; +SPLio/ktor/client/plugins/HttpSend$Plugin$install$1;->(Lio/ktor/client/plugins/HttpSend;Lio/ktor/client/HttpClient;Lkotlin/coroutines/Continuation;)V +Lio/ktor/client/plugins/HttpTimeoutCapability; +SPLio/ktor/client/plugins/HttpTimeoutCapability;->()V +SPLio/ktor/client/plugins/HttpTimeoutCapability;->hashCode()I +Lio/ktor/client/plugins/ReceiveError; +SPLio/ktor/client/plugins/ReceiveError;->()V +SPLio/ktor/client/plugins/ReceiveError;->(I)V +SPLio/ktor/client/plugins/ReceiveError;->getKey()Lio/ktor/util/AttributeKey; +SPLio/ktor/client/plugins/ReceiveError;->install(Lio/ktor/client/HttpClient;Lkotlin/coroutines/jvm/internal/SuspendLambda;)V +SPLio/ktor/client/plugins/ReceiveError;->install(Ljava/lang/Object;Lio/ktor/client/HttpClient;)V +SPLio/ktor/client/plugins/ReceiveError;->prepare(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +Lio/ktor/client/plugins/ReceiveError$install$1; +SPLio/ktor/client/plugins/ReceiveError$install$1;->(Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;I)V +Lio/ktor/client/plugins/SaveBodyPluginConfig; +Lio/ktor/client/plugins/api/ClientHook; +Lio/ktor/client/plugins/api/ClientPluginBuilder; +SPLio/ktor/client/plugins/api/ClientPluginBuilder;->(Lio/ktor/util/AttributeKey;Lio/ktor/client/HttpClient;Ljava/lang/Object;)V +SPLio/ktor/client/plugins/api/ClientPluginBuilder;->on(Lio/ktor/client/plugins/api/ClientHook;Lkotlin/coroutines/jvm/internal/SuspendLambda;)V +Lio/ktor/client/plugins/api/ClientPluginInstance; +SPLio/ktor/client/plugins/api/ClientPluginInstance;->(Lio/ktor/util/AttributeKey;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V +Lio/ktor/client/plugins/api/HookHandler; +SPLio/ktor/client/plugins/api/HookHandler;->(Lio/ktor/client/plugins/api/ClientHook;Lkotlin/coroutines/jvm/internal/SuspendLambda;)V +Lio/ktor/client/plugins/api/Send; +SPLio/ktor/client/plugins/api/Send;->()V +SPLio/ktor/client/plugins/api/Send;->(I)V +SPLio/ktor/client/plugins/api/Send;->install(Lio/ktor/client/HttpClient;Lkotlin/coroutines/jvm/internal/SuspendLambda;)V +Lio/ktor/client/plugins/api/Send$install$1; +SPLio/ktor/client/plugins/api/Send$install$1;->(Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +SPLio/ktor/client/plugins/api/Send$install$1;->(Lkotlin/jvm/functions/Function3;Lio/ktor/client/HttpClient;Lkotlin/coroutines/Continuation;)V +Lio/ktor/client/plugins/sse/SSECapability; +SPLio/ktor/client/plugins/sse/SSECapability;->()V +SPLio/ktor/client/plugins/sse/SSECapability;->hashCode()I +Lio/ktor/client/plugins/websocket/WebSocketCapability; +SPLio/ktor/client/plugins/websocket/WebSocketCapability;->()V +SPLio/ktor/client/plugins/websocket/WebSocketCapability;->hashCode()I +Lio/ktor/client/request/HttpSendPipeline; +SPLio/ktor/client/request/HttpSendPipeline;->()V +SPLio/ktor/client/request/HttpSendPipeline;->(I)V +Lio/ktor/client/statement/HttpReceivePipeline; +SPLio/ktor/client/statement/HttpReceivePipeline;->()V +SPLio/ktor/client/statement/HttpReceivePipeline;->(I)V +Lio/ktor/events/EventDefinition; +SPLio/ktor/events/EventDefinition;->(I)V +SPLio/ktor/events/EventDefinition;->create$default(Landroidx/navigation/internal/NavContext;Landroidx/navigation/NavDestination;Landroid/os/Bundle;Landroidx/lifecycle/Lifecycle$State;Landroidx/navigation/NavControllerViewModel;)Landroidx/navigation/NavBackStackEntry; +PLio/ktor/events/EventDefinition;->onResultReceived(ILjava/lang/Object;)V +Lio/ktor/events/Events; +SPLio/ktor/events/Events;->(I)V +SPLio/ktor/events/Events;->(IZ)V +SPLio/ktor/events/Events;->(Lcc/n0th1ng/tripmoney/data/dao/TripDao_Impl;Lio/ktor/utils/io/WriterJob;)V +SPLio/ktor/events/Events;->(Ljava/lang/Object;)V +SPLio/ktor/events/Events;->accessHint(Landroidx/paging/ViewportHint;)V +SPLio/ktor/events/Events;->getData()Lkotlinx/coroutines/flow/Flow; +SPLio/ktor/events/Events;->getFontLoadState()Landroidx/compose/runtime/State; +SPLio/ktor/events/Events;->getTrip(I)Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1; +SPLio/ktor/events/Events;->open(Ljava/lang/String;)Landroidx/sqlite/SQLiteConnection; +SPLio/ktor/events/Events;->runInIsolation(Landroidx/datastore/core/FileReadScope$readData$2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLio/ktor/events/Events;->updateData(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +Lio/ktor/http/CodecsKt$$ExternalSyntheticLambda1; +SPLio/ktor/http/CodecsKt$$ExternalSyntheticLambda1;->(ILjava/lang/Object;)V +SPLio/ktor/http/CodecsKt$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lio/ktor/http/HttpMethod; +SPLio/ktor/http/HttpMethod;->()V +SPLio/ktor/http/HttpMethod;->(Ljava/lang/String;)V +SPLio/ktor/http/HttpMethod;->hashCode()I +Lio/ktor/http/URLBuilderKt; +SPLio/ktor/http/URLBuilderKt;->Channel$default(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/channels/BufferedChannel; +SPLio/ktor/http/URLBuilderKt;->getJavaClass(Lkotlin/reflect/KClass;)Ljava/lang/Class; +SPLio/ktor/http/URLBuilderKt;->getJavaObjectType(Lkotlin/reflect/KClass;)Ljava/lang/Class; +SPLio/ktor/http/URLBuilderKt;->getProgressionLastElement(III)I +SPLio/ktor/http/URLBuilderKt;->invariant(Lkotlin/jvm/internal/TypeReference;)Lkotlin/reflect/KTypeProjection; +Lio/ktor/http/URLParserKt$$ExternalSyntheticLambda0; +SPLio/ktor/http/URLParserKt$$ExternalSyntheticLambda0;->(IILjava/lang/Object;)V +SPLio/ktor/http/URLParserKt$$ExternalSyntheticLambda0;->(ILjava/lang/Object;)V +Lio/ktor/http/Url$$ExternalSyntheticLambda0; +SPLio/ktor/http/Url$$ExternalSyntheticLambda0;->(ILjava/lang/Object;)V +SPLio/ktor/http/Url$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lio/ktor/http/Url$$ExternalSyntheticLambda1; +SPLio/ktor/http/Url$$ExternalSyntheticLambda1;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLio/ktor/http/Url$$ExternalSyntheticLambda1;->invoke()Ljava/lang/Object; +Lio/ktor/http/cio/CIOMultipartDataBase; +SPLio/ktor/http/cio/CIOMultipartDataBase;->(Lkotlin/coroutines/CoroutineContext;)V +SPLio/ktor/http/cio/CIOMultipartDataBase;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +Lio/ktor/util/AttributeKey; +SPLio/ktor/util/AttributeKey;->(Ljava/lang/String;Lio/ktor/util/reflect/TypeInfo;)V +SPLio/ktor/util/AttributeKey;->hashCode()I +Lio/ktor/util/ConcurrentSafeAttributes; +SPLio/ktor/util/ConcurrentSafeAttributes;->()V +SPLio/ktor/util/ConcurrentSafeAttributes;->computeIfAbsent(Lio/ktor/util/AttributeKey;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +SPLio/ktor/util/ConcurrentSafeAttributes;->getMap()Ljava/util/Map; +SPLio/ktor/util/ConcurrentSafeAttributes;->getOrNull(Lio/ktor/util/AttributeKey;)Ljava/lang/Object; +SPLio/ktor/util/ConcurrentSafeAttributes;->put(Lio/ktor/util/AttributeKey;Ljava/lang/Object;)V +Lio/ktor/util/CoroutinesUtilsKt$SilentSupervisor$$inlined$CoroutineExceptionHandler$1; +SPLio/ktor/util/CoroutinesUtilsKt$SilentSupervisor$$inlined$CoroutineExceptionHandler$1;->(Lkotlin/coroutines/CoroutineContext$Key;I)V +Lio/ktor/util/LRUCache; +SPLio/ktor/util/LRUCache;->(Landroidx/room/InvalidationTracker$implementation$1;Lkotlin/time/InstantKt$$ExternalSyntheticLambda0;I)V +Lio/ktor/util/PlatformUtils; +SPLio/ktor/util/PlatformUtils;->()V +Lio/ktor/util/StringValuesBuilder; +Lio/ktor/util/StringValuesBuilderImpl; +SPLio/ktor/util/StringValuesBuilderImpl;->(I)V +Lio/ktor/util/collections/CopyOnWriteHashMap; +SPLio/ktor/util/collections/CopyOnWriteHashMap;->()V +SPLio/ktor/util/collections/CopyOnWriteHashMap;->()V +Lio/ktor/util/date/GMTDate$$ExternalSyntheticLambda0; +SPLio/ktor/util/date/GMTDate$$ExternalSyntheticLambda0;->(I)V +SPLio/ktor/util/date/GMTDate$$ExternalSyntheticLambda0;->invoke()Ljava/lang/Object; +Lio/ktor/util/pipeline/PhaseContent; +SPLio/ktor/util/pipeline/PhaseContent;->()V +SPLio/ktor/util/pipeline/PhaseContent;->(Lkotlinx/coroutines/internal/Symbol;Lkotlin/io/CloseableKt;)V +Lio/ktor/util/pipeline/Pipeline; +SPLio/ktor/util/pipeline/Pipeline;->([Lkotlinx/coroutines/internal/Symbol;)V +SPLio/ktor/util/pipeline/Pipeline;->findPhase(Lkotlinx/coroutines/internal/Symbol;)Lio/ktor/util/pipeline/PhaseContent; +SPLio/ktor/util/pipeline/Pipeline;->findPhaseIndex(Lkotlinx/coroutines/internal/Symbol;)I +SPLio/ktor/util/pipeline/Pipeline;->hasPhase(Lkotlinx/coroutines/internal/Symbol;)Z +SPLio/ktor/util/pipeline/Pipeline;->intercept(Lkotlinx/coroutines/internal/Symbol;Lkotlin/jvm/functions/Function3;)V +Lio/ktor/util/pipeline/PipelinePhaseRelation$After; +SPLio/ktor/util/pipeline/PipelinePhaseRelation$After;->(Lkotlinx/coroutines/internal/Symbol;)V +Lio/ktor/util/pipeline/PipelinePhaseRelation$Before; +Lio/ktor/util/pipeline/PipelinePhaseRelation$Last; +SPLio/ktor/util/pipeline/PipelinePhaseRelation$Last;->()V +Lio/ktor/util/reflect/TypeInfo; +SPLio/ktor/util/reflect/TypeInfo;->(Lkotlin/jvm/internal/ClassReference;Lkotlin/jvm/internal/TypeReference;)V +SPLio/ktor/util/reflect/TypeInfo;->hashCode()I +Lio/ktor/utils/io/WriterJob; +SPLio/ktor/utils/io/WriterJob;->(Landroidx/paging/PageFetcher$flow$1$2$1;)V +SPLio/ktor/utils/io/WriterJob;->(Landroidx/savedstate/internal/SavedStateRegistryImpl;I)V +SPLio/ktor/utils/io/WriterJob;->(Lcc/n0th1ng/tripmoney/data/dao/ExchangeRateDao_Impl;Lio/ktor/events/Events;)V +SPLio/ktor/utils/io/WriterJob;->(Lcc/n0th1ng/tripmoney/data/dao/ExpenseDao_Impl;Lio/ktor/utils/io/WriterJob;)V +SPLio/ktor/utils/io/WriterJob;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLio/ktor/utils/io/WriterJob;->block$room_runtime()Z +SPLio/ktor/utils/io/WriterJob;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; +PLio/ktor/utils/io/WriterJob;->getExpensesDto(ILjava/lang/String;Lcc/n0th1ng/tripmoney/Filter;)Landroidx/room/coroutines/FlowUtil$createFlow$$inlined$map$1; +SPLio/ktor/utils/io/WriterJob;->getSavedStateProvider()Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; +SPLio/ktor/utils/io/WriterJob;->performRestore(Landroid/os/Bundle;)V +SPLio/ktor/utils/io/WriterJob;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V +SPLio/ktor/utils/io/WriterJob;->unblock$room_runtime()V +Lio/ktor/utils/io/charsets/TooLongLineException; +Lkotlin/Function; +Lkotlin/Lazy; +Lkotlin/LazyThreadSafetyMode; +SPLkotlin/LazyThreadSafetyMode;->()V +Lkotlin/NotImplementedError; +Lkotlin/Pair; +SPLkotlin/Pair;->(Ljava/lang/Object;Ljava/lang/Object;)V +Lkotlin/Result; +SPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable; +Lkotlin/Result$Failure; +SPLkotlin/Result$Failure;->(Ljava/lang/Throwable;)V +Lkotlin/ResultKt; +SPLkotlin/ResultKt;->()V +SPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Lkotlin/Result$Failure; +HSPLkotlin/ResultKt;->lazy(Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; +SPLkotlin/ResultKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/SynchronizedLazyImpl; +HSPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V +SPLkotlin/ResultKt;->ulongToDouble(J)D +Lkotlin/SafePublicationLazyImpl; +SPLkotlin/SafePublicationLazyImpl;->()V +SPLkotlin/SafePublicationLazyImpl;->getValue()Ljava/lang/Object; +Lkotlin/SynchronizedLazyImpl; +SPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;)V +SPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; +SPLkotlin/SynchronizedLazyImpl;->isInitialized()Z +Lkotlin/UIntArray$Iterator; +SPLkotlin/UIntArray$Iterator;->(ILjava/lang/Object;)V +SPLkotlin/UIntArray$Iterator;->hasNext()Z +SPLkotlin/UIntArray$Iterator;->next()Ljava/lang/Object; +Lkotlin/UNINITIALIZED_VALUE; +SPLkotlin/UNINITIALIZED_VALUE;->()V +Lkotlin/Unit; +SPLkotlin/Unit;->()V +Lkotlin/UnsafeLazyImpl; +SPLkotlin/UnsafeLazyImpl;->getValue()Ljava/lang/Object; +Lkotlin/collections/AbstractCollection; +SPLkotlin/collections/AbstractCollection;->isEmpty()Z +SPLkotlin/collections/AbstractCollection;->size()I +Lkotlin/collections/AbstractList; +SPLkotlin/collections/AbstractList;->equals(Ljava/lang/Object;)Z +Lkotlin/collections/AbstractMap; +SPLkotlin/collections/AbstractMap;->equals(Ljava/lang/Object;)Z +Lkotlin/collections/AbstractMutableList; +PLkotlin/collections/AbstractMutableList;->remove(I)Ljava/lang/Object; +SPLkotlin/collections/AbstractMutableList;->size()I +Lkotlin/collections/AbstractMutableSet; +SPLkotlin/collections/AbstractMutableSet;->size()I +Lkotlin/collections/AbstractSet; +SPLkotlin/collections/AbstractSet;->equals(Ljava/lang/Object;)Z +Lkotlin/collections/ArrayAsCollection; +SPLkotlin/collections/ArrayAsCollection;->([Ljava/lang/Object;Z)V +SPLkotlin/collections/ArrayAsCollection;->toArray()[Ljava/lang/Object; +Lkotlin/collections/ArrayDeque; +SPLkotlin/collections/ArrayDeque;->()V +SPLkotlin/collections/ArrayDeque;->()V +PLkotlin/collections/ArrayDeque;->add(ILjava/lang/Object;)V +SPLkotlin/collections/ArrayDeque;->addAll(Ljava/util/Collection;)Z +SPLkotlin/collections/ArrayDeque;->addFirst(Ljava/lang/Object;)V +HSPLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V +SPLkotlin/collections/ArrayDeque;->clear()V +SPLkotlin/collections/ArrayDeque;->contains(Ljava/lang/Object;)Z +SPLkotlin/collections/ArrayDeque;->copyCollectionElements(ILjava/util/Collection;)V +SPLkotlin/collections/ArrayDeque;->ensureCapacity$1(I)V +SPLkotlin/collections/ArrayDeque;->first()Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->firstOrNull()Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->get(I)Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->getSize()I +HSPLkotlin/collections/ArrayDeque;->incremented(I)I +SPLkotlin/collections/ArrayDeque;->indexOf(Ljava/lang/Object;)I +HSPLkotlin/collections/ArrayDeque;->isEmpty()Z +SPLkotlin/collections/ArrayDeque;->last()Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->lastOrNull()Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->positiveMod(I)I +HSPLkotlin/collections/ArrayDeque;->registerModification()V +PLkotlin/collections/ArrayDeque;->removeAt(I)Ljava/lang/Object; +HSPLkotlin/collections/ArrayDeque;->removeFirst()Ljava/lang/Object; +PLkotlin/collections/ArrayDeque;->removeLast()Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->toArray()[Ljava/lang/Object; +SPLkotlin/collections/ArrayDeque;->toArray([Ljava/lang/Object;)[Ljava/lang/Object; +Lkotlin/collections/ArraysKt___ArraysKt; +SPLkotlin/collections/ArraysKt___ArraysKt;->asList([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/ArraysKt___ArraysKt;->contains([Ljava/lang/Object;Ljava/lang/Object;)Z +SPLkotlin/collections/ArraysKt___ArraysKt;->copyInto$default([I[IIII)V +SPLkotlin/collections/ArraysKt___ArraysKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;III)V +HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto([I[IIII)V +PLkotlin/collections/ArraysKt___ArraysKt;->copyInto([J[JIII)V +HSPLkotlin/collections/ArraysKt___ArraysKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)V +PLkotlin/collections/ArraysKt___ArraysKt;->copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object; +PLkotlin/collections/ArraysKt___ArraysKt;->fill$default([II)V +HSPLkotlin/collections/ArraysKt___ArraysKt;->fill$default([JJ)V +PLkotlin/collections/ArraysKt___ArraysKt;->fill$default([Ljava/lang/Object;Lkotlinx/coroutines/internal/Symbol;)V +HSPLkotlin/collections/ArraysKt___ArraysKt;->fill(IILjava/lang/Object;[Ljava/lang/Object;)V +SPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNull([Ljava/lang/Object;)Ljava/util/ArrayList; +PLkotlin/collections/ArraysKt___ArraysKt;->getIndices([I)Lkotlin/ranges/IntRange; +PLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([J)I +SPLkotlin/collections/ArraysKt___ArraysKt;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I +HSPLkotlin/collections/ArraysKt___ArraysKt;->sortWith([Ljava/lang/Object;Ljava/util/Comparator;II)V +SPLkotlin/collections/ArraysKt___ArraysKt;->toList([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/ArraysKt___ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; +Lkotlin/collections/CollectionsKt; +HSPLkotlin/collections/CollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)V +HSPLkotlin/collections/CollectionsKt;->first(Ljava/util/List;)Ljava/lang/Object; +HSPLkotlin/collections/CollectionsKt;->firstOrNull(Ljava/util/List;)Ljava/lang/Object; +HSPLkotlin/collections/CollectionsKt;->getOrNull(ILjava/util/List;)Ljava/lang/Object; +HSPLkotlin/collections/CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt;->lastOrNull(Ljava/util/List;)Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt;->maxOrNull(Ljava/util/ArrayList;)Ljava/lang/Comparable; +SPLkotlin/collections/CollectionsKt;->minus(Ljava/util/List;Ljava/lang/Object;)Ljava/util/ArrayList; +SPLkotlin/collections/CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/ArrayList; +SPLkotlin/collections/CollectionsKt;->random(Ljava/util/Collection;)Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt;->removeFirst(Ljava/util/ArrayList;)Ljava/lang/Object; +PLkotlin/collections/CollectionsKt;->removeLast(Ljava/util/List;)Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt;->reversed(Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt;->sortedWith(Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt;->toList(Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt;->toMutableList(Ljava/lang/Iterable;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/ArrayList; +Lkotlin/collections/CollectionsKt__IteratorsJVMKt; +PLkotlin/collections/CollectionsKt__IteratorsJVMKt;->arrayListOf([Ljava/lang/Object;)Ljava/util/ArrayList; +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->checkRadix(I)V +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->closeFinally(Landroidx/sqlite/SQLiteStatement;Ljava/lang/Throwable;)V +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->coerceIn(DDD)D +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->coerceIn(FFF)F +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->coerceIn(III)I +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->createCoroutineUnintercepted(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function2;)Lkotlin/coroutines/Continuation; +HSPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->getLastIndex(Ljava/util/List;)I +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->isWhitespace(C)Z +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->listOf(Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->listOf([Ljava/lang/Object;)Ljava/util/List; +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->mutableListOf([Ljava/lang/Object;)Ljava/util/ArrayList; +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->startUndspatched(Lkotlinx/coroutines/internal/ScopeCoroutine;ZLkotlinx/coroutines/internal/ScopeCoroutine;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlin/collections/CollectionsKt__IteratorsJVMKt;->until(II)Lkotlin/ranges/IntRange; +Lkotlin/collections/CollectionsKt__IteratorsKt; +Lkotlin/collections/CollectionsKt__MutableCollectionsJVMKt; +HSPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sortWith(Ljava/util/List;Ljava/util/Comparator;)V +Lkotlin/collections/EmptyIterator; +SPLkotlin/collections/EmptyIterator;->()V +SPLkotlin/collections/EmptyIterator;->hasNext()Z +SPLkotlin/collections/EmptyIterator;->hasPrevious()Z +Lkotlin/collections/EmptyList; +SPLkotlin/collections/EmptyList;->()V +SPLkotlin/collections/EmptyList;->contains(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptyList;->equals(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptyList;->isEmpty()Z +SPLkotlin/collections/EmptyList;->iterator()Ljava/util/Iterator; +SPLkotlin/collections/EmptyList;->listIterator(I)Ljava/util/ListIterator; +SPLkotlin/collections/EmptyList;->size()I +SPLkotlin/collections/EmptyList;->toArray()[Ljava/lang/Object; +Lkotlin/collections/EmptyMap; +SPLkotlin/collections/EmptyMap;->()V +SPLkotlin/collections/EmptyMap;->containsKey(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptyMap;->entrySet()Ljava/util/Set; +SPLkotlin/collections/EmptyMap;->equals(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptyMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlin/collections/EmptyMap;->isEmpty()Z +SPLkotlin/collections/EmptyMap;->keySet()Ljava/util/Set; +SPLkotlin/collections/EmptyMap;->size()I +Lkotlin/collections/EmptySet; +SPLkotlin/collections/EmptySet;->()V +SPLkotlin/collections/EmptySet;->contains(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptySet;->equals(Ljava/lang/Object;)Z +SPLkotlin/collections/EmptySet;->isEmpty()Z +SPLkotlin/collections/EmptySet;->iterator()Ljava/util/Iterator; +SPLkotlin/collections/EmptySet;->size()I +Lkotlin/collections/IndexedValue; +SPLkotlin/collections/IndexedValue;->(ILjava/lang/Object;)V +Lkotlin/collections/IndexingIterable; +SPLkotlin/collections/IndexingIterable;->()V +SPLkotlin/collections/IndexingIterable;->iterator()Ljava/util/Iterator; +Lkotlin/collections/IntIterator; +Lkotlin/collections/MapsKt__MapsKt; +SPLkotlin/collections/MapsKt__MapsKt;->mapCapacity(I)I +SPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/HashMap;[Lkotlin/Pair;)V +SPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/util/ArrayList;)Ljava/util/Map; +SPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map; +PLkotlin/collections/ReversedListReadOnly;->(Ljava/util/List;)V +PLkotlin/collections/ReversedListReadOnly;->getSize()I +PLkotlin/collections/ReversedListReadOnly;->iterator()Ljava/util/Iterator; +PLkotlin/collections/ReversedListReadOnly$listIterator$1;->(Lkotlin/collections/ReversedListReadOnly;I)V +Lkotlin/collections/builders/ListBuilder$Itr; +SPLkotlin/collections/builders/ListBuilder$Itr;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;I)V +SPLkotlin/collections/builders/ListBuilder$Itr;->hasNext()Z +PLkotlin/collections/builders/ListBuilder$Itr;->next()Ljava/lang/Object; +PLkotlin/collections/builders/ListBuilder$Itr;->validateModification()V +Lkotlin/collections/builders/MapBuilder; +SPLkotlin/collections/builders/MapBuilder;->()V +SPLkotlin/collections/builders/MapBuilder;->()V +SPLkotlin/collections/builders/MapBuilder;->(I)V +SPLkotlin/collections/builders/MapBuilder;->addKey$kotlin_stdlib(Ljava/lang/Object;)I +SPLkotlin/collections/builders/MapBuilder;->build()Lkotlin/collections/builders/MapBuilder; +SPLkotlin/collections/builders/MapBuilder;->checkIsMutable$kotlin_stdlib()V +PLkotlin/collections/builders/MapBuilder;->entrySet()Ljava/util/Set; +SPLkotlin/collections/builders/MapBuilder;->hash(Ljava/lang/Object;)I +SPLkotlin/collections/builders/MapBuilder;->isEmpty()Z +PLkotlin/collections/builders/MapBuilder;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLkotlin/collections/builders/MapBuilder;->size()I +PLkotlin/collections/builders/MapBuilder$EntryRef;->(Lkotlin/collections/builders/MapBuilder;I)V +PLkotlin/collections/builders/MapBuilder$EntryRef;->checkForComodification$5()V +PLkotlin/collections/builders/MapBuilder$EntryRef;->getKey()Ljava/lang/Object; +PLkotlin/collections/builders/MapBuilder$EntryRef;->getValue()Ljava/lang/Object; +Lkotlin/collections/builders/MapBuilder$KeysItr; +SPLkotlin/collections/builders/MapBuilder$KeysItr;->(Lkotlin/collections/builders/MapBuilder;I)V +SPLkotlin/collections/builders/MapBuilder$KeysItr;->next()Ljava/lang/Object; +PLkotlin/collections/builders/MapBuilderKeys;->(Lkotlin/collections/builders/MapBuilder;I)V +PLkotlin/collections/builders/MapBuilderKeys;->iterator()Ljava/util/Iterator; +Lkotlin/collections/builders/SetBuilder; +SPLkotlin/collections/builders/SetBuilder;->()V +SPLkotlin/collections/builders/SetBuilder;->()V +SPLkotlin/collections/builders/SetBuilder;->(Lkotlin/collections/builders/MapBuilder;)V +SPLkotlin/collections/builders/SetBuilder;->add(Ljava/lang/Object;)Z +SPLkotlin/collections/builders/SetBuilder;->getSize()I +SPLkotlin/collections/builders/SetBuilder;->isEmpty()Z +SPLkotlin/collections/builders/SetBuilder;->iterator()Ljava/util/Iterator; +Lkotlin/coroutines/AbstractCoroutineContextElement; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->(Lkotlin/coroutines/CoroutineContext$Key;)V +SPLkotlin/coroutines/AbstractCoroutineContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlin/coroutines/AbstractCoroutineContextElement;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/CombinedContext; +HSPLkotlin/coroutines/CombinedContext;->(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)V +SPLkotlin/coroutines/CombinedContext;->equals(Ljava/lang/Object;)Z +HSPLkotlin/coroutines/CombinedContext;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +HSPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/CombinedContext$$ExternalSyntheticLambda0; +SPLkotlin/coroutines/CombinedContext$$ExternalSyntheticLambda0;->(I)V +Lkotlin/coroutines/Continuation; +Lkotlin/coroutines/ContinuationInterceptor; +Lkotlin/coroutines/ContinuationInterceptor$Key; +SPLkotlin/coroutines/ContinuationInterceptor$Key;->()V +Lkotlin/coroutines/CoroutineContext; +Lkotlin/coroutines/CoroutineContext$Element; +Lkotlin/coroutines/CoroutineContext$Key; +Lkotlin/coroutines/EmptyCoroutineContext; +SPLkotlin/coroutines/EmptyCoroutineContext;->()V +SPLkotlin/coroutines/EmptyCoroutineContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlin/coroutines/EmptyCoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlin/coroutines/EmptyCoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +PLkotlin/coroutines/SafeContinuation;->()V +PLkotlin/coroutines/SafeContinuation;->(Lkotlin/coroutines/Continuation;)V +PLkotlin/coroutines/SafeContinuation;->resumeWith(Ljava/lang/Object;)V +Lkotlin/coroutines/intrinsics/CoroutineSingletons; +SPLkotlin/coroutines/intrinsics/CoroutineSingletons;->()V +Lkotlin/coroutines/jvm/internal/BaseContinuationImpl; +SPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->(Lkotlin/coroutines/Continuation;)V +PLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->releaseIntercepted()V +Lkotlin/coroutines/jvm/internal/CompletedContinuation; +SPLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V +Lkotlin/coroutines/jvm/internal/ContinuationImpl; +SPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V +HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; +HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->releaseIntercepted()V +Lkotlin/coroutines/jvm/internal/CoroutineStackFrame; +PLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->(Lkotlin/coroutines/Continuation;)V +PLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; +PLkotlin/coroutines/jvm/internal/RestrictedSuspendLambda;->(ILkotlin/coroutines/Continuation;)V +Lkotlin/coroutines/jvm/internal/SuspendLambda; +HSPLkotlin/coroutines/jvm/internal/SuspendLambda;->(ILkotlin/coroutines/Continuation;)V +SPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I +Lkotlin/enums/EnumEntries; +Lkotlin/enums/EnumEntriesList; +SPLkotlin/enums/EnumEntriesList;->([Ljava/lang/Enum;)V +SPLkotlin/enums/EnumEntriesList;->get(I)Ljava/lang/Object; +SPLkotlin/enums/EnumEntriesList;->getSize()I +Lkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion; +SPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V +Lkotlin/io/CloseableKt; +SPLkotlin/io/CloseableKt;->build(Lkotlin/collections/builders/SetBuilder;)Lkotlin/collections/builders/SetBuilder; +PLkotlin/io/CloseableKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V +PLkotlin/io/CloseableKt;->copyOfRangeToIndexCheck(II)V +HSPLkotlin/io/CloseableKt;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlin/io/CloseableKt;->plus(Ljava/util/Set;Landroidx/navigation/NavBackStackEntry;)Ljava/util/LinkedHashSet; +SPLkotlin/io/CloseableKt;->plus(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +SPLkotlin/io/CloseableKt;->setOf(Ljava/lang/Object;)Ljava/util/Set; +Lkotlin/jvm/functions/Function0; +Lkotlin/jvm/functions/Function1; +Lkotlin/jvm/functions/Function12; +Lkotlin/jvm/functions/Function2; +Lkotlin/jvm/functions/Function22; +Lkotlin/jvm/functions/Function3; +Lkotlin/jvm/functions/Function4; +Lkotlin/jvm/functions/Function5; +Lkotlin/jvm/functions/Function8; +Lkotlin/jvm/internal/AdaptedFunctionReference; +SPLkotlin/jvm/internal/AdaptedFunctionReference;->(IILjava/lang/Class;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V +Lkotlin/jvm/internal/CallableReference; +SPLkotlin/jvm/internal/CallableReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V +Lkotlin/jvm/internal/CallableReference$NoReceiver; +SPLkotlin/jvm/internal/CallableReference$NoReceiver;->()V +Lkotlin/jvm/internal/ClassBasedDeclarationContainer; +Lkotlin/jvm/internal/ClassReference; +SPLkotlin/jvm/internal/ClassReference;->()V +SPLkotlin/jvm/internal/ClassReference;->(Ljava/lang/Class;)V +SPLkotlin/jvm/internal/ClassReference;->equals(Ljava/lang/Object;)Z +SPLkotlin/jvm/internal/ClassReference;->getJClass()Ljava/lang/Class; +SPLkotlin/jvm/internal/ClassReference;->getQualifiedName()Ljava/lang/String; +SPLkotlin/jvm/internal/ClassReference;->hashCode()I +SPLkotlin/jvm/internal/ClassReference;->isInstance(Ljava/lang/Object;)Z +Lkotlin/jvm/internal/FunctionAdapter; +Lkotlin/jvm/internal/FunctionBase; +Lkotlin/jvm/internal/FunctionReferenceImpl; +SPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +SPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;II)V +SPLkotlin/jvm/internal/FunctionReferenceImpl;->getArity()I +Lkotlin/jvm/internal/Intrinsics; +HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V +HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V +SPLkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V +HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V +SPLkotlin/jvm/internal/Intrinsics;->compare(II)I +SPLkotlin/jvm/internal/Intrinsics;->compare(JJ)I +Lkotlin/jvm/internal/Intrinsics$Kotlin; +SPLkotlin/jvm/internal/Intrinsics$Kotlin;->()V +SPLkotlin/jvm/internal/Intrinsics$Kotlin;->toArray(Ljava/util/Collection;)[Ljava/lang/Object; +Lkotlin/jvm/internal/KotlinGenericDeclaration; +Lkotlin/jvm/internal/Lambda; +HSPLkotlin/jvm/internal/Lambda;->(I)V +SPLkotlin/jvm/internal/Lambda;->getArity()I +Lkotlin/jvm/internal/MutablePropertyReference; +Lkotlin/jvm/internal/MutablePropertyReference1Impl; +SPLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Ljava/lang/String;Ljava/lang/String;)V +Lkotlin/jvm/internal/PropertyReference; +SPLkotlin/jvm/internal/PropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +SPLkotlin/jvm/internal/PropertyReference;->equals(Ljava/lang/Object;)Z +Lkotlin/jvm/internal/PropertyReference1Impl; +SPLkotlin/jvm/internal/PropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +Lkotlin/jvm/internal/Ref$BooleanRef; +Lkotlin/jvm/internal/Ref$IntRef; +Lkotlin/jvm/internal/Ref$ObjectRef; +Lkotlin/jvm/internal/Reflection; +SPLkotlin/jvm/internal/Reflection;->()V +SPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/jvm/internal/ClassReference; +SPLkotlin/jvm/internal/Reflection;->setUpperBounds(Lkotlin/jvm/internal/TypeParameterReference;Lkotlin/jvm/internal/TypeReference;)V +SPLkotlin/jvm/internal/Reflection;->typeOf(Ljava/lang/Class;)Lkotlin/jvm/internal/TypeReference; +SPLkotlin/jvm/internal/Reflection;->typeOf(Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/jvm/internal/TypeReference; +Lkotlin/jvm/internal/ReflectionFactory; +SPLkotlin/jvm/internal/ReflectionFactory;->typeOf(Lkotlin/reflect/KClassifier;Ljava/util/List;)Lkotlin/jvm/internal/TypeReference; +Lkotlin/jvm/internal/TypeIntrinsics; +HSPLkotlin/jvm/internal/TypeIntrinsics;->beforeCheckcastToFunctionOfArity(ILjava/lang/Object;)V +SPLkotlin/jvm/internal/TypeIntrinsics;->classFqNameOf(Ljava/lang/String;)Ljava/lang/String; +Lkotlin/jvm/internal/TypeParameterReference; +SPLkotlin/jvm/internal/TypeParameterReference;->(Lkotlin/jvm/internal/ClassReference;)V +SPLkotlin/jvm/internal/TypeParameterReference;->hashCode()I +Lkotlin/jvm/internal/TypeReference; +SPLkotlin/jvm/internal/TypeReference;->(Lkotlin/reflect/KClassifier;Ljava/util/List;I)V +SPLkotlin/jvm/internal/TypeReference;->hashCode()I +Lkotlin/jvm/internal/markers/KMappedMarker; +Lkotlin/jvm/internal/markers/KMutableCollection; +Lkotlin/jvm/internal/markers/KMutableList; +Lkotlin/jvm/internal/markers/KMutableMap; +Lkotlin/jvm/internal/markers/KMutableSet; +Lkotlin/math/MathKt; +SPLkotlin/math/MathKt;->LazyColumn(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/foundation/gestures/FlingBehavior;ZLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ComposerImpl;II)V +SPLkotlin/math/MathKt;->PredictiveBackHandler(ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;I)V +SPLkotlin/math/MathKt;->RoundRect-gG7oq9Y(FFFFJ)Landroidx/compose/ui/geometry/RoundRect; +PLkotlin/math/MathKt;->addPointerInputChange-0AR0LA0(Landroidx/compose/ui/draw/DrawResult;Landroidx/compose/ui/input/pointer/PointerInputChange;J)V +SPLkotlin/math/MathKt;->createFontFamilyResolver(Landroid/content/Context;)Landroidx/compose/ui/text/font/FontFamilyResolverImpl; +PLkotlin/math/MathKt;->dot([F[F)F +SPLkotlin/math/MathKt;->fitPrioritizingHeight-Zbe2FdA(IIII)J +HSPLkotlin/math/MathKt;->fitPrioritizingWidth-Zbe2FdA(IIII)J +HSPLkotlin/math/MathKt;->getAutofillId(Landroid/view/View;)Landroidx/compose/ui/platform/coreshims/AutofillIdCompat; +SPLkotlin/math/MathKt;->isSimple(Landroidx/compose/ui/geometry/RoundRect;)Z +SPLkotlin/math/MathKt;->plus-Nv-tHpc(JJ)J +PLkotlin/math/MathKt;->polyFitLeastSquares([F[FI[F)V +HSPLkotlin/math/MathKt;->resolveLineHeightInPx-o2QH7mI(JFLandroidx/compose/ui/unit/Density;)F +SPLkotlin/math/MathKt;->round-k-4lQ0M(J)J +SPLkotlin/math/MathKt;->roundToInt(F)I +PLkotlin/math/MathKt;->roundToLong(D)J +HSPLkotlin/math/MathKt;->setObject-DKhxnng(Landroidx/compose/runtime/changelist/Operations;ILjava/lang/Object;)V +SPLkotlin/math/MathKt;->setObjects-4uCC6AY(Landroidx/compose/runtime/changelist/Operations;ILjava/lang/Object;ILjava/lang/Object;)V +SPLkotlin/math/MathKt;->stringResource(ILandroidx/compose/runtime/ComposerImpl;)Ljava/lang/String; +Lkotlin/random/AbstractPlatformRandom; +Lkotlin/random/FallbackThreadLocalRandom$implStorage$1; +SPLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->(I)V +Lkotlin/random/Random; +SPLkotlin/random/Random;->()V +Lkotlin/random/Random$Default; +SPLkotlin/random/Random$Default;->nextDouble(D)D +Lkotlin/random/jdk8/PlatformThreadLocalRandom; +SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->getImpl()Ljava/util/Random; +SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->nextInt$1(I)I +SPLkotlin/random/jdk8/PlatformThreadLocalRandom;->nextLong(JJ)J +Lkotlin/ranges/IntProgression; +SPLkotlin/ranges/IntProgression;->(III)V +SPLkotlin/ranges/IntProgression;->iterator()Ljava/util/Iterator; +Lkotlin/ranges/IntProgressionIterator; +SPLkotlin/ranges/IntProgressionIterator;->(III)V +SPLkotlin/ranges/IntProgressionIterator;->nextInt()I +Lkotlin/ranges/IntRange; +SPLkotlin/ranges/IntRange;->()V +PLkotlin/ranges/IntRange;->contains(I)Z +PLkotlin/ranges/IntRange;->equals(Ljava/lang/Object;)Z +PLkotlin/ranges/IntRange;->isEmpty()Z +Lkotlin/reflect/KCallable; +Lkotlin/reflect/KClass; +Lkotlin/reflect/KClassifier; +Lkotlin/reflect/KProperty; +Lkotlin/reflect/KProperty0; +Lkotlin/reflect/KProperty1; +Lkotlin/reflect/KTypeProjection; +SPLkotlin/reflect/KTypeProjection;->()V +SPLkotlin/reflect/KTypeProjection;->(Lkotlin/reflect/KVariance;Lkotlin/jvm/internal/TypeReference;)V +SPLkotlin/reflect/KTypeProjection;->hashCode()I +Lkotlin/reflect/KVariance; +SPLkotlin/reflect/KVariance;->()V +Lkotlin/sequences/ConstrainedOnceSequence; +SPLkotlin/sequences/ConstrainedOnceSequence;->(Lkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1;)V +SPLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator; +Lkotlin/sequences/FilteringSequence; +SPLkotlin/sequences/FilteringSequence;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;I)V +SPLkotlin/sequences/FilteringSequence;->iterator()Ljava/util/Iterator; +Lkotlin/sequences/FilteringSequence$iterator$1; +SPLkotlin/sequences/FilteringSequence$iterator$1;->(Lkotlin/sequences/FilteringSequence;)V +SPLkotlin/sequences/FilteringSequence$iterator$1;->calcNext()V +SPLkotlin/sequences/FilteringSequence$iterator$1;->hasNext()Z +SPLkotlin/sequences/FilteringSequence$iterator$1;->next()Ljava/lang/Object; +Lkotlin/sequences/GeneratorSequence$iterator$1; +SPLkotlin/sequences/GeneratorSequence$iterator$1;->(Lkotlin/sequences/FilteringSequence;)V +SPLkotlin/sequences/GeneratorSequence$iterator$1;->calcNext$1()V +SPLkotlin/sequences/GeneratorSequence$iterator$1;->hasNext()Z +SPLkotlin/sequences/GeneratorSequence$iterator$1;->next()Ljava/lang/Object; +Lkotlin/sequences/Sequence; +Lkotlin/sequences/SequencesKt; +SPLkotlin/sequences/SequencesKt;->asSequence(Ljava/util/Iterator;)Lkotlin/sequences/Sequence; +SPLkotlin/sequences/SequencesKt;->firstOrNull(Lkotlin/sequences/Sequence;)Ljava/lang/Object; +SPLkotlin/sequences/SequencesKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; +SPLkotlin/sequences/SequencesKt;->toList(Lkotlin/sequences/Sequence;)Ljava/util/List; +Lkotlin/sequences/TakeWhileSequence; +SPLkotlin/sequences/TakeWhileSequence;->(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;I)V +Lkotlin/sequences/TransformingSequence$iterator$1; +SPLkotlin/sequences/TransformingSequence$iterator$1;->(Lkotlin/sequences/TakeWhileSequence;)V +SPLkotlin/sequences/TransformingSequence$iterator$1;->hasNext()Z +SPLkotlin/sequences/TransformingSequence$iterator$1;->next()Ljava/lang/Object; +Lkotlin/text/Charsets; +SPLkotlin/text/Charsets;->()V +Lkotlin/text/MatcherMatchResult$groups$1; +SPLkotlin/text/MatcherMatchResult$groups$1;->(ILjava/lang/Object;)V +Lkotlin/text/Regex; +SPLkotlin/text/Regex;->(Ljava/lang/String;)V +SPLkotlin/text/Regex;->(Ljava/lang/String;I)V +SPLkotlin/text/Regex;->find$default(Lkotlin/text/Regex;Ljava/lang/String;)Lokhttp3/Dispatcher; +SPLkotlin/text/Regex;->matchEntire(Ljava/lang/String;)Lokhttp3/Dispatcher; +Lkotlin/text/StringsKt; +SPLkotlin/text/StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/String;Z)Z +SPLkotlin/text/StringsKt;->endsWith$default(Ljava/lang/CharSequence;Ljava/lang/String;)Z +SPLkotlin/text/StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I +SPLkotlin/text/StringsKt;->indexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZI)I +SPLkotlin/text/StringsKt;->indexOf(Ljava/lang/CharSequence;Ljava/lang/String;IZ)I +SPLkotlin/text/StringsKt;->isBlank(Ljava/lang/CharSequence;)Z +HSPLkotlin/text/StringsKt;->last(Ljava/lang/CharSequence;)C +SPLkotlin/text/StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CII)I +SPLkotlin/text/StringsKt;->substringAfter(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt;->substringAfterLast(CLjava/lang/String;Ljava/lang/String;)Ljava/lang/String; +SPLkotlin/text/StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +Lkotlin/text/StringsKt__IndentKt; +Lkotlin/text/StringsKt__RegexExtensionsJVMKt; +Lkotlin/text/StringsKt__RegexExtensionsKt; +Lkotlin/text/StringsKt__StringBuilderJVMKt; +Lkotlin/text/StringsKt__StringBuilderKt; +Lkotlin/text/StringsKt__StringNumberConversionsJVMKt; +Lkotlin/text/StringsKt__StringsJVMKt; +SPLkotlin/text/StringsKt__StringsJVMKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;)Z +SPLkotlin/text/StringsKt__StringsJVMKt;->equals(Ljava/lang/String;Ljava/lang/String;Z)Z +SPLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +Lkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1; +SPLkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1;->(ILjava/lang/Object;)V +SPLkotlin/text/StringsKt__StringsKt$lineSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; +PLkotlin/time/Duration;->()V +PLkotlin/time/DurationJvmKt;->()V +PLkotlin/time/DurationUnit;->()V +PLkotlin/time/DurationUnit;->(Ljava/lang/String;ILjava/util/concurrent/TimeUnit;)V +PLkotlin/time/InstantKt;->()V +HPLkotlin/time/InstantKt;->convertDurationUnitOverflow(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J +PLkotlin/time/InstantKt;->durationOfMillis(J)J +HPLkotlin/time/InstantKt;->toDuration(JLkotlin/time/DurationUnit;)J +Lkotlin/time/InstantKt$$ExternalSyntheticLambda0; +SPLkotlin/time/InstantKt$$ExternalSyntheticLambda0;->(I)V +SPLkotlin/time/InstantKt$$ExternalSyntheticLambda0;->(Lio/ktor/client/HttpClientConfig;)V +HSPLkotlin/time/InstantKt$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlin/time/InstantParseResult; +PLkotlin/time/MonotonicTimeSource;->()V +Lkotlinx/coroutines/AbstractCoroutine; +HSPLkotlinx/coroutines/AbstractCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V +SPLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String; +SPLkotlinx/coroutines/AbstractCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/AbstractCoroutine;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/AbstractCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V +SPLkotlinx/coroutines/AbstractCoroutine;->onCompleted(Ljava/lang/Object;)V +SPLkotlinx/coroutines/AbstractCoroutine;->onCompletionInternal(Ljava/lang/Object;)V +SPLkotlinx/coroutines/AbstractCoroutine;->resumeWith(Ljava/lang/Object;)V +SPLkotlinx/coroutines/AbstractCoroutine;->start(Lkotlinx/coroutines/CoroutineStart;Lkotlinx/coroutines/AbstractCoroutine;Lkotlin/jvm/functions/Function2;)V +Lkotlinx/coroutines/Active; +SPLkotlinx/coroutines/Active;->()V +Lkotlinx/coroutines/BlockingCoroutine; +Lkotlinx/coroutines/BlockingEventLoop; +SPLkotlinx/coroutines/BlockingEventLoop;->(Ljava/lang/Thread;)V +Lkotlinx/coroutines/CancellableContinuation; +Lkotlinx/coroutines/CancellableContinuationImpl; +SPLkotlinx/coroutines/CancellableContinuationImpl;->()V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->(ILkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->callCancelHandler(Lkotlinx/coroutines/DisposeOnCancel;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->callSegmentOnCancellation(Lkotlinx/coroutines/internal/Segment;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z +PLkotlinx/coroutines/CancellableContinuationImpl;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/CancellableContinuationImpl;->completeResume(Ljava/lang/Object;)V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/JobSupport;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; +HSPLkotlinx/coroutines/CancellableContinuationImpl;->getResult()Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlinx/coroutines/CancellableContinuationImpl;->initCancellability()V +SPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlin/jvm/functions/Function1;)V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellationImpl(Lkotlinx/coroutines/NotCompleted;)V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->isReusable()Z +HSPLkotlinx/coroutines/CancellableContinuationImpl;->releaseClaimedReusableContinuation$kotlinx_coroutines_core()V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl$kotlinx_coroutines_core(Ljava/lang/Object;ILkotlin/jvm/functions/Function3;)V +PLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;)V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V +HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function3;)Ljava/lang/Object; +SPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; +HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/internal/Symbol; +Lkotlinx/coroutines/CancelledContinuation; +SPLkotlinx/coroutines/CancelledContinuation;->()V +Lkotlinx/coroutines/ChildContinuation; +SPLkotlinx/coroutines/ChildContinuation;->(Lkotlinx/coroutines/CancellableContinuationImpl;I)V +SPLkotlinx/coroutines/ChildContinuation;->getOnCancelling()Z +SPLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/ChildHandle; +Lkotlinx/coroutines/ChildHandleNode; +SPLkotlinx/coroutines/ChildHandleNode;->(Lkotlinx/coroutines/JobSupport;)V +SPLkotlinx/coroutines/ChildHandleNode;->childCancelled(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/ChildHandleNode;->getOnCancelling()Z +SPLkotlinx/coroutines/ChildHandleNode;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/CompletableDeferred; +Lkotlinx/coroutines/CompletableDeferredImpl; +Lkotlinx/coroutines/CompletableJob; +Lkotlinx/coroutines/CompletedContinuation; +SPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/DisposeOnCancel;Lkotlin/jvm/functions/Function3;Ljava/lang/Object;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/DisposeOnCancel;Lkotlin/jvm/functions/Function3;Ljava/lang/Throwable;I)V +PLkotlinx/coroutines/CompletedContinuation;->copy$default(Lkotlinx/coroutines/CompletedContinuation;Lkotlinx/coroutines/DisposeOnCancel;Ljava/lang/Throwable;I)Lkotlinx/coroutines/CompletedContinuation; +Lkotlinx/coroutines/CompletedExceptionally; +SPLkotlinx/coroutines/CompletedExceptionally;->()V +SPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;Z)V +Lkotlinx/coroutines/CopyableThrowable; +Lkotlinx/coroutines/CoroutineDispatcher; +SPLkotlinx/coroutines/CoroutineDispatcher;->()V +SPLkotlinx/coroutines/CoroutineDispatcher;->()V +PLkotlinx/coroutines/CoroutineDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +HSPLkotlinx/coroutines/CoroutineDispatcher;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +HSPLkotlinx/coroutines/CoroutineDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z +SPLkotlinx/coroutines/CoroutineDispatcher;->limitedParallelism(I)Lkotlinx/coroutines/CoroutineDispatcher; +SPLkotlinx/coroutines/CoroutineDispatcher;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/CoroutineDispatcher$Key; +SPLkotlinx/coroutines/CoroutineDispatcher$Key;->(Lkotlin/coroutines/CoroutineContext$Key;Lkotlin/jvm/functions/Function1;)V +Lkotlinx/coroutines/CoroutineExceptionHandler; +Lkotlinx/coroutines/CoroutineName; +SPLkotlinx/coroutines/CoroutineName;->()V +SPLkotlinx/coroutines/CoroutineName;->(Ljava/lang/String;)V +Lkotlinx/coroutines/CoroutineScope; +Lkotlinx/coroutines/CoroutineStart; +SPLkotlinx/coroutines/CoroutineStart;->()V +Lkotlinx/coroutines/DefaultExecutor; +SPLkotlinx/coroutines/DefaultExecutor;->()V +PLkotlinx/coroutines/DefaultExecutor;->acknowledgeShutdownIfNeeded()V +SPLkotlinx/coroutines/DefaultExecutor;->getThread()Ljava/lang/Thread; +SPLkotlinx/coroutines/DefaultExecutor;->run()V +Lkotlinx/coroutines/DefaultExecutorKt; +SPLkotlinx/coroutines/DefaultExecutorKt;->()V +Lkotlinx/coroutines/DeferredCoroutine; +SPLkotlinx/coroutines/DeferredCoroutine;->(Lkotlin/coroutines/CoroutineContext;ZI)V +Lkotlinx/coroutines/Delay; +Lkotlinx/coroutines/DispatchException; +Lkotlinx/coroutines/DispatchedCoroutine; +SPLkotlinx/coroutines/DispatchedCoroutine;->()V +SPLkotlinx/coroutines/DispatchedCoroutine;->afterResume(Ljava/lang/Object;)V +Lkotlinx/coroutines/DispatchedTask; +SPLkotlinx/coroutines/DispatchedTask;->(I)V +SPLkotlinx/coroutines/DispatchedTask;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/util/concurrent/CancellationException;)V +HSPLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/Dispatchers; +SPLkotlinx/coroutines/Dispatchers;->()V +Lkotlinx/coroutines/DisposableHandle; +Lkotlinx/coroutines/DisposeOnCancel; +SPLkotlinx/coroutines/DisposeOnCancel;->(ILjava/lang/Object;)V +Lkotlinx/coroutines/Empty; +SPLkotlinx/coroutines/Empty;->(Z)V +SPLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/Empty;->isActive()Z +Lkotlinx/coroutines/EventLoopImplBase; +SPLkotlinx/coroutines/EventLoopImplBase;->()V +SPLkotlinx/coroutines/EventLoopImplBase;->enqueueDelayedTasks()V +PLkotlinx/coroutines/EventLoopImplBase;->enqueueImpl(Ljava/lang/Runnable;)Z +PLkotlinx/coroutines/EventLoopImplBase;->isEmpty()Z +SPLkotlinx/coroutines/EventLoopImplBase;->processNextEvent()J +SPLkotlinx/coroutines/EventLoopImplBase;->schedule(JLkotlinx/coroutines/EventLoopImplBase$DelayedTask;)V +SPLkotlinx/coroutines/EventLoopImplBase;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuationImpl;)V +Lkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask; +SPLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->(Lkotlinx/coroutines/EventLoopImplBase;JLkotlinx/coroutines/CancellableContinuationImpl;)V +PLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->run()V +Lkotlinx/coroutines/EventLoopImplBase$DelayedTask; +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->(J)V +PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->compareTo(Ljava/lang/Object;)I +PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->dispose()V +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->scheduleTask(JLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;Lkotlinx/coroutines/EventLoopImplBase;)I +SPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setHeap(Lkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;)V +Lkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue; +Lkotlinx/coroutines/EventLoopImplPlatform; +SPLkotlinx/coroutines/EventLoopImplPlatform;->decrementUseCount(Z)V +SPLkotlinx/coroutines/EventLoopImplPlatform;->dispatchUnconfined(Lkotlinx/coroutines/DispatchedTask;)V +SPLkotlinx/coroutines/EventLoopImplPlatform;->incrementUseCount(Z)V +HSPLkotlinx/coroutines/EventLoopImplPlatform;->processUnconfinedEvent()Z +Lkotlinx/coroutines/ExecutorCoroutineDispatcher; +SPLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V +Lkotlinx/coroutines/ExecutorCoroutineDispatcherImpl; +SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->(Ljava/util/concurrent/Executor;)V +SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/ExecutorCoroutineDispatcherImpl;->equals(Ljava/lang/Object;)Z +Lkotlinx/coroutines/GlobalScope; +SPLkotlinx/coroutines/GlobalScope;->()V +SPLkotlinx/coroutines/GlobalScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/InactiveNodeList; +SPLkotlinx/coroutines/InactiveNodeList;->(Lkotlinx/coroutines/NodeList;)V +SPLkotlinx/coroutines/InactiveNodeList;->getList()Lkotlinx/coroutines/NodeList; +PLkotlinx/coroutines/InactiveNodeList;->isActive()Z +Lkotlinx/coroutines/Incomplete; +Lkotlinx/coroutines/IncompleteStateBox; +Lkotlinx/coroutines/InvokeOnCompletion; +SPLkotlinx/coroutines/InvokeOnCompletion;->(ILjava/lang/Object;)V +SPLkotlinx/coroutines/InvokeOnCompletion;->getOnCancelling()Z +PLkotlinx/coroutines/InvokeOnCompletion;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/Job; +Lkotlinx/coroutines/Job$Key; +SPLkotlinx/coroutines/Job$Key;->()V +Lkotlinx/coroutines/JobCancellationException; +SPLkotlinx/coroutines/JobCancellationException;->(Ljava/lang/String;Ljava/lang/Throwable;Lkotlinx/coroutines/JobSupport;)V +PLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable; +Lkotlinx/coroutines/JobImpl; +SPLkotlinx/coroutines/JobImpl;->(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobImpl;->getHandlesException$kotlinx_coroutines_core()Z +SPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z +Lkotlinx/coroutines/JobKt; +SPLkotlinx/coroutines/JobKt;->()V +SPLkotlinx/coroutines/JobKt;->CompletableDeferred$default()Lkotlinx/coroutines/CompletableDeferredImpl; +SPLkotlinx/coroutines/JobKt;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lio/ktor/http/cio/CIOMultipartDataBase; +SPLkotlinx/coroutines/JobKt;->Job$default()Lkotlinx/coroutines/JobImpl; +SPLkotlinx/coroutines/JobKt;->SupervisorJob$default()Lkotlinx/coroutines/SupervisorJobImpl; +PLkotlinx/coroutines/JobKt;->cancel(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/JobKt;->cancel(Lkotlinx/coroutines/CoroutineScope;Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/JobKt;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V +HSPLkotlinx/coroutines/JobKt;->foldCopies(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Z)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/JobKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay; +SPLkotlinx/coroutines/JobKt;->getJob(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Job; +HSPLkotlinx/coroutines/JobKt;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl; +HSPLkotlinx/coroutines/JobKt;->invokeOnCompletion(Lkotlinx/coroutines/Job;ZLkotlinx/coroutines/JobNode;)Lkotlinx/coroutines/DisposableHandle; +PLkotlinx/coroutines/JobKt;->isActive(Lkotlin/coroutines/CoroutineContext;)Z +PLkotlinx/coroutines/JobKt;->isActive(Lkotlinx/coroutines/CoroutineScope;)Z +SPLkotlinx/coroutines/JobKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;I)Lkotlinx/coroutines/DeferredCoroutine; +SPLkotlinx/coroutines/JobKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/DeferredCoroutine; +SPLkotlinx/coroutines/JobKt;->newCoroutineContext(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/JobKt;->recoverResult(Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlinx/coroutines/JobKt;->resume(Lkotlinx/coroutines/CancellableContinuationImpl;Lkotlin/coroutines/Continuation;Z)V +SPLkotlinx/coroutines/JobKt;->unboxState(Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlinx/coroutines/JobKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLkotlinx/coroutines/JobKt;->yield(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Lkotlinx/coroutines/JobNode; +SPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport; +SPLkotlinx/coroutines/JobNode;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/JobNode;->getParent()Lkotlinx/coroutines/Job; +SPLkotlinx/coroutines/JobNode;->isActive()Z +Lkotlinx/coroutines/JobSupport; +SPLkotlinx/coroutines/JobSupport;->()V +SPLkotlinx/coroutines/JobSupport;->(Z)V +SPLkotlinx/coroutines/JobSupport;->afterCompletion(Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->afterResume(Ljava/lang/Object;)V +HSPLkotlinx/coroutines/JobSupport;->attachChild(Lkotlinx/coroutines/JobSupport;)Lkotlinx/coroutines/ChildHandle; +SPLkotlinx/coroutines/JobSupport;->awaitInternal(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z +PLkotlinx/coroutines/JobSupport;->cancellationExceptionMessage()Ljava/lang/String; +SPLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z +HSPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->createCauseException(Ljava/lang/Object;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/JobSupport;->finalizeFinishingState(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +HSPLkotlinx/coroutines/JobSupport;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlinx/coroutines/JobSupport;->getCancellationException()Ljava/util/concurrent/CancellationException; +SPLkotlinx/coroutines/JobSupport;->getFinalRootCause(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/util/ArrayList;)Ljava/lang/Throwable; +SPLkotlinx/coroutines/JobSupport;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +SPLkotlinx/coroutines/JobSupport;->getOnCancelComplete$kotlinx_coroutines_core()Z +SPLkotlinx/coroutines/JobSupport;->getOrPromoteCancellingList(Lkotlinx/coroutines/Incomplete;)Lkotlinx/coroutines/NodeList; +HSPLkotlinx/coroutines/JobSupport;->initParentJob(Lkotlinx/coroutines/Job;)V +SPLkotlinx/coroutines/JobSupport;->invokeOnCompletion(Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle; +SPLkotlinx/coroutines/JobSupport;->isCancelled()Z +SPLkotlinx/coroutines/JobSupport;->isCompleted()Z +SPLkotlinx/coroutines/JobSupport;->isScopedCoroutine()Z +SPLkotlinx/coroutines/JobSupport;->join(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->makeCompleting$kotlinx_coroutines_core(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/JobSupport;->makeCompletingOnce$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/JobSupport;->nextChild(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/ChildHandleNode; +SPLkotlinx/coroutines/JobSupport;->notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport;->onCompletionInternal(Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport;->promoteEmptyToNodeList(Lkotlinx/coroutines/Empty;)V +SPLkotlinx/coroutines/JobSupport;->promoteSingleToNodeList(Lkotlinx/coroutines/JobNode;)V +SPLkotlinx/coroutines/JobSupport;->start()Z +SPLkotlinx/coroutines/JobSupport;->startInternal(Ljava/lang/Object;)I +HSPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z +PLkotlinx/coroutines/JobSupport$AwaitContinuation;->(Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/JobSupport;)V +Lkotlinx/coroutines/JobSupport$ChildCompletion; +SPLkotlinx/coroutines/JobSupport$ChildCompletion;->(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V +SPLkotlinx/coroutines/JobSupport$ChildCompletion;->getOnCancelling()Z +SPLkotlinx/coroutines/JobSupport$ChildCompletion;->invoke(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/JobSupport$Finishing; +SPLkotlinx/coroutines/JobSupport$Finishing;->()V +SPLkotlinx/coroutines/JobSupport$Finishing;->(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport$Finishing;->addExceptionLocked(Ljava/lang/Throwable;)V +SPLkotlinx/coroutines/JobSupport$Finishing;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/JobSupport$Finishing;->getRootCause()Ljava/lang/Throwable; +SPLkotlinx/coroutines/JobSupport$Finishing;->isActive()Z +SPLkotlinx/coroutines/JobSupport$Finishing;->isCancelling()Z +SPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/ArrayList; +Lkotlinx/coroutines/LazyStandaloneCoroutine; +SPLkotlinx/coroutines/LazyStandaloneCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V +SPLkotlinx/coroutines/LazyStandaloneCoroutine;->onStart()V +Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList; +SPLkotlinx/coroutines/NodeList;->isActive()Z +SPLkotlinx/coroutines/NodeList;->isRemoved()Z +Lkotlinx/coroutines/NonDisposableHandle; +SPLkotlinx/coroutines/NonDisposableHandle;->()V +SPLkotlinx/coroutines/NonDisposableHandle;->dispose()V +Lkotlinx/coroutines/NotCompleted; +Lkotlinx/coroutines/ParentJob; +Lkotlinx/coroutines/ResumeUndispatchedRunnable; +SPLkotlinx/coroutines/ResumeUndispatchedRunnable;->(Lkotlinx/coroutines/internal/LimitedDispatcher;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/ResumeUndispatchedRunnable;->run()V +PLkotlinx/coroutines/SupervisorCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;I)V +PLkotlinx/coroutines/SupervisorCoroutine;->childCancelled(Ljava/lang/Throwable;)Z +Lkotlinx/coroutines/SupervisorJobImpl; +PLkotlinx/coroutines/SupervisorJobImpl;->childCancelled(Ljava/lang/Throwable;)Z +Lkotlinx/coroutines/ThreadLocalEventLoop; +SPLkotlinx/coroutines/ThreadLocalEventLoop;->()V +HSPLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoopImplPlatform; +Lkotlinx/coroutines/TimeoutCancellationException; +Lkotlinx/coroutines/Unconfined; +Lkotlinx/coroutines/UndispatchedCoroutine; +SPLkotlinx/coroutines/UndispatchedCoroutine;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/UndispatchedCoroutine;->afterCompletionUndispatched()V +PLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/UndispatchedCoroutine;->clearThreadLocal()V +Lkotlinx/coroutines/UndispatchedMarker; +SPLkotlinx/coroutines/UndispatchedMarker;->()V +SPLkotlinx/coroutines/UndispatchedMarker;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/UndispatchedMarker;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; +SPLkotlinx/coroutines/UndispatchedMarker;->getKey()Lkotlin/coroutines/CoroutineContext$Key; +SPLkotlinx/coroutines/UndispatchedMarker;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/Waiter; +PLkotlinx/coroutines/YieldContext;->()V +Lkotlinx/coroutines/android/AndroidDispatcherFactory; +Lkotlinx/coroutines/android/HandlerContext; +SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;)V +SPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;Z)V +SPLkotlinx/coroutines/android/HandlerContext;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +PLkotlinx/coroutines/android/HandlerContext;->equals(Ljava/lang/Object;)Z +HSPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z +SPLkotlinx/coroutines/android/HandlerContext;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuationImpl;)V +Lkotlinx/coroutines/android/HandlerContext$$ExternalSyntheticLambda1; +SPLkotlinx/coroutines/android/HandlerContext$$ExternalSyntheticLambda1;->(Ljava/lang/Object;ILjava/lang/Object;)V +SPLkotlinx/coroutines/android/HandlerContext$$ExternalSyntheticLambda1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/android/HandlerDispatcherKt; +SPLkotlinx/coroutines/android/HandlerDispatcherKt;->()V +SPLkotlinx/coroutines/android/HandlerDispatcherKt;->asHandler(Landroid/os/Looper;)Landroid/os/Handler; +Lkotlinx/coroutines/channels/BufferOverflow; +SPLkotlinx/coroutines/channels/BufferOverflow;->()V +Lkotlinx/coroutines/channels/BufferedChannel; +SPLkotlinx/coroutines/channels/BufferedChannel;->()V +SPLkotlinx/coroutines/channels/BufferedChannel;->(ILkotlin/jvm/functions/Function1;)V +PLkotlinx/coroutines/channels/BufferedChannel;->access$findSegmentSend(Lkotlinx/coroutines/channels/BufferedChannel;JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; +HSPLkotlinx/coroutines/channels/BufferedChannel;->access$updateCellSend(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLjava/lang/Object;Z)I +HSPLkotlinx/coroutines/channels/BufferedChannel;->bufferOrRendezvousSend(J)Z +PLkotlinx/coroutines/channels/BufferedChannel;->cancel(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/channels/BufferedChannel;->close(Ljava/lang/Throwable;)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->closeOrCancelImpl(Ljava/lang/Throwable;Z)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->completeClose(J)Lkotlinx/coroutines/channels/ChannelSegment; +HSPLkotlinx/coroutines/channels/BufferedChannel;->expandBuffer()V +PLkotlinx/coroutines/channels/BufferedChannel;->findSegmentReceive(JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; +SPLkotlinx/coroutines/channels/BufferedChannel;->getCloseCause()Ljava/lang/Throwable; +SPLkotlinx/coroutines/channels/BufferedChannel;->getSendersCounter$kotlinx_coroutines_core()J +SPLkotlinx/coroutines/channels/BufferedChannel;->incCompletedExpandBufferAttempts$default(Lkotlinx/coroutines/channels/BufferedChannel;)V +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosed(JZ)Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForReceive()Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForSend()Z +PLkotlinx/coroutines/channels/BufferedChannel;->isConflatedDropOldest()Z +SPLkotlinx/coroutines/channels/BufferedChannel;->isRendezvousOrUnlimited()Z +SPLkotlinx/coroutines/channels/BufferedChannel;->iterator()Lkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator; +SPLkotlinx/coroutines/channels/BufferedChannel;->receive(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU$suspendImpl(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;)Ljava/lang/Object; +PLkotlinx/coroutines/channels/BufferedChannel;->receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->resumeWaiterOnClosedChannel(Lkotlinx/coroutines/Waiter;Z)V +SPLkotlinx/coroutines/channels/BufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->tryReceive-PtdJZtk()Ljava/lang/Object; +HSPLkotlinx/coroutines/channels/BufferedChannel;->tryResumeReceiver(Ljava/lang/Object;Ljava/lang/Object;)Z +HSPLkotlinx/coroutines/channels/BufferedChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; +HSPLkotlinx/coroutines/channels/BufferedChannel;->updateCellReceive(Lkotlinx/coroutines/channels/ChannelSegment;IJLjava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel;->waitExpandBufferCompletion$kotlinx_coroutines_core(J)V +Lkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator; +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->(Lkotlinx/coroutines/channels/BufferedChannel;)V +HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->hasNext(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V +SPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->next()Ljava/lang/Object; +PLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/BufferedChannelKt; +SPLkotlinx/coroutines/channels/BufferedChannelKt;->()V +SPLkotlinx/coroutines/channels/BufferedChannelKt;->tryResume0(Lkotlinx/coroutines/CancellableContinuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Z +PLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->()V +PLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/Channel; +SPLkotlinx/coroutines/channels/Channel;->()V +Lkotlinx/coroutines/channels/Channel$Factory; +SPLkotlinx/coroutines/channels/Channel$Factory;->()V +Lkotlinx/coroutines/channels/ChannelResult; +SPLkotlinx/coroutines/channels/ChannelResult;->()V +PLkotlinx/coroutines/channels/ChannelResult;->(Ljava/lang/Object;)V +SPLkotlinx/coroutines/channels/ChannelResult;->getOrNull-impl(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/ChannelResult$Closed; +PLkotlinx/coroutines/channels/ChannelResult$Closed;->(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/channels/ChannelResult$Failed; +Lkotlinx/coroutines/channels/ChannelSegment; +SPLkotlinx/coroutines/channels/ChannelSegment;->(JLkotlinx/coroutines/channels/ChannelSegment;Lkotlinx/coroutines/channels/BufferedChannel;I)V +SPLkotlinx/coroutines/channels/ChannelSegment;->casState$kotlinx_coroutines_core(Ljava/lang/Object;ILjava/lang/Object;)Z +SPLkotlinx/coroutines/channels/ChannelSegment;->getNumberOfSlots()I +SPLkotlinx/coroutines/channels/ChannelSegment;->getState$kotlinx_coroutines_core(I)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ChannelSegment;->onCancellation(ILkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/channels/ChannelSegment;->onCancelledRequest(IZ)V +SPLkotlinx/coroutines/channels/ChannelSegment;->setElementLazy(ILjava/lang/Object;)V +SPLkotlinx/coroutines/channels/ChannelSegment;->setState$kotlinx_coroutines_core(ILjava/lang/Object;)V +Lkotlinx/coroutines/channels/ClosedSendChannelException; +Lkotlinx/coroutines/channels/ConflatedBufferedChannel; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)V +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->isConflatedDropOldest()Z +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySendImpl-Mj0NB7M(Ljava/lang/Object;Z)Ljava/lang/Object; +Lkotlinx/coroutines/channels/ProducerCoroutine; +SPLkotlinx/coroutines/channels/ProducerCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/BufferedChannel;)V +SPLkotlinx/coroutines/channels/ProducerCoroutine;->cancel(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/channels/ProducerCoroutine;->cancelInternal(Ljava/util/concurrent/CancellationException;)V +SPLkotlinx/coroutines/channels/ProducerCoroutine;->iterator()Lkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator; +SPLkotlinx/coroutines/channels/ProducerCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V +SPLkotlinx/coroutines/channels/ProducerCoroutine;->onCompleted(Ljava/lang/Object;)V +SPLkotlinx/coroutines/channels/ProducerCoroutine;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/channels/ProducerScope; +Lkotlinx/coroutines/channels/ReceiveCatching; +PLkotlinx/coroutines/channels/ReceiveCatching;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V +PLkotlinx/coroutines/channels/ReceiveCatching;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V +Lkotlinx/coroutines/channels/ReceiveChannel; +Lkotlinx/coroutines/channels/SendChannel; +Lkotlinx/coroutines/channels/WaiterEB; +Lkotlinx/coroutines/flow/AbstractFlow$collect$1; +SPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->(Lkotlinx/coroutines/flow/SafeFlow;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/ChannelAsFlow; +SPLkotlinx/coroutines/flow/ChannelAsFlow;->()V +SPLkotlinx/coroutines/flow/ChannelAsFlow;->(Lkotlinx/coroutines/channels/ReceiveChannel;Z)V +SPLkotlinx/coroutines/flow/ChannelAsFlow;->(Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/ChannelAsFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/DistinctFlowImpl; +SPLkotlinx/coroutines/flow/DistinctFlowImpl;->(Lkotlinx/coroutines/flow/Flow;)V +SPLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1; +SPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->(Landroidx/compose/material3/ThumbNode$onAttach$1$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/Flow; +Lkotlinx/coroutines/flow/FlowCollector; +Lkotlinx/coroutines/flow/FlowKt; +SPLkotlinx/coroutines/flow/FlowKt;->()V +SPLkotlinx/coroutines/flow/FlowKt;->MutableSharedFlow$default(Lkotlinx/coroutines/channels/BufferOverflow;I)Lkotlinx/coroutines/flow/SharedFlowImpl; +SPLkotlinx/coroutines/flow/FlowKt;->MutableSharedFlow(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/SharedFlowImpl; +SPLkotlinx/coroutines/flow/FlowKt;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlowImpl; +SPLkotlinx/coroutines/flow/FlowKt;->access$emitAbort$FlowKt__LimitKt(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +PLkotlinx/coroutines/flow/FlowKt;->access$invokeSafely$FlowKt__EmittersKt(Lkotlinx/coroutines/flow/ThrowingCollector;Lkotlin/jvm/functions/Function3;Ljava/lang/Throwable;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->access$setBufferAt([Ljava/lang/Object;JLjava/lang/Object;)V +SPLkotlinx/coroutines/flow/FlowKt;->buffer$default(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->collectLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/SuspendLambda;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->configureSharing$FlowKt__ShareKt(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/SharingConfig; +SPLkotlinx/coroutines/flow/FlowKt;->consumeAsFlow(Lkotlinx/coroutines/channels/BufferedChannel;)Lkotlinx/coroutines/flow/ChannelAsFlow; +SPLkotlinx/coroutines/flow/FlowKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/FlowKt;->emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/StartedWhileSubscribed;Ljava/lang/Object;)Lkotlinx/coroutines/flow/ReadonlyStateFlow; +Lkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1$1; +SPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/SafeFlow;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1; +SPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onCompletion$$inlined$unsafeFlow$1; +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onCompletion$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onCompletion$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onCompletion$$inlined$unsafeFlow$1$1; +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onCompletion$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onCompletion$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V +PLkotlinx/coroutines/flow/FlowKt__EmittersKt$onCompletion$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1; +SPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V +PLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;II)V +PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;->(Lkotlin/jvm/internal/Ref$IntRef;ILkotlinx/coroutines/flow/FlowCollector;)V +PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1; +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/flow/Flow;)V +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;I)V +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1; +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;->(Landroidx/paging/FlowExtKt$simpleScan$1$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__LimitKt$emitAbort$1; +Lkotlinx/coroutines/flow/FlowKt__LimitKt$take$$inlined$unsafeFlow$1; +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$take$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;I)V +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$take$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__LimitKt$take$$inlined$unsafeFlow$1$1; +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$take$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$take$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$take$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__LimitKt$take$2$1$emit$1; +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$take$2$1$emit$1;->(Landroidx/paging/FlowExtKt$simpleScan$1$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__LimitKt$takeWhile$$inlined$unsafeFlow$1$1; +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$takeWhile$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V +PLkotlinx/coroutines/flow/FlowKt__LimitKt$takeWhile$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__LimitKt$takeWhile$lambda$6$$inlined$collectWhile$1$1; +SPLkotlinx/coroutines/flow/FlowKt__LimitKt$takeWhile$lambda$6$$inlined$collectWhile$1$1;->(Landroidx/compose/material3/ThumbNode$onAttach$1$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__MergeKt; +SPLkotlinx/coroutines/flow/FlowKt__MergeKt;->()V +Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1; +SPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1;->(Landroidx/compose/material3/ThumbNode$onAttach$1$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3; +SPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2$1; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$filterNotNull$$inlined$unsafeTransform$1$2$1;->(Landroidx/paging/CachedPagingDataKt$cachedIn$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->(Landroidx/compose/material3/ThumbNode$onAttach$1$1;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/FlowKt__TransformKt$withIndex$1$1$emit$1; +SPLkotlinx/coroutines/flow/FlowKt__TransformKt$withIndex$1$1$emit$1;->(Landroidx/paging/CachedPageEventFlow$downstreamFlow$1$2;Lkotlin/coroutines/Continuation;)V +Lkotlinx/coroutines/flow/MutableSharedFlow; +Lkotlinx/coroutines/flow/MutableStateFlow; +Lkotlinx/coroutines/flow/ReadonlySharedFlow; +SPLkotlinx/coroutines/flow/ReadonlySharedFlow;->(Lkotlinx/coroutines/flow/SharedFlowImpl;)V +SPLkotlinx/coroutines/flow/ReadonlySharedFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/ReadonlySharedFlow;->getReplayCache()Ljava/util/List; +Lkotlinx/coroutines/flow/ReadonlyStateFlow; +SPLkotlinx/coroutines/flow/ReadonlyStateFlow;->(Lkotlinx/coroutines/flow/StateFlowImpl;)V +SPLkotlinx/coroutines/flow/ReadonlyStateFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/ReadonlyStateFlow;->getValue()Ljava/lang/Object; +Lkotlinx/coroutines/flow/SafeFlow; +SPLkotlinx/coroutines/flow/SafeFlow;->(ILjava/lang/Object;)V +SPLkotlinx/coroutines/flow/SafeFlow;->(Lkotlin/jvm/functions/Function2;)V +SPLkotlinx/coroutines/flow/SafeFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/SharedFlow; +Lkotlinx/coroutines/flow/SharedFlowImpl; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->(IILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->awaitValue(Lkotlinx/coroutines/flow/SharedFlowSlot;Lkotlinx/coroutines/flow/SharedFlowImpl$collect$1;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->cleanupTailLocked()V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->collect$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray()[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->dropOldestLocked()V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->enqueueLocked(Ljava/lang/Object;)V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->findSlotsToResumeLocked([Lkotlin/coroutines/Continuation;)[Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getHead()J +SPLkotlinx/coroutines/flow/SharedFlowImpl;->getReplayCache()Ljava/util/List; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->growBuffer([Ljava/lang/Object;II)[Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmit(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmitLocked(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowSlot;)J +SPLkotlinx/coroutines/flow/SharedFlowImpl;->tryTakeValue(Lkotlinx/coroutines/flow/SharedFlowSlot;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SharedFlowImpl;->updateBufferLocked(JJJJ)V +SPLkotlinx/coroutines/flow/SharedFlowImpl;->updateCollectorIndexLocked$kotlinx_coroutines_core(J)[Lkotlin/coroutines/Continuation; +Lkotlinx/coroutines/flow/SharedFlowImpl$Emitter; +Lkotlinx/coroutines/flow/SharedFlowImpl$collect$1; +SPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/SharedFlowSlot; +SPLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)Z +SPLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)[Lkotlin/coroutines/Continuation; +Lkotlinx/coroutines/flow/SharingCommand; +SPLkotlinx/coroutines/flow/SharingCommand;->()V +Lkotlinx/coroutines/flow/SharingConfig; +SPLkotlinx/coroutines/flow/SharingConfig;->(ILkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/flow/Flow;)V +SPLkotlinx/coroutines/flow/SharingConfig;->(Landroid/graphics/Paint;)V +SPLkotlinx/coroutines/flow/SharingConfig;->getStrokeCap-KaPHkGw()I +SPLkotlinx/coroutines/flow/SharingConfig;->getStrokeJoin-LxFBmk8()I +SPLkotlinx/coroutines/flow/SharingConfig;->setAlpha(F)V +SPLkotlinx/coroutines/flow/SharingConfig;->setBlendMode-s9anfk8(I)V +SPLkotlinx/coroutines/flow/SharingConfig;->setColor-8_81llA(J)V +SPLkotlinx/coroutines/flow/SharingConfig;->setColorFilter(Landroidx/compose/ui/graphics/BlendModeColorFilter;)V +SPLkotlinx/coroutines/flow/SharingConfig;->setStrokeWidth(F)V +SPLkotlinx/coroutines/flow/SharingConfig;->setStyle-k9PVt8s(I)V +Lkotlinx/coroutines/flow/SharingStarted; +Lkotlinx/coroutines/flow/SharingStarted$Companion; +SPLkotlinx/coroutines/flow/SharingStarted$Companion;->()V +SPLkotlinx/coroutines/flow/SharingStarted$Companion;->WhileSubscribed$default(I)Lkotlinx/coroutines/flow/StartedWhileSubscribed; +Lkotlinx/coroutines/flow/StartedLazily; +SPLkotlinx/coroutines/flow/StartedLazily;->(I)V +Lkotlinx/coroutines/flow/StartedWhileSubscribed; +SPLkotlinx/coroutines/flow/StartedWhileSubscribed;->(J)V +SPLkotlinx/coroutines/flow/StartedWhileSubscribed;->command(Lkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/StartedWhileSubscribed;->equals(Ljava/lang/Object;)Z +Lkotlinx/coroutines/flow/StartedWhileSubscribed$command$1; +SPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->(Lkotlinx/coroutines/flow/StartedWhileSubscribed;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/StateFlow; +Lkotlinx/coroutines/flow/StateFlowImpl; +SPLkotlinx/coroutines/flow/StateFlowImpl;->()V +SPLkotlinx/coroutines/flow/StateFlowImpl;->(Ljava/lang/Object;)V +HSPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowImpl;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z +SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray()[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object; +SPLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V +HSPLkotlinx/coroutines/flow/StateFlowImpl;->updateState(Ljava/lang/Object;Ljava/lang/Object;)Z +Lkotlinx/coroutines/flow/StateFlowImpl$collect$1; +SPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/StateFlowSlot; +SPLkotlinx/coroutines/flow/StateFlowSlot;->()V +SPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)Z +PLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)[Lkotlin/coroutines/Continuation; +Lkotlinx/coroutines/flow/SubscribedFlowCollector; +SPLkotlinx/coroutines/flow/SubscribedFlowCollector;->(Lkotlinx/coroutines/flow/FlowCollector;Landroidx/datastore/core/DataStoreImpl$data$1;)V +SPLkotlinx/coroutines/flow/SubscribedFlowCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/SubscribedFlowCollector;->onSubscription(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/SubscribedFlowCollector$onSubscription$1; +SPLkotlinx/coroutines/flow/SubscribedFlowCollector$onSubscription$1;->(Lkotlinx/coroutines/flow/SubscribedFlowCollector;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +Lkotlinx/coroutines/flow/SubscribedSharedFlow; +SPLkotlinx/coroutines/flow/SubscribedSharedFlow;->(Lkotlinx/coroutines/flow/SharedFlowImpl;Landroidx/datastore/core/DataStoreImpl$data$1;)V +SPLkotlinx/coroutines/flow/SubscribedSharedFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/SubscribedSharedFlow$collect$1; +SPLkotlinx/coroutines/flow/SubscribedSharedFlow$collect$1;->(Lkotlinx/coroutines/flow/SubscribedSharedFlow;Lkotlin/coroutines/Continuation;)V +PLkotlinx/coroutines/flow/SubscribedSharedFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/ThrowingCollector; +PLkotlinx/coroutines/flow/ThrowingCollector;->(Ljava/lang/Throwable;)V +Lkotlinx/coroutines/flow/internal/AbortFlowException; +SPLkotlinx/coroutines/flow/internal/AbortFlowException;->(Ljava/lang/Object;)V +SPLkotlinx/coroutines/flow/internal/AbortFlowException;->fillInStackTrace()Ljava/lang/Throwable; +Lkotlinx/coroutines/flow/internal/AbstractSharedFlow; +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->allocateSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->freeSlot(Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;)V +SPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSubscriptionCount()Lkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow; +Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; +Lkotlinx/coroutines/flow/internal/ChannelFlow; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->fuse(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; +SPLkotlinx/coroutines/flow/internal/ChannelFlow;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; +Lkotlinx/coroutines/flow/internal/ChannelFlowKt; +SPLkotlinx/coroutines/flow/internal/ChannelFlowKt;->()V +Lkotlinx/coroutines/flow/internal/ChannelFlowOperator; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->(ILkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/flow/Flow;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Landroidx/paging/PageFetcher$flow$1;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl; +SPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->create(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1; +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->(Landroidx/compose/material3/DatePickerKt$updateDisplayedMonth$3;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/ChildCancelledException; +SPLkotlinx/coroutines/flow/internal/ChildCancelledException;->fillInStackTrace()Ljava/lang/Throwable; +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;Lkotlin/coroutines/Continuation;I)V +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->(IILjava/lang/Object;)V +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;Lkotlin/coroutines/Continuation;)V +PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/DownstreamExceptionContext; +SPLkotlinx/coroutines/flow/internal/DownstreamExceptionContext;->(Ljava/lang/Throwable;Lkotlin/coroutines/CoroutineContext;)V +Lkotlinx/coroutines/flow/internal/FusibleFlow; +Lkotlinx/coroutines/flow/internal/NoOpContinuation; +SPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V +Lkotlinx/coroutines/flow/internal/NopCollector; +SPLkotlinx/coroutines/flow/internal/NopCollector;->()V +SPLkotlinx/coroutines/flow/internal/NopCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/SafeCollector; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V +SPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/flow/internal/SafeCollector;->getContext()Lkotlin/coroutines/CoroutineContext; +Lkotlinx/coroutines/flow/internal/SafeCollectorKt; +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt;->()V +Lkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1; +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V +SPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/SendingCollector; +SPLkotlinx/coroutines/flow/internal/SendingCollector;->(Lkotlinx/coroutines/channels/ProducerScope;)V +SPLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +Lkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow; +SPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->increment(I)V +Lkotlinx/coroutines/internal/ConcurrentKt; +SPLkotlinx/coroutines/internal/ConcurrentKt;->()V +Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->()V +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->(Lkotlinx/coroutines/internal/Segment;)V +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->cleanPrev()V +SPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getNext()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; +Lkotlinx/coroutines/internal/DispatchedContinuation; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->()V +HSPLkotlinx/coroutines/internal/DispatchedContinuation;->(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->getContext()Lkotlin/coroutines/CoroutineContext; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; +SPLkotlinx/coroutines/internal/DispatchedContinuation;->resumeWith(Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/DispatchedContinuation;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; +Lkotlinx/coroutines/internal/InlineList; +SPLkotlinx/coroutines/internal/InlineList;->()V +SPLkotlinx/coroutines/internal/InlineList;->checkParallelism(I)V +SPLkotlinx/coroutines/internal/InlineList;->findSegmentInternal(Lkotlinx/coroutines/internal/Segment;JLkotlin/jvm/functions/Function2;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/InlineList;->getSegment-impl(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Segment; +SPLkotlinx/coroutines/internal/InlineList;->isClosed-impl(Ljava/lang/Object;)Z +SPLkotlinx/coroutines/internal/InlineList;->plus-FjFbRPM(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/InlineList;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/InlineList;->resumeCancellableWith(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V +SPLkotlinx/coroutines/internal/InlineList;->safeDispatch(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/internal/InlineList;->safeIsDispatchNeeded(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/CoroutineContext;)Z +SPLkotlinx/coroutines/internal/InlineList;->systemProp$default(IILjava/lang/String;)I +SPLkotlinx/coroutines/internal/InlineList;->systemProp(Ljava/lang/String;JJJ)J +HSPLkotlinx/coroutines/internal/InlineList;->threadContextElements(Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object; +HSPLkotlinx/coroutines/internal/InlineList;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/internal/LimitedDispatcher; +SPLkotlinx/coroutines/internal/LimitedDispatcher;->()V +SPLkotlinx/coroutines/internal/LimitedDispatcher;->(Lkotlinx/coroutines/CoroutineDispatcher;I)V +SPLkotlinx/coroutines/internal/LimitedDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/internal/LimitedDispatcher;->obtainTaskOrDeallocateWorker()Ljava/lang/Runnable; +SPLkotlinx/coroutines/internal/LimitedDispatcher;->tryAllocateWorker()Z +Lkotlinx/coroutines/internal/ListClosed; +SPLkotlinx/coroutines/internal/ListClosed;->(I)V +Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V +HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addLast(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;I)Z +HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNextNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->isRemoved()Z +Lkotlinx/coroutines/internal/LockFreeLinkedListNode$toString$1; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode$toString$1;->(IILjava/lang/Class;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode$toString$1;->get()Ljava/lang/Object; +SPLkotlinx/coroutines/internal/LockFreeLinkedListNode$toString$1;->invoke()Ljava/lang/Object; +Lkotlinx/coroutines/internal/LockFreeTaskQueue; +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->()V +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->()V +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->addLast(Ljava/lang/Runnable;)Z +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->getSize()I +SPLkotlinx/coroutines/internal/LockFreeTaskQueue;->removeFirstOrNull()Ljava/lang/Object; +Lkotlinx/coroutines/internal/LockFreeTaskQueueCore; +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->()V +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->(IZ)V +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->addLast(Ljava/lang/Object;)I +SPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->removeFirstOrNull()Ljava/lang/Object; +Lkotlinx/coroutines/internal/LockFreeTaskQueueCore$Placeholder; +Lkotlinx/coroutines/internal/MainDispatcherLoader; +SPLkotlinx/coroutines/internal/MainDispatcherLoader;->()V +Lkotlinx/coroutines/internal/Removed; +SPLkotlinx/coroutines/internal/Removed;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V +Lkotlinx/coroutines/internal/ResizableAtomicArray; +SPLkotlinx/coroutines/internal/ResizableAtomicArray;->(I)V +SPLkotlinx/coroutines/internal/ResizableAtomicArray;->get(I)Ljava/lang/Object; +SPLkotlinx/coroutines/internal/ResizableAtomicArray;->setSynchronized(ILkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)V +Lkotlinx/coroutines/internal/ScopeCoroutine; +SPLkotlinx/coroutines/internal/ScopeCoroutine;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V +PLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z +Lkotlinx/coroutines/internal/Segment; +SPLkotlinx/coroutines/internal/Segment;->()V +SPLkotlinx/coroutines/internal/Segment;->(JLkotlinx/coroutines/internal/Segment;I)V +PLkotlinx/coroutines/internal/Segment;->decPointers$kotlinx_coroutines_core()Z +SPLkotlinx/coroutines/internal/Segment;->isRemoved()Z +SPLkotlinx/coroutines/internal/Segment;->onSlotCleaned()V +PLkotlinx/coroutines/internal/Segment;->tryIncPointers$kotlinx_coroutines_core()Z +Lkotlinx/coroutines/internal/Symbol; +SPLkotlinx/coroutines/internal/Symbol;->(Ljava/lang/String;I)V +Lkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt; +SPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->()V +Lkotlinx/coroutines/internal/ThreadLocalElement; +Lkotlinx/coroutines/internal/ThreadSafeHeap; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->()V +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->addImpl(Lkotlinx/coroutines/EventLoopImplBase$DelayedTask;)V +PLkotlinx/coroutines/internal/ThreadSafeHeap;->removeAtImpl(I)Lkotlinx/coroutines/EventLoopImplBase$DelayedTask; +SPLkotlinx/coroutines/internal/ThreadSafeHeap;->siftUpFrom(I)V +Lkotlinx/coroutines/internal/ThreadState; +Lkotlinx/coroutines/scheduling/CoroutineScheduler; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->(IIJLjava/lang/String;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createNewWorker()I +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch(Ljava/lang/Runnable;ZZ)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker(J)Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryUnpark()Z +Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->(Lkotlinx/coroutines/scheduling/CoroutineScheduler;I)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findTask(Z)Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getIndexInArray()I +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getNextParkedWorker()Ljava/lang/Object; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->nextInt(I)I +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->pollGlobalQueues()Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->run()V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setIndexInArray(I)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setNextParkedWorker(Ljava/lang/Object;)V +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryReleaseCpu(Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;)Z +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->trySteal(I)Lkotlinx/coroutines/scheduling/Task; +Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState; +SPLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->()V +Lkotlinx/coroutines/scheduling/DefaultIoScheduler; +SPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V +SPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +Lkotlinx/coroutines/scheduling/DefaultScheduler; +SPLkotlinx/coroutines/scheduling/DefaultScheduler;->()V +Lkotlinx/coroutines/scheduling/GlobalQueue; +Lkotlinx/coroutines/scheduling/NanoTimeSource; +SPLkotlinx/coroutines/scheduling/NanoTimeSource;->()V +Lkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher; +Lkotlinx/coroutines/scheduling/Task; +SPLkotlinx/coroutines/scheduling/Task;->(JZ)V +Lkotlinx/coroutines/scheduling/TaskImpl; +SPLkotlinx/coroutines/scheduling/TaskImpl;->(Ljava/lang/Runnable;JZ)V +SPLkotlinx/coroutines/scheduling/TaskImpl;->run()V +Lkotlinx/coroutines/scheduling/TasksKt; +SPLkotlinx/coroutines/scheduling/TasksKt;->()V +Lkotlinx/coroutines/scheduling/UnlimitedIoScheduler; +SPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V +SPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V +SPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->limitedParallelism(I)Lkotlinx/coroutines/CoroutineDispatcher; +Lkotlinx/coroutines/scheduling/WorkQueue; +SPLkotlinx/coroutines/scheduling/WorkQueue;->()V +SPLkotlinx/coroutines/scheduling/WorkQueue;->()V +SPLkotlinx/coroutines/scheduling/WorkQueue;->pollBuffer()Lkotlinx/coroutines/scheduling/Task; +Lkotlinx/coroutines/sync/Mutex; +Lkotlinx/coroutines/sync/MutexImpl; +SPLkotlinx/coroutines/sync/MutexImpl;->()V +SPLkotlinx/coroutines/sync/MutexImpl;->()V +SPLkotlinx/coroutines/sync/MutexImpl;->isLocked()Z +SPLkotlinx/coroutines/sync/MutexImpl;->lock(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +SPLkotlinx/coroutines/sync/MutexImpl;->tryLock()Z +SPLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V +Lkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner; +SPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/CancellableContinuationImpl;)V +SPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->completeResume(Ljava/lang/Object;)V +SPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V +SPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->tryResume(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/internal/Symbol; +Lkotlinx/coroutines/sync/MutexKt; +SPLkotlinx/coroutines/sync/MutexKt;->()V +Lkotlinx/coroutines/sync/SemaphoreAndMutexImpl; +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->()V +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->(I)V +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->addAcquireToQueue(Lkotlinx/coroutines/Waiter;)Z +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl;->release()V +Lkotlinx/coroutines/sync/SemaphoreAndMutexImpl$$ExternalSyntheticLambda0; +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl$$ExternalSyntheticLambda0;->(ILjava/lang/Object;)V +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;)V +HSPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl$$ExternalSyntheticLambda0;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +Lkotlinx/coroutines/sync/SemaphoreAndMutexImpl$addAcquireToQueue$createNewSegment$1; +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl$addAcquireToQueue$createNewSegment$1;->()V +Lkotlinx/coroutines/sync/SemaphoreAndMutexImpl$tryResumeNextFromQueue$createNewSegment$1; +SPLkotlinx/coroutines/sync/SemaphoreAndMutexImpl$tryResumeNextFromQueue$createNewSegment$1;->()V +Lkotlinx/coroutines/sync/SemaphoreKt; +SPLkotlinx/coroutines/sync/SemaphoreKt;->()V +Lkotlinx/coroutines/sync/SemaphoreSegment; +SPLkotlinx/coroutines/sync/SemaphoreSegment;->(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V +SPLkotlinx/coroutines/sync/SemaphoreSegment;->getNumberOfSlots()I +Lkotlinx/serialization/encoding/CompositeDecoder; +Lkotlinx/serialization/encoding/Decoder; +Lkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0; +SPLkotlinx/serialization/json/JsonObject$$ExternalSyntheticLambda0;->(I)V +Lokhttp3/Dispatcher; +SPLokhttp3/Dispatcher;->(I)V +PLokhttp3/Dispatcher;->(Landroid/graphics/Typeface;Landroidx/emoji2/text/flatbuffer/MetadataList;)V +SPLokhttp3/Dispatcher;->(Landroidx/compose/animation/core/FloatAnimationSpec;)V +SPLokhttp3/Dispatcher;->(Landroidx/compose/ui/draw/DrawResult;)V +SPLokhttp3/Dispatcher;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/ui/autofill/AutofillTree;)V +SPLokhttp3/Dispatcher;->(Landroidx/datastore/core/DataStoreImpl;Ljava/util/List;)V +SPLokhttp3/Dispatcher;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V +SPLokhttp3/Dispatcher;->(Lio/ktor/events/Events;)V +SPLokhttp3/Dispatcher;->(Ljava/util/regex/Matcher;Ljava/lang/CharSequence;)V +SPLokhttp3/Dispatcher;->(Lkotlinx/coroutines/CoroutineScope;Lio/ktor/http/CodecsKt$$ExternalSyntheticLambda1;Landroidx/compose/ui/text/SaversKt$$ExternalSyntheticLambda5;Landroidx/datastore/core/SimpleActor$offer$2;)V +PLokhttp3/Dispatcher;->dispatchPostFling-RZ2iAVY(JJLkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLokhttp3/Dispatcher;->dispatchPreFling-QWom1Mo(JLkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +SPLokhttp3/Dispatcher;->doRun(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +PLokhttp3/Dispatcher;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J +SPLokhttp3/Dispatcher;->getRange()Lkotlin/ranges/IntRange; +SPLokhttp3/Dispatcher;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; +SPLokhttp3/Dispatcher;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; +SPLokhttp3/Dispatcher;->getViewModel$lifecycle_viewmodel_release(Ljava/lang/String;Lkotlin/jvm/internal/ClassReference;)Landroidx/lifecycle/ViewModel; +SPLokhttp3/Dispatcher;->modify(Landroidx/paging/ViewportHint$Access;Lkotlin/jvm/functions/Function2;)V +SPLokhttp3/Dispatcher;->runIfNeeded(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +Lokhttp3/Handshake$$ExternalSyntheticLambda0; +SPLokhttp3/Handshake$$ExternalSyntheticLambda0;->(ILkotlin/jvm/functions/Function0;)V +Lokhttp3/Headers$Builder; +SPLokhttp3/Headers$Builder;->(I)V +SPLokhttp3/Headers$Builder;->close()V +SPLokhttp3/Headers$Builder;->curveToRelative(FFFFFF)V +SPLokhttp3/Headers$Builder;->horizontalLineTo(F)V +SPLokhttp3/Headers$Builder;->horizontalLineToRelative(F)V +SPLokhttp3/Headers$Builder;->lineTo(FF)V +SPLokhttp3/Headers$Builder;->lineToRelative(FF)V +SPLokhttp3/Headers$Builder;->moveTo(FF)V +SPLokhttp3/Headers$Builder;->verticalLineToRelative(F)V +Lokhttp3/OkHttpClient; +Lokhttp3/Request$Builder; +SPLokhttp3/Request$Builder;->(I)V +HPLokhttp3/Request$Builder;->(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamily$Resolver;)V +SPLokhttp3/Request$Builder;->(Ljava/util/Map;)V +HSPLokhttp3/Request$Builder;->addAwaiter(Landroidx/compose/runtime/internal/AwaiterQueue$Awaiter;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/CancellationHandle; +HSPLokhttp3/Request$Builder;->flushAndDispatchAwaiters(Lkotlin/jvm/functions/Function1;)V +SPLokhttp3/Request$Builder;->set(Ljava/lang/Object;Ljava/lang/String;)V +Lokhttp3/internal/concurrent/TaskRunner; +Lokhttp3/internal/connection/ExchangeFinder; +Lokhttp3/internal/http/StatusLine; +SPLokhttp3/internal/http/StatusLine;->(I)V +SPLokhttp3/internal/http/StatusLine;->(IZ)V +SPLokhttp3/internal/http/StatusLine;->(Lkotlin/ranges/IntRange;Landroidx/compose/foundation/lazy/layout/LazyLayoutKt;)V +SPLokhttp3/internal/http/StatusLine;->addInterval(ILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval;)V +SPLokhttp3/internal/http/StatusLine;->get(I)Landroidx/compose/foundation/lazy/layout/IntervalList$Interval; +PLokhttp3/internal/http/StatusLine;->getIndex(Ljava/lang/Object;)I +SPLokhttp3/internal/http/StatusLine;->getStateAsEvents(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/io/Serializable; +SPLokhttp3/internal/http/StatusLine;->insert$default(Lokhttp3/internal/http/StatusLine;IIIIIIZZZI)V +SPLokhttp3/internal/http/StatusLine;->insert(IIIIIIZZZI)V +SPLokhttp3/internal/http/StatusLine;->record(Lkotlin/collections/IndexedValue;Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; +HSPLokhttp3/internal/http/StatusLine;->updateSubhierarchy(IIJ)V +PLokhttp3/internal/http1/HeadersReader;->(JLandroidx/compose/foundation/gestures/Orientation;)V +PLokhttp3/internal/http1/HeadersReader;->(Landroidx/compose/foundation/gestures/Orientation;)V +PLokhttp3/internal/http1/HeadersReader;->addPositions-akrDWew(JJF)J +PLokhttp3/internal/http1/HeadersReader;->mainAxis-k-4lQ0M(J)F +Lokhttp3/internal/http2/Http2; +Lokhttp3/internal/http2/Huffman$Node; +SPLokhttp3/internal/http2/Huffman$Node;->(IILandroidx/compose/animation/core/Easing;)V +SPLokhttp3/internal/http2/Huffman$Node;->getDelayMillis()I +SPLokhttp3/internal/http2/Huffman$Node;->getDurationMillis()I +SPLokhttp3/internal/http2/Huffman$Node;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; +SPLokhttp3/internal/http2/Huffman$Node;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; +Lokhttp3/internal/platform/Android10Platform; +SPLokhttp3/internal/platform/Android10Platform;->()V +SPLokhttp3/internal/platform/Android10Platform;->()V +SPLokhttp3/internal/platform/Android10Platform;->setApplicationContext(Landroid/content/Context;)V +Lokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0; +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$1()I +PLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsetsController;)V +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$2()I +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$3()I +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/view/WindowInsetsController;)V +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$4()I +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m$5()I +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m()I +PLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; +SPLokhttp3/internal/platform/Android10Platform$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)Landroid/view/WindowInsetsController; +Lokhttp3/internal/platform/ContextAwarePlatform; +Lokhttp3/internal/platform/Platform; +SPLokhttp3/internal/platform/Platform;->()V +Lokhttp3/internal/platform/PlatformInitializer; +SPLokhttp3/internal/platform/PlatformInitializer;->()V +SPLokhttp3/internal/platform/PlatformInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; +SPLokhttp3/internal/platform/PlatformInitializer;->dependencies()Ljava/util/List; +Lokhttp3/internal/platform/android/Android10SocketAdapter; +SPLokhttp3/internal/platform/android/Android10SocketAdapter;->isSupported()Z +Lokhttp3/internal/platform/android/AndroidLog; +SPLokhttp3/internal/platform/android/AndroidLog;->()V +SPLokhttp3/internal/platform/android/AndroidLog;->enableLogging(Ljava/lang/String;Ljava/lang/String;)V +Lokhttp3/internal/platform/android/AndroidLogHandler; +SPLokhttp3/internal/platform/android/AndroidLogHandler;->()V +Lokhttp3/internal/platform/android/AndroidSocketAdapter; +SPLokhttp3/internal/platform/android/AndroidSocketAdapter;->()V +Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter; +SPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter;->()V +Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion$factory$1; +Lokhttp3/internal/platform/android/ConscryptSocketAdapter; +SPLokhttp3/internal/platform/android/ConscryptSocketAdapter;->()V +Lokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion; +Lokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion$factory$1; +Lokhttp3/internal/platform/android/DeferredSocketAdapter; +SPLokhttp3/internal/platform/android/DeferredSocketAdapter;->(Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory;)V +SPLokhttp3/internal/platform/android/DeferredSocketAdapter;->isSupported()Z +Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; +Lokhttp3/internal/platform/android/SocketAdapter; +Lokio/ByteString$Companion; +SPLokio/ByteString$Companion;->getLogger(Ljava/lang/String;)Lorg/slf4j/Logger; +Lokio/PriorityQueue; +SPLokio/PriorityQueue;->(ILjava/lang/Object;)V +SPLokio/PriorityQueue;->(Landroidx/room/RoomConnectionManager;I)V +PLokio/PriorityQueue;->add(J)V +PLokio/PriorityQueue;->contains(J)Z +PLokio/PriorityQueue;->remove(J)V +Lokio/Socket; +Lorg/slf4j/ILoggerFactory; +Lorg/slf4j/Logger; +Lorg/slf4j/LoggerFactory; +SPLorg/slf4j/LoggerFactory;->()V +SPLorg/slf4j/LoggerFactory;->findServiceProviders()Ljava/util/ArrayList; +SPLorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/String;)Lorg/slf4j/Logger; +SPLorg/slf4j/LoggerFactory;->performInitialization()V +SPLorg/slf4j/LoggerFactory;->postBindCleanUp()V +SPLorg/slf4j/LoggerFactory;->reportIgnoredStaticLoggerBinders(Ljava/util/LinkedHashSet;)V +SPLorg/slf4j/LoggerFactory;->reportMultipleBindingAmbiguity(Ljava/util/ArrayList;)V +Lorg/slf4j/event/Level$EnumUnboxingLocalUtility; +SPLorg/slf4j/event/Level$EnumUnboxingLocalUtility;->m(III)I +SPLorg/slf4j/event/Level$EnumUnboxingLocalUtility;->m(ILandroidx/compose/runtime/ComposerImpl;ILandroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;)V +SPLorg/slf4j/event/Level$EnumUnboxingLocalUtility;->m(ILandroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/node/ComposeUiNode$Companion$SetModifier$1;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/node/OwnerSnapshotObserver$onCommitAffectingLayout$1;)V +PLorg/slf4j/event/Level$EnumUnboxingLocalUtility;->m(Ljava/lang/AutoCloseable;)V +PLorg/slf4j/event/Level$EnumUnboxingLocalUtility;->m(Ljava/lang/Object;)V +SPLorg/slf4j/event/Level$EnumUnboxingLocalUtility;->m(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +Lorg/slf4j/helpers/BasicMDCAdapter$1; +Lorg/slf4j/helpers/NOPLogger; +SPLorg/slf4j/helpers/NOPLogger;->()V +Lorg/slf4j/helpers/Reporter; +SPLorg/slf4j/helpers/Reporter;->()V +SPLorg/slf4j/helpers/Reporter;->getTarget()Ljava/io/PrintStream; +SPLorg/slf4j/helpers/Reporter;->warn(Ljava/lang/String;)V +Lorg/slf4j/helpers/SubstituteLoggerFactory; +SPLorg/slf4j/helpers/SubstituteLoggerFactory;->()V +Lorg/slf4j/helpers/SubstituteServiceProvider; +SPLorg/slf4j/helpers/SubstituteServiceProvider;->(I)V \ No newline at end of file diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt index 8adc5b1..d7c7e5d 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/MainActivity.kt @@ -3,6 +3,7 @@ package cc.n0th1ng.tripmoney import android.os.Build import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.compose.ReportDrawnWhen import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.annotation.RequiresApi @@ -11,6 +12,7 @@ import androidx.compose.material3.DrawerValue import androidx.compose.material3.Scaffold import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -55,6 +57,7 @@ class MainActivity : ComponentActivity() { NavigationDrawer() } } + } } @@ -77,7 +80,7 @@ fun NavigationDrawer() { val autoOpenPref by settingsViewModel.autoOpenStartupPref.collectAsState() var hasHandledStartupOpen by rememberSaveable { mutableStateOf(false) } val shouldTriggerAutoOpen = autoOpenPref == true && !hasHandledStartupOpen - + ReportDrawnWhen { !categories.isEmpty() } CustomNavigationDrawer(navController, drawerState) { Scaffold( topBar = { diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index 79c4b70..1b09386 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -212,7 +212,7 @@ private class DatabasePrepopulator( color = colors.random() ), Category( - name = "Zakupy9 ", + name = "Zakupy9", icon = Icons.GROCERIES, color = colors.random() ), diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt index febd2d5..4f49e07 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/entity/Expense.kt @@ -19,7 +19,7 @@ import java.time.LocalDateTime onUpdate = ForeignKey.CASCADE, onDelete = ForeignKey.CASCADE )], - indices = [Index(value = ["category_id"], unique = true)] + indices = [Index(value = ["category_id"])] ) @Immutable data class Expense( diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt index f1e1bd7..8d7a46a 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/listexpense/ListExpenseScreen.kt @@ -47,8 +47,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.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -143,7 +146,9 @@ fun ListExpenseScreen( { Box { LazyColumn( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().semantics { + contentDescription = "expensesList" + }, horizontalAlignment = Alignment.CenterHorizontally, state = listState ) { diff --git a/baselineprofile/build.gradle.kts b/baselineprofile/build.gradle.kts deleted file mode 100644 index bf95b1c..0000000 --- a/baselineprofile/build.gradle.kts +++ /dev/null @@ -1,53 +0,0 @@ -plugins { - alias(libs.plugins.android.test) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.baselineprofile) -} - -android { - namespace = "cc.n0th1ng.baselineprofile" - compileSdk = 36 - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - kotlinOptions { - jvmTarget = "11" - } - - defaultConfig { - minSdk = 28 - targetSdk = 36 - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - targetProjectPath = ":app" - -} - -// This is the configuration block for the Baseline Profile plugin. -// You can specify to run the generators on a managed devices or connected devices. -baselineProfile { - useConnectedDevices = true -} - -dependencies { - implementation(libs.androidx.junit) - implementation(libs.androidx.espresso.core) - implementation(libs.androidx.uiautomator) - implementation(libs.androidx.benchmark.macro.junit4) - implementation(libs.androidx.ui.test.junit4) -} - -androidComponents { - onVariants { v -> - val artifactsLoader = v.artifacts.getBuiltArtifactsLoader() - v.instrumentationRunnerArguments.put( - "targetAppId", - v.testedApks.map { artifactsLoader.load(it)?.applicationId } - ) - } -} \ No newline at end of file diff --git a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt deleted file mode 100644 index 371e938..0000000 --- a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/BaselineProfileGenerator.kt +++ /dev/null @@ -1,36 +0,0 @@ -package cc.n0th1ng.baselineprofile - -import android.R.attr.contentDescription -import androidx.benchmark.macro.MacrobenchmarkScope -import androidx.benchmark.macro.junit4.BaselineProfileRule -import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.LargeTest -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.uiautomator.By -import androidx.test.uiautomator.Direction -import androidx.test.uiautomator.Until -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -@LargeTest -class BaselineProfileGenerator { - @get:Rule - val rule = BaselineProfileRule() - - @Test - fun generate() { - rule.collect( - packageName = "cc.n0th1ng.tripmoney", - includeInStartupProfile = true - ) { -// pressHome() - startActivityAndWait() - - device.waitForIdle() - device.wait(Until.hasObject(By.desc("list screen")), 10_000) - } - } -} diff --git a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt b/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt deleted file mode 100644 index 851db23..0000000 --- a/baselineprofile/src/main/java/cc/n0th1ng/baselineprofile/StartupBenchmarks.kt +++ /dev/null @@ -1,76 +0,0 @@ -package cc.n0th1ng.baselineprofile - -import androidx.benchmark.macro.BaselineProfileMode -import androidx.benchmark.macro.CompilationMode -import androidx.benchmark.macro.StartupMode -import androidx.benchmark.macro.StartupTimingMetric -import androidx.benchmark.macro.junit4.MacrobenchmarkRule -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.LargeTest -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith - -/** - * This test class benchmarks the speed of app startup. - * Run this benchmark to verify how effective a Baseline Profile is. - * It does this by comparing [CompilationMode.None], which represents the app with no Baseline - * Profiles optimizations, and [CompilationMode.Partial], which uses Baseline Profiles. - * - * Run this benchmark to see startup measurements and captured system traces for verifying - * the effectiveness of your Baseline Profiles. You can run it directly from Android - * Studio as an instrumentation test, or run all benchmarks for a variant, for example benchmarkRelease, - * with this Gradle task: - * ``` - * ./gradlew :baselineprofile:connectedBenchmarkReleaseAndroidTest - * ``` - * - * You should run the benchmarks on a physical device, not an Android emulator, because the - * emulator doesn't represent real world performance and shares system resources with its host. - * - * For more information, see the [Macrobenchmark documentation](https://d.android.com/macrobenchmark#create-macrobenchmark) - * and the [instrumentation arguments documentation](https://d.android.com/topic/performance/benchmarking/macrobenchmark-instrumentation-args). - **/ -@RunWith(AndroidJUnit4::class) -@LargeTest -class StartupBenchmarks { - - @get:Rule - val rule = MacrobenchmarkRule() - - @Test - fun startupCompilationNone() = - benchmark(CompilationMode.None()) - - @Test - fun startupCompilationBaselineProfiles() = - benchmark(CompilationMode.Partial(BaselineProfileMode.Require)) - - private fun benchmark(compilationMode: CompilationMode) { - // The application id for the running build variant is read from the instrumentation arguments. - rule.measureRepeated( - packageName = InstrumentationRegistry.getArguments().getString("targetAppId") - ?: throw Exception("targetAppId not passed as instrumentation runner arg"), - metrics = listOf(StartupTimingMetric()), - compilationMode = compilationMode, - startupMode = StartupMode.COLD, - iterations = 10, - setupBlock = { - pressHome() - }, - measureBlock = { - startActivityAndWait() - - // TODO Add interactions to wait for when your app is fully drawn. - // The app is fully drawn when Activity.reportFullyDrawn is called. - // For Jetpack Compose, you can use ReportDrawn, ReportDrawnWhen and ReportDrawnAfter - // from the AndroidX Activity library. - - // Check the UiAutomator documentation for more information on how to - // interact with the app. - // https://d.android.com/training/testing/other-components/ui-automator - } - ) - } -} \ No newline at end of file diff --git a/baselineprofile/.gitignore b/benchmark/.gitignore similarity index 100% rename from baselineprofile/.gitignore rename to benchmark/.gitignore diff --git a/benchmark/build.gradle.kts b/benchmark/build.gradle.kts new file mode 100644 index 0000000..8fcb1b1 --- /dev/null +++ b/benchmark/build.gradle.kts @@ -0,0 +1,54 @@ +import com.android.build.api.dsl.ManagedVirtualDevice + +kotlin { + jvmToolchain(21) +} +plugins { + alias(libs.plugins.android.test) + alias(libs.plugins.kotlin.android) +} + +android { + namespace = "cc.n0th1ng.benchmark" + compileSdk = 36 + + defaultConfig { + minSdk = 24 + targetSdk = 36 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["androidx.compose.ui.test.tagsAsResourceId"] = "true" + } + + testOptions.managedDevices.devices { + create("pixel6Api31") { + device = "Pixel 6" + apiLevel = 31 + systemImageSource = "aosp" + } + } + + buildTypes { + create("benchmark") { + isDebuggable = true + signingConfig = getByName("debug").signingConfig + matchingFallbacks += listOf("release") + } + } + + targetProjectPath = ":app" + experimentalProperties["android.experimental.self-instrumenting"] = true +} + +dependencies { + implementation(libs.androidx.junit) + implementation(libs.androidx.espresso.core) + implementation(libs.androidx.uiautomator) + implementation(libs.androidx.benchmark.macro.junit4) +} + +androidComponents { + beforeVariants(selector().all()) { + it.enable = it.buildType == "benchmark" + } +} \ No newline at end of file diff --git a/baselineprofile/src/main/AndroidManifest.xml b/benchmark/src/main/AndroidManifest.xml similarity index 100% rename from baselineprofile/src/main/AndroidManifest.xml rename to benchmark/src/main/AndroidManifest.xml diff --git a/benchmark/src/main/java/cc/n0th1ng/benchmark/BaselineProfileGenerator.kt b/benchmark/src/main/java/cc/n0th1ng/benchmark/BaselineProfileGenerator.kt new file mode 100644 index 0000000..239163c --- /dev/null +++ b/benchmark/src/main/java/cc/n0th1ng/benchmark/BaselineProfileGenerator.kt @@ -0,0 +1,46 @@ +package cc.n0th1ng.benchmark + +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.benchmark.macro.junit4.BaselineProfileRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner +import androidx.test.uiautomator.By +import androidx.test.uiautomator.Direction +import androidx.test.uiautomator.Until +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4ClassRunner::class) +class BaselineProfileGenerator { + + @RequiresApi(Build.VERSION_CODES.P) + @get:Rule + val rule = BaselineProfileRule() + + @RequiresApi(Build.VERSION_CODES.P) + @Test + fun startup() = rule.collect( + maxIterations = 1, + packageName = "cc.n0th1ng.tripmoney", + profileBlock = { + device.executeShellCommand( + "rm -rf /data/data/cc.n0th1ng.tripmoney/files/datastore/" + ) + startActivityAndWait() + device.wait(Until.hasObject(By.text("Włochy")), 10_000) + device.findObject(By.text("Włochy")).click() + val isVisible = device.wait(Until.hasObject(By.desc("expensesList")), 10_000) + assert(isVisible) + val expensesList = device.findObject(By.desc("expensesList")) + expensesList.setGestureMargin(device.displayWidth / 5) + expensesList.fling(Direction.DOWN) + expensesList.fling(Direction.UP) + expensesList.fling(Direction.DOWN) + expensesList.fling(Direction.UP) + } + ) + + +} \ No newline at end of file diff --git a/benchmark/src/main/java/cc/n0th1ng/benchmark/ExampleStartupBenchmark.kt b/benchmark/src/main/java/cc/n0th1ng/benchmark/ExampleStartupBenchmark.kt new file mode 100644 index 0000000..38b10a5 --- /dev/null +++ b/benchmark/src/main/java/cc/n0th1ng/benchmark/ExampleStartupBenchmark.kt @@ -0,0 +1,43 @@ +package cc.n0th1ng.benchmark + +import androidx.benchmark.macro.CompilationMode +import androidx.benchmark.macro.StartupMode +import androidx.benchmark.macro.StartupTimingMetric +import androidx.benchmark.macro.junit4.MacrobenchmarkRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.uiautomator.By +import androidx.test.uiautomator.Until +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +/** + * This is an example startup benchmark. + * + * It navigates to the device's home screen, and launches the default activity. + * + * Before running this benchmark: + * 1) switch your app's active build variant in the Studio (affedaggcts Studio runs only) + * 2) add `` to your app's manifest, within the `` tag + * + * Run this benchmark from Studio to see startup measurements, and captured system traces + * for investigating your app's performance. + */ +@RunWith(AndroidJUnit4::class) +class ExampleStartupBenchmark { + @get:Rule + val benchmarkRule = MacrobenchmarkRule() + + @Test + fun startup() = benchmarkRule.measureRepeated( + packageName = "cc.n0th1ng.tripmoney", + metrics = listOf(StartupTimingMetric()), + iterations = 5, + startupMode = StartupMode.COLD + ) { + pressHome() + startActivityAndWait() + device.wait(Until.hasObject(By.pkg("cc.n0th1ng.tripmoney")), 10_000) + device.waitForIdle() + } +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d758490..13d1ad7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,10 +35,10 @@ roomRxjava2 = "2.8.4" roomRxjava3 = "2.8.4" roomTesting = "2.8.4" uiautomator = "2.3.0" -benchmarkMacroJunit4 = "1.2.4" -baselineprofile = "1.2.4" -profileinstaller = "1.3.1" -uiTestJunit4 = "1.10.6" +benchmarkMacroJunit4 = "1.4.1" +baselineprofile = "1.4.1" +profileinstaller = "1.4.1" +uiTestJunit4 = "1.11.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } diff --git a/settings.gradle.kts b/settings.gradle.kts index e638d04..8ed148d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,4 +21,4 @@ dependencyResolutionManagement { rootProject.name = "tripMoney" include(":app") -include(":baselineprofile") +include(":benchmark") From e6c8cf5cd3a12b269b7086702f7212b4f4ff94b8 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Wed, 29 Apr 2026 15:58:20 +0200 Subject: [PATCH 16/18] init --- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 8 ++++---- .../cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt | 3 +-- .../data/repository/ExpenseRepository.kt | 3 +-- .../tripmoney/screens/settings/SettingsScreen.kt | 16 ++-------------- .../screens/statistics/StatisticsScreen.kt | 3 ++- .../viewmodel/ExpenseAndCategoryViewModel.kt | 4 +--- 6 files changed, 11 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index 1b09386..c486f39 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -57,13 +57,13 @@ object DatabaseModule { fun provideTripDatabase( @ApplicationContext context: Context ): TripDatabase { - val db: TripDatabase = Room.inMemoryDatabaseBuilder( -// val db: TripDatabase = Room.databaseBuilder( -// name = "tripmoney_db", +// val db: TripDatabase = Room.inMemoryDatabaseBuilder( + val db: TripDatabase = Room.databaseBuilder( + name = "tripmoney_db", context = context, klass = TripDatabase::class.java, ) - .allowMainThreadQueries() // TODO Remove in production! +// .allowMainThreadQueries() // TODO Remove in production! .fallbackToDestructiveMigration() // TODO Handle schema changes during dev .build() diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt index 97308f9..b475462 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/dao/ExpenseDao.kt @@ -7,7 +7,6 @@ import androidx.room.Query import androidx.room.RewriteQueriesToDropUnusedColumns import androidx.room.Transaction import androidx.room.Upsert -import cc.n0th1ng.tripmoney.data.entity.Category import cc.n0th1ng.tripmoney.data.entity.Expense import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import kotlinx.coroutines.flow.Flow @@ -100,7 +99,7 @@ interface ExpenseDao { WHERE trip.id = :tripId """ ) - fun budgetLeft(tripId: Int): Double? + fun budgetLeft(tripId: Int): Flow @Delete suspend fun delete(expense: Expense) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt index 3e5aedf..bacf5ab 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/repository/ExpenseRepository.kt @@ -13,7 +13,6 @@ import cc.n0th1ng.tripmoney.data.entity.ExpenseDto import cc.n0th1ng.tripmoney.utils.Currencies import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first -import java.util.OptionalDouble import javax.inject.Inject class ExpenseRepository @Inject constructor( @@ -21,7 +20,7 @@ class ExpenseRepository @Inject constructor( private val exchangeRateRepository: ExchangeRateRepository ) { - fun getBudgetLeft(tripId: Int): Double? { + fun getBudgetLeft(tripId: Int): Flow { return expenseDao.budgetLeft(tripId) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt index 0feb2ef..c3fc911 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/settings/SettingsScreen.kt @@ -1,6 +1,5 @@ package cc.n0th1ng.tripmoney.screens.settings -import android.content.Intent import android.os.Build import androidx.annotation.RequiresApi import androidx.annotation.StringRes @@ -36,34 +35,23 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.core.content.FileProvider import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.navigation.NavHostController -import androidx.navigation.compose.rememberNavController -import cc.n0th1ng.tripmoney.R.* -import cc.n0th1ng.tripmoney.data.entity.Category +import cc.n0th1ng.tripmoney.R.string import cc.n0th1ng.tripmoney.data.entity.Trip import cc.n0th1ng.tripmoney.data.repository.AppTheme import cc.n0th1ng.tripmoney.navigation.Screens -import cc.n0th1ng.tripmoney.screens.listexpense.CategorySelectionDialog import cc.n0th1ng.tripmoney.screens.listexpense.CurrencySelectionDialog -import cc.n0th1ng.tripmoney.screens.statistics.categories import cc.n0th1ng.tripmoney.theme.TripMoneyTheme import cc.n0th1ng.tripmoney.utils.AllPreviews import cc.n0th1ng.tripmoney.utils.Currencies -import cc.n0th1ng.tripmoney.utils.Icons -import cc.n0th1ng.tripmoney.utils.saveCsv import cc.n0th1ng.tripmoney.utils.shareCsv import cc.n0th1ng.tripmoney.viewmodel.ExpenseAndCategoryViewModel import cc.n0th1ng.tripmoney.viewmodel.SettingsViewModel import cc.n0th1ng.tripmoney.viewmodel.TripViewModel import com.composables.icons.materialsymbols.outlined.R -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import java.io.File -import java.nio.file.Files @RequiresApi(Build.VERSION_CODES.S) @Composable @@ -168,7 +156,7 @@ fun SettingsScreen( iconResource = R.drawable.materialsymbols_ic_label_outlined ) SettingsListItem( - onClick = onCategoriesClick, + onClick = {}, stringResource(string.add_expense), supportingText = stringResource(string.add_expense_settings), iconResource = R.drawable.materialsymbols_ic_payments_outlined, diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt index 9ecbdd2..3fa4ae3 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/screens/statistics/StatisticsScreen.kt @@ -60,11 +60,12 @@ fun StatisticsScreen() { .collectAsState(emptyList()) val summaryAmount by expenseAndCategoryViewModel.getSummaryAmount(currentTripId) .collectAsState(0.0) + val moneyLeft by expenseAndCategoryViewModel.getBudgetLeft(currentTripId).collectAsState(null) StatisticsScreen( summaryPerCategoryList, summaryAmount, Currencies.valueOf(currentTrip?.currency ?: Currencies.default().name), - expenseAndCategoryViewModel.getBudgetLeft(currentTripId) + moneyLeft ) } diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt index 61fcf43..e1e5376 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/viewmodel/ExpenseAndCategoryViewModel.kt @@ -29,9 +29,7 @@ import org.apache.commons.csv.CSVFormat import org.apache.commons.csv.CSVPrinter import java.io.File import java.time.LocalDate -import java.util.OptionalDouble import javax.inject.Inject -import kotlin.collections.mapValues @HiltViewModel @@ -42,7 +40,7 @@ open class ExpenseAndCategoryViewModel @Inject constructor( private val tripRepo: TripRepository ) : ViewModel() { - fun getBudgetLeft(tripId: Int): Double? { + fun getBudgetLeft(tripId: Int): Flow { return expenseRepo.getBudgetLeft(tripId) } From 43aec61c756dc0a94999d48d11ba1c666a9cee83 Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Wed, 29 Apr 2026 15:59:17 +0200 Subject: [PATCH 17/18] init --- app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index c486f39..e33e971 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -63,7 +63,6 @@ object DatabaseModule { context = context, klass = TripDatabase::class.java, ) -// .allowMainThreadQueries() // TODO Remove in production! .fallbackToDestructiveMigration() // TODO Handle schema changes during dev .build() From bfbb1056d77274fb9d1d0ab5ef18b74d22e0d9de Mon Sep 17 00:00:00 2001 From: Rafal Wisniewski <2krafal.wisniewski@gmail.com> Date: Thu, 30 Apr 2026 09:58:14 +0200 Subject: [PATCH 18/18] init --- app/build.gradle.kts | 4 +- .../cc/n0th1ng/tripmoney/data/TripDatabase.kt | 89 +++++++------------ 2 files changed, 36 insertions(+), 57 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 314159a..a569677 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,7 +10,9 @@ plugins { android { namespace = "cc.n0th1ng.tripmoney" compileSdk = 36 - + buildFeatures { + buildConfig = true + } defaultConfig { applicationId = "cc.n0th1ng.tripmoney" minSdk = 24 diff --git a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt index e33e971..b9806da 100644 --- a/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt +++ b/app/src/main/java/cc/n0th1ng/tripmoney/data/TripDatabase.kt @@ -7,6 +7,7 @@ import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters +import cc.n0th1ng.tripmoney.BuildConfig import cc.n0th1ng.tripmoney.data.dao.CategoryDao import cc.n0th1ng.tripmoney.data.dao.ExchangeRateDao import cc.n0th1ng.tripmoney.data.dao.ExpenseDao @@ -34,8 +35,7 @@ import javax.inject.Singleton import kotlin.random.Random @Database( - entities = [Trip::class, Expense::class, Category::class, ExchangeRate::class], - version = 1 + entities = [Trip::class, Expense::class, Category::class, ExchangeRate::class], version = 1 ) @TypeConverters(Converters::class) abstract class TripDatabase : RoomDatabase() { @@ -57,22 +57,28 @@ object DatabaseModule { fun provideTripDatabase( @ApplicationContext context: Context ): TripDatabase { -// val db: TripDatabase = Room.inMemoryDatabaseBuilder( - val db: TripDatabase = Room.databaseBuilder( + val builder = if (BuildConfig.DEBUG) Room.inMemoryDatabaseBuilder( + context = context, klass = TripDatabase::class.java + ) else Room.databaseBuilder( name = "tripmoney_db", context = context, klass = TripDatabase::class.java, ) - .fallbackToDestructiveMigration() // TODO Handle schema changes during dev - .build() - CoroutineScope(Dispatchers.IO).launch { - DatabasePrepopulator( - tripDao = db.tripDao(), - categoryDao = db.categoryDao(), - expenseDao = db.expenseDao() - ).prepopulate() + val db: TripDatabase = + builder.fallbackToDestructiveMigration() // TODO Handle schema changes during dev + .build() + + if (BuildConfig.DEBUG) { + CoroutineScope(Dispatchers.IO).launch { + DatabasePrepopulator( + tripDao = db.tripDao(), + categoryDao = db.categoryDao(), + expenseDao = db.expenseDao() + ).prepopulate() + } } + return db } @@ -146,74 +152,46 @@ private class DatabasePrepopulator( val sampleCategories = listOf( Category( - name = "Hotel", - icon = Icons.HOTEL, - color = colors.random() + name = "Hotel", icon = Icons.HOTEL, color = colors.random() ), Category( - name = "Jedzenie", - icon = Icons.RESTAURANT, - color = colors.random() + name = "Jedzenie", icon = Icons.RESTAURANT, color = colors.random() ), Category( - name = "Transport", - icon = Icons.FLIGHT, - color = colors.random() + name = "Transport", icon = Icons.FLIGHT, color = colors.random() ), Category( - name = "Rozrywka", - icon = Icons.ATTRACTION, - color = colors.random() + name = "Rozrywka", icon = Icons.ATTRACTION, color = colors.random() ), Category( - name = "Zakupy", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy1", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy1", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy2", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy2", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy3", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy3", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy4", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy4", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy5", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy5", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy6", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy6", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy7", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy7", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy8", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy8", icon = Icons.GROCERIES, color = colors.random() ), Category( - name = "Zakupy9", - icon = Icons.GROCERIES, - color = colors.random() + name = "Zakupy9", icon = Icons.GROCERIES, color = colors.random() ), ) @@ -239,8 +217,7 @@ private class DatabasePrepopulator( note = if (i % 3 == 0) "Some note" else "", datetime = datetime, rate = if (Random.nextBoolean()) Random.nextDouble( - 0.1, - 5.0 + 0.1, 5.0 ) else 1.0 ) expense