diff --git a/app/src/main/java/com/topjohnwu/magisk/arch/BaseUIActivity.kt b/app/src/main/java/com/topjohnwu/magisk/arch/BaseUIActivity.kt index f7a84a279..ffedfe4c3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/arch/BaseUIActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/arch/BaseUIActivity.kt @@ -10,7 +10,6 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.res.use import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding -import androidx.lifecycle.MutableLiveData import androidx.navigation.NavController import androidx.navigation.NavDirections import androidx.navigation.fragment.NavHostFragment @@ -28,7 +27,7 @@ abstract class BaseUIActivity : protected open val themeRes: Int = Theme.selected.themeRes private val navHostFragment by lazy { - supportFragmentManager.findFragmentById(navHost) as? NavHostFragment + supportFragmentManager.findFragmentById(navHostId) as? NavHostFragment } private val topFragment get() = navHostFragment?.childFragmentManager?.fragments?.getOrNull(0) protected val currentFragment get() = topFragment as? BaseUIFragment<*, *> @@ -36,7 +35,7 @@ abstract class BaseUIActivity : override val viewRoot: View get() = binding.root open val navigation: NavController? get() = navHostFragment?.navController - open val navHost: Int = 0 + open val navHostId: Int = 0 open val snackbarView get() = binding.root init { @@ -58,14 +57,6 @@ abstract class BaseUIActivity : .use { it.getDrawable(0) } .also { window.setBackgroundDrawable(it) } - directionsDispatcher.observe(this) { - it?.navigate() - // we don't want the directions to be re-dispatched, so we preemptively set them to null - if (it != null) { - directionsDispatcher.value = null - } - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window?.decorView?.let { it.systemUiVisibility = (it.systemUiVisibility @@ -127,14 +118,4 @@ abstract class BaseUIActivity : fun NavDirections.navigate() { navigation?.navigate(this) } - - companion object { - - private val directionsDispatcher = MutableLiveData() - - fun postDirections(navDirections: NavDirections) = - directionsDispatcher.postValue(navDirections) - - } - } 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 98f4fe809..c4841a282 100644 --- a/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt @@ -1,7 +1,6 @@ package com.topjohnwu.magisk.arch import android.Manifest -import android.os.Build import androidx.annotation.CallSuper import androidx.core.graphics.Insets import androidx.databinding.Bindable @@ -107,7 +106,7 @@ abstract class BaseViewModel( _viewEvents.postValue(this) } - fun NavDirections.publish() { + fun NavDirections.navigate() { _viewEvents.postValue(NavigationEvent(this)) } diff --git a/app/src/main/java/com/topjohnwu/magisk/core/download/DownloadService.kt b/app/src/main/java/com/topjohnwu/magisk/core/download/DownloadService.kt index 7f7b0755a..67eed6883 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/download/DownloadService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/download/DownloadService.kt @@ -7,6 +7,8 @@ import android.content.Context import android.content.Intent import android.os.Build import androidx.core.net.toFile +import com.topjohnwu.magisk.arch.BaseUIActivity +import com.topjohnwu.magisk.core.ForegroundTracker import com.topjohnwu.magisk.core.download.Action.Flash import com.topjohnwu.magisk.core.download.Subject.Manager import com.topjohnwu.magisk.core.download.Subject.Module @@ -26,7 +28,11 @@ open class DownloadService : BaseDownloader() { } private fun Module.onFinish(id: Int) = when (action) { - Flash -> FlashFragment.install(file, id) + Flash -> { + (ForegroundTracker.foreground as? BaseUIActivity<*, *>) + ?.navigation?.navigate(FlashFragment.install(file, id)) + Unit + } else -> Unit } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt index b54b132ea..c8a5219c3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt @@ -34,7 +34,7 @@ open class MainActivity : BaseUIActivity( override val layoutRes = R.layout.activity_main_md2 override val viewModel by viewModel() - override val navHost: Int = R.id.main_nav_host + override val navHostId: Int = R.id.main_nav_host private var isRootFragment = true @@ -166,9 +166,9 @@ open class MainActivity : BaseUIActivity( private fun getScreen(name: String?): NavDirections? { return when (name) { - Const.Nav.SUPERUSER -> HomeFragmentDirections.actionSuperuserFragment() - Const.Nav.HIDE -> HomeFragmentDirections.actionHideFragment() - Const.Nav.MODULES -> HomeFragmentDirections.actionModuleFragment() + Const.Nav.SUPERUSER -> MainDirections.actionSuperuserFragment() + Const.Nav.HIDE -> MainDirections.actionHideFragment() + Const.Nav.MODULES -> MainDirections.actionModuleFragment() Const.Nav.SETTINGS -> HomeFragmentDirections.actionHomeFragmentToSettingsFragment() else -> null } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt index 331b0045d..826a309e4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt @@ -7,8 +7,8 @@ import android.net.Uri import android.os.Bundle import android.view.* import androidx.navigation.NavDeepLinkBuilder +import com.topjohnwu.magisk.MainDirections import com.topjohnwu.magisk.R -import com.topjohnwu.magisk.arch.BaseUIActivity import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.cmp @@ -16,7 +16,6 @@ import com.topjohnwu.magisk.databinding.FragmentFlashMd2Binding import com.topjohnwu.magisk.ui.MainActivity import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf -import com.topjohnwu.magisk.MainDirections.Companion.actionFlashFragment as toFlash class FlashFragment : BaseUIFragment() { @@ -91,22 +90,22 @@ class FlashFragment : BaseUIFragment() /* Flashing is understood as installing / flashing magisk itself */ - fun flash(isSecondSlot: Boolean) = toFlash( + fun flash(isSecondSlot: Boolean) = MainDirections.actionFlashFragment( action = flashType(isSecondSlot) - ).let { BaseUIActivity.postDirections(it) } + ) /* Patching is understood as injecting img files with magisk */ - fun patch(uri: Uri) = toFlash( + fun patch(uri: Uri) = MainDirections.actionFlashFragment( action = Const.Value.PATCH_FILE, additionalData = uri - ).let { BaseUIActivity.postDirections(it) } + ) /* Uninstalling is understood as removing magisk entirely */ - fun uninstall() = toFlash( + fun uninstall() = MainDirections.actionFlashFragment( action = Const.Value.UNINSTALL - ).let { BaseUIActivity.postDirections(it) } + ) /* Installing is understood as flashing modules / zips */ @@ -116,11 +115,11 @@ class FlashFragment : BaseUIFragment() dismissId = id ).let { createIntent(context, it) } - fun install(file: Uri, id: Int) = toFlash( + fun install(file: Uri, id: Int) = MainDirections.actionFlashFragment( action = Const.Value.FLASH_ZIP, additionalData = file, dismissId = id - ).let { BaseUIActivity.postDirections(it) } + ) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index 8808ccc97..e01005f65 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -127,11 +127,11 @@ class HomeViewModel( } fun onMagiskPressed() = withExternalRW { - HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish() + HomeFragmentDirections.actionHomeFragmentToInstallFragment().navigate() } fun onSafetyNetPressed() = - HomeFragmentDirections.actionHomeFragmentToSafetynetFragment().publish() + HomeFragmentDirections.actionHomeFragmentToSafetynetFragment().navigate() fun hideNotice() { Config.safetyNotice = false diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt index 8a830b37a..0902491bb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt @@ -89,9 +89,9 @@ class InstallViewModel( fun install() { when (method) { - R.id.method_patch -> FlashFragment.patch(data!!) - R.id.method_direct -> FlashFragment.flash(false) - R.id.method_inactive_slot -> FlashFragment.flash(true) + R.id.method_patch -> FlashFragment.patch(data!!).navigate() + R.id.method_direct -> FlashFragment.flash(false).navigate() + R.id.method_inactive_slot -> FlashFragment.flash(true).navigate() else -> error("Unknown value") } state = State.LOADING diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt index 805aa405f..240ad4343 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt @@ -103,7 +103,7 @@ class SettingsViewModel( override fun onItemPressed(view: View, item: BaseSettingsItem, callback: () -> Unit) = when (item) { is DownloadPath -> withExternalRW(callback) is Biometrics -> authenticate(callback) - is Theme -> SettingsFragmentDirections.actionSettingsFragmentToThemeFragment().publish() + is Theme -> SettingsFragmentDirections.actionSettingsFragmentToThemeFragment().navigate() is ClearRepoCache -> clearRepoCache() is SystemlessHosts -> createHosts() is Restore -> HideAPK.restore(view.activity) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt index 23b1c5794..e2ad4a764 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt @@ -80,7 +80,7 @@ class SuperuserViewModel( } private fun hidePressed() = - SuperuserFragmentDirections.actionSuperuserFragmentToHideFragment().publish() + SuperuserFragmentDirections.actionSuperuserFragmentToHideFragment().navigate() fun deletePressed(item: PolicyRvItem) { fun updateState() = viewModelScope.launch { diff --git a/app/src/main/res/navigation/main.xml b/app/src/main/res/navigation/main.xml index fa507c1e7..7e023e837 100644 --- a/app/src/main/res/navigation/main.xml +++ b/app/src/main/res/navigation/main.xml @@ -145,8 +145,7 @@ app:exitAnim="@anim/fragment_exit" app:popEnterAnim="@anim/fragment_enter_pop" app:popExitAnim="@anim/fragment_exit_pop" - app:popUpTo="@id/superuserFragment" - app:popUpToInclusive="true" /> + app:popUpTo="@id/homeFragment" /> + app:popUpTo="@id/homeFragment" /> + app:popUpTo="@id/homeFragment" /> + app:popUpTo="@id/homeFragment" /> + app:popExitAnim="@anim/fragment_exit_pop" />