From 39f4997c73a35d16127e4ab22f8040e19c31d587 Mon Sep 17 00:00:00 2001 From: Sad Ellie Date: Fri, 17 Feb 2023 15:58:17 +0400 Subject: [PATCH] Calculator history (#2): this is a squashed commit --- app/build.gradle.kts | 1 + core/base/src/main/res/values/strings.xml | 3 + .../unitto/core/ui/common/UnittoTopAppBar.kt | 5 +- data/calculator/.gitignore | 1 + .../build.gradle.kts} | 22 ++- data/calculator/consumer-rules.pro | 0 data/calculator/src/main/AndroidManifest.xml | 22 +++ .../data/calculator/CalculatorRepository.kt | 68 +++++++ data/common/.gitignore | 1 + data/common/build.gradle.kts | 29 +++ data/common/consumer-rules.pro | 0 data/common/src/main/AndroidManifest.xml | 22 +++ .../unitto/data/common}/BigDecimalUtils.kt | 4 +- .../unitto/data/common}/StringUtils.kt | 2 +- data/database/.gitignore | 1 + data/database/build.gradle.kts | 40 ++++ data/database/consumer-rules.pro | 0 .../1.json | 52 +++++ .../2.json | 90 +++++++++ data/database/src/main/AndroidManifest.xml | 22 +++ .../data/database/CalculatorHistoryDao.kt | 37 ++++ .../data/database/CalculatorHistoryEntity.kt | 31 +++ .../unitto/data/database/UnitsDao.kt} | 10 +- .../unitto/data/database/UnitsEntity.kt} | 4 +- .../unitto/data/database/UnitsRepository.kt} | 16 +- .../unitto/data/database/UnittoDatabase.kt | 39 ++++ .../data/database/UnittoDatabaseModule.kt} | 35 ++-- data/epoch/proguard-rules.pro | 21 -- data/model/.gitignore | 1 + data/model/build.gradle.kts | 30 +++ data/model/consumer-rules.pro | 0 data/model/src/main/AndroidManifest.xml | 22 +++ .../unitto/data/model}/AbstractUnit.kt | 5 +- .../sadellie/unitto/data/model/HistoryItem.kt | 27 +++ .../com/sadellie/unitto/data/model}/MyUnit.kt | 7 +- .../unitto/data/model}/NumberBaseUnit.kt | 3 +- .../sadellie/unitto/data/model}/UnitGroup.kt | 2 +- data/unitgroups/build.gradle.kts | 1 + .../data/unitgroups/UnitGroupsRepository.kt | 2 + data/units/build.gradle.kts | 7 +- .../unitto/data/units/AllUnitsRepository.kt | 20 +- .../sadellie/unitto/data/units/FlowUtils.kt | 2 +- .../data/units/collections/Acceleration.kt | 6 +- .../unitto/data/units/collections/Angle.kt | 8 +- .../unitto/data/units/collections/Area.kt | 8 +- .../unitto/data/units/collections/Currency.kt | 8 +- .../unitto/data/units/collections/Data.kt | 8 +- .../data/units/collections/DataTransfer.kt | 8 +- .../unitto/data/units/collections/Energy.kt | 8 +- .../unitto/data/units/collections/Flux.kt | 8 +- .../unitto/data/units/collections/Length.kt | 8 +- .../unitto/data/units/collections/Mass.kt | 8 +- .../data/units/collections/NumberBase.kt | 8 +- .../unitto/data/units/collections/Power.kt | 8 +- .../unitto/data/units/collections/Pressure.kt | 8 +- .../unitto/data/units/collections/Speed.kt | 8 +- .../data/units/collections/Temperature.kt | 10 +- .../unitto/data/units/collections/Time.kt | 8 +- .../unitto/data/units/collections/Volume.kt | 8 +- .../unitto/data/units/AllUnitsTest.kt | 4 +- .../units/LevenshteinFilterAndSortTest.kt | 5 +- .../unitto/data/units/LevenshteinTest.kt | 2 +- .../data/units/MinimumRequiredScaleTest.kt | 2 +- data/userprefs/build.gradle.kts | 4 +- .../unitto/data/userprefs/UserPreferences.kt | 6 +- feature/calculator/build.gradle.kts | 6 +- .../feature/calculator/CalculatorScreen.kt | 181 ++++++++++++++---- .../feature/calculator/CalculatorUIState.kt | 5 +- .../feature/calculator/CalculatorViewModel.kt | 35 +++- .../calculator/components/DragDownView.kt | 92 +++++++++ .../calculator/components/HistoryList.kt | 104 ++++++++++ feature/converter/build.gradle.kts | 4 +- .../feature/converter/ConverterUIState.kt | 2 +- .../feature/converter/ConverterViewModel.kt | 31 +-- .../feature/converter/components/TopScreen.kt | 4 +- .../converter/ConverterViewModelTest.kt | 10 +- feature/settings/build.gradle.kts | 3 +- .../feature/settings/SettingsViewModel.kt | 2 +- feature/unitslist/build.gradle.kts | 2 + .../feature/unitslist/LeftSideScreen.kt | 2 +- .../feature/unitslist/RightSideScreen.kt | 6 +- .../feature/unitslist/SecondScreenUIState.kt | 4 +- .../feature/unitslist/SecondViewModel.kt | 22 +-- .../feature/unitslist/components/ChipsRow.kt | 4 +- .../unitslist/components/UnitGroupHeader.kt | 2 +- .../unitslist/components/UnitListItem.kt | 2 +- .../navigation/UnitsListNavigation.kt | 2 +- settings.gradle.kts | 4 + 88 files changed, 1139 insertions(+), 256 deletions(-) create mode 100644 data/calculator/.gitignore rename data/{units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDatabase.kt => calculator/build.gradle.kts} (67%) create mode 100644 data/calculator/consumer-rules.pro create mode 100644 data/calculator/src/main/AndroidManifest.xml create mode 100644 data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorRepository.kt create mode 100644 data/common/.gitignore create mode 100644 data/common/build.gradle.kts create mode 100644 data/common/consumer-rules.pro create mode 100644 data/common/src/main/AndroidManifest.xml rename data/{units/src/main/java/com/sadellie/unitto/data/units => common/src/main/java/com/sadellie/unitto/data/common}/BigDecimalUtils.kt (96%) rename data/{units/src/main/java/com/sadellie/unitto/data/units => common/src/main/java/com/sadellie/unitto/data/common}/StringUtils.kt (98%) create mode 100644 data/database/.gitignore create mode 100644 data/database/build.gradle.kts create mode 100644 data/database/consumer-rules.pro create mode 100644 data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/1.json create mode 100644 data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/2.json create mode 100644 data/database/src/main/AndroidManifest.xml create mode 100644 data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt create mode 100644 data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt rename data/{units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDao.kt => database/src/main/java/com/sadellie/unitto/data/database/UnitsDao.kt} (81%) rename data/{units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnit.kt => database/src/main/java/com/sadellie/unitto/data/database/UnitsEntity.kt} (95%) rename data/{units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitsRepository.kt => database/src/main/java/com/sadellie/unitto/data/database/UnitsRepository.kt} (69%) create mode 100644 data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt rename data/{units/src/main/java/com/sadellie/unitto/data/units/database/BasedUnitDatabaseModule.kt => database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt} (58%) delete mode 100644 data/epoch/proguard-rules.pro create mode 100644 data/model/.gitignore create mode 100644 data/model/build.gradle.kts create mode 100644 data/model/consumer-rules.pro create mode 100644 data/model/src/main/AndroidManifest.xml rename data/{units/src/main/java/com/sadellie/unitto/data/units => model/src/main/java/com/sadellie/unitto/data/model}/AbstractUnit.kt (97%) create mode 100644 data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt rename data/{units/src/main/java/com/sadellie/unitto/data/units => model/src/main/java/com/sadellie/unitto/data/model}/MyUnit.kt (90%) rename data/{units/src/main/java/com/sadellie/unitto/data/units => model/src/main/java/com/sadellie/unitto/data/model}/NumberBaseUnit.kt (93%) rename data/{unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups => model/src/main/java/com/sadellie/unitto/data/model}/UnitGroup.kt (97%) create mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/DragDownView.kt create mode 100644 feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f7873b64..c1115a32 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -116,6 +116,7 @@ dependencies { implementation(project(mapOf("path" to ":feature:tools"))) implementation(project(mapOf("path" to ":feature:epoch"))) implementation(project(mapOf("path" to ":data:units"))) + implementation(project(mapOf("path" to ":data:model"))) implementation(project(mapOf("path" to ":data:userprefs"))) implementation(project(mapOf("path" to ":core:ui"))) } diff --git a/core/base/src/main/res/values/strings.xml b/core/base/src/main/res/values/strings.xml index 7eadc89e..debd58a2 100644 --- a/core/base/src/main/res/values/strings.xml +++ b/core/base/src/main/res/values/strings.xml @@ -1025,6 +1025,9 @@ Calculator Calculate, but don\'t convert + Clear + Clear history + All expressions from history will be deleted forever. This action can\'t be undone! Number of decimal places diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoTopAppBar.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoTopAppBar.kt index 616d2b41..ee2f4c1f 100644 --- a/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoTopAppBar.kt +++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/common/UnittoTopAppBar.kt @@ -19,6 +19,7 @@ package com.sadellie.unitto.core.ui.common import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.RowScope import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar @@ -36,6 +37,7 @@ import androidx.compose.ui.Modifier fun UnittoTopAppBar( title: String, navigateUpAction: () -> Unit, + actions: @Composable RowScope.() -> Unit = {}, content: @Composable (PaddingValues) -> Unit ) { Scaffold( @@ -47,7 +49,8 @@ fun UnittoTopAppBar( }, navigationIcon = { NavigateUpButton { navigateUpAction() } - } + }, + actions = actions ) }, content = content diff --git a/data/calculator/.gitignore b/data/calculator/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/data/calculator/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDatabase.kt b/data/calculator/build.gradle.kts similarity index 67% rename from data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDatabase.kt rename to data/calculator/build.gradle.kts index 42320213..9b5f6680 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDatabase.kt +++ b/data/calculator/build.gradle.kts @@ -1,6 +1,6 @@ /* * Unitto is a unit converter for Android - * Copyright (c) 2022-2022 Elshan Agaev + * Copyright (c) 2023 Elshan Agaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,16 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units.database - -import androidx.room.Database -import androidx.room.RoomDatabase - -@Database(entities = [MyBasedUnit::class], version = 1, exportSchema = false) -abstract class MyBasedUnitDatabase : RoomDatabase() { - abstract fun myBasedUnitDao(): MyBasedUnitDao +plugins { + id("unitto.library") + id("unitto.android.hilt") +} + +android { + namespace = "com.sadellie.unitto.data.calculator" +} + +dependencies { + implementation(project(mapOf("path" to ":data:model"))) + implementation(project(mapOf("path" to ":data:database"))) } diff --git a/data/calculator/consumer-rules.pro b/data/calculator/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/data/calculator/src/main/AndroidManifest.xml b/data/calculator/src/main/AndroidManifest.xml new file mode 100644 index 00000000..232257bf --- /dev/null +++ b/data/calculator/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorRepository.kt b/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorRepository.kt new file mode 100644 index 00000000..54576a03 --- /dev/null +++ b/data/calculator/src/main/java/com/sadellie/unitto/data/calculator/CalculatorRepository.kt @@ -0,0 +1,68 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.data.calculator + +import com.sadellie.unitto.data.database.CalculatorHistoryDao +import com.sadellie.unitto.data.database.CalculatorHistoryEntity +import com.sadellie.unitto.data.model.HistoryItem +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.map +import java.util.* +import javax.inject.Inject + +class CalculatorHistoryRepository @Inject constructor( + private val calculatorHistoryDao: CalculatorHistoryDao +) { + /** + * Calculator history sorted by [CalculatorHistoryEntity.timestamp] from new to old (DESC). + */ + val historyFlow: Flow> = calculatorHistoryDao + .getAllDescending() + .map { it.toHistoryItemList() } + .flowOn(Dispatchers.IO) + + suspend fun add( + expression: String, + result: String + ) { + calculatorHistoryDao.insert( + CalculatorHistoryEntity( + timestamp = System.currentTimeMillis(), + expression = expression, + result = result + ) + ) + } + + suspend fun clear() { + calculatorHistoryDao.clear() + } + + private fun List.toHistoryItemList(): List { + return this.map { + HistoryItem( + date = Date(it.timestamp), + expression = it.expression, + result = it.result + ) + } + } +} diff --git a/data/common/.gitignore b/data/common/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/data/common/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/data/common/build.gradle.kts b/data/common/build.gradle.kts new file mode 100644 index 00000000..ae906d33 --- /dev/null +++ b/data/common/build.gradle.kts @@ -0,0 +1,29 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id("unitto.library") +} + +android { + namespace = "com.sadellie.unitto.data.common" +} + +dependencies { + implementation(project(mapOf("path" to ":core:base"))) +} \ No newline at end of file diff --git a/data/common/consumer-rules.pro b/data/common/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/data/common/src/main/AndroidManifest.xml b/data/common/src/main/AndroidManifest.xml new file mode 100644 index 00000000..232257bf --- /dev/null +++ b/data/common/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/BigDecimalUtils.kt b/data/common/src/main/java/com/sadellie/unitto/data/common/BigDecimalUtils.kt similarity index 96% rename from data/units/src/main/java/com/sadellie/unitto/data/units/BigDecimalUtils.kt rename to data/common/src/main/java/com/sadellie/unitto/data/common/BigDecimalUtils.kt index a2876d94..16843cf9 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/BigDecimalUtils.kt +++ b/data/common/src/main/java/com/sadellie/unitto/data/common/BigDecimalUtils.kt @@ -1,6 +1,6 @@ /* * Unitto is a unit converter for Android - * Copyright (c) 2022 Elshan Agaev + * Copyright (c) 2022-2023 Elshan Agaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data +package com.sadellie.unitto.data.common import com.sadellie.unitto.core.base.OutputFormat import java.math.BigDecimal diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/StringUtils.kt b/data/common/src/main/java/com/sadellie/unitto/data/common/StringUtils.kt similarity index 98% rename from data/units/src/main/java/com/sadellie/unitto/data/units/StringUtils.kt rename to data/common/src/main/java/com/sadellie/unitto/data/common/StringUtils.kt index 855edbf0..7e52fd33 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/StringUtils.kt +++ b/data/common/src/main/java/com/sadellie/unitto/data/common/StringUtils.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data +package com.sadellie.unitto.data.common /** * Compute Levenshtein Distance between this string and [secondString]. Doesn't matter which string is diff --git a/data/database/.gitignore b/data/database/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/data/database/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/data/database/build.gradle.kts b/data/database/build.gradle.kts new file mode 100644 index 00000000..301acfc6 --- /dev/null +++ b/data/database/build.gradle.kts @@ -0,0 +1,40 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id("unitto.library") + id("unitto.android.hilt") +} + +android { + namespace = "com.sadellie.unitto.data.database" + + // Long thingy + val schemaLocation = "$projectDir/schemas" + defaultConfig + .javaCompileOptions + .annotationProcessorOptions + .arguments["room.schemaLocation"] = schemaLocation + println("Exported Database schema to $schemaLocation") +} + +dependencies { + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.ktx) + kapt(libs.androidx.room.compiler) +} \ No newline at end of file diff --git a/data/database/consumer-rules.pro b/data/database/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/1.json b/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/1.json new file mode 100644 index 00000000..ed1eaa91 --- /dev/null +++ b/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/1.json @@ -0,0 +1,52 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "96a05166e4b7d08a4595ac65138aff62", + "entities": [ + { + "tableName": "units", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`unitId` TEXT NOT NULL, `is_favorite` INTEGER, `paired_unit_id` TEXT, `frequency` INTEGER, PRIMARY KEY(`unitId`))", + "fields": [ + { + "fieldPath": "unitId", + "columnName": "unitId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isFavorite", + "columnName": "is_favorite", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "pairedUnitId", + "columnName": "paired_unit_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "frequency", + "columnName": "frequency", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "unitId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '96a05166e4b7d08a4595ac65138aff62')" + ] + } +} \ No newline at end of file diff --git a/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/2.json b/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/2.json new file mode 100644 index 00000000..531c500c --- /dev/null +++ b/data/database/schemas/com.sadellie.unitto.data.database.UnittoDatabase/2.json @@ -0,0 +1,90 @@ +{ + "formatVersion": 1, + "database": { + "version": 2, + "identityHash": "d5dca9e0346c3400b7ff5b31e85c7827", + "entities": [ + { + "tableName": "units", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`unitId` TEXT NOT NULL, `is_favorite` INTEGER, `paired_unit_id` TEXT, `frequency` INTEGER, PRIMARY KEY(`unitId`))", + "fields": [ + { + "fieldPath": "unitId", + "columnName": "unitId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isFavorite", + "columnName": "is_favorite", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "pairedUnitId", + "columnName": "paired_unit_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "frequency", + "columnName": "frequency", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "unitId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "calculator_history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`entityId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timestamp` INTEGER NOT NULL, `expression` TEXT NOT NULL, `result` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "entityId", + "columnName": "entityId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "expression", + "columnName": "expression", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "result", + "columnName": "result", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "entityId" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd5dca9e0346c3400b7ff5b31e85c7827')" + ] + } +} \ No newline at end of file diff --git a/data/database/src/main/AndroidManifest.xml b/data/database/src/main/AndroidManifest.xml new file mode 100644 index 00000000..232257bf --- /dev/null +++ b/data/database/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt new file mode 100644 index 00000000..52b662c4 --- /dev/null +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryDao.kt @@ -0,0 +1,37 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.data.database + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import kotlinx.coroutines.flow.Flow + +@Dao +interface CalculatorHistoryDao { + @Query("SELECT * FROM calculator_history ORDER BY timestamp DESC") + fun getAllDescending(): Flow> + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insert(vararg historyEntity: CalculatorHistoryEntity) + + @Query("DELETE FROM calculator_history") + suspend fun clear() +} diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt new file mode 100644 index 00000000..6488f524 --- /dev/null +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/CalculatorHistoryEntity.kt @@ -0,0 +1,31 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.data.database + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "calculator_history") +class CalculatorHistoryEntity( + @PrimaryKey(autoGenerate = true) val entityId: Int = 0, + @ColumnInfo(name = "timestamp") val timestamp: Long, + @ColumnInfo(name = "expression") val expression: String, + @ColumnInfo(name = "result") val result: String +) diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDao.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnitsDao.kt similarity index 81% rename from data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDao.kt rename to data/database/src/main/java/com/sadellie/unitto/data/database/UnitsDao.kt index dc44bfff..6a1175cc 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitDao.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnitsDao.kt @@ -1,6 +1,6 @@ /* * Unitto is a unit converter for Android - * Copyright (c) 2022-2022 Elshan Agaev + * Copyright (c) 2022-2023 Elshan Agaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units.database +package com.sadellie.unitto.data.database import androidx.room.Dao import androidx.room.Insert @@ -24,10 +24,10 @@ import androidx.room.OnConflictStrategy import androidx.room.Query @Dao -interface MyBasedUnitDao { +interface UnitsDao { @Query("SELECT * FROM units") - suspend fun getAll(): List + suspend fun getAll(): List @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertUnits(vararg units: MyBasedUnit) + suspend fun insertUnits(vararg units: UnitsEntity) } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnit.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnitsEntity.kt similarity index 95% rename from data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnit.kt rename to data/database/src/main/java/com/sadellie/unitto/data/database/UnitsEntity.kt index f94b345f..83601859 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnit.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnitsEntity.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units.database +package com.sadellie.unitto.data.database import androidx.room.ColumnInfo import androidx.room.Entity @@ -30,7 +30,7 @@ import androidx.room.PrimaryKey * @param frequency Show the amount of time this unit was used */ @Entity(tableName = "units") -class MyBasedUnit( +class UnitsEntity( @PrimaryKey val unitId: String, @ColumnInfo(name = "is_favorite") val isFavorite: Boolean?, @ColumnInfo(name = "paired_unit_id") val pairedUnitId: String?, diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitsRepository.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnitsRepository.kt similarity index 69% rename from data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitsRepository.kt rename to data/database/src/main/java/com/sadellie/unitto/data/database/UnitsRepository.kt index 874fb7da..810f032d 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/database/MyBasedUnitsRepository.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnitsRepository.kt @@ -1,6 +1,6 @@ /* * Unitto is a unit converter for Android - * Copyright (c) 2022-2022 Elshan Agaev + * Copyright (c) 2022-2023 Elshan Agaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,26 +16,26 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units.database +package com.sadellie.unitto.data.database import javax.inject.Inject -class MyBasedUnitsRepository @Inject constructor (private val myBasedUnitDao: MyBasedUnitDao) { +class UnitsRepository @Inject constructor (private val unitsDao: UnitsDao) { /** * Method to insert units. Will rewrite row if unit's id is already in database * * @param unit Unit to add */ - suspend fun insertUnits(unit: MyBasedUnit) { - myBasedUnitDao.insertUnits(unit) + suspend fun insertUnits(unit: UnitsEntity) { + unitsDao.insertUnits(unit) } /** * Method to get all units from units table * - * @return List of [MyBasedUnit] objects that represent one row in table + * @return List of [UnitsEntity] objects that represent one row in table */ - suspend fun getAll(): List { - return myBasedUnitDao.getAll() + suspend fun getAll(): List { + return unitsDao.getAll() } } \ No newline at end of file diff --git a/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt new file mode 100644 index 00000000..8162acc1 --- /dev/null +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabase.kt @@ -0,0 +1,39 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2022-2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.data.database + +import androidx.room.AutoMigration +import androidx.room.Database +import androidx.room.RoomDatabase + +@Database( + version = 2, + exportSchema = true, + entities = [ + UnitsEntity::class, + CalculatorHistoryEntity::class + ], + autoMigrations = [ + AutoMigration (from = 1, to = 2) + ] +) +abstract class UnittoDatabase : RoomDatabase() { + abstract fun unitsDao(): UnitsDao + abstract fun calculatorHistoryDao(): CalculatorHistoryDao +} diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/database/BasedUnitDatabaseModule.kt b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt similarity index 58% rename from data/units/src/main/java/com/sadellie/unitto/data/units/database/BasedUnitDatabaseModule.kt rename to data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt index 4982a65f..bc2902ae 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/database/BasedUnitDatabaseModule.kt +++ b/data/database/src/main/java/com/sadellie/unitto/data/database/UnittoDatabaseModule.kt @@ -1,6 +1,6 @@ /* * Unitto is a unit converter for Android - * Copyright (c) 2022-2022 Elshan Agaev + * Copyright (c) 2022-2023 Elshan Agaev * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units.database +package com.sadellie.unitto.data.database import android.content.Context import androidx.room.Room @@ -33,30 +33,41 @@ import javax.inject.Singleton */ @InstallIn(SingletonComponent::class) @Module -class BasedUnitDatabaseModule { +class UnittoDatabaseModule { /** - * Tells Hilt to use this method to get [MyBasedUnitDao] + * Tells Hilt to use this method to get [UnitsDao] * - * @param myBasedUnitDatabase Database for which we need DAO - * @return Singleton of [MyBasedUnitDao] + * @param unittoDatabase Database for which we need DAO + * @return Singleton of [UnitsDao] */ @Provides - fun provideMyBasedUnitDao(myBasedUnitDatabase: MyBasedUnitDatabase): MyBasedUnitDao { - return myBasedUnitDatabase.myBasedUnitDao() + fun provideUnitsDao(unittoDatabase: UnittoDatabase): UnitsDao { + return unittoDatabase.unitsDao() } /** - * Tells Hilt to use this method to get [MyBasedUnitDatabase] + * Tells Hilt to use this method to get [CalculatorHistoryDao] + * + * @param unittoDatabase Database for which we need DAO + * @return Singleton of [CalculatorHistoryDao] + */ + @Provides + fun provideCalculatorHistoryDao(unittoDatabase: UnittoDatabase): CalculatorHistoryDao { + return unittoDatabase.calculatorHistoryDao() + } + + /** + * Tells Hilt to use this method to get [UnittoDatabase] * * @param appContext Context - * @return Singleton of [MyBasedUnitDatabase] + * @return Singleton of [UnittoDatabase] */ @Provides @Singleton - fun provideMyBasedUnitDatabase(@ApplicationContext appContext: Context): MyBasedUnitDatabase { + fun provideUnittoDatabase(@ApplicationContext appContext: Context): UnittoDatabase { return Room.databaseBuilder( appContext.applicationContext, - MyBasedUnitDatabase::class.java, + UnittoDatabase::class.java, "unitto_database" ).build() } diff --git a/data/epoch/proguard-rules.pro b/data/epoch/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/data/epoch/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/data/model/.gitignore b/data/model/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/data/model/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/data/model/build.gradle.kts b/data/model/build.gradle.kts new file mode 100644 index 00000000..d6d0a1f5 --- /dev/null +++ b/data/model/build.gradle.kts @@ -0,0 +1,30 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +plugins { + id("unitto.library") +} + +android { + namespace = "com.sadellie.unitto.data.model" +} + +dependencies { + implementation(project(mapOf("path" to ":core:base"))) + implementation(project(mapOf("path" to ":data:common"))) +} \ No newline at end of file diff --git a/data/model/consumer-rules.pro b/data/model/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/data/model/src/main/AndroidManifest.xml b/data/model/src/main/AndroidManifest.xml new file mode 100644 index 00000000..232257bf --- /dev/null +++ b/data/model/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/AbstractUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/AbstractUnit.kt similarity index 97% rename from data/units/src/main/java/com/sadellie/unitto/data/units/AbstractUnit.kt rename to data/model/src/main/java/com/sadellie/unitto/data/model/AbstractUnit.kt index 32853e5f..3e663423 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/AbstractUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/AbstractUnit.kt @@ -16,11 +16,10 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units +package com.sadellie.unitto.data.model import androidx.annotation.StringRes -import com.sadellie.unitto.data.lev -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.common.lev import java.math.BigDecimal /** diff --git a/data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt new file mode 100644 index 00000000..f6ab18a6 --- /dev/null +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/HistoryItem.kt @@ -0,0 +1,27 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.data.model + +import java.util.* + +data class HistoryItem( + val date: Date, + val expression: String, + val result: String +) diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/MyUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/MyUnit.kt similarity index 90% rename from data/units/src/main/java/com/sadellie/unitto/data/units/MyUnit.kt rename to data/model/src/main/java/com/sadellie/unitto/data/model/MyUnit.kt index 6fee94f7..d7d2f9ab 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/MyUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/MyUnit.kt @@ -16,13 +16,12 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units +package com.sadellie.unitto.data.model import androidx.annotation.StringRes import com.sadellie.unitto.core.base.MAX_PRECISION -import com.sadellie.unitto.data.setMinimumRequiredScale -import com.sadellie.unitto.data.trimZeros -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.common.setMinimumRequiredScale +import com.sadellie.unitto.data.common.trimZeros import java.math.BigDecimal /** diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/NumberBaseUnit.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/NumberBaseUnit.kt similarity index 93% rename from data/units/src/main/java/com/sadellie/unitto/data/units/NumberBaseUnit.kt rename to data/model/src/main/java/com/sadellie/unitto/data/model/NumberBaseUnit.kt index b1aae8c3..3fc4ec25 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/NumberBaseUnit.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/NumberBaseUnit.kt @@ -16,10 +16,9 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.units +package com.sadellie.unitto.data.model import androidx.annotation.StringRes -import com.sadellie.unitto.data.unitgroups.UnitGroup import java.math.BigDecimal class NumberBaseUnit( diff --git a/data/unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups/UnitGroup.kt b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt similarity index 97% rename from data/unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups/UnitGroup.kt rename to data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt index 8dc4c911..22f8a7c8 100644 --- a/data/unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups/UnitGroup.kt +++ b/data/model/src/main/java/com/sadellie/unitto/data/model/UnitGroup.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data.unitgroups +package com.sadellie.unitto.data.model import androidx.annotation.StringRes diff --git a/data/unitgroups/build.gradle.kts b/data/unitgroups/build.gradle.kts index 7e6ac72c..0f477e00 100644 --- a/data/unitgroups/build.gradle.kts +++ b/data/unitgroups/build.gradle.kts @@ -30,4 +30,5 @@ dependencies { implementation(libs.org.burnoutcrew.composereorderable) implementation(project(mapOf("path" to ":core:base"))) + implementation(project(mapOf("path" to ":data:model"))) } diff --git a/data/unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups/UnitGroupsRepository.kt b/data/unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups/UnitGroupsRepository.kt index c6caf9cb..44fbe968 100644 --- a/data/unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups/UnitGroupsRepository.kt +++ b/data/unitgroups/src/main/java/com/sadellie/unitto/data/unitgroups/UnitGroupsRepository.kt @@ -18,6 +18,8 @@ package com.sadellie.unitto.data.unitgroups +import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS +import com.sadellie.unitto.data.model.UnitGroup import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock diff --git a/data/units/build.gradle.kts b/data/units/build.gradle.kts index 462466c8..df73e349 100644 --- a/data/units/build.gradle.kts +++ b/data/units/build.gradle.kts @@ -30,9 +30,6 @@ dependencies { implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.datastore) - implementation(libs.androidx.room.runtime) - implementation(libs.androidx.room.ktx) - kapt(libs.androidx.room.compiler) implementation(libs.com.squareup.moshi) implementation(libs.com.squareup.retrofit2) @@ -40,6 +37,8 @@ dependencies { implementation(libs.org.burnoutcrew.composereorderable) implementation(libs.com.github.sadellie.themmo) - implementation(project(mapOf("path" to ":data:unitgroups"))) implementation(project(mapOf("path" to ":core:base"))) + implementation(project(mapOf("path" to ":data:database"))) + implementation(project(mapOf("path" to ":data:common"))) + implementation(project(mapOf("path" to ":data:model"))) } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt index 6177f232..467b87a2 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/AllUnitsRepository.kt @@ -20,7 +20,9 @@ package com.sadellie.unitto.data.units import android.content.Context import com.sadellie.unitto.core.base.MAX_PRECISION -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.UnitGroup +import com.sadellie.unitto.data.model.sortByLev import com.sadellie.unitto.data.units.collections.accelerationCollection import com.sadellie.unitto.data.units.collections.angleCollection import com.sadellie.unitto.data.units.collections.areaCollection @@ -38,7 +40,7 @@ import com.sadellie.unitto.data.units.collections.speedCollection import com.sadellie.unitto.data.units.collections.temperatureCollection import com.sadellie.unitto.data.units.collections.timeCollection import com.sadellie.unitto.data.units.collections.volumeCollection -import com.sadellie.unitto.data.units.database.MyBasedUnit +import com.sadellie.unitto.data.database.UnitsEntity import java.math.BigDecimal import javax.inject.Inject import javax.inject.Singleton @@ -153,19 +155,19 @@ class AllUnitsRepository @Inject constructor() { * * @param context [Context] that is used to fill [AbstractUnit.renderedName]. Rendered names are used when * searching. - * @param allBasedUnits List from database. See: [MyBasedUnit]. + * @param allUnits List from database. See: [UnitsEntity]. */ - fun loadFromDatabase(context: Context, allBasedUnits: List) { - allUnits.forEach { + fun loadFromDatabase(context: Context, allUnits: List) { + this.allUnits.forEach { // Loading unit names so that we can search through them it.renderedName = context.getString(it.displayName) it.renderedShortName = context.getString(it.shortName) - val based = allBasedUnits.firstOrNull { based -> based.unitId == it.unitId } + val fromDb = allUnits.firstOrNull { fromDb -> fromDb.unitId == it.unitId } // Loading paired units - it.pairedUnit = based?.pairedUnitId + it.pairedUnit = fromDb?.pairedUnitId // Loading favorite state - it.isFavorite = based?.isFavorite ?: false - it.counter = based?.frequency ?: 0 + it.isFavorite = fromDb?.isFavorite ?: false + it.counter = fromDb?.frequency ?: 0 } } diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/FlowUtils.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/FlowUtils.kt index 27d5c44c..fd1ffa2d 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/FlowUtils.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/FlowUtils.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.sadellie.unitto.data +package com.sadellie.unitto.data.units import kotlinx.coroutines.flow.Flow diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Acceleration.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Acceleration.kt index 9c549b35..aa950185 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Acceleration.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Acceleration.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.unitgroups.UnitGroup import java.math.BigDecimal internal val accelerationCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Angle.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Angle.kt index 3cc5de8c..3dde114e 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Angle.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Angle.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val angleCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Area.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Area.kt index e831ebdb..e0294b57 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Area.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Area.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val areaCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt index eb6f8fa5..be0020a3 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Currency.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val currencyCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Data.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Data.kt index b3f45448..8bba7fcf 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Data.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Data.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val dataCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/DataTransfer.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/DataTransfer.kt index a98b3ff3..29f93f7b 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/DataTransfer.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/DataTransfer.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val dataTransferCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Energy.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Energy.kt index 92609b00..fe5397a1 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Energy.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Energy.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val energyCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Flux.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Flux.kt index db5b2906..7e28401b 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Flux.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Flux.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val fluxCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Length.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Length.kt index fdc99991..185cf43e 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Length.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Length.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val lengthCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Mass.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Mass.kt index cf2a8e53..80b3c288 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Mass.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Mass.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val massCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/NumberBase.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/NumberBase.kt index 18722c6c..05050356 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/NumberBase.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/NumberBase.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.NumberBaseUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.units.NumberBaseUnit -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R internal val numberBaseCollection: List by lazy { listOf( diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Power.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Power.kt index 1159cd8a..fd3f2d05 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Power.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Power.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val powerCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Pressure.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Pressure.kt index 170deb59..ff1b7e17 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Pressure.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Pressure.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val pressureCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Speed.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Speed.kt index b1cf832d..0445debb 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Speed.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Speed.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val speedCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt index 26b2cde5..e84d446b 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Temperature.kt @@ -19,12 +19,12 @@ package com.sadellie.unitto.data.units.collections import com.sadellie.unitto.core.base.MAX_PRECISION -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.setMinimumRequiredScale -import com.sadellie.unitto.data.trimZeros -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.UnitGroup +import com.sadellie.unitto.data.common.setMinimumRequiredScale +import com.sadellie.unitto.data.common.trimZeros import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal import java.math.RoundingMode diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Time.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Time.kt index b4bcb9f3..f4a439ae 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Time.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Time.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val timeCollection: List by lazy { diff --git a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Volume.kt b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Volume.kt index b6bacc01..e4790f66 100644 --- a/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Volume.kt +++ b/data/units/src/main/java/com/sadellie/unitto/data/units/collections/Volume.kt @@ -18,11 +18,11 @@ package com.sadellie.unitto.data.units.collections -import com.sadellie.unitto.data.units.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.MyUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.units.R import java.math.BigDecimal internal val volumeCollection: List by lazy { diff --git a/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt b/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt index c5e8a6d5..d23ab0b6 100644 --- a/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt +++ b/data/units/src/test/java/com/sadellie/unitto/data/units/AllUnitsTest.kt @@ -18,8 +18,8 @@ package com.sadellie.unitto.data.units - -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.model.NumberBaseUnit +import com.sadellie.unitto.data.model.UnitGroup import org.junit.After import org.junit.Assert.assertEquals import org.junit.Test diff --git a/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinFilterAndSortTest.kt b/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinFilterAndSortTest.kt index 7a4d3444..b556137a 100644 --- a/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinFilterAndSortTest.kt +++ b/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinFilterAndSortTest.kt @@ -18,7 +18,10 @@ package com.sadellie.unitto.data.units -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.MyUnit +import com.sadellie.unitto.data.model.UnitGroup +import com.sadellie.unitto.data.model.sortByLev import org.junit.Assert.assertEquals import org.junit.Test import java.math.BigDecimal diff --git a/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinTest.kt b/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinTest.kt index 1187e70b..e9d4df7f 100644 --- a/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinTest.kt +++ b/data/units/src/test/java/com/sadellie/unitto/data/units/LevenshteinTest.kt @@ -18,7 +18,7 @@ package com.sadellie.unitto.data.units -import com.sadellie.unitto.data.lev +import com.sadellie.unitto.data.common.lev import org.junit.Assert.assertEquals import org.junit.Test diff --git a/data/units/src/test/java/com/sadellie/unitto/data/units/MinimumRequiredScaleTest.kt b/data/units/src/test/java/com/sadellie/unitto/data/units/MinimumRequiredScaleTest.kt index cd4899d1..1deaf6d3 100644 --- a/data/units/src/test/java/com/sadellie/unitto/data/units/MinimumRequiredScaleTest.kt +++ b/data/units/src/test/java/com/sadellie/unitto/data/units/MinimumRequiredScaleTest.kt @@ -18,7 +18,7 @@ package com.sadellie.unitto.data.units -import com.sadellie.unitto.data.setMinimumRequiredScale +import com.sadellie.unitto.data.common.setMinimumRequiredScale import org.junit.Assert.assertEquals import org.junit.Test import java.math.BigDecimal diff --git a/data/userprefs/build.gradle.kts b/data/userprefs/build.gradle.kts index f6cc1b0f..063de206 100644 --- a/data/userprefs/build.gradle.kts +++ b/data/userprefs/build.gradle.kts @@ -29,7 +29,7 @@ dependencies { implementation(libs.androidx.datastore) implementation(libs.com.github.sadellie.themmo) - implementation(project(mapOf("path" to ":data:units"))) - implementation(project(mapOf("path" to ":data:unitgroups"))) implementation(project(mapOf("path" to ":core:base"))) + implementation(project(mapOf("path" to ":data:model"))) + implementation(project(mapOf("path" to ":data:units"))) } diff --git a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt index afb5b24d..797dc82b 100644 --- a/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt +++ b/data/userprefs/src/main/java/com/sadellie/unitto/data/userprefs/UserPreferences.kt @@ -27,9 +27,9 @@ import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey import com.sadellie.unitto.core.base.OutputFormat import com.sadellie.unitto.core.base.Separator -import com.sadellie.unitto.data.unitgroups.ALL_UNIT_GROUPS -import com.sadellie.unitto.data.unitgroups.UnitGroup -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.MyUnitIDS import io.github.sadellie.themmo.ThemingMode import kotlinx.coroutines.flow.Flow diff --git a/feature/calculator/build.gradle.kts b/feature/calculator/build.gradle.kts index 68815800..1c7915d0 100644 --- a/feature/calculator/build.gradle.kts +++ b/feature/calculator/build.gradle.kts @@ -32,7 +32,9 @@ dependencies { implementation(libs.org.mariuszgromada.math.mxparser) implementation(libs.com.github.sadellie.themmo) + implementation(project(mapOf("path" to ":data:common"))) implementation(project(mapOf("path" to ":data:userprefs"))) - implementation(project(mapOf("path" to ":data:unitgroups"))) - implementation(project(mapOf("path" to ":data:units"))) + implementation(project(mapOf("path" to ":data:database"))) + implementation(project(mapOf("path" to ":data:calculator"))) + implementation(project(mapOf("path" to ":data:model"))) } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt index 70c82148..65ea236a 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorScreen.kt @@ -18,14 +18,30 @@ package com.sadellie.unitto.feature.calculator -import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.draggable +import androidx.compose.foundation.gestures.rememberDraggableState import androidx.compose.foundation.layout.Column +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.filled.Delete +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.onPlaced import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue @@ -35,8 +51,15 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.ui.common.UnittoTopAppBar import com.sadellie.unitto.core.ui.theme.NumbersTextStyleDisplayMedium +import com.sadellie.unitto.data.model.HistoryItem import com.sadellie.unitto.feature.calculator.components.CalculatorKeyboard +import com.sadellie.unitto.feature.calculator.components.DragDownView +import com.sadellie.unitto.feature.calculator.components.HistoryList import com.sadellie.unitto.feature.calculator.components.InputTextField +import java.text.SimpleDateFormat +import java.util.* +import kotlin.math.abs +import kotlin.math.roundToInt @Composable internal fun CalculatorRoute( @@ -53,7 +76,8 @@ internal fun CalculatorRoute( deleteSymbol = viewModel::deleteSymbol, onCursorChange = viewModel::onCursorChange, toggleAngleMode = viewModel::toggleCalculatorMode, - evaluate = viewModel::evaluate + evaluate = viewModel::evaluate, + clearHistory = viewModel::clearHistory ) } @@ -66,57 +90,144 @@ private fun CalculatorScreen( deleteSymbol: () -> Unit, onCursorChange: (IntRange) -> Unit, toggleAngleMode: () -> Unit, - evaluate: () -> Unit + evaluate: () -> Unit, + clearHistory: () -> Unit ) { + var showClearHistoryDialog by rememberSaveable { mutableStateOf(false) } + var draggedAmount by remember { mutableStateOf(0f) } + val dragAmountAnimated by animateFloatAsState(draggedAmount) + // val dragAmountAnimated = draggedAmount + var textThingyHeight by remember { mutableStateOf(0) } + var historyItemHeight by remember { mutableStateOf(0) } + UnittoTopAppBar( title = stringResource(R.string.calculator), navigateUpAction = navigateUpAction, - ) { - Column(Modifier.padding(it)) { - InputTextField( - modifier = Modifier.fillMaxWidth(), - value = TextFieldValue( - text = uiState.input, - selection = TextRange(uiState.selection.first, uiState.selection.last) - ), - onCursorChange = onCursorChange, - pasteCallback = addSymbol - ) - AnimatedVisibility(visible = uiState.output.isNotEmpty()) { - Text( - modifier = Modifier.fillMaxWidth(), - // Quick fix to prevent the UI from crashing - text = uiState.output, - textAlign = TextAlign.End, - softWrap = false, - color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f), - style = NumbersTextStyleDisplayMedium, - ) - } - CalculatorKeyboard( - modifier = Modifier, - addSymbol = addSymbol, - clearSymbols = clearSymbols, - deleteSymbol = deleteSymbol, - toggleAngleMode = toggleAngleMode, - angleMode = uiState.angleMode, - evaluate = evaluate + actions = { + IconButton( + onClick = { showClearHistoryDialog = true }, + content = { Icon(Icons.Default.Delete, stringResource(R.string.calculator_clear_history_title)) } ) } + ) { paddingValues -> + DragDownView( + modifier = Modifier.padding(paddingValues), + drag = dragAmountAnimated.toInt(), + historyItemHeight = historyItemHeight, + historyList = { + HistoryList( + modifier = Modifier.fillMaxSize(), + historyItems = uiState.history, + historyItemHeightCallback = { historyItemHeight = it } + ) + }, + textFields = { maxDragAmount -> + Column( + Modifier + .onPlaced { textThingyHeight = it.size.height } + .draggable( + orientation = Orientation.Vertical, + state = rememberDraggableState { delta -> + draggedAmount = (draggedAmount + delta).coerceAtLeast(0f) + }, + onDragStopped = { + // Snap to closest anchor (0, one history item, all history items) + draggedAmount = listOf(0, historyItemHeight, maxDragAmount) + .minBy { abs(draggedAmount.roundToInt() - it) } + .toFloat() + } + ) + ) { + InputTextField( + modifier = Modifier.fillMaxWidth(), + value = TextFieldValue( + text = uiState.input, + selection = TextRange(uiState.selection.first, uiState.selection.last) + ), + onCursorChange = onCursorChange, + pasteCallback = addSymbol + ) + Text( + modifier = Modifier.fillMaxWidth(), + text = uiState.output, + textAlign = TextAlign.End, + softWrap = false, + color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f), + style = NumbersTextStyleDisplayMedium, + ) + } + }, + numPad = { + CalculatorKeyboard( + modifier = Modifier, + addSymbol = addSymbol, + clearSymbols = clearSymbols, + deleteSymbol = deleteSymbol, + toggleAngleMode = toggleAngleMode, + angleMode = uiState.angleMode, + evaluate = evaluate + ) + } + ) + } + + if (showClearHistoryDialog) { + AlertDialog( + icon = { + Icon(Icons.Default.Delete, stringResource(R.string.calculator_clear_history_title)) + }, + title = { + Text(stringResource(R.string.calculator_clear_history_title)) + }, + text = { + Text(stringResource(R.string.calculator_clear_history_support)) + }, + confirmButton = { + TextButton(onClick = clearHistory) { Text(stringResource(R.string.calculator_clear_history_label)) } + }, + dismissButton = { + TextButton(onClick = { showClearHistoryDialog = false }) { Text(stringResource(R.string.cancel_label)) } + }, + onDismissRequest = { showClearHistoryDialog = false } + ) } } @Preview @Composable private fun PreviewCalculatorScreen() { + val dtf = SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.getDefault()) + + val historyItems = listOf( + "13.06.1989 23:59:15", + "13.06.1989 23:59:16", + "13.06.1989 23:59:17", + "14.06.1989 23:59:17", + "14.06.1989 23:59:18", + "14.07.1989 23:59:18", + "14.07.1989 23:59:19", + "14.07.2005 23:59:19", + ).map { + HistoryItem( + date = dtf.parse(it)!!, + expression = "12345123451234512345123451234512345123451234512345123451234512345", + result = "67890" + ) + } + CalculatorScreen( - uiState = CalculatorUIState(), + uiState = CalculatorUIState( + input = "12345", + output = "12345", + history = historyItems + ), navigateUpAction = {}, addSymbol = {}, clearSymbols = {}, deleteSymbol = {}, onCursorChange = {}, toggleAngleMode = {}, - evaluate = {} + evaluate = {}, + clearHistory = {} ) } \ No newline at end of file diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt index c572c0c6..20b75ecf 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorUIState.kt @@ -18,9 +18,12 @@ package com.sadellie.unitto.feature.calculator +import com.sadellie.unitto.data.model.HistoryItem + internal data class CalculatorUIState( val input: String = "", val output: String = "", val selection: IntRange = 0..0, - val angleMode: AngleMode = AngleMode.RAD + val angleMode: AngleMode = AngleMode.RAD, + val history: List = emptyList() ) diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt index 36ae7a27..b582a72a 100644 --- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/CalculatorViewModel.kt @@ -24,9 +24,10 @@ import com.sadellie.unitto.core.base.KEY_LEFT_BRACKET import com.sadellie.unitto.core.base.KEY_MINUS import com.sadellie.unitto.core.base.KEY_MINUS_DISPLAY import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET -import com.sadellie.unitto.data.setMinimumRequiredScale -import com.sadellie.unitto.data.toStringWith -import com.sadellie.unitto.data.trimZeros +import com.sadellie.unitto.data.calculator.CalculatorHistoryRepository +import com.sadellie.unitto.data.common.setMinimumRequiredScale +import com.sadellie.unitto.data.common.toStringWith +import com.sadellie.unitto.data.common.trimZeros import com.sadellie.unitto.data.userprefs.UserPreferences import com.sadellie.unitto.data.userprefs.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel @@ -47,7 +48,8 @@ import org.mariuszgromada.math.mxparser.mXparser as MathParser @HiltViewModel internal class CalculatorViewModel @Inject constructor( - userPrefsRepository: UserPreferencesRepository + userPrefsRepository: UserPreferencesRepository, + private val calculatorHistoryRepository: CalculatorHistoryRepository ) : ViewModel() { private val _userPrefs: StateFlow = userPrefsRepository.userPreferencesFlow.stateIn( @@ -60,15 +62,17 @@ internal class CalculatorViewModel @Inject constructor( private val _output: MutableStateFlow = MutableStateFlow("") private val _selection: MutableStateFlow = MutableStateFlow(IntRange(0, 0)) private val _angleMode: MutableStateFlow = MutableStateFlow(AngleMode.RAD) + private val _history = calculatorHistoryRepository.historyFlow val uiState = combine( - _input, _output, _selection, _angleMode - ) { input, output, selection, angleMode -> + _input, _output, _selection, _angleMode, _history + ) { input, output, selection, angleMode, history -> return@combine CalculatorUIState( input = input, output = output, selection = selection, - angleMode = angleMode + angleMode = angleMode, + history = history ) }.stateIn( viewModelScope, SharingStarted.WhileSubscribed(5000L), CalculatorUIState() @@ -115,11 +119,28 @@ internal class CalculatorViewModel @Inject constructor( fun evaluate() { if (!Expression(_input.value.clean).checkSyntax()) return + // Input and output can change while saving in history. This way we cache it here (i think) + val input = _input.value + val output = _output.value + + viewModelScope.launch(Dispatchers.IO) { + calculatorHistoryRepository.add( + expression = input, + result = output + ) + } + _input.update { _output.value } _selection.update { _input.value.length.._input.value.length } _output.update { "" } } + fun clearHistory() { + viewModelScope.launch(Dispatchers.IO) { + calculatorHistoryRepository.clear() + } + } + fun onCursorChange(selection: IntRange) { // When we paste, selection is set to the length of the pasted text (start and end) if (selection.first > _input.value.length) return diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/DragDownView.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/DragDownView.kt new file mode 100644 index 00000000..68b25e3d --- /dev/null +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/DragDownView.kt @@ -0,0 +1,92 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.feature.calculator.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.SubcomposeLayout +import androidx.compose.ui.unit.offset + +/** + * Screen layout where [historyList] can be seen only when you drag [textFields] down. + * + * @param modifier [Modifier] that will be applied to [SubcomposeLayout]. + * @param drag Drag amount. Update this when dragging [textFields]. + * @param historyItemHeight Height of one item in [historyList]. + * @param textFields This part of the UI should be used as a handle. Offsets when dragging. + * @param numPad Composable with buttons. Offsets when drag amount is higher than [historyItemHeight] + * (otherwise will just shrink). + */ +@Composable +internal fun DragDownView( + modifier: Modifier, + drag: Int, + historyItemHeight: Int, + historyList: @Composable () -> Unit, + textFields: @Composable (maxDragAmount: Int) -> Unit, + numPad: @Composable () -> Unit +) { + SubcomposeLayout(modifier = modifier) { constraints -> + val showHistory = drag < historyItemHeight + val offset = if (showHistory) (drag - historyItemHeight).coerceAtLeast(0) else 0 + + val textFieldPlaceables = subcompose(DragDownContent.TextFields) { + textFields(constraints.maxHeight) + }.map { it.measure(constraints.offset(offset)) } + val textFieldsHeight = textFieldPlaceables.maxByOrNull { it.height }?.height ?: 0 + + val historyListPlaceables = subcompose(DragDownContent.HistoryList) { + historyList() + }.map { + it.measure( + constraints.copy( + maxHeight = drag.coerceAtMost(constraints.maxHeight - textFieldsHeight) + ) + ) + } + + val padding = if (showHistory) drag.coerceAtLeast(0) else historyItemHeight + val numPadConstraints = constraints + .offset(offset) + .copy(maxHeight = constraints.maxHeight - textFieldsHeight - padding) + val numPadPlaceables = subcompose(DragDownContent.NumPad, numPad).map { + it.measure(numPadConstraints) + } + + layout(constraints.maxWidth, constraints.maxHeight) { + var yPos = 0 + historyListPlaceables.forEach { + it.place(0, yPos) + yPos += it.height + } + + textFieldPlaceables.forEach { + it.place(0, yPos) + yPos += it.height + } + + numPadPlaceables.forEach { + it.place(0, yPos) + yPos += it.height + } + } + } +} + +private enum class DragDownContent { HistoryList, TextFields, NumPad } diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt new file mode 100644 index 00000000..178343b4 --- /dev/null +++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/components/HistoryList.kt @@ -0,0 +1,104 @@ +/* + * Unitto is a unit converter for Android + * Copyright (c) 2023 Elshan Agaev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sadellie.unitto.feature.calculator.components + +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.onPlaced +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import com.sadellie.unitto.core.ui.theme.NumbersTextStyleDisplayMedium +import com.sadellie.unitto.data.model.HistoryItem +import java.text.SimpleDateFormat +import java.util.* + +@Composable +internal fun HistoryList( + modifier: Modifier, + historyItems: List, + historyItemHeightCallback: (Int) -> Unit +) { + LazyColumn( + modifier = modifier, + reverseLayout = true + ) { + items(historyItems) { historyItem -> + Column( + Modifier.onPlaced { historyItemHeightCallback(it.size.height) } + ) { + Text( + text = historyItem.expression, + maxLines = 1, + modifier = Modifier + .fillMaxWidth() + .horizontalScroll(rememberScrollState(), reverseScrolling = true), + style = NumbersTextStyleDisplayMedium, + textAlign = TextAlign.End + ) + Text( + text = historyItem.result, + maxLines = 1, + modifier = Modifier + .fillMaxWidth() + .horizontalScroll(rememberScrollState(), reverseScrolling = true), + style = NumbersTextStyleDisplayMedium, + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f), + textAlign = TextAlign.End + ) + } + } + } +} + +@Preview +@Composable +private fun PreviewHistoryList() { + val dtf = SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.getDefault()) + + val historyItems = listOf( + "13.06.1989 23:59:15", + "13.06.1989 23:59:16", + "13.06.1989 23:59:17", + "14.06.1989 23:59:17", + "14.06.1989 23:59:18", + "14.07.1989 23:59:18", + "14.07.1989 23:59:19", + "14.07.2005 23:59:19", + ).map { + HistoryItem( + date = dtf.parse(it)!!, + expression = "12345".repeat(10), + result = "67890" + ) + } + + HistoryList( + modifier = Modifier.fillMaxWidth(), + historyItems = historyItems, + historyItemHeightCallback = {} + ) +} diff --git a/feature/converter/build.gradle.kts b/feature/converter/build.gradle.kts index 8b9de5c5..3a94684b 100644 --- a/feature/converter/build.gradle.kts +++ b/feature/converter/build.gradle.kts @@ -41,7 +41,9 @@ dependencies { implementation(libs.com.squareup.moshi) implementation(libs.com.squareup.retrofit2) + implementation(project(mapOf("path" to ":data:common"))) + implementation(project(mapOf("path" to ":data:database"))) + implementation(project(mapOf("path" to ":data:model"))) implementation(project(mapOf("path" to ":data:userprefs"))) - implementation(project(mapOf("path" to ":data:unitgroups"))) implementation(project(mapOf("path" to ":data:units"))) } diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt index 1752375c..a03e1378 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterUIState.kt @@ -19,7 +19,7 @@ package com.sadellie.unitto.feature.converter import com.sadellie.unitto.core.base.KEY_0 -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.AbstractUnit /** * Represents current state of the ConverterScreen diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt index 17ae3e57..7590c24e 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/ConverterViewModel.kt @@ -43,19 +43,20 @@ import com.sadellie.unitto.core.base.KEY_PLUS import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET import com.sadellie.unitto.core.base.KEY_SQRT import com.sadellie.unitto.core.base.OPERATORS -import com.sadellie.unitto.data.combine -import com.sadellie.unitto.data.setMinimumRequiredScale -import com.sadellie.unitto.data.toStringWith -import com.sadellie.unitto.data.trimZeros -import com.sadellie.unitto.data.unitgroups.UnitGroup -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.common.setMinimumRequiredScale +import com.sadellie.unitto.data.common.toStringWith +import com.sadellie.unitto.data.common.trimZeros +import com.sadellie.unitto.data.database.UnitsEntity +import com.sadellie.unitto.data.database.UnitsRepository +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.NumberBaseUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.AllUnitsRepository import com.sadellie.unitto.data.units.MyUnitIDS -import com.sadellie.unitto.data.units.NumberBaseUnit -import com.sadellie.unitto.data.units.database.MyBasedUnit -import com.sadellie.unitto.data.units.database.MyBasedUnitsRepository +import com.sadellie.unitto.data.units.combine import com.sadellie.unitto.data.units.remote.CurrencyApi import com.sadellie.unitto.data.units.remote.CurrencyUnitResponse +import com.sadellie.unitto.data.userprefs.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel @@ -77,8 +78,8 @@ import javax.inject.Inject @HiltViewModel class ConverterViewModel @Inject constructor( - private val userPrefsRepository: com.sadellie.unitto.data.userprefs.UserPreferencesRepository, - private val basedUnitRepository: MyBasedUnitsRepository, + private val userPrefsRepository: UserPreferencesRepository, + private val unitRepository: UnitsRepository, private val allUnitsRepository: AllUnitsRepository ) : ViewModel() { @@ -501,8 +502,8 @@ class ConverterViewModel @Inject constructor( private fun incrementCounter(unit: AbstractUnit) { viewModelScope.launch(Dispatchers.IO) { - basedUnitRepository.insertUnits( - MyBasedUnit( + unitRepository.insertUnits( + UnitsEntity( unitId = unit.unitId, isFavorite = unit.isFavorite, pairedUnitId = unit.pairedUnit, @@ -515,8 +516,8 @@ class ConverterViewModel @Inject constructor( private fun updatePairedUnit(unit: AbstractUnit) { viewModelScope.launch(Dispatchers.IO) { - basedUnitRepository.insertUnits( - MyBasedUnit( + unitRepository.insertUnits( + UnitsEntity( unitId = unit.unitId, isFavorite = unit.isFavorite, pairedUnitId = unit.pairedUnit, diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/TopScreen.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/TopScreen.kt index 17aa1a01..9af92fe6 100644 --- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/TopScreen.kt +++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/components/TopScreen.kt @@ -42,8 +42,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.ui.Formatter import com.sadellie.unitto.core.ui.R -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.feature.converter.ConverterMode /** diff --git a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt index e8083e0e..77d604a9 100644 --- a/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt +++ b/feature/converter/src/test/java/com/sadellie/unitto/feature/converter/ConverterViewModelTest.kt @@ -40,8 +40,8 @@ import com.sadellie.unitto.core.base.KEY_PLUS import com.sadellie.unitto.core.base.KEY_RIGHT_BRACKET import com.sadellie.unitto.core.base.KEY_SQRT import com.sadellie.unitto.data.units.AllUnitsRepository -import com.sadellie.unitto.data.units.database.MyBasedUnitDatabase -import com.sadellie.unitto.data.units.database.MyBasedUnitsRepository +import com.sadellie.unitto.data.database.UnittoDatabase +import com.sadellie.unitto.data.database.UnitsRepository import com.sadellie.unitto.data.userprefs.DataStoreModule import com.sadellie.unitto.data.userprefs.UserPreferencesRepository import junit.framework.TestCase.assertEquals @@ -72,7 +72,7 @@ class ConverterViewModelTest { private val allUnitsRepository = AllUnitsRepository() private val database = Room.inMemoryDatabaseBuilder( RuntimeEnvironment.getApplication(), - MyBasedUnitDatabase::class.java + UnittoDatabase::class.java ).build() @Before @@ -84,8 +84,8 @@ class ConverterViewModelTest { RuntimeEnvironment.getApplication() ) ), - basedUnitRepository = MyBasedUnitsRepository( - database.myBasedUnitDao() + unitRepository = UnitsRepository( + database.unitsDao() ), allUnitsRepository = allUnitsRepository ) diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts index 4f314b17..a8aa51e5 100644 --- a/feature/settings/build.gradle.kts +++ b/feature/settings/build.gradle.kts @@ -31,7 +31,8 @@ dependencies { implementation(libs.com.github.sadellie.themmo) implementation(libs.org.burnoutcrew.composereorderable) + implementation(project(mapOf("path" to ":data:model"))) + implementation(project(mapOf("path" to ":data:unitgroups"))) implementation(project(mapOf("path" to ":data:userprefs"))) implementation(project(mapOf("path" to ":data:licenses"))) - implementation(project(mapOf("path" to ":data:unitgroups"))) } diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt index 83dd3f9f..3495458e 100644 --- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/SettingsViewModel.kt @@ -21,7 +21,7 @@ package com.sadellie.unitto.feature.settings import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.sadellie.unitto.core.ui.Formatter -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.unitgroups.UnitGroupsRepository import com.sadellie.unitto.data.userprefs.UserPreferencesRepository import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/feature/unitslist/build.gradle.kts b/feature/unitslist/build.gradle.kts index 614af3cf..abea9da6 100644 --- a/feature/unitslist/build.gradle.kts +++ b/feature/unitslist/build.gradle.kts @@ -28,6 +28,8 @@ android { } dependencies { + implementation(project(mapOf("path" to ":data:model"))) implementation(project(mapOf("path" to ":data:units"))) + implementation(project(mapOf("path" to ":data:database"))) implementation(project(mapOf("path" to ":data:unitgroups"))) } \ No newline at end of file diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/LeftSideScreen.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/LeftSideScreen.kt index d6cf820e..7e36739d 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/LeftSideScreen.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/LeftSideScreen.kt @@ -45,7 +45,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.AbstractUnit import com.sadellie.unitto.feature.unitslist.components.ChipsRow import com.sadellie.unitto.feature.unitslist.components.SearchBar import com.sadellie.unitto.feature.unitslist.components.SearchPlaceholder diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/RightSideScreen.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/RightSideScreen.kt index 4135b907..b6b53736 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/RightSideScreen.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/RightSideScreen.kt @@ -33,9 +33,9 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.sadellie.unitto.core.ui.Formatter -import com.sadellie.unitto.data.unitgroups.UnitGroup -import com.sadellie.unitto.data.units.AbstractUnit -import com.sadellie.unitto.data.units.NumberBaseUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.NumberBaseUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.feature.unitslist.components.SearchBar import com.sadellie.unitto.feature.unitslist.components.SearchPlaceholder import com.sadellie.unitto.feature.unitslist.components.UnitGroupHeader diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondScreenUIState.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondScreenUIState.kt index 2507c84d..f012c8ea 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondScreenUIState.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondScreenUIState.kt @@ -18,8 +18,8 @@ package com.sadellie.unitto.feature.unitslist -import com.sadellie.unitto.data.unitgroups.UnitGroup -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.UnitGroup /** * Second (unit list) screen UI state. diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondViewModel.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondViewModel.kt index c378752f..67c3a246 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondViewModel.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/SecondViewModel.kt @@ -21,11 +21,11 @@ package com.sadellie.unitto.feature.unitslist import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sadellie.unitto.data.unitgroups.UnitGroup -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.database.UnitsEntity +import com.sadellie.unitto.data.database.UnitsRepository +import com.sadellie.unitto.data.model.AbstractUnit +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.units.AllUnitsRepository -import com.sadellie.unitto.data.units.database.MyBasedUnit -import com.sadellie.unitto.data.units.database.MyBasedUnitsRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -39,7 +39,7 @@ import javax.inject.Inject @HiltViewModel class SecondViewModel @Inject constructor( - private val basedUnitRepository: MyBasedUnitsRepository, + private val unitRepository: UnitsRepository, private val allUnitsRepository: AllUnitsRepository, private val mContext: Application, unitGroupsRepository: com.sadellie.unitto.data.unitgroups.UnitGroupsRepository, @@ -136,8 +136,8 @@ class SecondViewModel @Inject constructor( // Changing unit in list to the opposite unit.isFavorite = !unit.isFavorite // Updating it in database - basedUnitRepository.insertUnits( - MyBasedUnit( + unitRepository.insertUnits( + UnitsEntity( unitId = unit.unitId, isFavorite = unit.isFavorite, pairedUnitId = unit.pairedUnit, @@ -147,15 +147,15 @@ class SecondViewModel @Inject constructor( } } - private fun loadBasedUnits() { + private fun loadUnits() { viewModelScope.launch(Dispatchers.IO) { // Now we load units data from database - val allBasedUnits = basedUnitRepository.getAll() - allUnitsRepository.loadFromDatabase(mContext, allBasedUnits) + val allUnits = unitRepository.getAll() + allUnitsRepository.loadFromDatabase(mContext, allUnits) } } init { - loadBasedUnits() + loadUnits() } } diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/ChipsRow.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/ChipsRow.kt index 0ede0865..4a7e362b 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/ChipsRow.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/ChipsRow.kt @@ -46,8 +46,8 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.sadellie.unitto.data.unitgroups.ALL_UNIT_GROUPS -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.model.ALL_UNIT_GROUPS +import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.feature.unitslist.R /** diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitGroupHeader.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitGroupHeader.kt index 7914e201..cc3d3e3d 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitGroupHeader.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitGroupHeader.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.sadellie.unitto.core.ui.common.Header -import com.sadellie.unitto.data.unitgroups.UnitGroup +import com.sadellie.unitto.data.model.UnitGroup @Composable internal fun UnitGroupHeader(modifier: Modifier, unitGroup: UnitGroup) { diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitListItem.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitListItem.kt index 32326745..ba5207f4 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitListItem.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/components/UnitListItem.kt @@ -53,7 +53,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.AbstractUnit import com.sadellie.unitto.feature.unitslist.R /** diff --git a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/navigation/UnitsListNavigation.kt b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/navigation/UnitsListNavigation.kt index b0ba6ffd..cb776bad 100644 --- a/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/navigation/UnitsListNavigation.kt +++ b/feature/unitslist/src/main/java/com/sadellie/unitto/feature/unitslist/navigation/UnitsListNavigation.kt @@ -21,7 +21,7 @@ package com.sadellie.unitto.feature.unitslist.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import com.sadellie.unitto.data.units.AbstractUnit +import com.sadellie.unitto.data.model.AbstractUnit import com.sadellie.unitto.data.units.AllUnitsRepository import com.sadellie.unitto.feature.unitslist.LeftSideScreen import com.sadellie.unitto.feature.unitslist.RightSideScreen diff --git a/settings.gradle.kts b/settings.gradle.kts index 96749ac9..86a0e810 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -30,3 +30,7 @@ include(":data:userprefs") include(":data:unitgroups") include(":data:licenses") include(":data:epoch") +include(":data:calculator") +include(":data:database") +include(":data:model") +include(":data:common")