mirror of
https://github.com/element-hq/element-android
synced 2024-11-25 19:05:39 +03:00
Mavericks 2: clean after PR review
This commit is contained in:
parent
bde129ddce
commit
a26e43e90c
11 changed files with 30 additions and 20 deletions
1
changelog.d/3890.misc
Normal file
1
changelog.d/3890.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Migrate to MvRx2 (Mavericks)
|
11
docs/mavericks_migration.md
Normal file
11
docs/mavericks_migration.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Useful links:
|
||||||
|
- https://airbnb.io/mavericks/#/new-2x
|
||||||
|
|
||||||
|
Mavericks 2 is replacing MvRx, by removing usage of Rx by Flow, both internally and in the API.
|
||||||
|
See the link ^ to have more intel, but basically, the changes are:
|
||||||
|
|
||||||
|
session.rx() => session.flow()
|
||||||
|
room.rx() => room.flow()
|
||||||
|
subscribe { }.disposeOnClear() => onEach { }.launchIn(viewModelScope)
|
||||||
|
|
||||||
|
Only using manually onEach requires to add launchIn,any other methods provided by Mavericks on viewModel and activity/fragment are already taking care of lifecycle.
|
|
@ -22,11 +22,10 @@ import kotlinx.coroutines.flow.onStart
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
internal fun <T> Flow<T>.startWith(supplier: suspend () -> T): Flow<T> {
|
internal fun <T> Flow<T>.startWith(supplier: suspend () -> T): Flow<T> {
|
||||||
return this
|
return onStart {
|
||||||
.onStart {
|
val value = withContext(Dispatchers.IO) {
|
||||||
val value = withContext(Dispatchers.IO) {
|
supplier()
|
||||||
supplier()
|
}
|
||||||
}
|
emit(value)
|
||||||
emit(value)
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
|
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
|
||||||
import org.matrix.android.sdk.internal.crypto.store.PrivateKeysInfo
|
import org.matrix.android.sdk.internal.crypto.store.PrivateKeysInfo
|
||||||
|
|
||||||
class RxFlow(private val session: Session) {
|
class FlowSession(private val session: Session) {
|
||||||
|
|
||||||
fun liveRoomSummaries(queryParams: RoomSummaryQueryParams): Flow<List<RoomSummary>> {
|
fun liveRoomSummaries(queryParams: RoomSummaryQueryParams): Flow<List<RoomSummary>> {
|
||||||
return session.getRoomSummariesLive(queryParams).asFlow()
|
return session.getRoomSummariesLive(queryParams).asFlow()
|
||||||
|
@ -175,6 +175,6 @@ class RxFlow(private val session: Session) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Session.flow(): RxFlow {
|
fun Session.flow(): FlowSession {
|
||||||
return RxFlow(this)
|
return FlowSession(this)
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ import androidx.fragment.app.FragmentFactory
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import com.airbnb.mvrx.MvRxView
|
import com.airbnb.mvrx.MavericksView
|
||||||
import com.bumptech.glide.util.Util
|
import com.bumptech.glide.util.Util
|
||||||
import com.google.android.material.appbar.MaterialToolbar
|
import com.google.android.material.appbar.MaterialToolbar
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
@ -89,7 +89,7 @@ import timber.log.Timber
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.system.measureTimeMillis
|
import kotlin.system.measureTimeMillis
|
||||||
|
|
||||||
abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), HasScreenInjector, MvRxView {
|
abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), HasScreenInjector, MavericksView {
|
||||||
/* ==========================================================================================
|
/* ==========================================================================================
|
||||||
* View
|
* View
|
||||||
* ========================================================================================== */
|
* ========================================================================================== */
|
||||||
|
|
|
@ -30,7 +30,7 @@ import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import com.airbnb.mvrx.MvRxView
|
import com.airbnb.mvrx.MavericksView
|
||||||
import com.bumptech.glide.util.Util.assertMainThread
|
import com.bumptech.glide.util.Util.assertMainThread
|
||||||
import com.google.android.material.appbar.MaterialToolbar
|
import com.google.android.material.appbar.MaterialToolbar
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
@ -50,7 +50,7 @@ import io.reactivex.disposables.Disposable
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
abstract class VectorBaseFragment<VB : ViewBinding> : Fragment(), MvRxView, HasScreenInjector {
|
abstract class VectorBaseFragment<VB : ViewBinding> : Fragment(), MavericksView, HasScreenInjector {
|
||||||
|
|
||||||
protected val vectorBaseActivity: VectorBaseActivity<*> by lazy {
|
protected val vectorBaseActivity: VectorBaseActivity<*> by lazy {
|
||||||
activity as VectorBaseActivity<*>
|
activity as VectorBaseActivity<*>
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
package im.vector.app.features.crypto.quads
|
package im.vector.app.features.crypto.quads
|
||||||
|
|
||||||
import androidx.lifecycle.viewModelScope
|
|
||||||
import com.airbnb.mvrx.Async
|
import com.airbnb.mvrx.Async
|
||||||
import com.airbnb.mvrx.Fail
|
import com.airbnb.mvrx.Fail
|
||||||
import com.airbnb.mvrx.Loading
|
import com.airbnb.mvrx.Loading
|
||||||
|
|
|
@ -161,7 +161,7 @@ class HomeDetailFragment @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unknownDeviceDetectorSharedViewModel.subscribe { state ->
|
unknownDeviceDetectorSharedViewModel.onEach { state ->
|
||||||
state.unknownSessions.invoke()?.let { unknownDevices ->
|
state.unknownSessions.invoke()?.let { unknownDevices ->
|
||||||
// Timber.v("## Detector Triggerred in fragment - ${unknownDevices.firstOrNull()}")
|
// Timber.v("## Detector Triggerred in fragment - ${unknownDevices.firstOrNull()}")
|
||||||
if (unknownDevices.firstOrNull()?.currentSessionTrust == true) {
|
if (unknownDevices.firstOrNull()?.currentSessionTrust == true) {
|
||||||
|
@ -179,7 +179,7 @@ class HomeDetailFragment @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unreadMessagesSharedViewModel.subscribe { state ->
|
unreadMessagesSharedViewModel.onEach { state ->
|
||||||
views.drawerUnreadCounterBadgeView.render(
|
views.drawerUnreadCounterBadgeView.render(
|
||||||
UnreadCounterBadgeView.State(
|
UnreadCounterBadgeView.State(
|
||||||
count = state.otherSpacesUnread.totalCount,
|
count = state.otherSpacesUnread.totalCount,
|
||||||
|
|
|
@ -72,7 +72,7 @@ class AccountCreatedFragment @Inject constructor(
|
||||||
setupSubmitButton()
|
setupSubmitButton()
|
||||||
observeViewEvents()
|
observeViewEvents()
|
||||||
|
|
||||||
viewModel.subscribe { invalidateState(it) }
|
viewModel.onEach { invalidateState(it) }
|
||||||
|
|
||||||
views.loginAccountCreatedTime.text = dateFormatter.format(System.currentTimeMillis(), DateFormatKind.MESSAGE_SIMPLE)
|
views.loginAccountCreatedTime.text = dateFormatter.format(System.currentTimeMillis(), DateFormatKind.MESSAGE_SIMPLE)
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor(
|
||||||
sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates))
|
sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates))
|
||||||
}
|
}
|
||||||
|
|
||||||
sharedViewModel.subscribe { state ->
|
sharedViewModel.onEach { state ->
|
||||||
views.accessInfoHelpText.text = stringProvider.getString(R.string.create_spaces_make_sure_access, state.name ?: "")
|
views.accessInfoHelpText.text = stringProvider.getString(R.string.create_spaces_make_sure_access, state.name ?: "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,7 +81,7 @@ class UserListFragment @Inject constructor(
|
||||||
setupRecyclerView()
|
setupRecyclerView()
|
||||||
setupSearchView()
|
setupSearchView()
|
||||||
|
|
||||||
homeServerCapabilitiesViewModel.subscribe {
|
homeServerCapabilitiesViewModel.onEach {
|
||||||
views.userListE2EbyDefaultDisabled.isVisible = !it.isE2EByDefault
|
views.userListE2EbyDefaultDisabled.isVisible = !it.isE2EByDefault
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue