Skip to content

Commit 23a210b

Browse files
add retrofit example and test retrofit
1 parent afe42f3 commit 23a210b

38 files changed

+603
-199
lines changed

.idea/modules.xml

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

+11-8
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,30 @@ android {
2727

2828
dependencies {
2929
def ktx_version = "2.0.0"
30-
3130
implementation fileTree(dir: 'libs', include: ['*.jar'])
32-
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
31+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
3332
implementation 'androidx.appcompat:appcompat:1.0.2'
3433
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-experimental-adapter:1.0.0'
35-
implementation "com.google.android.material:material:1.1.0-alpha07"
36-
kapt "androidx.databinding:databinding-compiler:3.5.0-beta01"
34+
implementation "com.google.android.material:material:1.1.0-alpha09"
35+
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
36+
kapt "androidx.databinding:databinding-compiler:3.5.0"
3737
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
3838
implementation "androidx.lifecycle:lifecycle-viewmodel:2.0.0"
3939
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$ktx_version"
40-
implementation "androidx.fragment:fragment-ktx:1.1.0-rc01"
40+
implementation "androidx.fragment:fragment-ktx:1.1.0-rc04"
41+
implementation project(':networkmodule')
4142

42-
implementation project (':ktandroidarchitecturecore')
43+
implementation project(':ktandroidarchitecturecore')
4344
testImplementation 'junit:junit:4.12'
4445
androidTestImplementation 'androidx.test:runner:1.2.0'
4546
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
46-
testImplementation 'org.mockito:mockito-core:2.23.0'
47+
testImplementation 'org.mockito:mockito-core:2.27.0'
4748
testImplementation 'android.arch.core:core-testing:1.1.1'
4849
testImplementation 'com.jraska.livedata:testing-ktx:1.1.0'
4950
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0"
5051
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"
5152
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.0"
52-
}
53+
// Koin for Unit tests
54+
testImplementation "org.koin:koin-test:$koin_version"
5355

56+
}

app/src/main/AndroidManifest.xml

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
1+
<?xml version="1.0" encoding="utf-8"?>
12
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
24
package="com.sysdata.kt.ktandroidarchitecture">
35

6+
<uses-permission android:name="android.permission.INTERNET" />
47
<application
8+
android:name=".MainApplication"
59
android:allowBackup="true"
610
android:icon="@mipmap/ic_launcher"
711
android:label="@string/app_name"
812
android:roundIcon="@mipmap/ic_launcher_round"
913
android:supportsRtl="true"
10-
android:theme="@style/AppTheme">
14+
android:theme="@style/AppTheme"
15+
tools:ignore="GoogleAppIndexingWarning">
16+
<activity android:name=".ui.GitHubActivity"></activity>
1117
<activity android:name=".ui.LoginActivity">
1218
<intent-filter>
1319
<action android:name="android.intent.action.MAIN" />
1420

1521
<category android:name="android.intent.category.LAUNCHER" />
1622
</intent-filter>
1723
</activity>
18-
<!--<activity android:name=".ui.UserLoggedActivity"></activity>-->
1924
</application>
20-
</manifest>
25+
26+
</manifest>

app/src/main/java/com/sysdata/kt/ktandroidarchitecture/MainApplication.kt

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
package com.sysdata.kt.ktandroidarchitecture
22

33
import android.app.Application
4+
import com.example.networkmodule.di.networkModule
5+
import com.sysdata.kt.ktandroidarchitecture.di.appModule
6+
import org.koin.android.ext.koin.androidContext
7+
import org.koin.android.ext.koin.androidLogger
8+
import org.koin.core.context.startKoin
9+
import org.koin.core.logger.Level
410

511

