Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d411da4

Browse files
release 0.7.0
2 parents 565be57 + 34af978 commit d411da4

File tree

48 files changed

+2949
-166
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2949
-166
lines changed

‎app/build.gradle.kts

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,40 @@ android {
4242
// }
4343
// }
4444

45-
flavorDimensions("debug")
46-
productFlavors {
47-
}
45+
// Specifies one flavor dimension. Intend to use both reactive libraries as flavors as project develops
46+
47+
// flavorDimensions("reactive")
48+
//
49+
// productFlavors {
50+
//
51+
// create("rxjava") {
52+
// dimension = "reactive"
53+
// applicationIdSuffix = ".rxjava"
54+
// versionNameSuffix = "-rxjava"
55+
// }
56+
// create("coroutines") {
57+
// dimension = "reactive"
58+
// applicationIdSuffix =".coroutines"
59+
// versionNameSuffix = "-coroutines"
60+
// }
61+
// }
4862

49-
sourceSets {
50-
}
63+
// sourceSets {
64+
// val sharedTestDir =
65+
// "${project(Modules.AndroidLibrary.TEST_UTILS).projectDir}/src/test-shared/java"
66+
//
67+
// getByName("test") {
68+
// java.srcDir(sharedTestDir)
69+
// }
70+
//
71+
// getByName("androidTest") {
72+
// java.srcDir(sharedTestDir)
73+
// resources.srcDir(
74+
// "${project(Modules.AndroidLibrary.TEST_UTILS).projectDir}" +
75+
// "/src/test/resources"
76+
// )
77+
// }
78+
// }
5179

5280
android.buildFeatures.dataBinding = true
5381

@@ -65,12 +93,17 @@ dependencies {
6593

6694
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
6795

68-
implementation(project(Modules.AndroidLibrary.DOMAIN))
6996
implementation(project(Modules.AndroidLibrary.CORE))
7097

98+
implementation(project(Modules.AndroidLibrary.DOMAIN))
99+
// TODO Solve Why doesn't work when DATA module is not added?
100+
implementation(project(Modules.AndroidLibrary.DATA))
101+
71102
addAppModuleDependencies()
72103

73-
testImplementation(project(Modules.AndroidLibrary.TEST_UTILS))
74104
addUnitTestDependencies()
105+
testImplementation(project(Modules.AndroidLibrary.TEST_UTILS))
106+
75107
addInstrumentationTestDependencies()
108+
androidTestImplementation(project(Modules.AndroidLibrary.TEST_UTILS))
76109
}

‎app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.smarttoolfactory.postdynamichilt">
44

5+
<uses-permission android:name="android.permission.INTERNET"/>
6+
57
<application
8+
android:name=".PostApplication"
69
android:allowBackup="true"
710
android:icon="@mipmap/ic_launcher"
811
android:label="@string/app_name"
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,33 @@
11
package com.smarttoolfactory.postdynamichilt
22

33
import android.os.Bundle
4+
import androidx.activity.viewModels
45
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.lifecycle.Observer
7+
import com.smarttoolfactory.domain.usecase.GetPostListUseCaseFlow
8+
import com.smarttoolfactory.postdynamichilt.postlist.PostListViewModelRxJava3
9+
import dagger.hilt.android.AndroidEntryPoint
10+
import javax.inject.Inject
511

12+
@AndroidEntryPoint
613
class MainActivity : AppCompatActivity() {
14+
15+
// private val viewModel: PostListViewModel by viewModels()
16+
private val viewModel: PostListViewModelRxJava3 by viewModels()
17+
18+
@Inject
19+
lateinit var getPostListUseCaseFlow: GetPostListUseCaseFlow
20+
721
override fun onCreate(savedInstanceState: Bundle?) {
822
super.onCreate(savedInstanceState)
923
setContentView(R.layout.activity_main)
24+
viewModel.getPosts()
25+
26+
viewModel.postViewState.observe(
27+
this,
28+
Observer {
29+
println("🔥 MainActivity view state: ${it.status}")
30+
}
31+
)
1032
}
1133
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.smarttoolfactory.postdynamichilt
2+
3+
import android.app.Application
4+
import dagger.hilt.android.HiltAndroidApp
5+
6+
@HiltAndroidApp
7+
class PostApplication : Application() {
8+
9+
override fun onCreate() {
10+
super.onCreate()
11+
}
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.smarttoolfactory.postdynamichilt.di
2+
3+
import dagger.Module
4+
import dagger.Provides
5+
import dagger.hilt.InstallIn
6+
import dagger.hilt.android.components.ApplicationComponent
7+
import javax.inject.Singleton
8+
import kotlinx.coroutines.CoroutineScope
9+
import kotlinx.coroutines.Dispatchers
10+
import kotlinx.coroutines.SupervisorJob
11+
12+
@Module
13+
@InstallIn(ApplicationComponent::class)
14+
class AppModule {
15+
16+
@Singleton
17+
@Provides
18+
fun provideCoroutineScope() = CoroutineScope(Dispatchers.Main.immediate + SupervisorJob())
19+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.smarttoolfactory.postdynamichilt.postlist
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.lifecycle.ViewModel
5+
import com.smarttoolfactory.core.util.Event
6+
import com.smarttoolfactory.core.viewstate.ViewState
7+
import com.smarttoolfactory.domain.model.Post
8+
9+
abstract class AbstractPostListVM : ViewModel() {
10+
11+
companion object {
12+
const val POST_LIST = "POST_LIST"
13+
const val POST_DETAIL = "POST_DETAIL"
14+
}
15+
16+
abstract val goToDetailScreen: LiveData<Event<Post>>
17+
18+
abstract val postViewState: LiveData<ViewState<List<Post>>>
19+
20+
abstract fun getPosts()
21+
22+
abstract fun refreshPosts()
23+
24+
abstract fun onClick(post: Post)
25+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.smarttoolfactory.postdynamichilt.postlist
2+
3+
import androidx.hilt.Assisted
4+
import androidx.hilt.lifecycle.ViewModelInject
5+
import androidx.lifecycle.LiveData
6+
import androidx.lifecycle.SavedStateHandle
7+
import com.smarttoolfactory.core.util.Event
8+
import com.smarttoolfactory.core.util.convertToFlowViewState
9+
import com.smarttoolfactory.core.viewstate.Status
10+
import com.smarttoolfactory.core.viewstate.ViewState
11+
import com.smarttoolfactory.domain.model.Post
12+
import com.smarttoolfactory.domain.usecase.GetPostListUseCaseFlow
13+
import kotlinx.coroutines.CoroutineScope
14+
import kotlinx.coroutines.flow.launchIn
15+
import kotlinx.coroutines.flow.onEach
16+
import kotlinx.coroutines.flow.onStart
17+
18+
class PostListViewModel @ViewModelInject constructor(
19+
private val coroutineScope: CoroutineScope,
20+
private val getPostsUseCase: GetPostListUseCaseFlow,
21+
@Assisted savedStateHandle: SavedStateHandle
22+
) : AbstractPostListVM() {
23+
24+
private val _goToDetailScreen =
25+
savedStateHandle.getLiveData<Event<Post>>(POST_DETAIL)
26+
27+
override val goToDetailScreen: LiveData<Event<Post>>
28+
get() = _goToDetailScreen
29+
30+
private val _postViewState =
31+
savedStateHandle.getLiveData<ViewState<List<Post>>>(POST_LIST)
32+
33+
override val postViewState: LiveData<ViewState<List<Post>>>
34+
get() = _postViewState
35+
36+
override fun getPosts() {
37+
38+
getPostsUseCase.getPostFlowOfflineFirst()
39+
.convertToFlowViewState()
40+
.onStart {
41+
_postViewState.value = ViewState(status = Status.LOADING)
42+
}
43+
.onEach {
44+
_postViewState.value = it
45+
}
46+
.launchIn(coroutineScope)
47+
}
48+
49+
override fun refreshPosts() {
50+
getPostsUseCase.getPostFlowOfflineLast()
51+
.convertToFlowViewState()
52+
.onStart {
53+
_postViewState.value = ViewState(status = Status.LOADING)
54+
}
55+
.onEach {
56+
_postViewState.value = it
57+
}
58+
.launchIn(coroutineScope)
59+
}
60+
61+
override fun onClick(post: Post) {
62+
_goToDetailScreen.value = Event(post)
63+
}
64+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.smarttoolfactory.postdynamichilt.postlist
2+
3+
import androidx.hilt.Assisted
4+
import androidx.hilt.lifecycle.ViewModelInject
5+
import androidx.lifecycle.LiveData
6+
import androidx.lifecycle.SavedStateHandle
7+
import com.smarttoolfactory.core.util.Event
8+
import com.smarttoolfactory.core.util.convertFromSingleToObservableViewState
9+
import com.smarttoolfactory.core.viewstate.Status
10+
import com.smarttoolfactory.core.viewstate.ViewState
11+
import com.smarttoolfactory.domain.model.Post
12+
import com.smarttoolfactory.domain.usecase.GetPostListUseCaseRxJava3
13+
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
14+
15+
class PostListViewModelRxJava3 @ViewModelInject constructor(
16+
private val getPostsUseCase: GetPostListUseCaseRxJava3,
17+
@Assisted private val savedStateHandle: SavedStateHandle
18+
) : AbstractPostListVM() {
19+
20+
private val _goToDetailScreen =
21+
savedStateHandle.getLiveData<Event<Post>>(POST_DETAIL)
22+
23+
override val goToDetailScreen: LiveData<Event<Post>>
24+
get() = _goToDetailScreen
25+
26+
private val _postViewState =
27+
savedStateHandle.getLiveData<ViewState<List<Post>>>(POST_LIST)
28+
29+
override val postViewState: LiveData<ViewState<List<Post>>>
30+
get() = _postViewState
31+
32+
override fun getPosts() {
33+
getPostsUseCase.getPostsOfflineFirst()
34+
.convertFromSingleToObservableViewState()
35+
.observeOn(AndroidSchedulers.mainThread())
36+
.subscribe(
37+
{
38+
_postViewState.value = it
39+
},
40+
{
41+
_postViewState.value = ViewState(status = Status.ERROR, error = it)
42+
}
43+
)
44+
}
45+
46+
override fun refreshPosts() {
47+
getPostsUseCase.getPostsOfflineLast()
48+
.convertFromSingleToObservableViewState()
49+
.observeOn(AndroidSchedulers.mainThread())
50+
.subscribe(
51+
{
52+
_postViewState.value = it
53+
},
54+
{
55+
_postViewState.value = ViewState(status = Status.ERROR, error = it)
56+
}
57+
)
58+
}
59+
60+
override fun onClick(post: Post) {
61+
_goToDetailScreen.value = Event(post)
62+
}
63+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /