diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 00000000..86bc04dc
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,98 @@
+plugins {
+ id 'com.android.application'
+ id 'kotlin-android'
+ id 'kotlin-android-extensions'
+ id 'kotlin-kapt'
+}
+
+android {
+ compileSdkVersion 30
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.siedg.desafio_android"
+ minSdkVersion 21
+ targetSdkVersion 30
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ buildConfigField "String", "BASE_URL", "\"http://swapi.dev/\""
+ buildConfigField "String", "FAVORITE_API_URL", "\"http://docs.starwarsfavorites.apiary.io/#\""
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+ buildFeatures {
+ dataBinding = true
+ }
+}
+
+dependencies {
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'androidx.navigation:navigation-fragment-ktx:2.3.2'
+ implementation 'androidx.navigation:navigation-ui-ktx:2.3.2'
+ def lifecycle_version = "2.2.0"
+ def coroutines_version = "1.3.8"
+ def timber_version = "4.7.1"
+ def dagger_version = "2.28.3"
+ def retrofit_version = "2.9.0"
+ def ok_http_version = "4.8.1"
+ def groupie_version = "2.3.0"
+ def glide_version = "4.11.0"
+
+ // Groupie
+ implementation "com.xwray:groupie:$groupie_version"
+ implementation "com.xwray:groupie-kotlin-android-extensions:$groupie_version"
+ implementation "com.xwray:groupie-databinding:$groupie_version"
+
+ // ViewModel
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
+ // LiveData
+ implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
+ // Saved state module for ViewModel
+ implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
+ // Annotation processor
+ kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
+ // Coroutines
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
+ // Timber
+ implementation "com.jakewharton.timber:timber:$timber_version"
+ // Dagger
+ implementation "com.google.dagger:dagger:$dagger_version"
+ implementation "com.google.dagger:dagger-android-support:$dagger_version"
+ kapt "com.google.dagger:dagger-compiler:$dagger_version"
+ kapt "com.google.dagger:dagger-android-processor:$dagger_version"
+ // Retrofit
+ implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
+ // Gson Converter
+ implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
+ // OkHTTP
+ implementation "com.squareup.okhttp3:okhttp:$ok_http_version"
+ // Glide
+ implementation "com.github.bumptech.glide:glide:$glide_version"
+ kapt "com.github.bumptech.glide:compiler:$glide_version"
+
+
+
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+ implementation 'androidx.core:core-ktx:1.3.2'
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'com.google.android.material:material:1.2.1'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ testImplementation 'junit:junit:4.13.1'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.2'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 00000000..64b4a059
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -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
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/siedg/desafio_android/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/siedg/desafio_android/ExampleInstrumentedTest.kt
new file mode 100644
index 00000000..f97034e7
--- /dev/null
+++ b/app/src/androidTest/java/com/siedg/desafio_android/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.siedg.desafio_android
+
+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("com.siedg.desafio_android", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..7fd3f8d8
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/api/ApiService.kt b/app/src/main/java/com/siedg/desafio_android/data/api/ApiService.kt
new file mode 100644
index 00000000..bfbafb5e
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/api/ApiService.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android.data.api
+
+import com.siedg.desafio_android.data.model.*
+import retrofit2.Response
+import retrofit2.http.GET
+import retrofit2.http.Query
+
+interface ApiService {
+ @GET("people")
+ suspend fun getPersonList(@Query("page") index: Int): Response
+
+ @GET("planets")
+ suspend fun getPlanetsList(@Query("page") index: Int): Response
+
+ @GET("species")
+ suspend fun getSpeciesList(@Query("page") index: Int): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/Person.kt b/app/src/main/java/com/siedg/desafio_android/data/model/Person.kt
new file mode 100644
index 00000000..525fc6fe
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/Person.kt
@@ -0,0 +1,60 @@
+package com.siedg.desafio_android.data.model
+
+import com.google.gson.annotations.SerializedName
+
+data class Person(
+ @SerializedName("name")
+ val name: String,
+ @SerializedName("height")
+ val height: String,
+ @SerializedName("mass")
+ val mass: String,
+ @SerializedName("hair_color")
+ val hairColor: String,
+ @SerializedName("skin_color")
+ val skinColor: String,
+ @SerializedName("eye_color")
+ val eyeColor: String,
+ @SerializedName("birth_year")
+ val birthYear: String,
+ @SerializedName("gender")
+ val gender: String,
+ @SerializedName("homeworld")
+ val homeworld: String,
+ @SerializedName("films")
+ val films: List,
+ @SerializedName("species")
+ val species: List,
+ @SerializedName("vehicles")
+ val vehicles: List,
+ @SerializedName("starships")
+ val starships: List,
+ @SerializedName("created")
+ val created: String,
+ @SerializedName("edited")
+ val edited: String,
+ @SerializedName("url")
+ val url: String
+)
+
+fun Person.toModel() : PersonModel {
+ return PersonModel(
+ name,
+ height.toDouble(),
+ mass.toDouble(),
+ hairColor,
+ skinColor,
+ eyeColor,
+ birthYear,
+ gender,
+ homeworld,
+ films,
+ species,
+ vehicles,
+ starships,
+ created,
+ edited,
+ url,
+ false
+ )
+}
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/PersonList.kt b/app/src/main/java/com/siedg/desafio_android/data/model/PersonList.kt
new file mode 100644
index 00000000..ec7c6a9a
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/PersonList.kt
@@ -0,0 +1,18 @@
+package com.siedg.desafio_android.data.model
+
+import com.google.gson.annotations.SerializedName
+
+data class PersonList(
+ @SerializedName("count")
+ val count: Int,
+ @SerializedName("next")
+ val next: String?,
+ @SerializedName("previous")
+ val previous: String?,
+ @SerializedName("results")
+ val results: List
+)
+
+fun PersonList.mapToModel(): List {
+ return this.results.map { value -> value.toModel() }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/PersonModel.kt b/app/src/main/java/com/siedg/desafio_android/data/model/PersonModel.kt
new file mode 100644
index 00000000..891dbb92
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/PersonModel.kt
@@ -0,0 +1,21 @@
+package com.siedg.desafio_android.data.model
+
+data class PersonModel (
+ val name: String,
+ val height: Double,
+ val mass: Double,
+ val hairColor: String,
+ val skinColor: String,
+ val eyeColor: String,
+ val birthYear: String,
+ val gender: String,
+ val homeworld: String,
+ val films: List,
+ val species: List,
+ val vehicles: List,
+ val starships: List,
+ val created: String,
+ val edited: String,
+ val url: String,
+ val isFavorite: Boolean
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/Planet.kt b/app/src/main/java/com/siedg/desafio_android/data/model/Planet.kt
new file mode 100644
index 00000000..dbdb6f41
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/Planet.kt
@@ -0,0 +1,46 @@
+package com.siedg.desafio_android.data.model
+
+import com.google.gson.annotations.SerializedName
+
+data class Planet (
+ @SerializedName("climate")
+ val climate: String,
+ @SerializedName("diameter")
+ val diameter: String,
+ @SerializedName("gravity")
+ val gravity: String,
+ @SerializedName("name")
+ val name: String,
+ @SerializedName("orbital_period")
+ val orbitalPeriod: String,
+ @SerializedName("population")
+ val population: String,
+ @SerializedName("residents")
+ val residents: List,
+ @SerializedName("rotation_period")
+ val rotationPeriod: String,
+ @SerializedName("surface_water")
+ val surfaceWater: String,
+ @SerializedName("terrain")
+ val terrain: String,
+ @SerializedName("url")
+ val url: String
+
+
+)
+
+fun Planet.toModel(): PlanetModel {
+ return PlanetModel(
+ climate,
+ diameter,
+ gravity,
+ name,
+ orbitalPeriod,
+ population,
+ residents,
+ rotationPeriod,
+ surfaceWater,
+ terrain,
+ url
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/PlanetList.kt b/app/src/main/java/com/siedg/desafio_android/data/model/PlanetList.kt
new file mode 100644
index 00000000..31cd37b7
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/PlanetList.kt
@@ -0,0 +1,18 @@
+package com.siedg.desafio_android.data.model
+
+import com.google.gson.annotations.SerializedName
+
+data class PlanetList(
+ @SerializedName("count")
+ val count: Int,
+ @SerializedName("next")
+ val next: String?,
+ @SerializedName("previous")
+ val previous: String?,
+ @SerializedName("results")
+ val results: List
+)
+
+fun PlanetList.mapToModel(): List {
+ return this.results.map { value -> value.toModel() }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/PlanetModel.kt b/app/src/main/java/com/siedg/desafio_android/data/model/PlanetModel.kt
new file mode 100644
index 00000000..9fab2f59
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/PlanetModel.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android.data.model
+
+import com.google.gson.annotations.SerializedName
+
+class PlanetModel (
+ val climate: String,
+ val diameter: String,
+ val gravity: String,
+ val name: String,
+ val orbitalPeriod: String,
+ val population: String,
+ val residents: List,
+ val rotationPeriod: String,
+ val surfaceWater: String,
+ val terrain: String,
+ val url: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/Specie.kt b/app/src/main/java/com/siedg/desafio_android/data/model/Specie.kt
new file mode 100644
index 00000000..b2c5ff1a
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/Specie.kt
@@ -0,0 +1,56 @@
+package com.siedg.desafio_android.data.model
+
+import com.google.gson.annotations.SerializedName
+
+data class Specie (
+ @SerializedName("average_height")
+ val averageHeight: String,
+ @SerializedName("average_lifespan")
+ val averageLifespan: String,
+ @SerializedName("classification")
+ val classification: String,
+ @SerializedName("created")
+ val created: String,
+ @SerializedName("designation")
+ val designation: String,
+ @SerializedName("edited")
+ val edited: String,
+ @SerializedName("eye_color")
+ val eyeColor: String,
+ @SerializedName("hair_color")
+ val hairColor: String,
+ @SerializedName("homeworld")
+ val homeworld: String,
+ @SerializedName("language")
+ val language: String,
+ @SerializedName("name")
+ val name: String,
+ @SerializedName("people")
+ val people: List,
+ @SerializedName("films")
+ val films: List,
+ @SerializedName("skin_colors")
+ val skinColor: String,
+ @SerializedName("url")
+ val url: String
+)
+
+fun Specie.toModel(): SpecieModel {
+ return SpecieModel(
+ averageHeight,
+ averageLifespan,
+ classification,
+ created,
+ designation,
+ edited,
+ eyeColor,
+ hairColor,
+ homeworld,
+ language,
+ name,
+ people,
+ films,
+ skinColor,
+ url
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/SpecieList.kt b/app/src/main/java/com/siedg/desafio_android/data/model/SpecieList.kt
new file mode 100644
index 00000000..cb78775a
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/SpecieList.kt
@@ -0,0 +1,18 @@
+package com.siedg.desafio_android.data.model
+
+import com.google.gson.annotations.SerializedName
+
+data class SpecieList (
+ @SerializedName("count")
+ val count: Int,
+ @SerializedName("next")
+ val next: String?,
+ @SerializedName("previous")
+ val previous: String?,
+ @SerializedName("results")
+ val results: List
+)
+
+fun SpecieList.mapToModel(): List {
+ return this.results.map { value -> value.toModel() }
+}
diff --git a/app/src/main/java/com/siedg/desafio_android/data/model/SpecieModel.kt b/app/src/main/java/com/siedg/desafio_android/data/model/SpecieModel.kt
new file mode 100644
index 00000000..fbae43f4
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/model/SpecieModel.kt
@@ -0,0 +1,19 @@
+package com.siedg.desafio_android.data.model
+
+class SpecieModel(
+ val averageHeight: String,
+ val averageLifespan: String,
+ val classification: String,
+ val created: String,
+ val designation: String,
+ val edited: String,
+ val eyeColor: String,
+ val hairColor: String,
+ val homeworld: String,
+ val language: String,
+ val name: String,
+ val people: List,
+ val films: List,
+ val skinColor: String,
+ val url: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/PersonRepositoryImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/PersonRepositoryImpl.kt
new file mode 100644
index 00000000..5f05f52c
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/PersonRepositoryImpl.kt
@@ -0,0 +1,54 @@
+package com.siedg.desafio_android.data.repository
+
+import com.siedg.desafio_android.data.model.Person
+import com.siedg.desafio_android.data.model.PersonList
+import com.siedg.desafio_android.data.model.PersonModel
+import com.siedg.desafio_android.data.model.toModel
+import com.siedg.desafio_android.data.repository.datasource.PersonCacheDataSource
+import com.siedg.desafio_android.data.repository.datasource.PersonRemoteDataSource
+import com.siedg.desafio_android.domain.PersonRepository
+import timber.log.Timber
+import java.lang.Exception
+
+class PersonRepositoryImpl(
+ private val personRemoteDataSource: PersonRemoteDataSource,
+ private val personCacheDataSource: PersonCacheDataSource
+) : PersonRepository {
+ override suspend fun getPersonList(): List? = getPersonListFromCache()
+
+ private suspend fun getPersonListFromCache(): List {
+ lateinit var list: List
+ try {
+ list = personCacheDataSource.getPersonListFromCache()
+ } catch (e: Exception) {
+ Timber.e(e.message.toString())
+ }
+ if (list.isEmpty()) {
+ list = getPersonListFromAPI()
+ personCacheDataSource.savePersonListToCache(list)
+ }
+ return list
+ }
+
+ private suspend fun getPersonListFromAPI(): List {
+ val list: MutableList = mutableListOf()
+ try {
+ var index: Int? = 1
+ while (index != null) {
+ val response = personRemoteDataSource.getPersonList(index)
+ val body = response.body()
+ body?.results?.forEach { person ->
+ list.add(person.toModel())
+ }
+ if (body?.next.isNullOrEmpty()) {
+ index = null
+ } else {
+ index++
+ }
+ }
+ } catch (e: Exception) {
+ Timber.e(e.message.toString())
+ }
+ return list
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/PlanetRepositoryImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/PlanetRepositoryImpl.kt
new file mode 100644
index 00000000..d7242ed7
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/PlanetRepositoryImpl.kt
@@ -0,0 +1,52 @@
+package com.siedg.desafio_android.data.repository
+
+import com.siedg.desafio_android.data.model.PlanetModel
+import com.siedg.desafio_android.data.model.toModel
+import com.siedg.desafio_android.data.repository.datasource.PlanetCacheDataSource
+import com.siedg.desafio_android.data.repository.datasource.PlanetRemoteDataSource
+import com.siedg.desafio_android.domain.PlanetRepository
+import timber.log.Timber
+import java.lang.Exception
+
+class PlanetRepositoryImpl(
+ private val planetRemoteDataSource: PlanetRemoteDataSource,
+ private val planetCacheDataSource: PlanetCacheDataSource
+) : PlanetRepository {
+ override suspend fun getPlanetList(): List? = getPlanetListFromCache()
+
+ private suspend fun getPlanetListFromCache(): List {
+ lateinit var list: List
+ try {
+ list = planetCacheDataSource.getPlanetListFromCache()
+ } catch (e: Exception) {
+ Timber.e(e.message.toString())
+ }
+ if (list.isEmpty()) {
+ list = getPlanetListFromAPI()
+ planetCacheDataSource.savePlanetListToCache(list)
+ }
+ return list
+ }
+
+ private suspend fun getPlanetListFromAPI(): List {
+ val list: MutableList = mutableListOf()
+ try {
+ var index: Int? = 1
+ while (index != null) {
+ val response = planetRemoteDataSource.getPlanetsList(index)
+ val body = response.body()
+ body?.results?.forEach { planet ->
+ list.add(planet.toModel())
+ }
+ if (body?.next.isNullOrEmpty()) {
+ index = null
+ } else {
+ index++
+ }
+ }
+ } catch (e: Exception) {
+ Timber.e(e.message.toString())
+ }
+ return list
+ }
+}
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/SpecieRepositoryImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/SpecieRepositoryImpl.kt
new file mode 100644
index 00000000..b16f10b1
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/SpecieRepositoryImpl.kt
@@ -0,0 +1,57 @@
+package com.siedg.desafio_android.data.repository
+
+import com.siedg.desafio_android.data.model.PersonModel
+import com.siedg.desafio_android.data.model.Specie
+import com.siedg.desafio_android.data.model.SpecieModel
+import com.siedg.desafio_android.data.model.toModel
+import com.siedg.desafio_android.data.repository.datasource.PersonCacheDataSource
+import com.siedg.desafio_android.data.repository.datasource.PersonRemoteDataSource
+import com.siedg.desafio_android.data.repository.datasource.SpecieCacheDataSource
+import com.siedg.desafio_android.data.repository.datasource.SpecieRemoteDataSource
+import com.siedg.desafio_android.domain.PersonRepository
+import com.siedg.desafio_android.domain.SpecieRepository
+import timber.log.Timber
+import java.lang.Exception
+
+class SpecieRepositoryImpl(
+ private val specieRemoteDataSource: SpecieRemoteDataSource,
+ private val specieCacheDataSource: SpecieCacheDataSource
+) : SpecieRepository {
+ override suspend fun getSpecieList(): List? = getSpecieListFromCache()
+
+ private suspend fun getSpecieListFromCache(): List {
+ lateinit var list: List
+ try {
+ list = specieCacheDataSource.getSpecieListFromCache()
+ } catch (e: Exception) {
+ Timber.e(e.message.toString())
+ }
+ if (list.isEmpty()) {
+ list = getSpecieListFromAPI()
+ specieCacheDataSource.saveSpecieListToCache(list)
+ }
+ return list
+ }
+
+ private suspend fun getSpecieListFromAPI(): List {
+ val list: MutableList = mutableListOf()
+ try {
+ var index: Int? = 1
+ while (index != null) {
+ val response = specieRemoteDataSource.getSpeciesList(index)
+ val body = response.body()
+ body?.results?.forEach { specie ->
+ list.add(specie.toModel())
+ }
+ if (body?.next.isNullOrEmpty()) {
+ index = null
+ } else {
+ index++
+ }
+ }
+ } catch (e: Exception) {
+ Timber.e(e.message.toString())
+ }
+ return list
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PersonCacheDataSource.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PersonCacheDataSource.kt
new file mode 100644
index 00000000..6129faa0
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PersonCacheDataSource.kt
@@ -0,0 +1,10 @@
+package com.siedg.desafio_android.data.repository.datasource
+
+import com.siedg.desafio_android.data.model.Person
+import com.siedg.desafio_android.data.model.PersonModel
+
+interface PersonCacheDataSource {
+ suspend fun savePersonListToCache(personList: List)
+
+ suspend fun getPersonListFromCache(): List
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PersonRemoteDataSource.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PersonRemoteDataSource.kt
new file mode 100644
index 00000000..0636e746
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PersonRemoteDataSource.kt
@@ -0,0 +1,9 @@
+package com.siedg.desafio_android.data.repository.datasource
+
+import com.siedg.desafio_android.data.model.Person
+import com.siedg.desafio_android.data.model.PersonList
+import retrofit2.Response
+
+interface PersonRemoteDataSource {
+ suspend fun getPersonList(index: Int): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PlanetCacheDataSource.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PlanetCacheDataSource.kt
new file mode 100644
index 00000000..1e1e36ab
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PlanetCacheDataSource.kt
@@ -0,0 +1,9 @@
+package com.siedg.desafio_android.data.repository.datasource
+
+import com.siedg.desafio_android.data.model.PlanetModel
+
+interface PlanetCacheDataSource {
+ suspend fun savePlanetListToCache(personList: List)
+
+ suspend fun getPlanetListFromCache(): List
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PlanetRemoteDataSource.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PlanetRemoteDataSource.kt
new file mode 100644
index 00000000..1b2cefb2
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/PlanetRemoteDataSource.kt
@@ -0,0 +1,8 @@
+package com.siedg.desafio_android.data.repository.datasource
+
+import com.siedg.desafio_android.data.model.PlanetList
+import retrofit2.Response
+
+interface PlanetRemoteDataSource {
+ suspend fun getPlanetsList(index: Int): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/SpecieCacheDataSource.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/SpecieCacheDataSource.kt
new file mode 100644
index 00000000..31ac966c
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/SpecieCacheDataSource.kt
@@ -0,0 +1,9 @@
+package com.siedg.desafio_android.data.repository.datasource
+
+import com.siedg.desafio_android.data.model.SpecieModel
+
+interface SpecieCacheDataSource {
+ suspend fun saveSpecieListToCache(personList: List)
+
+ suspend fun getSpecieListFromCache(): List
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/SpecieRemoteDataSource.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/SpecieRemoteDataSource.kt
new file mode 100644
index 00000000..63e41f29
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasource/SpecieRemoteDataSource.kt
@@ -0,0 +1,10 @@
+package com.siedg.desafio_android.data.repository.datasource
+
+import com.siedg.desafio_android.data.model.PersonList
+import com.siedg.desafio_android.data.model.Specie
+import com.siedg.desafio_android.data.model.SpecieList
+import retrofit2.Response
+
+interface SpecieRemoteDataSource {
+ suspend fun getSpeciesList(index: Int): Response
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PersonCacheDataSourceImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PersonCacheDataSourceImpl.kt
new file mode 100644
index 00000000..e0c23e0b
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PersonCacheDataSourceImpl.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android.data.repository.datasourceImpl
+
+import com.siedg.desafio_android.data.model.Person
+import com.siedg.desafio_android.data.model.PersonModel
+import com.siedg.desafio_android.data.repository.datasource.PersonCacheDataSource
+
+class PersonCacheDataSourceImpl : PersonCacheDataSource {
+ private var list = ArrayList()
+ override suspend fun savePersonListToCache(personList: List) {
+ list.clear()
+ list = ArrayList(personList)
+ }
+
+ override suspend fun getPersonListFromCache(): List {
+ return list
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PersonRemoteDataSourceImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PersonRemoteDataSourceImpl.kt
new file mode 100644
index 00000000..d6472da8
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PersonRemoteDataSourceImpl.kt
@@ -0,0 +1,14 @@
+package com.siedg.desafio_android.data.repository.datasourceImpl
+
+import com.siedg.desafio_android.data.api.ApiService
+import com.siedg.desafio_android.data.model.Person
+import com.siedg.desafio_android.data.model.PersonList
+import com.siedg.desafio_android.data.repository.datasource.PersonRemoteDataSource
+import retrofit2.Response
+
+class PersonRemoteDataSourceImpl (
+ private val service: ApiService,
+// private val index: Int
+): PersonRemoteDataSource {
+ override suspend fun getPersonList(index: Int): Response = service.getPersonList(index)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PlanetCacheDataSourceImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PlanetCacheDataSourceImpl.kt
new file mode 100644
index 00000000..2c7ee161
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PlanetCacheDataSourceImpl.kt
@@ -0,0 +1,16 @@
+package com.siedg.desafio_android.data.repository.datasourceImpl
+
+import com.siedg.desafio_android.data.model.PlanetModel
+import com.siedg.desafio_android.data.repository.datasource.PlanetCacheDataSource
+
+class PlanetCacheDataSourceImpl : PlanetCacheDataSource {
+ private var list = ArrayList()
+ override suspend fun savePlanetListToCache(planetList: List) {
+ list.clear()
+ list = ArrayList(planetList)
+ }
+
+ override suspend fun getPlanetListFromCache(): List {
+ return list
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PlanetRemoteDataSourceImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PlanetRemoteDataSourceImpl.kt
new file mode 100644
index 00000000..0eceee5e
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/PlanetRemoteDataSourceImpl.kt
@@ -0,0 +1,12 @@
+package com.siedg.desafio_android.data.repository.datasourceImpl
+
+import com.siedg.desafio_android.data.api.ApiService
+import com.siedg.desafio_android.data.model.PlanetList
+import com.siedg.desafio_android.data.repository.datasource.PlanetRemoteDataSource
+import retrofit2.Response
+
+class PlanetRemoteDataSourceImpl(
+ private val service: ApiService,
+): PlanetRemoteDataSource {
+ override suspend fun getPlanetsList(index: Int): Response = service.getPlanetsList(index)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/SpecieCacheDataSourceImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/SpecieCacheDataSourceImpl.kt
new file mode 100644
index 00000000..0ad5121a
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/SpecieCacheDataSourceImpl.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android.data.repository.datasourceImpl
+
+import com.siedg.desafio_android.data.model.PersonModel
+import com.siedg.desafio_android.data.model.SpecieModel
+import com.siedg.desafio_android.data.repository.datasource.SpecieCacheDataSource
+
+class SpecieCacheDataSourceImpl : SpecieCacheDataSource {
+ private var list = ArrayList()
+ override suspend fun saveSpecieListToCache(specieList: List) {
+ list.clear()
+ list = ArrayList(specieList)
+ }
+
+ override suspend fun getSpecieListFromCache(): List {
+ return list
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/SpecieRemoteDataSourceImpl.kt b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/SpecieRemoteDataSourceImpl.kt
new file mode 100644
index 00000000..ae9e1aad
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/data/repository/datasourceImpl/SpecieRemoteDataSourceImpl.kt
@@ -0,0 +1,12 @@
+package com.siedg.desafio_android.data.repository.datasourceImpl
+
+import com.siedg.desafio_android.data.api.ApiService
+import com.siedg.desafio_android.data.model.SpecieList
+import com.siedg.desafio_android.data.repository.datasource.SpecieRemoteDataSource
+import retrofit2.Response
+
+class SpecieRemoteDataSourceImpl (
+ private val service: ApiService,
+ ): SpecieRemoteDataSource {
+ override suspend fun getSpeciesList(index: Int): Response = service.getSpeciesList(index)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/domain/GetPersonListUseCase.kt b/app/src/main/java/com/siedg/desafio_android/domain/GetPersonListUseCase.kt
new file mode 100644
index 00000000..1484fcbd
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/domain/GetPersonListUseCase.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.domain
+
+import com.siedg.desafio_android.data.model.PersonModel
+
+class GetPersonListUseCase(private val personRepository: PersonRepository) {
+ suspend fun execute():List? = personRepository.getPersonList()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/domain/GetPlanetListUseCase.kt b/app/src/main/java/com/siedg/desafio_android/domain/GetPlanetListUseCase.kt
new file mode 100644
index 00000000..26513060
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/domain/GetPlanetListUseCase.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.domain
+
+import com.siedg.desafio_android.data.model.PlanetModel
+
+class GetPlanetListUseCase(private val planetRepository: PlanetRepository) {
+ suspend fun execute(): List? = planetRepository.getPlanetList()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/domain/GetSpecieListUseCase.kt b/app/src/main/java/com/siedg/desafio_android/domain/GetSpecieListUseCase.kt
new file mode 100644
index 00000000..c54328e0
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/domain/GetSpecieListUseCase.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.domain
+
+import com.siedg.desafio_android.data.model.SpecieModel
+
+class GetSpecieListUseCase(private val specieRepository: SpecieRepository) {
+ suspend fun execute(): List? = specieRepository.getSpecieList()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/domain/PersonRepository.kt b/app/src/main/java/com/siedg/desafio_android/domain/PersonRepository.kt
new file mode 100644
index 00000000..de030d0e
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/domain/PersonRepository.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.domain
+
+import com.siedg.desafio_android.data.model.PersonModel
+
+interface PersonRepository {
+ suspend fun getPersonList(): List?
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/domain/PlanetRepository.kt b/app/src/main/java/com/siedg/desafio_android/domain/PlanetRepository.kt
new file mode 100644
index 00000000..956172ca
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/domain/PlanetRepository.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.domain
+
+import com.siedg.desafio_android.data.model.PlanetModel
+
+interface PlanetRepository {
+ suspend fun getPlanetList(): List?
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/domain/SpecieRepository.kt b/app/src/main/java/com/siedg/desafio_android/domain/SpecieRepository.kt
new file mode 100644
index 00000000..4acf8c3c
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/domain/SpecieRepository.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.domain
+
+import com.siedg.desafio_android.data.model.SpecieModel
+
+interface SpecieRepository {
+ suspend fun getSpecieList(): List?
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/App.kt b/app/src/main/java/com/siedg/desafio_android/presentation/App.kt
new file mode 100644
index 00000000..38158e1a
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/App.kt
@@ -0,0 +1,22 @@
+package com.siedg.desafio_android.presentation
+
+import android.app.Application
+import com.siedg.desafio_android.BuildConfig
+import com.siedg.desafio_android.presentation.di.Injector
+import com.siedg.desafio_android.presentation.di.core.*
+import com.siedg.desafio_android.presentation.di.home.HomeSubComponent
+
+class App : Application(), Injector {
+ private lateinit var appComponent: AppComponent
+
+ override fun createHomeSubComponent(): HomeSubComponent = appComponent.homeSubComponent().create()
+
+ override fun onCreate() {
+ super.onCreate()
+ appComponent = DaggerAppComponent.builder()
+ .appModule(AppModule(applicationContext))
+ .networkModule(NetworkModule(BuildConfig.BASE_URL))
+ .remoteDataModule(RemoteDataModule())
+ .build()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/Injector.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/Injector.kt
new file mode 100644
index 00000000..58bbe353
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/Injector.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.presentation.di
+
+import com.siedg.desafio_android.presentation.di.home.HomeSubComponent
+
+interface Injector {
+ fun createHomeSubComponent(): HomeSubComponent
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/core/AppComponent.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/AppComponent.kt
new file mode 100644
index 00000000..8369d012
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/AppComponent.kt
@@ -0,0 +1,22 @@
+package com.siedg.desafio_android.presentation.di.core
+
+import android.accounts.NetworkErrorException
+import com.siedg.desafio_android.presentation.di.home.HomeSubComponent
+import dagger.Component
+import javax.inject.Singleton
+
+@Singleton
+@Component(
+ modules = [
+ UseCaseModule::class,
+ RepositoryModule::class,
+ RemoteDataModule::class,
+ AppModule::class,
+ CacheDataModule::class,
+ NetworkModule::class
+ ]
+)
+
+interface AppComponent {
+ fun homeSubComponent(): HomeSubComponent.Factory
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/core/AppModule.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/AppModule.kt
new file mode 100644
index 00000000..4647fb25
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/AppModule.kt
@@ -0,0 +1,19 @@
+package com.siedg.desafio_android.presentation.di.core
+
+import android.content.Context
+import com.siedg.desafio_android.presentation.di.home.HomeSubComponent
+import dagger.Module
+import dagger.Provides
+import java.security.AccessControlContext
+import javax.inject.Singleton
+
+@Module(
+ subcomponents = [HomeSubComponent::class]
+)
+class AppModule(private val context: Context) {
+ @Singleton
+ @Provides
+ fun provideApplicationContext(): Context {
+ return context.applicationContext
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/core/CacheDataModule.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/CacheDataModule.kt
new file mode 100644
index 00000000..de126fd1
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/CacheDataModule.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android.presentation.di.core
+
+import com.siedg.desafio_android.data.repository.datasource.PersonCacheDataSource
+import com.siedg.desafio_android.data.repository.datasourceImpl.PersonCacheDataSourceImpl
+import com.siedg.desafio_android.data.repository.datasourceImpl.PersonRemoteDataSourceImpl
+import dagger.Module
+import dagger.Provides
+import javax.inject.Singleton
+
+@Module
+class CacheDataModule {
+ @Singleton
+ @Provides
+ fun providePersonCacheDataSource(): PersonCacheDataSource {
+ return PersonCacheDataSourceImpl()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/core/NetworkModule.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/NetworkModule.kt
new file mode 100644
index 00000000..209d2fa2
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/NetworkModule.kt
@@ -0,0 +1,26 @@
+package com.siedg.desafio_android.presentation.di.core
+
+import com.siedg.desafio_android.data.api.ApiService
+import dagger.Module
+import dagger.Provides
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import javax.inject.Singleton
+
+@Module
+class NetworkModule(private val baseUrl: String) {
+ @Singleton
+ @Provides
+ fun provideRetrofit() : Retrofit {
+ return Retrofit.Builder()
+ .addConverterFactory(GsonConverterFactory.create())
+ .baseUrl(baseUrl)
+ .build()
+ }
+
+ @Singleton
+ @Provides
+ fun provideApiService(retrofit: Retrofit): ApiService {
+ return retrofit.create(ApiService::class.java)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/core/RemoteDataModule.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/RemoteDataModule.kt
new file mode 100644
index 00000000..4658c93f
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/RemoteDataModule.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android.presentation.di.core
+
+import com.siedg.desafio_android.data.api.ApiService
+import com.siedg.desafio_android.data.repository.datasource.PersonRemoteDataSource
+import com.siedg.desafio_android.data.repository.datasourceImpl.PersonRemoteDataSourceImpl
+import dagger.Module
+import dagger.Provides
+import javax.inject.Singleton
+
+@Module
+class RemoteDataModule {
+ @Singleton
+ @Provides
+ fun providePersonRemoteDataSource(apiService: ApiService): PersonRemoteDataSource {
+ return PersonRemoteDataSourceImpl(apiService)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/core/RepositoryModule.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/RepositoryModule.kt
new file mode 100644
index 00000000..47c011e2
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/RepositoryModule.kt
@@ -0,0 +1,21 @@
+package com.siedg.desafio_android.presentation.di.core
+
+import com.siedg.desafio_android.data.repository.PersonRepositoryImpl
+import com.siedg.desafio_android.data.repository.datasource.PersonCacheDataSource
+import com.siedg.desafio_android.data.repository.datasource.PersonRemoteDataSource
+import com.siedg.desafio_android.domain.PersonRepository
+import dagger.Module
+import dagger.Provides
+import javax.inject.Singleton
+
+@Module
+class RepositoryModule {
+ @Singleton
+ @Provides
+ fun provideRepository(
+ remoteDataSource: PersonRemoteDataSource,
+ cacheDataSource: PersonCacheDataSource
+ ) : PersonRepository{
+ return PersonRepositoryImpl(remoteDataSource, cacheDataSource)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/core/UseCaseModule.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/UseCaseModule.kt
new file mode 100644
index 00000000..d20d2bf3
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/core/UseCaseModule.kt
@@ -0,0 +1,23 @@
+package com.siedg.desafio_android.presentation.di.core
+
+import com.siedg.desafio_android.domain.*
+import dagger.Module
+import dagger.Provides
+
+@Module
+class UseCaseModule {
+ @Provides
+ fun provideGetPersonListUseCase(repository: PersonRepository): GetPersonListUseCase {
+ return GetPersonListUseCase(repository)
+ }
+
+ @Provides
+ fun provideGetPlanetListUseCase(repository: PlanetRepository): GetPlanetListUseCase {
+ return GetPlanetListUseCase(repository)
+ }
+
+ @Provides
+ fun provideGetSpecieListUseCase(repository: SpecieRepository): GetSpecieListUseCase {
+ return GetSpecieListUseCase(repository)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeModule.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeModule.kt
new file mode 100644
index 00000000..10bd2414
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeModule.kt
@@ -0,0 +1,24 @@
+package com.siedg.desafio_android.presentation.di.home
+
+import com.siedg.desafio_android.domain.GetPersonListUseCase
+import com.siedg.desafio_android.domain.GetPlanetListUseCase
+import com.siedg.desafio_android.domain.GetSpecieListUseCase
+import com.siedg.desafio_android.presentation.viewmodel.HomeViewModelFactory
+import dagger.Module
+import dagger.Provides
+
+@Module
+class HomeModule {
+ @Provides
+ fun provideHomeViewModelFactory(
+ getPersonListUseCase: GetPersonListUseCase,
+ getPlanetListUseCase: GetPlanetListUseCase,
+ getSpecieListUseCase: GetSpecieListUseCase
+ ): HomeViewModelFactory {
+ return HomeViewModelFactory(
+ getPersonListUseCase,
+ getPlanetListUseCase,
+ getSpecieListUseCase
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeScope.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeScope.kt
new file mode 100644
index 00000000..79fad4ce
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeScope.kt
@@ -0,0 +1,7 @@
+package com.siedg.desafio_android.presentation.di.home
+
+import javax.inject.Scope
+
+@Scope
+@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
+annotation class HomeScope
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeSubComponent.kt b/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeSubComponent.kt
new file mode 100644
index 00000000..a2ca607a
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/di/home/HomeSubComponent.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android.presentation.di.home
+
+import com.siedg.desafio_android.presentation.ui.HomeFragment
+import com.siedg.desafio_android.presentation.ui.MainActivity
+import dagger.Subcomponent
+
+@HomeScope
+@Subcomponent(modules = [HomeModule::class])
+interface HomeSubComponent {
+ fun inject(mainActivity: MainActivity)
+ fun inject(homeFragment: HomeFragment)
+
+ @Subcomponent.Factory
+ interface Factory{
+ fun create(): HomeSubComponent
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/ui/HomeFragment.kt b/app/src/main/java/com/siedg/desafio_android/presentation/ui/HomeFragment.kt
new file mode 100644
index 00000000..94f2b3cd
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/ui/HomeFragment.kt
@@ -0,0 +1,63 @@
+package com.siedg.desafio_android.presentation.ui
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import com.siedg.desafio_android.R
+import com.siedg.desafio_android.data.model.PersonModel
+import com.siedg.desafio_android.databinding.FragmentHomeBinding
+import com.siedg.desafio_android.presentation.di.Injector
+import com.siedg.desafio_android.presentation.viewmodel.HomeViewModel
+import com.siedg.desafio_android.presentation.viewmodel.HomeViewModelFactory
+import com.xwray.groupie.GroupAdapter
+import com.xwray.groupie.ViewHolder
+import javax.inject.Inject
+
+class HomeFragment : Fragment() {
+ @Inject
+ lateinit var factory: HomeViewModelFactory
+ private lateinit var viewModel: HomeViewModel
+ private lateinit var binding: FragmentHomeBinding
+ private val groupAdapter = GroupAdapter()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ (activity?.application as Injector).createHomeSubComponent().inject(this)
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ binding = DataBindingUtil.inflate(
+ inflater,
+ R.layout.fragment_home,
+ container,
+ false
+ )
+
+ viewModel = ViewModelProvider(this, factory)
+ .get(HomeViewModel::class.java)
+
+ val responseLiveData = viewModel.getPersonList()
+
+ responseLiveData.observe(this.viewLifecycleOwner, Observer {
+ it?.let {
+ groupAdapter.clear()
+ groupAdapter.addAll(it.toRecyclerViewListItem())
+ binding.rvHomeList.adapter = groupAdapter
+ }
+ })
+ return binding.root
+ }
+
+ private fun List.toRecyclerViewListItem(): List {
+ return this.map { item -> HomeItem(item) }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/ui/HomeItem.kt b/app/src/main/java/com/siedg/desafio_android/presentation/ui/HomeItem.kt
new file mode 100644
index 00000000..de6dd540
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/ui/HomeItem.kt
@@ -0,0 +1,19 @@
+package com.siedg.desafio_android.presentation.ui
+
+import com.siedg.desafio_android.R
+import com.siedg.desafio_android.data.model.PersonModel
+import com.siedg.desafio_android.databinding.HomeItemBinding
+import com.xwray.groupie.databinding.BindableItem
+
+class HomeItem(private val personModel: PersonModel): BindableItem() {
+ override fun bind(viewBinding: HomeItemBinding, position: Int) {
+ viewBinding.apply {
+ tvHomeItemName.setText(personModel.name)
+ tvHomeItemGender.setText(personModel.gender)
+ tvHomeItemHeight.setText(personModel.height.toString())
+ tvHomeItemMass.setText(personModel.mass.toString())
+ }
+ }
+
+ override fun getLayout(): Int = R.layout.home_item
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/ui/MainActivity.kt b/app/src/main/java/com/siedg/desafio_android/presentation/ui/MainActivity.kt
new file mode 100644
index 00000000..dcd3d288
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/ui/MainActivity.kt
@@ -0,0 +1,12 @@
+package com.siedg.desafio_android.presentation.ui
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import com.siedg.desafio_android.R
+
+class MainActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/viewmodel/HomeViewModel.kt b/app/src/main/java/com/siedg/desafio_android/presentation/viewmodel/HomeViewModel.kt
new file mode 100644
index 00000000..46279217
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/viewmodel/HomeViewModel.kt
@@ -0,0 +1,28 @@
+package com.siedg.desafio_android.presentation.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.liveData
+import com.siedg.desafio_android.domain.GetPersonListUseCase
+import com.siedg.desafio_android.domain.GetPlanetListUseCase
+import com.siedg.desafio_android.domain.GetSpecieListUseCase
+
+class HomeViewModel (
+ private val getPersonListUseCase: GetPersonListUseCase,
+ private val getPlanetListUseCase: GetPlanetListUseCase,
+ private val getSpecieListUseCase: GetSpecieListUseCase
+): ViewModel() {
+ fun getPersonList() = liveData {
+ val personList = getPersonListUseCase.execute()
+ emit(personList)
+ }
+
+ fun getPlanetList() = liveData {
+ val planetList = getPlanetListUseCase.execute()
+ emit(planetList)
+ }
+
+ fun getSpecieList() = liveData {
+ val specieList = getSpecieListUseCase.execute()
+ emit(specieList)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/siedg/desafio_android/presentation/viewmodel/HomeViewModelFactory.kt b/app/src/main/java/com/siedg/desafio_android/presentation/viewmodel/HomeViewModelFactory.kt
new file mode 100644
index 00000000..2d78e0f1
--- /dev/null
+++ b/app/src/main/java/com/siedg/desafio_android/presentation/viewmodel/HomeViewModelFactory.kt
@@ -0,0 +1,26 @@
+package com.siedg.desafio_android.presentation.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.siedg.desafio_android.domain.GetPersonListUseCase
+import com.siedg.desafio_android.domain.GetPlanetListUseCase
+import com.siedg.desafio_android.domain.GetSpecieListUseCase
+import java.lang.IllegalArgumentException
+
+class HomeViewModelFactory(
+ private val getPersonListUseCase: GetPersonListUseCase,
+ private val getPlanetListUseCase: GetPlanetListUseCase,
+ private val getSpecieListUseCase: GetSpecieListUseCase
+): ViewModelProvider.Factory {
+ override fun create(modelClass: Class): T {
+ if (modelClass.isAssignableFrom(HomeViewModel::class.java)) {
+ return HomeViewModel(
+ getPersonListUseCase,
+ getPlanetListUseCase,
+ getSpecieListUseCase
+ ) as T
+ }
+ throw IllegalArgumentException("Argument invalid for View Model")
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 00000000..cc14f035
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000..a4f78de5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 00000000..c387db61
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 00000000..cb3be8f2
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/home_item.xml b/app/src/main/res/layout/home_item.xml
new file mode 100644
index 00000000..2e08576c
--- /dev/null
+++ b/app/src/main/res/layout/home_item.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000..a26f6fbc
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000..a26f6fbc
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..a571e600
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000..61da551c
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..c41dd285
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000..db5080a7
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..6dba46da
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..da31a871
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..15ac6817
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..b216f2d3
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..f25a4197
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..e96783cc
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
new file mode 100644
index 00000000..dd7902e5
--- /dev/null
+++ b/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 00000000..2664d756
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,17 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
+ #F4D06F
+ #FFF8F0
+ #FF8811
+ #EEB902
+ #E3F09B
+ #F7D08A
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 00000000..a64d52e9
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ desafio-android
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 00000000..adc035b6
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/test/java/com/siedg/desafio_android/ExampleUnitTest.kt b/app/src/test/java/com/siedg/desafio_android/ExampleUnitTest.kt
new file mode 100644
index 00000000..a83478a5
--- /dev/null
+++ b/app/src/test/java/com/siedg/desafio_android/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.siedg.desafio_android
+
+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/build.gradle b/build.gradle
new file mode 100644
index 00000000..6a3fc313
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,26 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ ext.kotlin_version = "1.4.32"
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath "com.android.tools.build:gradle:4.1.2"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 00000000..a38cbbbb
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,21 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..f6b961fd
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..455835b9
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sat Aug 07 18:49:29 BRT 2021
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 00000000..cccdd3d5
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 00000000..e95643d6
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/local.properties b/local.properties
new file mode 100644
index 00000000..22157355
--- /dev/null
+++ b/local.properties
@@ -0,0 +1,10 @@
+## This file is automatically generated by Android Studio.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file should *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+#
+# Location of the SDK. This is only used by Gradle.
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=C\:\\Users\\guilh\\AppData\\Local\\Android\\Sdk
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 00000000..335cb3e7
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+include ':app'
+rootProject.name = "desafio-android"
\ No newline at end of file