Skip to content

Commit 25bf865

Browse files
authored
remove rx1 from message thread holder/viewmodel (#2111)
1 parent 3edb866 commit 25bf865

File tree

3 files changed

+70
-54
lines changed

3 files changed

+70
-54
lines changed

app/src/main/java/com/kickstarter/ui/viewholders/MessageThreadViewHolder.kt

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,27 @@ package com.kickstarter.ui.viewholders
22

33
import android.content.Intent
44
import android.graphics.Typeface
5+
import android.view.View
56
import android.widget.TextView
6-
import com.jakewharton.rxbinding.view.RxView
77
import com.kickstarter.R
88
import com.kickstarter.databinding.MessageThreadViewBinding
99
import com.kickstarter.libs.MessagePreviousScreenType
1010
import com.kickstarter.libs.rx.transformers.Transformers
1111
import com.kickstarter.libs.utils.DateTimeUtils
12-
import com.kickstarter.libs.utils.ViewUtils
12+
import com.kickstarter.libs.utils.extensions.addToDisposable
1313
import com.kickstarter.libs.utils.extensions.wrapInParentheses
1414
import com.kickstarter.models.MessageThread
1515
import com.kickstarter.ui.IntentKey
1616
import com.kickstarter.ui.activities.MessagesActivity
1717
import com.kickstarter.ui.extensions.loadCircleImage
1818
import com.kickstarter.viewmodels.MessageThreadHolderViewModel
19+
import io.reactivex.disposables.CompositeDisposable
1920
import org.joda.time.DateTime
2021

2122
class MessageThreadViewHolder(private val binding: MessageThreadViewBinding) : KSViewHolder(binding.root) {
2223
private val viewModel = MessageThreadHolderViewModel.ViewModel(environment())
2324
private val ksString = requireNotNull(environment().ksString())
25+
private val disposables = CompositeDisposable()
2426

2527
@Throws(Exception::class)
2628
override fun bindData(data: Any?) {
@@ -54,49 +56,53 @@ class MessageThreadViewHolder(private val binding: MessageThreadViewBinding) : K
5456
}
5557

5658
init {
57-
RxView.clicks(binding.messageThreadContainer)
58-
.compose(bindToLifecycle())
59-
.compose(Transformers.observeForUI())
60-
.subscribe { viewModel.inputs.messageThreadCardViewClicked() }
59+
binding.messageThreadContainer.setOnClickListener {
60+
viewModel.inputs.messageThreadCardViewClicked()
61+
}
6162
viewModel.outputs.dateDateTime()
62-
.compose(bindToLifecycle())
63-
.compose(Transformers.observeForUI())
63+
.compose(Transformers.observeForUIV2())
6464
.subscribe { setDateTextView(it) }
65+
.addToDisposable(disposables)
6566
viewModel.outputs.dateTextViewIsBold()
66-
.compose(bindToLifecycle())
67-
.compose(Transformers.observeForUI())
67+
.compose(Transformers.observeForUIV2())
6868
.subscribe { setTypeface(binding.messageThreadDateTextView, it) }
69+
.addToDisposable(disposables)
6970
viewModel.outputs.messageBodyTextViewText()
70-
.compose(bindToLifecycle())
71-
.compose(Transformers.observeForUI())
71+
.compose(Transformers.observeForUIV2())
7272
.subscribe { binding.messageThreadBodyTextView.text = it }
73+
.addToDisposable(disposables)
7374
viewModel.outputs.messageBodyTextIsBold()
74-
.compose(bindToLifecycle())
75-
.compose(Transformers.observeForUI())
75+
.compose(Transformers.observeForUIV2())
7676
.subscribe { setTypeface(binding.messageThreadBodyTextView, it) }
77+
.addToDisposable(disposables)
7778
viewModel.outputs.participantAvatarUrl()
78-
.compose(bindToLifecycle())
79-
.compose(Transformers.observeForUI())
79+
.compose(Transformers.observeForUIV2())
8080
.subscribe { setParticipantAvatarImageView(it) }
81+
.addToDisposable(disposables)
8182
viewModel.outputs.participantNameTextViewIsBold()
82-
.compose(bindToLifecycle())
83-
.compose(Transformers.observeForUI())
83+
.compose(Transformers.observeForUIV2())
8484
.subscribe { setTypeface(binding.participantNameTextView, it) }
85+
.addToDisposable(disposables)
8586
viewModel.outputs.participantNameTextViewText()
86-
.compose(bindToLifecycle())
87-
.compose(Transformers.observeForUI())
87+
.compose(Transformers.observeForUIV2())
8888
.subscribe { binding.participantNameTextView.text = it }
89+
.addToDisposable(disposables)
8990
viewModel.outputs.startMessagesActivity()
90-
.compose(bindToLifecycle())
91-
.compose(Transformers.observeForUI())
91+
.compose(Transformers.observeForUIV2())
9292
.subscribe { startMessagesActivity(it) }
93+
.addToDisposable(disposables)
9394
viewModel.outputs.unreadCountTextViewIsGone()
94-
.compose(bindToLifecycle())
95-
.compose(Transformers.observeForUI())
96-
.subscribe(ViewUtils.setGone(binding.messageThreadUnreadCountTextView))
95+
.compose(Transformers.observeForUIV2())
96+
.subscribe { binding.messageThreadUnreadCountTextView.visibility = View.GONE }
97+
.addToDisposable(disposables)
9798
viewModel.outputs.unreadCountTextViewText()
98-
.compose(bindToLifecycle())
99-
.compose(Transformers.observeForUI())
99+
.compose(Transformers.observeForUIV2())
100100
.subscribe { setUnreadCountTextView(it) }
101+
.addToDisposable(disposables)
102+
}
103+
104+
override fun destroy() {
105+
disposables.clear()
106+
super.destroy()
101107
}
102108
}

app/src/main/java/com/kickstarter/viewmodels/MessageThreadHolderViewModel.kt

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package com.kickstarter.viewmodels
22

33
import android.content.SharedPreferences
4-
import com.kickstarter.libs.ActivityViewModel
54
import com.kickstarter.libs.Environment
65
import com.kickstarter.libs.rx.transformers.Transformers
76
import com.kickstarter.libs.utils.NumberUtils
7+
import com.kickstarter.libs.utils.extensions.addToDisposable
88
import com.kickstarter.libs.utils.extensions.isNotNull
99
import com.kickstarter.libs.utils.extensions.negate
1010
import com.kickstarter.models.MessageThread
1111
import com.kickstarter.ui.SharedPreferenceKey
12-
import com.kickstarter.ui.viewholders.MessageThreadViewHolder
12+
import io.reactivex.Observable
13+
import io.reactivex.disposables.CompositeDisposable
14+
import io.reactivex.subjects.PublishSubject
1315
import org.joda.time.DateTime
14-
import rx.Observable
15-
import rx.subjects.PublishSubject
1616

1717
interface MessageThreadHolderViewModel {
1818
interface Inputs {
@@ -58,12 +58,11 @@ interface MessageThreadHolderViewModel {
5858
fun unreadCountTextViewText(): Observable<String>
5959
}
6060

61-
class ViewModel(environment: Environment) :
62-
ActivityViewModel<MessageThreadViewHolder?>(environment), Inputs, Outputs {
61+
class ViewModel(val environment: Environment) : androidx.lifecycle.ViewModel(), Inputs, Outputs {
6362

6463
private val sharedPreferences: SharedPreferences?
65-
private val messageThread = PublishSubject.create<MessageThread?>()
66-
private val messageThreadCardViewClicked = PublishSubject.create<Void?>()
64+
private val messageThread = PublishSubject.create<MessageThread>()
65+
private val messageThreadCardViewClicked = PublishSubject.create<Unit>()
6766
private val cardViewIsElevated: Observable<Boolean>
6867
private val dateDateTime: Observable<DateTime>
6968
private val dateTextViewIsBold: Observable<Boolean>
@@ -78,19 +77,21 @@ interface MessageThreadHolderViewModel {
7877

7978
val inputs: Inputs = this
8079
val outputs: Outputs = this
80+
val disposables = CompositeDisposable()
8181

8282
init {
8383
sharedPreferences = requireNotNull(environment.sharedPreferences())
8484

8585
// Store the correct initial hasUnreadMessages value.
8686
messageThread
87-
.compose(Transformers.observeForUI())
87+
.compose(Transformers.observeForUIV2())
88+
.filter { it.isNotNull() }
8889
.subscribe { thread: MessageThread ->
8990
setHasUnreadMessagesPreference(
9091
thread,
9192
sharedPreferences
9293
)
93-
}
94+
}.addToDisposable(disposables)
9495

9596
val hasUnreadMessages = Observable.merge(
9697
messageThread.map { thread: MessageThread ->
@@ -104,11 +105,11 @@ interface MessageThreadHolderViewModel {
104105

105106
val lastMessage = messageThread.map { it.lastMessage() }
106107
.filter { it.isNotNull() }
107-
.map { requireNotNull(it) }
108+
.map { it }
108109

109110
val participant = messageThread.map { it.participant() }
110111
.filter { it.isNotNull() }
111-
.map { requireNotNull(it) }
112+
.map { it }
112113

113114
cardViewIsElevated = hasUnreadMessages
114115

@@ -127,7 +128,7 @@ interface MessageThreadHolderViewModel {
127128
participantNameTextViewText = participant.map { it.name() }
128129

129130
startMessagesActivity = messageThread.compose(
130-
Transformers.takeWhen(
131+
Transformers.takeWhenV2(
131132
messageThreadCardViewClicked
132133
)
133134
)
@@ -142,16 +143,17 @@ interface MessageThreadHolderViewModel {
142143
}
143144

144145
messageThread
145-
.compose(Transformers.takeWhen(messageThreadCardViewClicked))
146+
.compose(Transformers.takeWhenV2(messageThreadCardViewClicked))
146147
.subscribe { markedAsRead(it, sharedPreferences) }
148+
.addToDisposable(disposables)
147149
}
148150

149151
override fun configureWith(messageThread: MessageThread) {
150152
this.messageThread.onNext(messageThread)
151153
}
152154

153155
override fun messageThreadCardViewClicked() {
154-
messageThreadCardViewClicked.onNext(null)
156+
messageThreadCardViewClicked.onNext(Unit)
155157
}
156158

157159
override fun cardViewIsElevated(): Observable<Boolean> = cardViewIsElevated
@@ -209,5 +211,10 @@ interface MessageThreadHolderViewModel {
209211
editor.apply()
210212
}
211213
}
214+
215+
override fun onCleared() {
216+
disposables.clear()
217+
super.onCleared()
218+
}
212219
}
213220
}

app/src/test/java/com/kickstarter/viewmodels/MessageThreadHolderViewModelTest.kt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package com.kickstarter.viewmodels
33
import com.kickstarter.KSRobolectricTestCase
44
import com.kickstarter.libs.Environment
55
import com.kickstarter.libs.utils.NumberUtils
6+
import com.kickstarter.libs.utils.extensions.addToDisposable
67
import com.kickstarter.mock.factories.MessageThreadFactory.messageThread
78
import com.kickstarter.models.MessageThread
9+
import io.reactivex.disposables.CompositeDisposable
10+
import io.reactivex.subscribers.TestSubscriber
811
import org.joda.time.DateTime
912
import org.junit.Test
10-
import rx.observers.TestSubscriber
1113

1214
class MessageThreadHolderViewModelTest : KSRobolectricTestCase() {
1315

@@ -24,20 +26,21 @@ class MessageThreadHolderViewModelTest : KSRobolectricTestCase() {
2426
private val startMessagesActivity = TestSubscriber<MessageThread>()
2527
private val unreadCountTextViewIsGone = TestSubscriber<Boolean>()
2628
private val unreadCountTextViewText = TestSubscriber<String>()
29+
private val disposables = CompositeDisposable()
2730

2831
private fun setUpEnvironment(env: Environment) {
2932
vm = MessageThreadHolderViewModel.ViewModel(env)
30-
vm.outputs.cardViewIsElevated().subscribe(cardViewIsElevated)
31-
vm.outputs.dateDateTime().subscribe(dateDateTime)
32-
vm.outputs.dateTextViewIsBold().subscribe(dateTextViewIsBold)
33-
vm.outputs.messageBodyTextIsBold().subscribe(messageBodyTextIsBold)
34-
vm.outputs.messageBodyTextViewText().subscribe(messageBodyTextViewText)
35-
vm.outputs.participantAvatarUrl().subscribe(participantAvatarUrl)
36-
vm.outputs.participantNameTextViewIsBold().subscribe(participantNameTextViewIsBold)
37-
vm.outputs.participantNameTextViewText().subscribe(participantNameTextViewText)
38-
vm.outputs.startMessagesActivity().subscribe(startMessagesActivity)
39-
vm.outputs.unreadCountTextViewIsGone().subscribe(unreadCountTextViewIsGone)
40-
vm.outputs.unreadCountTextViewText().subscribe(unreadCountTextViewText)
33+
vm.outputs.cardViewIsElevated().subscribe { cardViewIsElevated.onNext(it) }.addToDisposable(disposables)
34+
vm.outputs.dateDateTime().subscribe { dateDateTime.onNext(it) }.addToDisposable(disposables)
35+
vm.outputs.dateTextViewIsBold().subscribe { dateTextViewIsBold.onNext(it) }.addToDisposable(disposables)
36+
vm.outputs.messageBodyTextIsBold().subscribe { messageBodyTextIsBold.onNext(it) }.addToDisposable(disposables)
37+
vm.outputs.messageBodyTextViewText().subscribe { messageBodyTextViewText.onNext(it) }.addToDisposable(disposables)
38+
vm.outputs.participantAvatarUrl().subscribe { participantAvatarUrl.onNext(it) }.addToDisposable(disposables)
39+
vm.outputs.participantNameTextViewIsBold().subscribe { participantNameTextViewIsBold.onNext(it) }.addToDisposable(disposables)
40+
vm.outputs.participantNameTextViewText().subscribe { participantNameTextViewText.onNext(it) }.addToDisposable(disposables)
41+
vm.outputs.startMessagesActivity().subscribe { startMessagesActivity.onNext(it) }.addToDisposable(disposables)
42+
vm.outputs.unreadCountTextViewIsGone().subscribe { unreadCountTextViewIsGone.onNext(it) }.addToDisposable(disposables)
43+
vm.outputs.unreadCountTextViewText().subscribe { unreadCountTextViewText.onNext(it) }.addToDisposable(disposables)
4144
}
4245

4346
@Test

0 commit comments

Comments
 (0)