612
class MainApplication : Application() {
713

814

9-
companion object {
10-
lateinit var INSTANCE: MainApplication
11-
}
12-
1315
override fun onCreate() {
1416
super.onCreate()
15-
INSTANCE = this
16-
MainApplicationConfig.instance
17+
18+
startKoin {
19+
androidLogger(Level.DEBUG)
20+
androidContext(this@MainApplication)
21+
modules(listOf(appModule, networkModule))
22+
}
1723
}
1824

1925

app/src/main/java/com/sysdata/kt/ktandroidarchitecture/MainApplicationConfig.kt

-14
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.sysdata.kt.ktandroidarchitecture.di
2+
3+
import com.sysdata.kt.ktandroidarchitecture.repository.AuthRepository
4+
import com.sysdata.kt.ktandroidarchitecture.repository.AuthRepositoryImpl
5+
import com.sysdata.kt.ktandroidarchitecture.repository.GitHubRepo
6+
import com.sysdata.kt.ktandroidarchitecture.repository.GitHubRepoImpl
7+
import com.sysdata.kt.ktandroidarchitecture.usecase.GitHubUseCase
8+
import com.sysdata.kt.ktandroidarchitecture.usecase.LoginUseCase
9+
import com.sysdata.kt.ktandroidarchitecture.viewmodel.GitHubViewModel
10+
import com.sysdata.kt.ktandroidarchitecture.viewmodel.LoginViewModel
11+
import org.koin.androidx.viewmodel.dsl.viewModel
12+
import org.koin.dsl.module
13+
14+
val appModule = module{
15+
// single instance of AuthRepository
16+
single<AuthRepository>{AuthRepositoryImpl()}
17+
single<GitHubRepo>{GitHubRepoImpl(get())}
18+
19+
// simple UseCase factory
20+
factory { LoginUseCase(get()) }
21+
factory { GitHubUseCase(get()) }
22+
23+
// LoginViewModel ViewModel
24+
viewModel { LoginViewModel(get())}
25+
viewModel { GitHubViewModel(get()) }
26+
27+
28+
}

app/src/main/java/com/sysdata/kt/ktandroidarchitecture/repository/AuthRepository.kt

-26
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.sysdata.kt.ktandroidarchitecture.repository
2+
3+
import com.sysdata.kt.ktandroidarchitecture.repository.model.UserLogged
4+
import it.sysdata.ktandroidarchitecturecore.BaseRepository
5+
6+
7+
interface AuthRepository {
8+
fun login(email: String, password: String): UserLogged
9+
10+
}
11+
12+
class AuthRepositoryImpl : BaseRepository(),AuthRepository {
13+
14+
15+
16+
override fun login(email: String, password: String): UserLogged {
17+
if (email.isEmpty() || password.isEmpty())
18+
throw RuntimeException()
19+
20+
return UserLogged(email)
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.sysdata.kt.ktandroidarchitecture.repository
2+
3+
import com.example.networkmodule.api.api.GitHubService
4+
import com.example.networkmodule.api.model.Repo
5+
6+
interface GitHubRepo {
7+
suspend fun getRepositoryByUser(user: String): List<Repo>
8+
9+
}
10+
11+
class GitHubRepoImpl(private val api: GitHubService) : GitHubRepo {
12+
13+
override suspend fun getRepositoryByUser(user: String): List<Repo> {
14+
return api.listRepos(user)
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.sysdata.kt.ktandroidarchitecture.ui
2+
3+
import android.os.Bundle
4+
import android.util.Log
5+
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.lifecycle.viewModelScope
7+
import com.sysdata.kt.ktandroidarchitecture.R
8+
import com.sysdata.kt.ktandroidarchitecture.usecase.GitHubActionParams
9+
import com.sysdata.kt.ktandroidarchitecture.viewmodel.GitHubViewModel
10+
import org.koin.androidx.viewmodel.ext.android.viewModel
11+
12+
class GitHubActivity : AppCompatActivity() {
13+
private val viewModel by viewModel<GitHubViewModel>()
14+
15+
override fun onCreate(savedInstanceState: Bundle?) {
16+
super.onCreate(savedInstanceState)
17+
setContentView(R.layout.activity_git_hub)
18+
viewModel.gitHubAction.observe(this) {
19+
Log.e("Repo", it.toString())
20+
}
21+
viewModel.gitHubAction.execute(GitHubActionParams("SysdataSpA"), viewModel.viewModelScope)
22+
}
23+
}

app/src/main/java/com/sysdata/kt/ktandroidarchitecture/ui/LoginActivity.kt

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
package com.sysdata.kt.ktandroidarchitecture.ui
22

3+
import android.content.Intent
34
import android.os.Bundle
45
import android.text.Editable
56
import android.text.TextWatcher
67
import android.view.View
78
import android.widget.Toast
8-
import androidx.activity.viewModels
99
import androidx.fragment.app.FragmentActivity
10-
import androidx.lifecycle.ViewModelProviders
11-
import androidx.lifecycle.viewModelScope
1210
import com.sysdata.kt.ktandroidarchitecture.R
1311
import com.sysdata.kt.ktandroidarchitecture.repository.model.UIUserLogged
14-
import com.sysdata.kt.ktandroidarchitecture.usecase.LoginActionParams
1512
import com.sysdata.kt.ktandroidarchitecture.viewmodel.LoginViewModel
1613
import it.sysdata.ktandroidarchitecturecore.exception.Failure
1714
import kotlinx.android.synthetic.main.activity_login.*
15+
import org.koin.androidx.viewmodel.ext.android.viewModel
1816

1917
class LoginActivity : FragmentActivity(), View.OnClickListener, TextWatcher {
2018

21-
private val viewModel: LoginViewModel by viewModels()
19+
private val viewModel by viewModel<LoginViewModel>()
2220

2321
override fun onCreate(savedInstanceState: Bundle?) {
2422
super.onCreate(savedInstanceState)
@@ -39,12 +37,13 @@ class LoginActivity : FragmentActivity(), View.OnClickListener, TextWatcher {
3937
}
4038

4139
private fun onUserLoggged(userLogged: UIUserLogged?) {
40+
startActivity(Intent(this, GitHubActivity::class.java))
4241
Toast.makeText(this, "user : ${userLogged?.email}", Toast.LENGTH_SHORT).show()
4342
}
4443

4544

4645
override fun onClick(p0: View?) {
47-
viewModel.login(usernameValue.text.toString(),passwordValue.text.toString())
46+
viewModel.login(usernameValue.text.toString(), passwordValue.text.toString())
4847
}
4948

5049
fun validateForm(): Boolean {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.sysdata.kt.ktandroidarchitecture.usecase
2+
3+
import com.example.networkmodule.api.model.Repo
4+
import com.sysdata.kt.ktandroidarchitecture.repository.GitHubRepo
5+
import com.sysdata.kt.ktandroidarchitecture.repository.model.UserLogged
6+
import it.sysdata.ktandroidarchitecturecore.exception.Failure
7+
import it.sysdata.ktandroidarchitecturecore.functional.Either
8+
import it.sysdata.ktandroidarchitecturecore.interactor.UseCase
9+
10+
class GitHubUseCase(private val repo: GitHubRepo) : UseCase< List<Repo>, GitHubActionParams>() {
11+
override suspend fun run(params: GitHubActionParams): Either<Failure, List<Repo>> {
12+
return try {
13+
Either.Right(repo.getRepositoryByUser(params.user))
14+
} catch (e: Exception) {
15+
Either.Left(Failure.NetworkConnection())
16+
}
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package com.sysdata.kt.ktandroidarchitecture.usecase
22

33
import com.sysdata.kt.ktandroidarchitecture.repository.AuthRepository
4+
import com.sysdata.kt.ktandroidarchitecture.repository.AuthRepositoryImpl
45
import com.sysdata.kt.ktandroidarchitecture.repository.model.UserLogged
56
import it.sysdata.ktandroidarchitecturecore.exception.Failure
67
import it.sysdata.ktandroidarchitecturecore.functional.Either
78
import it.sysdata.ktandroidarchitecturecore.interactor.UseCase
89

9-
class LoginUseCase: UseCase<UserLogged, LoginActionParams>() {
10+
class LoginUseCase(private val repo:AuthRepository) : UseCase<UserLogged, LoginActionParams>() {
1011
override suspend fun run(params: LoginActionParams): Either<Failure, UserLogged> {
11-
return AuthRepository.instance.login(params.email, params.password)
12+
return try {
13+
Either.Right(repo.login(params.email, params.password))
14+
} catch (e: Exception) {
15+
Either.Left(Failure.NetworkConnection())
16+
}
1217
}
1318
}

app/src/main/java/com/sysdata/kt/ktandroidarchitecture/usecase/Params.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ package com.sysdata.kt.ktandroidarchitecture.usecase
33
import it.sysdata.ktandroidarchitecturecore.interactor.ActionParams
44

55
class None : ActionParams()
6-
data class LoginActionParams(val email: String, val password: String) : ActionParams()
6+
data class LoginActionParams(val email: String, val password: String) : ActionParams()
7+
8+
data class GitHubActionParams(val user: String) : ActionParams()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.sysdata.kt.ktandroidarchitecture.viewmodel
2+
3+
import androidx.lifecycle.ViewModel
4+
import com.example.networkmodule.api.model.Repo
5+
import com.sysdata.kt.ktandroidarchitecture.usecase.GitHubActionParams
6+
import com.sysdata.kt.ktandroidarchitecture.usecase.GitHubUseCase
7+
import it.sysdata.ktandroidarchitecturecore.interactor.Action
8+
9+
class GitHubViewModel(gitHubUseCase: GitHubUseCase) : ViewModel() {
10+
val gitHubAction = Action.Builder<GitHubActionParams, List<Repo>, List<Repo>>()
11+
.useCase(gitHubUseCase)
12+
.buildWithUiModel { it }
13+
14+
}

app/src/main/java/com/sysdata/kt/ktandroidarchitecture/viewmodel/LoginViewModel.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@ import com.sysdata.kt.ktandroidarchitecture.usecase.LoginUseCase
88
import it.sysdata.ktandroidarchitecturecore.interactor.Action
99
import it.sysdata.ktandroidarchitecturecore.platform.BaseViewModel
1010

11-
class LoginViewModel : BaseViewModel() {
11+
class LoginViewModel(loginUseCase: LoginUseCase) : BaseViewModel() {
1212

1313

1414

15-
private val myUseCase = LoginUseCase::class.java
1615

1716
val actionLogin = Action.Builder<LoginActionParams, UserLogged, UIUserLogged>()
18-
.useCase(myUseCase)
17+
.useCase(loginUseCase)
1918
.buildWithUiModel { UIUserLogged(it.username) }
2019

2120

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
tools:context=".ui.GitHubActivity">
8+
9+
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)