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