From c0981174a8ad7ba2f0819154293b2a47bcfaeda4 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 29 May 2022 03:57:32 -0700 Subject: [PATCH] Use LiveData instead of Observable --- .../com/topjohnwu/magisk/arch/BaseFragment.kt | 2 +- .../topjohnwu/magisk/arch/BaseViewModel.kt | 19 ------------------- .../com/topjohnwu/magisk/arch/UIActivity.kt | 2 +- .../topjohnwu/magisk/arch/ViewModelHolder.kt | 6 +++++- .../java/com/topjohnwu/magisk/core/Info.kt | 9 +++++---- .../magisk/ui/module/ModuleViewModel.kt | 2 +- 6 files changed, 13 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/arch/BaseFragment.kt b/app/src/main/java/com/topjohnwu/magisk/arch/BaseFragment.kt index 3e8150d5d..227dee6f6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/arch/BaseFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/arch/BaseFragment.kt @@ -24,7 +24,7 @@ abstract class BaseFragment : Fragment(), ViewModelHo override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - startObserveEvents() + startObserveLiveData() } override fun onCreateView( diff --git a/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt index 0f28275f1..35cf3cc67 100644 --- a/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt @@ -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 get() = _viewEvents var state= initialState @@ -49,15 +45,6 @@ abstract class BaseViewModel( private val _viewEvents = MutableLiveData() 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() } diff --git a/app/src/main/java/com/topjohnwu/magisk/arch/UIActivity.kt b/app/src/main/java/com/topjohnwu/magisk/arch/UIActivity.kt index b3a8ef23e..c011e5ef9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/arch/UIActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/arch/UIActivity.kt @@ -36,7 +36,7 @@ abstract class UIActivity : BaseActivity(), ViewModel super.onCreate(savedInstanceState) - startObserveEvents() + startObserveLiveData() // We need to set the window background explicitly since for whatever reason it's not // propagated upstream diff --git a/app/src/main/java/com/topjohnwu/magisk/arch/ViewModelHolder.kt b/app/src/main/java/com/topjohnwu/magisk/arch/ViewModelHolder.kt index 9d5b08037..d660e109b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/arch/ViewModelHolder.kt +++ b/app/src/main/java/com/topjohnwu/magisk/arch/ViewModelHolder.kt @@ -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() + } } /** diff --git a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt index d9bd771c5..ed392f2fc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt @@ -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 by lazy { + MutableLiveData(false).also { field -> NetworkObserver.observe(AppContext) { - UiThreadHandler.run { field.set(it) } + UiThreadHandler.run { field.value = it } } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index 5e687fe96..bc7f64592 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -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()