diff --git a/acronyms/src/androidTest/java/dev/carlos/acronyms/ExampleInstrumentedTest.kt b/acronyms/src/androidTest/java/dev/carlos/acronyms/ExampleInstrumentedTest.kt deleted file mode 100644 index b73d727..0000000 --- a/acronyms/src/androidTest/java/dev/carlos/acronyms/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package dev.carlos.acronyms - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("dev.carlos.acronyms", appContext.packageName) - } -} \ No newline at end of file diff --git a/acronyms/src/main/AndroidManifest.xml b/acronyms/src/main/AndroidManifest.xml deleted file mode 100644 index 7fd5b30..0000000 --- a/acronyms/src/main/AndroidManifest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/acronyms/src/main/java/dev/carlos/acronyms/models/AcronymsModels.kt b/acronyms/src/main/java/dev/carlos/acronyms/models/AcronymsModels.kt deleted file mode 100644 index 430f1ed..0000000 --- a/acronyms/src/main/java/dev/carlos/acronyms/models/AcronymsModels.kt +++ /dev/null @@ -1,51 +0,0 @@ -package dev.carlos.acronyms.models - -import android.os.Parcelable -import androidx.room.Entity -import androidx.room.Index -import androidx.room.PrimaryKey -import androidx.room.TypeConverters -import com.google.gson.annotations.SerializedName -import kotlinx.parcelize.Parcelize - -@Parcelize -data class ShortformRemote( - @SerializedName("sf") val value: String, - @SerializedName("lfs") val results: List -) : Parcelable { - @Parcelize - data class LongformRemote( - @SerializedName("lf") val value: String, - @SerializedName("freq") val corpusFrequency: Int, - @SerializedName("since") val since: Int - ) : Parcelable -} - -@Entity(tableName = ShortformEntity.TABLE_NAME, indices = [Index(value = ["value"], unique = true)]) -@TypeConverters(LongformListConverter::class) -data class ShortformEntity( - @PrimaryKey - val value: String, - val results: List -) { - data class LongformEntity( - val value: String, - val corpusFrequency: Int, - val since: Int - ) - - companion object { - const val TABLE_NAME = "shortforms" - } -} - -data class ShortformModel( - val value: String, - val results: List -) { - data class LongformModel( - val value: String, - val corpusFrequency: Int, - val since: Int - ) -} diff --git a/acronyms/src/main/java/dev/carlos/acronyms/models/Mappers.kt b/acronyms/src/main/java/dev/carlos/acronyms/models/Mappers.kt deleted file mode 100644 index e6be133..0000000 --- a/acronyms/src/main/java/dev/carlos/acronyms/models/Mappers.kt +++ /dev/null @@ -1,24 +0,0 @@ -package dev.carlos.acronyms.models - -import androidx.room.TypeConverter -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken - -class LongformListConverter { - @TypeConverter - fun fromString(value: String): List { - val listType = object : TypeToken>() {}.type - return Gson().fromJson(value, listType) - } - - @TypeConverter - fun fromList(list: List) = Gson().toJson(list) -} - -fun ShortformRemote.toShortformEntity() = ShortformEntity(this.value, this.results.map { - ShortformEntity.LongformEntity(it.value, it.corpusFrequency, it.since) -}) - -fun ShortformEntity.toShortformModel() = ShortformModel(this.value, this.results.map { - ShortformModel.LongformModel(it.value, it.corpusFrequency, it.since) -}) diff --git a/acronyms/src/main/res/drawable-v24/ic_launcher_foreground.xml b/acronyms/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 1448aba..0000000 --- a/acronyms/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/acronyms/src/main/res/drawable/ic_launcher_background.xml b/acronyms/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 445d0d5..0000000 --- a/acronyms/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/acronyms/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/acronyms/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 03eed25..0000000 --- a/acronyms/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/acronyms/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/acronyms/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 03eed25..0000000 --- a/acronyms/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/acronyms/src/main/res/mipmap-hdpi/ic_launcher.png b/acronyms/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 Binary files a/acronyms/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-hdpi/ic_launcher_round.png b/acronyms/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 Binary files a/acronyms/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-mdpi/ic_launcher.png b/acronyms/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 Binary files a/acronyms/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-mdpi/ic_launcher_round.png b/acronyms/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 Binary files a/acronyms/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-xhdpi/ic_launcher.png b/acronyms/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 Binary files a/acronyms/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/acronyms/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 Binary files a/acronyms/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-xxhdpi/ic_launcher.png b/acronyms/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 15ac681..0000000 Binary files a/acronyms/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/acronyms/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index b216f2d..0000000 Binary files a/acronyms/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/acronyms/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index f25a419..0000000 Binary files a/acronyms/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/acronyms/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/acronyms/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index e96783c..0000000 Binary files a/acronyms/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/acronyms/src/test/java/dev/carlos/acronyms/ExampleUnitTest.kt b/acronyms/src/test/java/dev/carlos/acronyms/ExampleUnitTest.kt deleted file mode 100644 index f8091ea..0000000 --- a/acronyms/src/test/java/dev/carlos/acronyms/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.carlos.acronyms - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index ce91a0f..c808dd7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - buildConfigField "String", "BASE_ENDPOINT", '"http://www.nactem.ac.uk/software/acromine/"' + buildConfigField "String", "BASE_ENDPOINT", '"http://www.nactem.ac.uk"' } buildTypes { @@ -58,5 +58,5 @@ android { dependencies { implementation project(":core") - implementation project(":acronyms") + implementation project(':shortform') } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b2d252b..e4ecfed 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ diff --git a/app/src/main/java/dev/carlos/acronyms/MainApplication.kt b/app/src/main/java/dev/carlos/acronyms/MainApplication.kt index ea7d95c..7f3734d 100644 --- a/app/src/main/java/dev/carlos/acronyms/MainApplication.kt +++ b/app/src/main/java/dev/carlos/acronyms/MainApplication.kt @@ -1,6 +1,7 @@ package dev.carlos.acronyms import android.app.Application +import dev.carlos.shortform.di.acronymsModule import dev.carlos.acronyms.di.appModules import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin @@ -24,7 +25,8 @@ class MainApplication : Application() { modules( listOf( - appModules + appModules, + acronymsModule ) ) } diff --git a/app/src/main/java/dev/carlos/acronyms/views/MainActivity.kt b/app/src/main/java/dev/carlos/acronyms/views/MainActivity.kt index 8d5b26b..415fd1c 100644 --- a/app/src/main/java/dev/carlos/acronyms/views/MainActivity.kt +++ b/app/src/main/java/dev/carlos/acronyms/views/MainActivity.kt @@ -5,15 +5,11 @@ import androidx.appcompat.app.AppCompatActivity import androidx.navigation.findNavController import androidx.navigation.ui.NavigationUI import dev.carlos.acronyms.R -import dev.carlos.acronyms.di.appModules import dev.carlos.acronyms.viewmodel.NavigationViewmodel -import dev.carlos.core.extensions.findNavHostFragment import dev.carlos.core.extensions.observeNonNull import dev.carlos.core.navigation.NavigationRouter import org.koin.android.ext.android.inject -import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.ext.android.viewModel -import org.koin.core.context.startKoin class MainActivity : AppCompatActivity() { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a21b3e1..f35bcca 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,7 +5,8 @@ android:layout_height="match_parent" > - + + + + www.nactem.ac.uk + + \ No newline at end of file diff --git a/core/src/main/java/dev/carlos/core/domain/network/RequestState.kt b/core/src/main/java/dev/carlos/core/domain/network/RequestState.kt new file mode 100644 index 0000000..956f293 --- /dev/null +++ b/core/src/main/java/dev/carlos/core/domain/network/RequestState.kt @@ -0,0 +1,7 @@ +package dev.carlos.core.domain.network + +sealed class RequestState { + class Success(val data: T) : RequestState() + object Loading : RequestState() + class Error(val throwable: Throwable) : RequestState() +} diff --git a/core/src/main/java/dev/carlos/core/domain/network/RequestStatus.kt b/core/src/main/java/dev/carlos/core/domain/network/RequestStatus.kt deleted file mode 100644 index 1c8cafc..0000000 --- a/core/src/main/java/dev/carlos/core/domain/network/RequestStatus.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.carlos.core.domain.network - -sealed class RequestStatus { - object Ready : RequestStatus() - object Loading : RequestStatus() - object Errored : RequestStatus() - object Empty : RequestStatus() -} diff --git a/core/src/main/java/dev/carlos/core/extensions/NumbersExtensions.kt b/core/src/main/java/dev/carlos/core/extensions/NumbersExtensions.kt new file mode 100644 index 0000000..3a428da --- /dev/null +++ b/core/src/main/java/dev/carlos/core/extensions/NumbersExtensions.kt @@ -0,0 +1,3 @@ +package dev.carlos.core.extensions + +fun Int.notEmpty() = this > 0 diff --git a/core/src/main/java/dev/carlos/core/extensions/SchedulerExtensions.kt b/core/src/main/java/dev/carlos/core/extensions/SchedulerExtensions.kt new file mode 100644 index 0000000..7ac530c --- /dev/null +++ b/core/src/main/java/dev/carlos/core/extensions/SchedulerExtensions.kt @@ -0,0 +1,19 @@ +package dev.carlos.core.extensions + +import dev.carlos.core.scheduler.Scheduler +import io.reactivex.Completable +import io.reactivex.Flowable +import io.reactivex.Observable +import io.reactivex.Single + +fun Observable.runOnIo(scheduler: Scheduler): Observable = + subscribeOn(scheduler.io()).observeOn(scheduler.ui()) + +fun Single.runOnIo(scheduler: Scheduler): Single = + subscribeOn(scheduler.io()).observeOn(scheduler.ui()) + +fun Flowable.runOnIo(scheduler: Scheduler): Flowable = + subscribeOn(scheduler.io()).observeOn(scheduler.ui()) + +fun Completable.runOnIo(scheduler: Scheduler): Completable = + subscribeOn(scheduler.io()).observeOn(scheduler.ui()) diff --git a/core/src/main/java/dev/carlos/core/scheduler/Scheduler.kt b/core/src/main/java/dev/carlos/core/scheduler/Scheduler.kt new file mode 100644 index 0000000..9a57637 --- /dev/null +++ b/core/src/main/java/dev/carlos/core/scheduler/Scheduler.kt @@ -0,0 +1,10 @@ +package dev.carlos.core.scheduler + +import io.reactivex.Scheduler + +interface Scheduler { + fun io(): Scheduler + fun computation(): Scheduler + fun newThread(): Scheduler + fun ui(): Scheduler +} diff --git a/core/src/main/java/dev/carlos/core/scheduler/SchedulerProvider.kt b/core/src/main/java/dev/carlos/core/scheduler/SchedulerProvider.kt new file mode 100644 index 0000000..f04fb75 --- /dev/null +++ b/core/src/main/java/dev/carlos/core/scheduler/SchedulerProvider.kt @@ -0,0 +1,15 @@ +package dev.carlos.core.scheduler + +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +class SchedulerProvider : Scheduler { + + override fun io() = Schedulers.io() + + override fun computation() = Schedulers.computation() + + override fun newThread() = Schedulers.newThread() + + override fun ui(): io.reactivex.Scheduler = AndroidSchedulers.mainThread() +} diff --git a/core/src/main/res/drawable-v24/ic_launcher_foreground.xml b/core/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 1448aba..0000000 --- a/core/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/core/src/main/res/drawable/ic_launcher_background.xml b/core/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 445d0d5..0000000 --- a/core/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 03eed25..0000000 --- a/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 03eed25..0000000 --- a/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher.png b/core/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 Binary files a/core/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher_round.png b/core/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 Binary files a/core/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher.png b/core/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 Binary files a/core/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher_round.png b/core/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 Binary files a/core/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher.png b/core/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 Binary files a/core/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 Binary files a/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 15ac681..0000000 Binary files a/core/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index b216f2d..0000000 Binary files a/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index f25a419..0000000 Binary files a/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index e96783c..0000000 Binary files a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/settings.gradle b/settings.gradle index ed5015c..51e8e82 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ rootProject.name = "Acronyms" -include ':app', ':core', ':acronyms' +include ':app', ':core', ':shortform' diff --git a/acronyms/.gitignore b/shortform/.gitignore similarity index 100% rename from acronyms/.gitignore rename to shortform/.gitignore diff --git a/acronyms/build.gradle b/shortform/build.gradle similarity index 72% rename from acronyms/build.gradle rename to shortform/build.gradle index 91acb7e..92d439c 100644 --- a/acronyms/build.gradle +++ b/shortform/build.gradle @@ -5,6 +5,12 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-parcelize' +android { + defaultConfig { + buildConfigField "String", "DB_NAME", '"acronyms.db"' + } +} + dependencies { implementation project(':core') } diff --git a/acronyms/proguard-rules.pro b/shortform/proguard-rules.pro similarity index 100% rename from acronyms/proguard-rules.pro rename to shortform/proguard-rules.pro diff --git a/shortform/src/main/AndroidManifest.xml b/shortform/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7b5a50f --- /dev/null +++ b/shortform/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/shortform/src/main/java/dev/carlos/shortform/data/AcronymsDataRepository.kt b/shortform/src/main/java/dev/carlos/shortform/data/AcronymsDataRepository.kt new file mode 100644 index 0000000..30f4b85 --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/data/AcronymsDataRepository.kt @@ -0,0 +1,16 @@ +package dev.carlos.shortform.data + +import dev.carlos.shortform.data.cloud.AcronymsRemoteSource +import dev.carlos.shortform.data.models.ShortformModel +import dev.carlos.shortform.data.models.toShortformModel +import dev.carlos.shortform.domain.AcronymsRepository +import io.reactivex.Single + +class AcronymsDataRepository( + private val remoteDatasource: AcronymsRemoteSource +) : AcronymsRepository { + + override fun getAcronymDefinition(acronym: String): Single { + return remoteDatasource.getAcronymDefinition(acronym).map { it.single()?.toShortformModel() } + } +} diff --git a/shortform/src/main/java/dev/carlos/shortform/data/cloud/AcronymsRemoteSource.kt b/shortform/src/main/java/dev/carlos/shortform/data/cloud/AcronymsRemoteSource.kt new file mode 100644 index 0000000..315eb7c --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/data/cloud/AcronymsRemoteSource.kt @@ -0,0 +1,8 @@ +package dev.carlos.shortform.data.cloud + +import dev.carlos.shortform.data.cloud.model.ShortformRemote +import io.reactivex.Single + +interface AcronymsRemoteSource { + fun getAcronymDefinition(acronym: String): Single> +} diff --git a/shortform/src/main/java/dev/carlos/shortform/data/cloud/model/ShortformRemote.kt b/shortform/src/main/java/dev/carlos/shortform/data/cloud/model/ShortformRemote.kt new file mode 100644 index 0000000..6fb68c8 --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/data/cloud/model/ShortformRemote.kt @@ -0,0 +1,18 @@ +package dev.carlos.shortform.data.cloud.model + +import android.os.Parcelable +import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize + +@Parcelize +data class ShortformRemote( + @SerializedName("sf") val value: String, + @SerializedName("lfs") val results: List +) : Parcelable { + @Parcelize + data class LongformRemote( + @SerializedName("lf") val value: String, + @SerializedName("freq") val corpusFrequency: Int, + @SerializedName("since") val since: Int + ) : Parcelable +} diff --git a/shortform/src/main/java/dev/carlos/shortform/data/cloud/retrofit/AcronymsRemoteDatasource.kt b/shortform/src/main/java/dev/carlos/shortform/data/cloud/retrofit/AcronymsRemoteDatasource.kt new file mode 100644 index 0000000..c02c65d --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/data/cloud/retrofit/AcronymsRemoteDatasource.kt @@ -0,0 +1,11 @@ +package dev.carlos.shortform.data.cloud.retrofit + +import dev.carlos.shortform.data.cloud.AcronymsRemoteSource +import dev.carlos.shortform.data.cloud.model.ShortformRemote +import io.reactivex.Single + +class AcronymsRemoteDatasource(private val acronymsService: AcronymsService) : AcronymsRemoteSource { + override fun getAcronymDefinition(acronym: String): Single> { + return acronymsService.getAcronymDefinition(acronym) + } +} diff --git a/shortform/src/main/java/dev/carlos/shortform/data/cloud/retrofit/AcronymsService.kt b/shortform/src/main/java/dev/carlos/shortform/data/cloud/retrofit/AcronymsService.kt new file mode 100644 index 0000000..d44843c --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/data/cloud/retrofit/AcronymsService.kt @@ -0,0 +1,11 @@ +package dev.carlos.shortform.data.cloud.retrofit + +import dev.carlos.shortform.data.cloud.model.ShortformRemote +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query + +interface AcronymsService { + @GET("/software/acromine/dictionary.py") + fun getAcronymDefinition(@Query("sf") acronym: String): Single> +} diff --git a/shortform/src/main/java/dev/carlos/shortform/data/models/Mappers.kt b/shortform/src/main/java/dev/carlos/shortform/data/models/Mappers.kt new file mode 100644 index 0000000..6031961 --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/data/models/Mappers.kt @@ -0,0 +1,7 @@ +package dev.carlos.shortform.data.models + +import dev.carlos.shortform.data.cloud.model.ShortformRemote + +fun ShortformRemote.toShortformModel() = ShortformModel(this.value, this.results.map { + ShortformModel.LongformModel(it.value, it.corpusFrequency, it.since) +}) diff --git a/shortform/src/main/java/dev/carlos/shortform/data/models/ShortformModel.kt b/shortform/src/main/java/dev/carlos/shortform/data/models/ShortformModel.kt new file mode 100644 index 0000000..e36aa13 --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/data/models/ShortformModel.kt @@ -0,0 +1,12 @@ +package dev.carlos.shortform.data.models + +data class ShortformModel( + val value: String, + val results: List +) { + data class LongformModel( + val value: String, + val corpusFrequency: Int, + val since: Int + ) +} diff --git a/shortform/src/main/java/dev/carlos/shortform/di/AcronymsModule.kt b/shortform/src/main/java/dev/carlos/shortform/di/AcronymsModule.kt new file mode 100644 index 0000000..2324c20 --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/di/AcronymsModule.kt @@ -0,0 +1,25 @@ +package dev.carlos.shortform.di + +import dev.carlos.core.domain.network.RemoteClient +import dev.carlos.core.scheduler.Scheduler +import dev.carlos.core.scheduler.SchedulerProvider +import dev.carlos.shortform.data.AcronymsDataRepository +import dev.carlos.shortform.data.cloud.AcronymsRemoteSource +import dev.carlos.shortform.data.cloud.retrofit.AcronymsRemoteDatasource +import dev.carlos.shortform.data.cloud.retrofit.AcronymsService +import dev.carlos.shortform.domain.AcronymsRepository +import dev.carlos.shortform.domain.GetAcronymDefinition +import org.koin.dsl.module + +val acronymsModule = module { + single { SchedulerProvider() } + + single { + get().getClient(AcronymsService::class.java) + } + + factory { AcronymsRemoteDatasource(get()) } + factory { AcronymsDataRepository(get()) } + + factory { GetAcronymDefinition(get(), get()) } +} diff --git a/shortform/src/main/java/dev/carlos/shortform/domain/AcronymsRepository.kt b/shortform/src/main/java/dev/carlos/shortform/domain/AcronymsRepository.kt new file mode 100644 index 0000000..64ce4e5 --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/domain/AcronymsRepository.kt @@ -0,0 +1,9 @@ +package dev.carlos.shortform.domain + +import dev.carlos.shortform.data.models.ShortformModel +import io.reactivex.Flowable +import io.reactivex.Single + +interface AcronymsRepository { + fun getAcronymDefinition(acronym: String): Single +} diff --git a/shortform/src/main/java/dev/carlos/shortform/domain/GetAcronymDefinition.kt b/shortform/src/main/java/dev/carlos/shortform/domain/GetAcronymDefinition.kt new file mode 100644 index 0000000..2eaf816 --- /dev/null +++ b/shortform/src/main/java/dev/carlos/shortform/domain/GetAcronymDefinition.kt @@ -0,0 +1,15 @@ +package dev.carlos.shortform.domain + +import dev.carlos.shortform.data.models.ShortformModel +import dev.carlos.core.extensions.runOnIo +import dev.carlos.core.scheduler.Scheduler +import io.reactivex.Single + +class GetAcronymDefinition( + private val acronymsRepository: AcronymsRepository, + private val scheduler: Scheduler +) { + fun getAcronymDefinition(acronym: String): Single { + return acronymsRepository.getAcronymDefinition(acronym).runOnIo(scheduler) + } +} diff --git a/acronyms/src/main/res/values-night/themes.xml b/shortform/src/main/res/values-night/themes.xml similarity index 100% rename from acronyms/src/main/res/values-night/themes.xml rename to shortform/src/main/res/values-night/themes.xml diff --git a/acronyms/src/main/res/values/colors.xml b/shortform/src/main/res/values/colors.xml similarity index 100% rename from acronyms/src/main/res/values/colors.xml rename to shortform/src/main/res/values/colors.xml diff --git a/acronyms/src/main/res/values/strings.xml b/shortform/src/main/res/values/strings.xml similarity index 100% rename from acronyms/src/main/res/values/strings.xml rename to shortform/src/main/res/values/strings.xml diff --git a/acronyms/src/main/res/values/themes.xml b/shortform/src/main/res/values/themes.xml similarity index 100% rename from acronyms/src/main/res/values/themes.xml rename to shortform/src/main/res/values/themes.xml