Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions .idea/runConfigurations.xml

This file was deleted.

71 changes: 59 additions & 12 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
compileSdkVersion 28
buildToolsVersion "29.0.2"
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "br.com.aisdigital.androidchallenge"
minSdkVersion 21
targetSdkVersion 28
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Expand All @@ -21,15 +20,63 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

buildFeatures {
viewBinding true
}

testOptions {
unitTests.returnDefaultValues = true
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
implementation 'com.google.android.material:material:1.4.0'

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation "androidx.fragment:fragment-ktx:1.3.6"

// HILT
implementation 'com.google.dagger:hilt-android:2.38.1'
kapt 'com.google.dagger:hilt-android-compiler:2.38.1'

// RX
implementation "io.reactivex.rxjava2:rxjava:2.1.9"
implementation "io.reactivex.rxjava2:rxandroid:2.0.2"

// RETROFIT
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation "com.google.code.gson:gson:2.8.6"

// ROOM
api "androidx.room:room-runtime:2.3.0"
api "androidx.room:room-ktx:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"

implementation 'com.squareup.picasso:picasso:2.71828'

testImplementation 'junit:junit:4.13.2'
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
testImplementation 'org.mockito:mockito-inline:2.22.0'
testImplementation "com.squareup.okhttp3:mockwebserver:3.12.0"

androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'androidx.test.ext:truth:1.4.0'
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package br.com.aisdigital.androidchallenge.persistence

import android.content.Context
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import br.com.aisdigital.androidchallenge.model.User
import br.com.aisdigital.androidchallenge.persistence.dao.UserDao
import kotlinx.coroutines.runBlocking
import org.hamcrest.CoreMatchers
import org.hamcrest.MatcherAssert
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import java.io.IOException

@RunWith(AndroidJUnit4::class)
class MainDatabaseTest {
private lateinit var userDao: UserDao
private lateinit var db: MainDatabase

@Before
fun setUp() {
val context = ApplicationProvider.getApplicationContext<Context>()
db = Room.inMemoryDatabaseBuilder(
context, MainDatabase::class.java
).build()
userDao = db.getUserDao()
}

@After
@Throws(IOException::class)
fun closeDb() {
db.close()
}

@Test
fun insertAndReadUser() = runBlocking {

val user = User("Rodrigo", 35, "MALE")

userDao.insert(user)

val userResult = userDao.getUser()

MatcherAssert.assertThat(userResult, CoreMatchers.equalTo(user))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package br.com.aisdigital.androidchallenge.presentation

import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.Espresso.*
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.action.ViewActions.*
import androidx.test.espresso.assertion.ViewAssertions.*
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.runners.AndroidJUnit4
import br.com.aisdigital.androidchallenge.R
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class LoginActivityTest {

@Test
fun checkStartOfActivityLogin() {
ActivityScenario.launch(LoginActivity::class.java)

onView(withId(R.id.emailField)).check(matches(isDisplayed()))

onView(withId(R.id.pwdField)).check(matches(isDisplayed()))

onView(withId(R.id.loginButton)).check(matches(isDisplayed()))
}

@Test
fun checkClickOnButtonLoginWithEmptyFields() {
ActivityScenario.launch(LoginActivity::class.java)

onView(withId(R.id.loginButton)).perform(click())

onView(withId(R.id.emailField))
.check(matches(hasErrorText("Este campo é obrigatório")))

onView(withId(R.id.emailField))
.perform(typeText("teste@email.com"), ViewActions.closeSoftKeyboard())

onView(withId(R.id.loginButton)).perform(click())

onView(withId(R.id.pwdField))
.check(matches(hasErrorText("Este campo é obrigatório")))
}
}
10 changes: 8 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,26 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.aisdigital.androidchallenge">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
android:allowBackup="true"
android:name=".AndroidChallenge"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<activity android:name=".presentation.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".presentation.TeamsActivity" />

</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package br.com.aisdigital.androidchallenge

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class AndroidChallenge : Application() {

}

This file was deleted.

13 changes: 13 additions & 0 deletions app/src/main/java/br/com/aisdigital/androidchallenge/model/Team.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package br.com.aisdigital.androidchallenge.model

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "teams")
data class Team(@PrimaryKey
@ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "city") val city:String,
@ColumnInfo(name = "conference") val conference: String,
@ColumnInfo(name = "teamImageUrl") val teamImageUrl: String,
@ColumnInfo(name = "description") val description : String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package br.com.aisdigital.androidchallenge.model

data class Token(val token : String)
11 changes: 11 additions & 0 deletions app/src/main/java/br/com/aisdigital/androidchallenge/model/User.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package br.com.aisdigital.androidchallenge.model

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users")
data class User (@PrimaryKey
@ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "age") val age: Int,
@ColumnInfo(name = "gender") val gender: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package br.com.aisdigital.androidchallenge.modules

import android.content.Context
import androidx.room.Room
import br.com.aisdigital.androidchallenge.AndroidChallenge
import br.com.aisdigital.androidchallenge.networking.TeamsApi
import br.com.aisdigital.androidchallenge.persistence.MainDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import io.reactivex.Scheduler
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
class Module {

@Singleton
@Provides
fun provideApplication(@ApplicationContext app: Context): AndroidChallenge {
return app as AndroidChallenge
}

@Singleton
@Provides
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://c526ee5a-a2fb-446c-b242-d5fa13592a1a.mock.pstmn.io")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}

@Singleton
@Provides
fun provideTeamsApi(retrofit: Retrofit): TeamsApi {
return retrofit.create(TeamsApi::class.java)
}

@Singleton
@Provides
fun provideDatabase(@ApplicationContext appContext: Context) : MainDatabase {
return Room.databaseBuilder(
appContext,
MainDatabase::class.java,
"main_database"
).build()
}

@Singleton
@Provides
fun provideUserDao(db: MainDatabase) = db.getUserDao()

@Singleton
@Provides
fun provideTeamDao(db: MainDatabase) = db.getTeamDao()

@Singleton
@Provides
fun provideSchedulerIO() = SchedulerProvider()

open class SchedulerProvider {
fun computation() = Schedulers.computation()
fun ui() = AndroidSchedulers.mainThread()
fun io() = Schedulers.io()
}
}
Loading