Use LiveData instead of Observable

This commit is contained in:
topjohnwu 2022-05-29 03:57:32 -07:00
parent 0b5f973b31
commit c0981174a8
6 changed files with 13 additions and 27 deletions

View File

@ -24,7 +24,7 @@ abstract class BaseFragment<Binding : ViewDataBinding> : Fragment(), ViewModelHo
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
startObserveEvents()
startObserveLiveData()
}
override fun onCreateView(

View File

@ -4,9 +4,7 @@ import android.Manifest.permission.REQUEST_INSTALL_PACKAGES
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.annotation.CallSuper
import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.databinding.PropertyChangeRegistry
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
@ -15,7 +13,6 @@ import androidx.lifecycle.viewModelScope
import androidx.navigation.NavDirections
import com.topjohnwu.magisk.BR
import com.topjohnwu.magisk.R
import com.topjohnwu.magisk.core.Info
import com.topjohnwu.magisk.databinding.ObservableHost
import com.topjohnwu.magisk.databinding.set
import com.topjohnwu.magisk.events.BackPressEvent
@ -41,7 +38,6 @@ abstract class BaseViewModel(
@get:Bindable
val loadFailed get() = state == State.LOADING_FAILED
val isConnected get() = Info.isConnected
val viewEvents: LiveData<ViewEvent> get() = _viewEvents
var state= initialState
@ -49,15 +45,6 @@ abstract class BaseViewModel(
private val _viewEvents = MutableLiveData<ViewEvent>()
private var runningJob: Job? = null
private val refreshCallback = object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
requestRefresh()
}
}
init {
isConnected.addOnPropertyChangedCallback(refreshCallback)
}
open fun onSaveState(state: Bundle) {}
open fun onRestoreState(state: Bundle) {}
@ -73,12 +60,6 @@ abstract class BaseViewModel(
protected open fun refresh(): Job? = null
@CallSuper
override fun onCleared() {
isConnected.removeOnPropertyChangedCallback(refreshCallback)
super.onCleared()
}
fun withPermission(permission: String, callback: (Boolean) -> Unit) {
PermissionEvent(permission, callback).publish()
}

View File

@ -36,7 +36,7 @@ abstract class UIActivity<Binding : ViewDataBinding> : BaseActivity(), ViewModel
super.onCreate(savedInstanceState)
startObserveEvents()
startObserveLiveData()
// We need to set the window background explicitly since for whatever reason it's not
// propagated upstream

View File

@ -4,6 +4,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStoreOwner
import com.topjohnwu.magisk.core.Info
import com.topjohnwu.magisk.core.di.ServiceLocator
import com.topjohnwu.magisk.ui.home.HomeViewModel
import com.topjohnwu.magisk.ui.install.InstallViewModel
@ -15,10 +16,13 @@ interface ViewModelHolder : LifecycleOwner, ViewModelStoreOwner {
val viewModel: BaseViewModel
fun startObserveEvents() {
fun startObserveLiveData() {
viewModel.viewEvents.observe(this) {
onEventDispatched(it)
}
Info.isConnected.observe(this) {
viewModel.requestRefresh()
}
}
/**

View File

@ -1,7 +1,8 @@
package com.topjohnwu.magisk.core
import android.os.Build
import androidx.databinding.ObservableBoolean
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.topjohnwu.magisk.StubApk
import com.topjohnwu.magisk.core.di.AppContext
import com.topjohnwu.magisk.core.model.UpdateInfo
@ -43,10 +44,10 @@ object Info {
getProperty("ro.kernel.qemu", "0") == "1" ||
getProperty("ro.boot.qemu", "0") == "1"
val isConnected by lazy {
ObservableBoolean(false).also { field ->
val isConnected: LiveData<Boolean> by lazy {
MutableLiveData(false).also { field ->
NetworkObserver.observe(AppContext) {
UiThreadHandler.run { field.set(it) }
UiThreadHandler.run { field.value = it }
}
}
}

View File

@ -70,7 +70,7 @@ class ModuleViewModel : BaseViewModel() {
}
fun downloadPressed(item: OnlineModule?) =
if (item != null && isConnected.get()) {
if (item != null && Info.isConnected.value == true) {
withExternalRW { ModuleInstallDialog(item).publish() }
} else {
SnackbarEvent(R.string.no_connection).publish()