Skip to content

Commit 80f2b19

Browse files
committed
Otus-Android#3 CatsViewModel connected to MainActivity
1 parent 0e28421 commit 80f2b19

File tree

2 files changed

+57
-20
lines changed

2 files changed

+57
-20
lines changed

app/src/main/java/otus/homework/coroutines/CatsViewModel.kt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@ package otus.homework.coroutines
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.ViewModelProvider
5+
import androidx.lifecycle.viewModelScope
56
import androidx.lifecycle.viewmodel.initializer
67
import androidx.lifecycle.viewmodel.viewModelFactory
78
import kotlinx.coroutines.CoroutineExceptionHandler
9+
import kotlinx.coroutines.async
10+
import kotlinx.coroutines.flow.MutableStateFlow
11+
import kotlinx.coroutines.flow.SharingStarted
12+
import kotlinx.coroutines.flow.filterNotNull
13+
import kotlinx.coroutines.flow.onStart
14+
import kotlinx.coroutines.flow.shareIn
15+
import kotlinx.coroutines.launch
816

917
class CatsViewModel(
1018
private val catsService: CatsService,
@@ -15,7 +23,28 @@ class CatsViewModel(
1523
CrashMonitor.trackWarning(throwable)
1624
}
1725

26+
private val _uiState = MutableStateFlow<CatsUIState?>(null)
27+
val uiState = _uiState.onStart { load() }
28+
.filterNotNull()
29+
.shareIn(
30+
viewModelScope,
31+
SharingStarted.WhileSubscribed(5000),
32+
replay = 1
33+
)
1834

35+
fun load() {
36+
viewModelScope.launch(exceptionHandler) {
37+
val fact = async { catsService.getCatFact() }
38+
val image = async { imageService.getCatImage() }
39+
40+
_uiState.emit(
41+
CatsUIState(
42+
fact = fact.await(),
43+
image = image.await()[0]
44+
)
45+
)
46+
}
47+
}
1948

2049
companion object {
2150
fun provideFactory(
Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,53 @@
11
package otus.homework.coroutines
22

33
import android.os.Bundle
4+
import android.widget.Button
5+
import android.widget.ImageView
6+
import android.widget.TextView
47
import androidx.appcompat.app.AppCompatActivity
58
import androidx.lifecycle.ViewModelProvider
9+
import androidx.lifecycle.lifecycleScope
10+
import com.squareup.picasso.Picasso
11+
import kotlinx.coroutines.launch
612

713
class MainActivity : AppCompatActivity() {
814

9-
lateinit var catsPresenter: CatsPresenter
10-
1115
private val diContainer = DiContainer()
1216

17+
private lateinit var fact: TextView
18+
private lateinit var image: ImageView
19+
private lateinit var loadButton: Button
20+
1321
private val viewModel by lazy {
1422
ViewModelProvider(
15-
this,
16-
CatsViewModel.provideFactory(diContainer.catsService, diContainer.imageService)
23+
this, CatsViewModel.provideFactory(diContainer.catsService, diContainer.imageService)
1724
)[CatsViewModel::class.java]
1825
}
1926

2027
override fun onCreate(savedInstanceState: Bundle?) {
2128
super.onCreate(savedInstanceState)
22-
23-
val view = layoutInflater.inflate(R.layout.activity_main, null) as CatsView
29+
val view = layoutInflater.inflate(R.layout.activity_main, null)
2430
setContentView(view)
31+
fact = view.findViewById(R.id.fact_textView)
32+
image = view.findViewById(R.id.catImage)
33+
loadButton = view.findViewById(R.id.button)
2534

26-
catsPresenter = CatsPresenter(
27-
diContainer.catsService,
28-
diContainer.imageService,
29-
diContainer.presenterScope
30-
)
31-
view.presenter = catsPresenter
32-
catsPresenter.attachView(view)
33-
catsPresenter.onInitComplete()
35+
configureFact()
36+
setListeners()
37+
}
38+
39+
private fun setListeners() {
40+
loadButton.setOnClickListener {
41+
viewModel.load()
42+
}
3443
}
3544

36-
override fun onStop() {
37-
if (isFinishing) {
38-
catsPresenter.apply {
39-
detachView()
45+
private fun configureFact() {
46+
lifecycleScope.launch {
47+
viewModel.uiState.collect { state ->
48+
fact.text = state.fact.fact
49+
Picasso.get().load(state.image.url).into(image)
4050
}
4151
}
42-
catsPresenter.cancelCoroutine()
43-
super.onStop()
4452
}
4553
}

0 commit comments

Comments
 (0)