Data module refactor

This commit is contained in:
Sad Ellie 2023-02-02 18:51:36 +04:00
parent 59de376f61
commit 1620444123
82 changed files with 421 additions and 141 deletions

View File

@ -112,7 +112,7 @@ dependencies {
implementation(project(mapOf("path" to ":feature:unitslist")))
implementation(project(mapOf("path" to ":feature:tools")))
implementation(project(mapOf("path" to ":feature:epoch")))
implementation(project(mapOf("path" to ":data")))
implementation(project(mapOf("path" to ":core:base")))
implementation(project(mapOf("path" to ":data:units")))
implementation(project(mapOf("path" to ":data:userprefs")))
implementation(project(mapOf("path" to ":core:ui")))
}

View File

@ -29,7 +29,6 @@ class UnittoLibraryFeaturePlugin : Plugin<Project> {
dependencies {
"implementation"(libs.findLibrary("androidx.navigation").get())
"implementation"(project(mapOf("path" to ":data")))
"implementation"(project(mapOf("path" to ":core:base")))
"implementation"(project(mapOf("path" to ":core:ui")))
}

View File

@ -0,0 +1,26 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
plugins {
id("unitto.library")
id("unitto.android.hilt")
}
android {
namespace = "com.sadellie.unitto.data.epoch"
}

View File

21
data/epoch/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# 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

View File

@ -0,0 +1,77 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.epoch
import java.math.BigDecimal
import java.util.*
object EpochDateConverter {
fun convertDateToUnix(date: String): String {
// Here we add some zeros, so that input is 14 symbols long
val inputWithPadding = date.padEnd(14, '0')
// Now we break input that is 14 symbols into pieces
val hour = inputWithPadding.substring(0, 2)
val minute = inputWithPadding.substring(2, 4)
val second = inputWithPadding.substring(4, 6)
val day = inputWithPadding.substring(6, 8)
val month = inputWithPadding.substring(8, 10)
val year = inputWithPadding.substring(10, 14)
val cal = Calendar.getInstance()
cal.set(
year.toIntOrNull() ?: 1970,
(month.toIntOrNull() ?: 1) - 1,
day.toIntOrNull() ?: 0,
hour.toIntOrNull() ?: 0,
minute.toIntOrNull() ?: 0,
second.toIntOrNull() ?: 0,
)
return (cal.timeInMillis / 1000).toString()
}
fun convertUnixToDate(unix: String): String {
var date = ""
val cal2 = Calendar.getInstance()
cal2.clear()
cal2.isLenient = true
// This lets us bypass calendars limits (it uses Int, we want BigDecimal)
try {
val unixBg = BigDecimal(unix.ifEmpty { "0" })
val division = unixBg.divideAndRemainder(BigDecimal(Int.MAX_VALUE))
val intTimes = division.component1()
val rem = division.component2()
repeat(intTimes.intValueExact()) {
cal2.add(Calendar.SECOND, Int.MAX_VALUE)
}
cal2.add(Calendar.SECOND, rem.intValueExact())
} catch (e: NumberFormatException) {
return ""
}
date += cal2.get(Calendar.HOUR_OF_DAY).toString().padStart(2, '0')
date += cal2.get(Calendar.MINUTE).toString().padStart(2, '0')
date += cal2.get(Calendar.SECOND).toString().padStart(2, '0')
date += cal2.get(Calendar.DAY_OF_MONTH).toString().padStart(2, '0')
date += (cal2.get(Calendar.MONTH) + 1).toString().padStart(2, '0')
// Year is 4 symbols long
date += cal2.get(Calendar.YEAR).toString().padStart(4, '0')
return date
}
}

1
data/licenses/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,26 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
plugins {
id("unitto.library")
id("unitto.android.hilt")
}
android {
namespace = "com.sadellie.unitto.data.licenses"
}

View File

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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 <https://www.gnu.org/licenses/>.
-->
<manifest>
</manifest>

View File

@ -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 <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data
package com.sadellie.unitto.data.licenses
data class AppLibrary(
val name: String,

1
data/unitgroups/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,33 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
plugins {
id("unitto.library")
id("unitto.android.hilt")
}
android {
namespace = "com.sadellie.unitto.data.unitgroups"
}
dependencies {
testImplementation(libs.junit)
implementation(libs.org.burnoutcrew.composereorderable)
implementation(project(mapOf("path" to ":core:base")))
}

View File

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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 <https://www.gnu.org/licenses/>.
-->
<manifest>
</manifest>

View File

@ -16,10 +16,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.units
package com.sadellie.unitto.data.unitgroups
import androidx.annotation.StringRes
import com.sadellie.unitto.data.R
val ALL_UNIT_GROUPS: List<UnitGroup> by lazy {
UnitGroup.values().toList()

View File

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.units
package com.sadellie.unitto.data.unitgroups
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.sync.Mutex

1
data/units/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -22,7 +22,7 @@ plugins {
}
android {
namespace = "com.sadellie.unitto.data"
namespace = "com.sadellie.unitto.data.units"
}
dependencies {
@ -40,5 +40,6 @@ 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")))
}

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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 <https://www.gnu.org/licenses/>.
-->
<manifest>
</manifest>

View File

@ -20,6 +20,7 @@ package com.sadellie.unitto.data.units
import androidx.annotation.StringRes
import com.sadellie.unitto.data.lev
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
/**

View File

@ -20,6 +20,7 @@ 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.units.collections.accelerationCollection
import com.sadellie.unitto.data.units.collections.angleCollection
import com.sadellie.unitto.data.units.collections.areaCollection

View File

@ -22,6 +22,7 @@ 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 java.math.BigDecimal
/**

View File

@ -19,6 +19,7 @@
package com.sadellie.unitto.data.units
import androidx.annotation.StringRes
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
class NumberBaseUnit(

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
import com.sadellie.unitto.data.units.AbstractUnit
import com.sadellie.unitto.data.units.MyUnit
import com.sadellie.unitto.data.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.units.R
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val accelerationCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val angleCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val areaCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val currencyCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val dataCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val dataTransferCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val energyCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val fluxCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val lengthCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val massCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
import com.sadellie.unitto.data.units.R
import com.sadellie.unitto.data.units.AbstractUnit
import com.sadellie.unitto.data.units.MyUnitIDS
import com.sadellie.unitto.data.units.NumberBaseUnit
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
internal val numberBaseCollection: List<AbstractUnit> by lazy {
listOf(

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val powerCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val pressureCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val speedCollection: List<AbstractUnit> by lazy {

View File

@ -19,12 +19,12 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.core.base.MAX_PRECISION
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
import java.math.RoundingMode

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val timeCollection: List<AbstractUnit> by lazy {

View File

@ -18,11 +18,11 @@
package com.sadellie.unitto.data.units.collections
import com.sadellie.unitto.data.R
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import java.math.BigDecimal
internal val volumeCollection: List<AbstractUnit> by lazy {

View File

@ -18,6 +18,8 @@
package com.sadellie.unitto.data.units
import com.sadellie.unitto.data.unitgroups.ALL_UNIT_GROUPS
import com.sadellie.unitto.data.unitgroups.UnitGroup
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@ -19,6 +19,7 @@
package com.sadellie.unitto.data.units
import com.sadellie.unitto.data.unitgroups.UnitGroup
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@ -16,12 +16,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data
package com.sadellie.unitto.data.units
import com.sadellie.unitto.data.units.AbstractUnit
import com.sadellie.unitto.data.units.MyUnit
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.units.sortByLev
import com.sadellie.unitto.data.unitgroups.UnitGroup
import org.junit.Assert.assertEquals
import org.junit.Test
import java.math.BigDecimal

View File

@ -16,8 +16,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data
package com.sadellie.unitto.data.units
import com.sadellie.unitto.data.lev
import org.junit.Assert.assertEquals
import org.junit.Test

View File

@ -16,8 +16,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data
package com.sadellie.unitto.data.units
import com.sadellie.unitto.data.setMinimumRequiredScale
import org.junit.Assert.assertEquals
import org.junit.Test
import java.math.BigDecimal

1
data/userprefs/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,35 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
plugins {
id("unitto.library")
id("unitto.android.hilt")
}
android {
namespace = "com.sadellie.unitto.data.userprefs"
}
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")))
}

View File

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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 <https://www.gnu.org/licenses/>.
-->
<manifest>
</manifest>

View File

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.preferences
package com.sadellie.unitto.data.userprefs
import android.content.Context
import androidx.datastore.core.DataStore

View File

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.preferences
package com.sadellie.unitto.data.userprefs
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
@ -27,15 +27,15 @@ 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.units.ALL_UNIT_GROUPS
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.units.MyUnitIDS
import com.sadellie.unitto.data.units.UnitGroup
import io.github.sadellie.themmo.ThemingMode
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
import okio.IOException
import java.io.IOException
import javax.inject.Inject
/**
@ -69,8 +69,7 @@ data class UserPreferences(
/**
* Repository that works with DataStore
*/
class
UserPreferencesRepository @Inject constructor(private val dataStore: DataStore<Preferences>) {
class UserPreferencesRepository @Inject constructor(private val dataStore: DataStore<Preferences>) {
/**
* Keys for DataStore
*/

View File

@ -40,4 +40,8 @@ dependencies {
implementation(libs.com.github.sadellie.themmo)
implementation(libs.com.squareup.moshi)
implementation(libs.com.squareup.retrofit2)
implementation(project(mapOf("path" to ":data:userprefs")))
implementation(project(mapOf("path" to ":data:unitgroups")))
implementation(project(mapOf("path" to ":data:units")))
}

View File

@ -44,16 +44,14 @@ 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.preferences.UserPreferences
import com.sadellie.unitto.data.preferences.UserPreferencesRepository
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.units.AllUnitsRepository
import com.sadellie.unitto.data.units.MyUnitIDS
import com.sadellie.unitto.data.units.NumberBaseUnit
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.units.database.MyBasedUnit
import com.sadellie.unitto.data.units.database.MyBasedUnitsRepository
import com.sadellie.unitto.data.units.remote.CurrencyApi
@ -79,7 +77,7 @@ import javax.inject.Inject
@HiltViewModel
class MainViewModel @Inject constructor(
private val userPrefsRepository: UserPreferencesRepository,
private val userPrefsRepository: com.sadellie.unitto.data.userprefs.UserPreferencesRepository,
private val basedUnitRepository: MyBasedUnitsRepository,
private val allUnitsRepository: AllUnitsRepository
) : ViewModel() {
@ -87,7 +85,7 @@ class MainViewModel @Inject constructor(
val userPrefs = userPrefsRepository.userPreferencesFlow.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UserPreferences()
com.sadellie.unitto.data.userprefs.UserPreferences()
)
/**

View File

@ -43,7 +43,7 @@ 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.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
import com.sadellie.unitto.feature.converter.ConverterMode
/**

View File

@ -39,11 +39,11 @@ import com.sadellie.unitto.core.base.KEY_MULTIPLY
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.preferences.DataStoreModule
import com.sadellie.unitto.data.preferences.UserPreferencesRepository
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.userprefs.DataStoreModule
import com.sadellie.unitto.data.userprefs.UserPreferencesRepository
import junit.framework.TestCase.assertEquals
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.collect
@ -79,9 +79,10 @@ class MainViewModelTest {
fun setUp() {
viewModel = MainViewModel(
userPrefsRepository = UserPreferencesRepository(
DataStoreModule().provideUserPreferencesDataStore(
RuntimeEnvironment.getApplication()
)
DataStoreModule()
.provideUserPreferencesDataStore(
RuntimeEnvironment.getApplication()
)
),
basedUnitRepository = MyBasedUnitsRepository(
database.myBasedUnitDao()

View File

@ -26,3 +26,7 @@ plugins {
android {
namespace = "com.sadellie.unitto.feature.epoch"
}
dependencies {
implementation(project(mapOf("path" to ":data:epoch")))
}

View File

@ -20,6 +20,7 @@ package com.sadellie.unitto.feature.epoch
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sadellie.unitto.data.epoch.EpochDateConverter
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@ -27,8 +28,6 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import java.math.BigDecimal
import java.util.*
import javax.inject.Inject
data class EpochUIState(
@ -49,13 +48,13 @@ class EpochViewModel @Inject constructor() : ViewModel() {
if (fromDateToUnix) {
EpochUIState(
dateField = input,
unixField = convertDateToUnix(input),
unixField = EpochDateConverter.convertDateToUnix(input),
dateToUnix = fromDateToUnix
)
} else {
EpochUIState(
unixField = input,
dateField = convertUnixToDate(input),
dateField = EpochDateConverter.convertUnixToDate(input),
dateToUnix = fromDateToUnix
)
}
@ -76,57 +75,4 @@ class EpochViewModel @Inject constructor() : ViewModel() {
clearSymbols()
!it
}
private fun convertDateToUnix(date: String): String {
// Here we add some zeros, so that input is 14 symbols long
val inputWithPadding = date.padEnd(14, '0')
// Now we break input that is 14 symbols into pieces
val hour = inputWithPadding.substring(0, 2)
val minute = inputWithPadding.substring(2, 4)
val second = inputWithPadding.substring(4, 6)
val day = inputWithPadding.substring(6, 8)
val month = inputWithPadding.substring(8, 10)
val year = inputWithPadding.substring(10, 14)
val cal = Calendar.getInstance()
cal.set(
year.toIntOrNull() ?: 1970,
(month.toIntOrNull() ?: 1) - 1,
day.toIntOrNull() ?: 0,
hour.toIntOrNull() ?: 0,
minute.toIntOrNull() ?: 0,
second.toIntOrNull() ?: 0,
)
return (cal.timeInMillis / 1000).toString()
}
private fun convertUnixToDate(unix: String): String {
var date = ""
val cal2 = Calendar.getInstance()
cal2.clear()
cal2.isLenient = true
// This lets us bypass calendars limits (it uses Int, we want BigDecimal)
try {
val unixBg = BigDecimal(unix)
val division = unixBg.divideAndRemainder(BigDecimal(Int.MAX_VALUE))
val intTimes = division.component1()
val rem = division.component2()
repeat(intTimes.intValueExact()) {
cal2.add(Calendar.SECOND, Int.MAX_VALUE)
}
cal2.add(Calendar.SECOND, rem.intValueExact())
} catch (e: NumberFormatException) {
return ""
}
date += cal2.get(Calendar.HOUR_OF_DAY).toString().padStart(2, '0')
date += cal2.get(Calendar.MINUTE).toString().padStart(2, '0')
date += cal2.get(Calendar.SECOND).toString().padStart(2, '0')
date += cal2.get(Calendar.DAY_OF_MONTH).toString().padStart(2, '0')
date += (cal2.get(Calendar.MONTH) + 1).toString().padStart(2, '0')
// Year is 4 symbols long
date += cal2.get(Calendar.YEAR).toString().padStart(4, '0')
return date
}
}

View File

@ -30,4 +30,8 @@ android {
dependencies {
implementation(libs.com.github.sadellie.themmo)
implementation(libs.org.burnoutcrew.composereorderable)
implementation(project(mapOf("path" to ":data:userprefs")))
implementation(project(mapOf("path" to ":data:licenses")))
implementation(project(mapOf("path" to ":data:unitgroups")))
}

View File

@ -21,10 +21,9 @@ 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.preferences.UserPreferences
import com.sadellie.unitto.data.preferences.UserPreferencesRepository
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.units.UnitGroupsRepository
import com.sadellie.unitto.data.unitgroups.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroupsRepository
import com.sadellie.unitto.data.userprefs.UserPreferencesRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import io.github.sadellie.themmo.ThemingMode
import kotlinx.coroutines.flow.SharingStarted
@ -42,7 +41,9 @@ class SettingsViewModel @Inject constructor(
) : ViewModel() {
var userPrefs = userPrefsRepository.userPreferencesFlow
.onEach { Formatter.setSeparator(it.separator) }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), UserPreferences())
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000),
com.sadellie.unitto.data.userprefs.UserPreferences()
)
val shownUnitGroups = unitGroupsRepository.shownUnitGroups
val hiddenUnitGroups = unitGroupsRepository.hiddenUnitGroups

View File

@ -36,10 +36,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.sadellie.unitto.core.ui.R
import com.sadellie.unitto.core.ui.common.UnittoLargeTopAppBar
import com.sadellie.unitto.core.ui.openLink
import com.sadellie.unitto.data.ALL_LIBRARIES
import com.sadellie.unitto.core.ui.R
import com.sadellie.unitto.data.licenses.ALL_LIBRARIES
/**
* Screen with used third party libraries

View File

@ -26,3 +26,8 @@ plugins {
android {
namespace = "com.sadellie.unitto.feature.unitslist"
}
dependencies {
implementation(project(mapOf("path" to ":data:units")))
implementation(project(mapOf("path" to ":data:unitgroups")))
}

View File

@ -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.units.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

View File

@ -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.units.UnitGroup
/**
* Second (unit list) screen UI state.

View File

@ -21,10 +21,9 @@ 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.units.AllUnitsRepository
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.units.UnitGroupsRepository
import com.sadellie.unitto.data.units.database.MyBasedUnit
import com.sadellie.unitto.data.units.database.MyBasedUnitsRepository
import dagger.hilt.android.lifecycle.HiltViewModel
@ -43,7 +42,7 @@ class SecondViewModel @Inject constructor(
private val basedUnitRepository: MyBasedUnitsRepository,
private val allUnitsRepository: AllUnitsRepository,
private val mContext: Application,
unitGroupsRepository: UnitGroupsRepository,
unitGroupsRepository: com.sadellie.unitto.data.unitgroups.UnitGroupsRepository,
) : ViewModel() {
private val _favoritesOnly = MutableStateFlow(false)

View File

@ -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.units.ALL_UNIT_GROUPS
import com.sadellie.unitto.data.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.ALL_UNIT_GROUPS
import com.sadellie.unitto.data.unitgroups.UnitGroup
import com.sadellie.unitto.feature.unitslist.R
/**

View File

@ -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.units.UnitGroup
import com.sadellie.unitto.data.unitgroups.UnitGroup
@Composable
internal fun UnitGroupHeader(modifier: Modifier, unitGroup: UnitGroup) {

View File

@ -17,7 +17,7 @@ dependencyResolutionManagement {
}
rootProject.name = "Unitto"
include(":app")
include(":data")
include(":data:units")
include(":core:base")
include(":core:ui")
include(":feature:converter")
@ -25,3 +25,7 @@ include(":feature:unitslist")
include(":feature:settings")
include(":feature:tools")
include(":feature:epoch")
include(":data:userprefs")
include(":data:unitgroups")
include(":data:licenses")
include(":data:epoch")