Skip to content

Commit 495dc5a

Browse files
authored
Merge pull request #18 from ReactComponentKit/issue/17
Android React Component Kit 2.0.0
2 parents 492a4ee + 5a950d3 commit 495dc5a

Some content is hidden

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

58 files changed

+828
-1058
lines changed

app/src/main/java/com/github/skyfe79/android/library/app/MainViewLayout.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package com.github.skyfe79.android.library.app
33
import android.view.View
44
import com.github.skyfe79.android.library.app.action.*
55
import com.github.skyfe79.android.reactcomponentkit.component.LayoutComponent
6-
import com.github.skyfe79.android.reactcomponentkit.eventbus.Token
6+
import com.github.skyfe79.android.reactcomponentkit.dispatcher.dispatch
7+
import com.github.skyfe79.android.reactcomponentkit.viewmodel.Token
78
import com.github.skyfe79.android.reactcomponentkit.redux.State
89
import kotlinx.android.synthetic.main.activity_main.view.*
910
import org.jetbrains.anko.AnkoContext
1011
import org.jetbrains.anko.include
1112
import org.jetbrains.anko.sdk27.coroutines.onClick
1213

1314
class MainViewLayout(token: Token)
14-
: LayoutComponent<MainActivity>(token, false) {
15+
: LayoutComponent<MainActivity>(token) {
1516

1617
/**
1718
* You can use layout xml file like below.

app/src/main/java/com/github/skyfe79/android/library/app/MainViewModel.kt

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.github.skyfe79.android.library.app
22

3+
import android.app.Application
4+
import com.github.skyfe79.android.library.app.action.*
35
import com.github.skyfe79.android.reactcomponentkit.redux.Output
46
import com.github.skyfe79.android.reactcomponentkit.redux.State
5-
import com.github.skyfe79.android.reactcomponentkit.viewmodel.RootViewModelType
6-
import com.github.skyfe79.android.library.app.redux.routeReducer
7+
import com.github.skyfe79.android.library.app.redux.*
8+
import com.github.skyfe79.android.reactcomponentkit.viewmodel.RCKViewModel
79

810
enum class MainRoute {
911
None,
@@ -13,17 +15,28 @@ enum class MainRoute {
1315
EmojiCollectionExample,
1416
CollectionViewExample
1517
}
16-
data class MainState(var route: MainRoute): State()
18+
data class MainState(var route: MainRoute): State() {
19+
override fun copyState(): MainState {
20+
return this.copy()
21+
}
22+
}
1723

18-
class MainViewModel: RootViewModelType<MainState>() {
24+
class MainViewModel(application: Application): RCKViewModel<MainState>(application) {
1925

2026
val route: Output<MainRoute> = Output(MainRoute.None)
2127

2228
override fun setupStore() {
23-
store.set(
24-
initialState = MainState(MainRoute.None),
25-
reducers = arrayOf(::routeReducer)
26-
)
29+
initStore { store ->
30+
store.initialState(MainState(MainRoute.None))
31+
32+
store.flow<ClickCounterExampleButtonAction>(::routeToCounterExample)
33+
store.flow<ClickCounterExample2ButtonAction>(::routeToCounterExample2)
34+
store.flow<ClickRecyclerViewExampleButtonAction>(::routeToRecyclerViewExample)
35+
store.flow<ClickEmojiExampleButtonAction>(::routeToEmojiExample)
36+
store.flow<ClickCollectionViewExampleButtonAction>({ state, _ ->
37+
state.copy(route = MainRoute.CollectionViewExample)
38+
})
39+
}
2740
}
2841

2942
override fun on(newState: MainState) {

app/src/main/java/com/github/skyfe79/android/library/app/component/LoadingComponent.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import android.view.View
88
import android.view.ViewGroup
99
import com.github.skyfe79.android.library.app.MainState
1010
import com.github.skyfe79.android.reactcomponentkit.component.FragmentComponent
11-
import com.github.skyfe79.android.reactcomponentkit.component.LayoutComponent
12-
import com.github.skyfe79.android.reactcomponentkit.eventbus.Token
1311
import com.github.skyfe79.android.reactcomponentkit.redux.State
1412
import org.jetbrains.anko.*
1513
import org.jetbrains.anko.support.v4.UI

app/src/main/java/com/github/skyfe79/android/library/app/examples/collectionview/CollectionViewModel.kt

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,39 @@ package com.github.skyfe79.android.library.app.examples.collectionview
22

33
import android.app.Application
44
import com.github.skyfe79.android.library.app.examples.collectionview.action.LoadAction
5-
import com.github.skyfe79.android.library.app.examples.collectionview.postwares.makeSectionModels
65
import com.github.skyfe79.android.library.app.examples.collectionview.reducer.loadEmoji
6+
import com.github.skyfe79.android.library.app.examples.collectionview.reducer.makeSectionModels
77
import com.github.skyfe79.android.reactcomponentkit.collectionmodels.DefaultSectionModel
8-
import com.github.skyfe79.android.reactcomponentkit.redux.Action
9-
import com.github.skyfe79.android.reactcomponentkit.redux.Output
10-
import com.github.skyfe79.android.reactcomponentkit.redux.State
11-
import com.github.skyfe79.android.reactcomponentkit.redux.VoidAction
12-
import com.github.skyfe79.android.reactcomponentkit.viewmodel.RootAndroidViewModelType
8+
import com.github.skyfe79.android.reactcomponentkit.redux.*
9+
import com.github.skyfe79.android.reactcomponentkit.viewmodel.RCKViewModel
1310

1411

1512
data class CollectionState(
1613
var emojis: List<List<String>> = emptyList(),
1714
var sections: List<DefaultSectionModel> = emptyList()
18-
): State()
15+
): State() {
16+
17+
override fun copyState(): CollectionState {
18+
return this.copy()
19+
}
20+
}
1921

2022

2123

22-
class CollectionViewModel(application: Application): RootAndroidViewModelType<CollectionState>(application) {
24+
class CollectionViewModel(application: Application): RCKViewModel<CollectionState>(application) {
2325

2426
val sections: Output<List<DefaultSectionModel>> = Output(emptyList())
2527

2628
override fun setupStore() {
27-
store.set(
28-
initialState = CollectionState(),
29-
reducers = arrayOf(::loadEmoji),
30-
postwares = arrayOf(::makeSectionModels)
31-
)
32-
}
33-
34-
override fun beforeDispatch(action: Action): Action = when(action) {
35-
is LoadAction -> {
36-
if (store.state.emojis.isNotEmpty()) VoidAction else action
29+
initStore { store ->
30+
store.initialState(CollectionState())
31+
store.flow<LoadAction>(
32+
::loadEmoji,
33+
{ state, _ ->
34+
makeSectionModels(state)
35+
}
36+
)
3737
}
38-
else -> action
3938
}
4039

4140
override fun on(newState: CollectionState) {

app/src/main/java/com/github/skyfe79/android/library/app/examples/collectionview/postwares/Postwares.kt

Lines changed: 0 additions & 53 deletions
This file was deleted.
Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,58 @@
11
package com.github.skyfe79.android.library.app.examples.collectionview.reducer
22

3+
import androidx.recyclerview.widget.GridLayoutManager
4+
import androidx.recyclerview.widget.LinearLayoutManager
5+
import androidx.recyclerview.widget.LinearSnapHelper
6+
import androidx.recyclerview.widget.StaggeredGridLayoutManager
37
import com.github.skyfe79.android.library.app.examples.collectionview.CollectionState
48
import com.github.skyfe79.android.library.app.examples.collectionview.CollectionViewModel
59
import com.github.skyfe79.android.library.app.examples.collectionview.action.LoadAction
10+
import com.github.skyfe79.android.library.app.examples.emojicollection.models.EmojiBoxModel
611
import com.github.skyfe79.android.library.app.examples.emojicollection.util.EmojiHelper
12+
import com.github.skyfe79.android.library.app.examples.recyclerview.model.TextMessage
13+
import com.github.skyfe79.android.reactcomponentkit.collectionmodels.DefaultSectionModel
714
import com.github.skyfe79.android.reactcomponentkit.redux.Action
815
import com.github.skyfe79.android.reactcomponentkit.redux.State
916
import io.reactivex.Observable
1017

11-
fun CollectionViewModel.loadEmoji(state: State, action: Action): Observable<State> {
12-
val collectionState = (state as? CollectionState) ?: return Observable.just(state)
18+
fun CollectionViewModel.loadEmoji(state: CollectionState, action: LoadAction): CollectionState {
19+
val emojiCollection = (1..5)
20+
.map {
21+
(1..(40..80).random()).map { EmojiHelper.emoji }
22+
}
23+
return state.copy(emojis = emojiCollection)
24+
}
25+
26+
fun CollectionViewModel.makeSectionModels(state: CollectionState): CollectionState {
27+
val colors = listOf(
28+
0xffd01774.toInt(),
29+
0xfff7f93c.toInt(),
30+
0xfff07777.toInt(),
31+
0xfffcce62.toInt(),
32+
0xff58c8d8.toInt()
33+
)
34+
35+
val sectionModels = state.emojis.mapIndexed { index, list ->
36+
val emojiBoxModels = list.map { EmojiBoxModel(it) }
37+
DefaultSectionModel(
38+
emojiBoxModels,
39+
header = TextMessage("Section Header #$index", colors[index], true),
40+
footer = TextMessage("Section Footer #$index", colors[index], false)
41+
)
42+
{ recyclerView ->
43+
recyclerView.layoutManager = when(index) {
44+
0 -> GridLayoutManager(getApplication(), 8)
45+
1 -> GridLayoutManager(getApplication(), 4)
46+
2 -> StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
47+
3 -> GridLayoutManager(getApplication(), 3)
48+
else -> LinearLayoutManager(getApplication(), LinearLayoutManager.HORIZONTAL, false)
49+
}
1350

14-
return when (action) {
15-
is LoadAction -> {
16-
val emojiCollection = (1..5)
17-
.map {
18-
(1..(40..80).random()).map { EmojiHelper.emoji }
19-
}
20-
Observable.just(collectionState.copy(emojis = emojiCollection))
51+
if (index == 4) {
52+
val snapHelper = LinearSnapHelper()
53+
snapHelper.attachToRecyclerView(recyclerView)
54+
}
2155
}
22-
else -> Observable.just(state)
2356
}
57+
return state.copy(sections = sectionModels)
2458
}

app/src/main/java/com/github/skyfe79/android/library/app/examples/counter/CounterActivity.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,26 @@ package com.github.skyfe79.android.library.app.examples.counter
33
import androidx.lifecycle.ViewModelProviders
44
import android.os.Bundle
55
import androidx.appcompat.app.AppCompatActivity
6+
import com.github.skyfe79.android.reactcomponentkit.rx.AutoDisposeBag
7+
import com.github.skyfe79.android.reactcomponentkit.rx.disposedBy
68
import org.jetbrains.anko.setContentView
79

810
class CounterActivity: AppCompatActivity() {
11+
private val disposeBag: AutoDisposeBag by lazy {
12+
AutoDisposeBag(this)
13+
}
14+
915
private lateinit var viewModel: CounterViewModel
1016
private val layout: CounterLayout by lazy {
11-
CounterLayout(viewModel.token, true)
17+
CounterLayout(viewModel.token)
1218
}
1319

1420
override fun onCreate(savedInstanceState: Bundle?) {
1521
super.onCreate(savedInstanceState)
1622

1723
viewModel = ViewModelProviders.of(this).get(CounterViewModel::class.java)
1824
layout.setContentView(this)
25+
1926
layout.countTextView.text = "${viewModel.count.value}"
2027
}
2128
}

app/src/main/java/com/github/skyfe79/android/library/app/examples/counter/CounterLayout.kt

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,20 @@ import android.view.Gravity
44
import android.view.View
55
import android.widget.Button
66
import android.widget.LinearLayout
7+
import android.widget.ProgressBar
78
import android.widget.TextView
9+
import com.github.skyfe79.android.library.app.examples.counter.action.AsyncIncreaseAction
810
import com.github.skyfe79.android.library.app.examples.counter.action.DecreaseAction
911
import com.github.skyfe79.android.library.app.examples.counter.action.IncreaseAction
1012
import com.github.skyfe79.android.reactcomponentkit.component.LayoutComponent
11-
import com.github.skyfe79.android.reactcomponentkit.eventbus.Token
13+
import com.github.skyfe79.android.reactcomponentkit.dispatcher.dispatch
14+
import com.github.skyfe79.android.reactcomponentkit.viewmodel.Token
15+
import com.github.skyfe79.android.reactcomponentkit.redux.Async
1216
import com.github.skyfe79.android.reactcomponentkit.redux.State
17+
import com.github.skyfe79.android.reactcomponentkit.subscriber.subscribeState
1318
import org.jetbrains.anko.*
14-
import org.jetbrains.anko.sdk27.coroutines.onClick
1519

16-
class CounterLayout(token: Token, receiveState: Boolean): LayoutComponent<CounterActivity>(token, receiveState) {
20+
class CounterLayout(token: Token): LayoutComponent<CounterActivity>(token) {
1721

1822
private enum class IDs {
1923
TextView
@@ -22,6 +26,12 @@ class CounterLayout(token: Token, receiveState: Boolean): LayoutComponent<Counte
2226
lateinit var countTextView: TextView
2327
private lateinit var increaseButton: Button
2428
private lateinit var decreaseButton: Button
29+
private lateinit var asyncIncreaseButton: Button
30+
private lateinit var progress: ProgressBar
31+
32+
override fun onInit() {
33+
subscribeState()
34+
}
2535

2636
override fun createView(ui: AnkoContext<CounterActivity>): View = with(ui) {
2737
val view = relativeLayout {
@@ -33,13 +43,18 @@ class CounterLayout(token: Token, receiveState: Boolean): LayoutComponent<Counte
3343
centerInParent()
3444
}
3545

46+
progress = progressBar().lparams {
47+
centerInParent()
48+
}
49+
progress.visibility = View.GONE
50+
3651
linearLayout {
3752
orientation = LinearLayout.HORIZONTAL
3853
gravity = Gravity.CENTER
3954

4055
decreaseButton = button(" - ").lparams(width = 0, weight = 1f)
4156
increaseButton = button(" + ").lparams(width = 0, weight = 1f)
42-
57+
asyncIncreaseButton = button("async +").lparams(width = 0, weight = 1f)
4358
}.applyRecursively {
4459
when(it) {
4560
is Button -> it.textSize = 20f
@@ -53,11 +68,15 @@ class CounterLayout(token: Token, receiveState: Boolean): LayoutComponent<Counte
5368
}
5469

5570

56-
increaseButton.onClick {
71+
asyncIncreaseButton.setOnClickListener {
72+
dispatch(AsyncIncreaseAction())
73+
}
74+
75+
increaseButton.setOnClickListener {
5776
dispatch(IncreaseAction())
5877
}
5978

60-
decreaseButton.onClick {
79+
decreaseButton.setOnClickListener {
6180
dispatch(DecreaseAction())
6281
}
6382

@@ -67,5 +86,15 @@ class CounterLayout(token: Token, receiveState: Boolean): LayoutComponent<Counte
6786
override fun on(state: State) {
6887
val countState = (state as? CounterState) ?: return
6988
countTextView.text = "${countState.count}"
89+
90+
when (state.asyncCount) {
91+
is Async.Loading -> {
92+
progress.visibility = View.VISIBLE
93+
progress.animate()
94+
}
95+
is Async.Success -> {
96+
progress.visibility = View.GONE
97+
}
98+
}
7099
}
71100
}

0 commit comments

Comments
 (0)