diff --git a/app/build.gradle b/app/build.gradle index f5c554bea..13374423e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,10 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' -apply plugin: 'kotlin-kapt' +plugins { + id("com.android.application") + id("kotlin-android") + id("kotlin-android-extensions") + id("kotlin-kapt") + id("androidx.navigation.safeargs.kotlin") +} kapt { correctErrorTypes = true @@ -22,7 +25,7 @@ android { javaCompileOptions { annotationProcessorOptions { - arguments = ["room.incremental":"true"] + arguments = ["room.incremental": "true"] } } } @@ -65,7 +68,6 @@ dependencies { implementation 'com.github.topjohnwu:jtar:1.0.0' implementation 'com.jakewharton.timber:timber:4.7.1' - implementation 'com.ncapdevi:frag-nav:3.2.0' implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.6' implementation 'io.reactivex.rxjava2:rxjava:2.2.18' @@ -116,7 +118,6 @@ dependencies { implementation "androidx.room:room-rxjava2:${vRoom}" kapt "androidx.room:room-compiler:${vRoom}" - def vNav = '2.2.1' implementation "androidx.navigation:navigation-fragment-ktx:${vNav}" implementation "androidx.navigation:navigation-ui-ktx:${vNav}" diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt index 122c0260a..9d731e08b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/flash/FlashActivity.kt @@ -6,6 +6,7 @@ import android.content.pm.ActivityInfo import android.net.Uri import android.os.Bundle import androidx.core.net.toUri +import androidx.navigation.NavController import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.intent @@ -16,7 +17,6 @@ import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.ui.base.BaseUIActivity -import com.topjohnwu.magisk.ui.base.CompatNavigationDelegate import org.koin.androidx.viewmodel.ext.android.viewModel import java.io.File @@ -25,8 +25,7 @@ open class FlashActivity : BaseUIActivity( override val layoutRes: Int = R.layout.activity_flash override val viewModel: FlashViewModel by viewModel() - override val navigation: CompatNavigationDelegate>? = - null + override val navigation: NavController? = null override fun onCreate(savedInstanceState: Bundle?) { requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR diff --git a/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt index edb04f82c..061dc28de 100644 --- a/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/legacy/surequest/SuRequestActivity.kt @@ -7,6 +7,7 @@ import android.os.Build import android.os.Bundle import android.view.Window import android.view.WindowManager +import androidx.navigation.NavController import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.su.SuCallbackHandler import com.topjohnwu.magisk.core.su.SuCallbackHandler.REQUEST @@ -15,7 +16,6 @@ import com.topjohnwu.magisk.model.events.DieEvent import com.topjohnwu.magisk.model.events.ViewActionEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.ui.base.BaseUIActivity -import com.topjohnwu.magisk.ui.base.CompatNavigationDelegate import org.koin.androidx.viewmodel.ext.android.viewModel open class SuRequestActivity : BaseUIActivity() { @@ -23,8 +23,7 @@ open class SuRequestActivity : BaseUIActivity>? = - null + override val navigation: NavController? = null override fun onBackPressed() { viewModel.denyPressed() diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt deleted file mode 100644 index 6c74b3483..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/MagiskNavigationEvent.kt +++ /dev/null @@ -1,94 +0,0 @@ -package com.topjohnwu.magisk.model.navigation - -import android.os.Bundle -import androidx.annotation.AnimRes -import androidx.annotation.AnimatorRes -import androidx.fragment.app.Fragment -import com.topjohnwu.magisk.core.base.BaseActivity -import com.topjohnwu.magisk.model.events.ActivityExecutor -import com.topjohnwu.magisk.model.events.ViewEvent -import com.topjohnwu.magisk.ui.base.BaseUIActivity -import kotlin.reflect.KClass - -@DslMarker -annotation class NavigationDslMarker - -class MagiskNavigationEvent( - val navDirections: MagiskNavDirectionsBuilder, - val navOptions: MagiskNavOptions, - val animOptions: MagiskAnimBuilder -) : ViewEvent(), ActivityExecutor { - - companion object { - operator fun invoke(builder: Builder.() -> Unit) = Builder().apply(builder).build() - } - - override fun invoke(activity: BaseActivity) { - if (activity !is BaseUIActivity<*, *>) return - activity.navigation?.navigateTo(this) - } - - @NavigationDslMarker - class Builder { - - private var animOptions: MagiskAnimBuilder = MagiskAnimBuilder() - private var navOptions: MagiskNavOptions = MagiskNavOptions() - private val directionsBuilder = MagiskNavDirectionsBuilder() - - fun args(builder: Bundle.() -> Unit) = directionsBuilder.args(builder) - - fun navAnim(builder: MagiskAnimBuilder.() -> Unit) { - animOptions = MagiskAnimBuilder().apply(builder) - } - - fun navOptions(builder: MagiskNavOptions.() -> Unit) { - navOptions = MagiskNavOptions().apply(builder) - } - - fun navDirections(builder: MagiskNavDirectionsBuilder.() -> Unit) { - directionsBuilder.apply(builder) - } - - internal fun build() = MagiskNavigationEvent(directionsBuilder, navOptions, animOptions) - } -} - -@NavigationDslMarker -class MagiskNavDirectionsBuilder { - - var destination: KClass? = null - var isActivity: Boolean = false - val args: Bundle = Bundle() - - fun args(builder: Bundle.() -> Unit) = args.apply(builder) - -} - -@NavigationDslMarker -class MagiskNavOptions { - var popUpTo: KClass<*>? = null - var inclusive: Boolean = false - var clearTask: Boolean = false - var singleTop: Boolean = false -} - -@NavigationDslMarker -class MagiskAnimBuilder { - @AnimRes - @AnimatorRes - var enter = 0 - - @AnimRes - @AnimatorRes - var exit = 0 - - @AnimRes - @AnimatorRes - var popEnter = 0 - - @AnimRes - @AnimatorRes - var popExit = 0 - - val anySet: Boolean get() = enter != 0 || exit != 0 || popEnter != 0 || popExit != 0 -} diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt index 12ebe4d7e..75776881d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/Navigation.kt @@ -6,80 +6,9 @@ import android.os.Build import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.intent import com.topjohnwu.magisk.ui.MainActivity -import com.topjohnwu.magisk.ui.hide.HideFragment -import com.topjohnwu.magisk.ui.home.HomeFragment -import com.topjohnwu.magisk.ui.install.InstallFragment -import com.topjohnwu.magisk.ui.log.LogFragment -import com.topjohnwu.magisk.ui.module.ModuleFragment -import com.topjohnwu.magisk.ui.safetynet.SafetynetFragment -import com.topjohnwu.magisk.ui.settings.SettingsFragment -import com.topjohnwu.magisk.ui.superuser.SuperuserFragment -import com.topjohnwu.magisk.ui.theme.ThemeFragment object Navigation { - fun home() = MagiskNavigationEvent { - navDirections { - destination = HomeFragment::class - } - navOptions { - popUpTo = HomeFragment::class - } - } - - fun superuser() = MagiskNavigationEvent { - navDirections { - destination = SuperuserFragment::class - } - } - - fun modules() = MagiskNavigationEvent { - navDirections { - destination = ModuleFragment::class - } - } - - fun hide() = MagiskNavigationEvent { - navDirections { - destination = HideFragment::class - } - } - - fun safetynet() = MagiskNavigationEvent { - navDirections { destination = SafetynetFragment::class } - } - - fun log() = MagiskNavigationEvent { - navDirections { - destination = LogFragment::class - } - } - - fun settings() = MagiskNavigationEvent { - navDirections { - destination = SettingsFragment::class - } - } - - fun install() = MagiskNavigationEvent { - navDirections { destination = InstallFragment::class } - } - - fun theme() = MagiskNavigationEvent { - navDirections { destination = ThemeFragment::class } - } - - fun fromSection(section: String) = when (section) { - "superuser" -> superuser() - "modules" -> modules() - "magiskhide" -> hide() - "log" -> log() - "settings" -> settings() - else -> home() - } - - // redesign starts here - fun start(launchIntent: Intent, context: Context) { context.intent() .putExtra( @@ -92,10 +21,6 @@ object Navigation { .also { context.startActivity(it) } } - object Main { - const val OPEN_NAV = 1 - } - private val ACTION_APPLICATION_PREFERENCES get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Intent.ACTION_APPLICATION_PREFERENCES diff --git a/app/src/main/java/com/topjohnwu/magisk/model/navigation/NavigationWrapper.kt b/app/src/main/java/com/topjohnwu/magisk/model/navigation/NavigationWrapper.kt new file mode 100644 index 000000000..300a1b0aa --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/model/navigation/NavigationWrapper.kt @@ -0,0 +1,18 @@ +package com.topjohnwu.magisk.model.navigation + +import androidx.navigation.NavDirections +import com.topjohnwu.magisk.core.base.BaseActivity +import com.topjohnwu.magisk.model.events.ActivityExecutor +import com.topjohnwu.magisk.model.events.ViewEvent +import com.topjohnwu.magisk.ui.base.BaseUIActivity + +class NavigationWrapper( + private val directions: NavDirections +) : ViewEvent(), ActivityExecutor { + override fun invoke(activity: BaseActivity) { + if (activity !is BaseUIActivity<*, *>) return + activity.apply { + directions.navigate() + } + } +} \ No newline at end of file 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 1dc284747..08225faa0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt @@ -7,47 +7,31 @@ import android.view.ViewTreeObserver import android.view.WindowManager import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.graphics.Insets +import androidx.core.view.forEach import androidx.core.view.setPadding import androidx.core.view.updateLayoutParams -import androidx.fragment.app.Fragment import com.google.android.material.card.MaterialCardView -import com.ncapdevi.fragnav.FragNavController +import com.topjohnwu.magisk.MainDirections import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding import com.topjohnwu.magisk.extensions.startAnimations -import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.ui.base.BaseUIActivity -import com.topjohnwu.magisk.ui.base.CompatNavigationDelegate -import com.topjohnwu.magisk.ui.home.HomeFragment -import com.topjohnwu.magisk.ui.log.LogFragment -import com.topjohnwu.magisk.ui.module.ModuleFragment -import com.topjohnwu.magisk.ui.superuser.SuperuserFragment +import com.topjohnwu.magisk.ui.home.HomeFragmentDirections import com.topjohnwu.magisk.utils.HideBottomViewOnScrollBehavior import com.topjohnwu.magisk.utils.HideTopViewOnScrollBehavior import com.topjohnwu.magisk.utils.HideableBehavior import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel -import kotlin.reflect.KClass -open class MainActivity : BaseUIActivity(), - FragNavController.TransactionListener { +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 navigation by lazy { CompatNavigationDelegate(this, this) } - - override val baseFragments: List> = listOf( - HomeFragment::class, - ModuleFragment::class, - SuperuserFragment::class, - LogFragment::class - ) - //This temporarily fixes unwanted feature of BottomNavigationView - where the view applies //padding on itself given insets are not consumed beforehand. Unfortunately the listener //implementation doesn't favor us against the design library, so on re-create it's often given @@ -56,6 +40,9 @@ open class MainActivity : BaseUIActivity( binding.mainNavigation.setPadding(0) } + protected var isRoot = true + private set + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -70,6 +57,25 @@ open class MainActivity : BaseUIActivity( window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) + navigation?.addOnDestinationChangedListener { controller, destination, arguments -> + isRoot = when (destination.id) { + R.id.homeFragment, + R.id.modulesFragment, + R.id.superuserFragment, + R.id.logFragment -> true + else -> false + } + + setDisplayHomeAsUpEnabled(!isRoot) + requestNavigationHidden(!isRoot) + + binding.mainNavigation.menu.forEach { + if (it.itemId == destination.id) { + it.isChecked = true + } + } + } + setSupportActionBar(binding.mainToolbar) binding.mainToolbarWrapper.updateLayoutParams { @@ -80,28 +86,26 @@ open class MainActivity : BaseUIActivity( } binding.mainNavigation.setOnNavigationItemSelectedListener { when (it.itemId) { - R.id.homeFragment -> Navigation.home() - R.id.modulesFragment -> Navigation.modules() - R.id.superuserFragment -> Navigation.superuser() - R.id.logFragment -> Navigation.log() + R.id.homeFragment -> MainDirections.actionHomeFragment() + R.id.modulesFragment -> MainDirections.actionModuleFragment() + R.id.superuserFragment -> MainDirections.actionSuperuserFragment() + R.id.logFragment -> MainDirections.actionLogFragment() else -> throw NotImplementedError("Id ${it.itemId} is not defined as selectable") - }.dispatchOnSelf() + }.navigate() true } binding.mainNavigation.setOnNavigationItemReselectedListener { - navigation.onReselected() + (currentFragment as? ReselectionTarget)?.onReselected() } binding.mainNavigation.viewTreeObserver.addOnGlobalLayoutListener(navObserver) if (intent.getBooleanExtra(Const.Key.OPEN_SETTINGS, false)) { - Navigation.settings().dispatchOnSelf() + HomeFragmentDirections.actionHomeFragmentToSettingsFragment().navigate() } if (savedInstanceState != null) { - onTabTransaction(null, -1) - - if (!navigation.isRoot) { + if (!isRoot) { requestNavigationHidden() } } @@ -129,17 +133,6 @@ open class MainActivity : BaseUIActivity( return true } - override fun onTabTransaction(fragment: Fragment?, index: Int) = - onFragmentTransaction(fragment, FragNavController.TransactionType.PUSH) - - override fun onFragmentTransaction( - fragment: Fragment?, - transactionType: FragNavController.TransactionType - ) { - setDisplayHomeAsUpEnabled(!navigation.isRoot) - requestNavigationHidden(!navigation.isRoot) - } - override fun peekSystemWindowInsets(insets: Insets) { viewModel.insets.value = insets } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt index 438ffc174..6cc96d67e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseUIActivity.kt @@ -9,7 +9,8 @@ import androidx.core.graphics.Insets import androidx.databinding.DataBindingUtil import androidx.databinding.OnRebindCallback import androidx.databinding.ViewDataBinding -import androidx.fragment.app.Fragment +import androidx.navigation.NavDirections +import androidx.navigation.findNavController import com.topjohnwu.magisk.BR import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.core.base.BaseActivity @@ -19,7 +20,6 @@ import com.topjohnwu.magisk.model.events.EventHandler import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.ui.theme.Theme -import kotlin.reflect.KClass abstract class BaseUIActivity : BaseActivity(), CompatView, EventHandler { @@ -28,20 +28,30 @@ abstract class BaseUIActivity + override val viewRoot: View get() = binding.root - override val navigation by lazy { CompatNavigationDelegate(this) as CompatNavigationDelegate? } + override val navigation by lazy { + kotlin.runCatching { findNavController(navHost) }.getOrNull() + } private val delegate by lazy { CompatDelegate(this) } open val navHost: Int = 0 open val snackbarView get() = binding.root - open val baseFragments = listOf>() init { val theme = Config.darkThemeExtended AppCompatDelegate.setDefaultNightMode(theme) } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + currentFragment?.onActivityResult(requestCode, resultCode, data) + } + override fun onCreate(savedInstanceState: Bundle?) { setTheme(themeRes) super.onCreate(savedInstanceState) @@ -61,12 +71,6 @@ abstract class BaseUIActivity( - private val source: Source, - private val listener: FragNavController.TransactionListener? = null -) : FragNavController.RootFragmentListener where Source : BaseUIActivity<*, *> { - - private val controller by lazy { - check(source.navHost != 0) { "Did you forget to override \"navHostId\"?" } - FragNavController(source.supportFragmentManager, source.navHost) - } - - val isRoot get() = controller.isRootFragment - - - //region Listener - override val numberOfRootFragments: Int - get() = source.baseFragments.size - - override fun getRootFragment(index: Int) = - source.baseFragments[index].java.newInstance() - //endregion - - fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - controller.currentFrag?.onActivityResult(requestCode, resultCode, data) - } - - fun onCreate(savedInstanceState: Bundle?) = controller.run { - rootFragmentListener = this@CompatNavigationDelegate - transactionListener = listener - initialize(0, savedInstanceState) - } - - fun onSaveInstanceState(outState: Bundle) = - controller.onSaveInstanceState(outState) - - fun onReselected() { - (controller.currentFrag as? ReselectionTarget)?.onReselected() - } - - fun onBackPressed(): Boolean { - val fragment = controller.currentFrag as? BaseUIFragment<*, *> - - if (fragment?.onBackPressed() == true) { - return true - } - - return runCatching { controller.popFragment() }.fold({ true }, { false }) - } - - // --- - - fun navigateTo(event: MagiskNavigationEvent) { - val directions = event.navDirections - - controller.defaultTransactionOptions = FragNavTransactionOptions.newBuilder() - .customAnimations(event.animOptions) - .build() - - controller.currentStack - ?.indexOfFirst { it.javaClass == event.navOptions.popUpTo } - ?.takeIf { it != -1 } // invalidate if class is not found - ?.let { if (event.navOptions.inclusive) it + 1 else it } - ?.let { controller.popFragments(it) } - - when (directions.isActivity) { - true -> navigateToActivity(event) - else -> navigateToFragment(event) - } - } - - private fun navigateToActivity(event: MagiskNavigationEvent) { - val destination = event.navDirections.destination?.java ?: let { - Timber.e("Cannot navigate to null destination") - return - } - val options = event.navOptions - - Intent(source, destination) - .putExtras(event.navDirections.args) - .apply { - if (options.singleTop) addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) - if (options.clearTask) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - } - .let { source.startActivity(it) } - } - - private fun navigateToFragment(event: MagiskNavigationEvent) { - val destination = event.navDirections.destination ?: let { - Timber.e("Cannot navigate to null destination") - return - } - - source.baseFragments - .indexOfFirst { it == destination } - .takeIf { it >= 0 } - ?.let { controller.switchTab(it) } ?: destination.java.newInstance() - .also { it.arguments = event.navDirections.args } - .let { controller.pushFragment(it) } - } - - private fun FragNavTransactionOptions.Builder.customAnimations(options: MagiskAnimBuilder) = - apply { - if (!options.anySet) customAnimations( - R.anim.fragment_enter, - R.anim.fragment_exit, - R.anim.fragment_enter_pop, - R.anim.fragment_exit_pop - ) else customAnimations( - options.enter, - options.exit, - options.popEnter, - options.popExit - ) - } - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatView.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatView.kt index c6d8fe5af..11f47e041 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatView.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/CompatView.kt @@ -2,12 +2,13 @@ package com.topjohnwu.magisk.ui.base import android.view.View import androidx.core.graphics.Insets +import androidx.navigation.NavController internal interface CompatView { val viewRoot: View val viewModel: ViewModel - val navigation: CompatNavigationDelegate<*>? + val navigation: NavController? fun peekSystemWindowInsets(insets: Insets) = Unit fun consumeSystemWindowInsets(insets: Insets): Insets? = null diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt index bd1d2318f..8bc53b9da 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt @@ -5,7 +5,6 @@ import android.view.* import com.topjohnwu.magisk.R import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding import com.topjohnwu.magisk.model.events.RebootEvent -import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.ui.base.BaseUIFragment import com.topjohnwu.superuser.Shell import org.koin.androidx.viewmodel.ext.android.viewModel @@ -46,7 +45,8 @@ class HomeFragment : BaseUIFragment() { } override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { - R.id.action_settings -> Navigation.settings().dispatchOnSelf() + R.id.action_settings -> HomeFragmentDirections.actionHomeFragmentToSettingsFragment() + .navigate() R.id.action_reboot -> RebootEvent.inflateMenu(activity).show() else -> null }?.let { true } ?: super.onOptionsItemSelected(item) 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 449083a10..7435116fa 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 @@ -22,7 +22,6 @@ import com.topjohnwu.magisk.model.events.ViewEvent import com.topjohnwu.magisk.model.events.dialog.EnvFixDialog import com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog import com.topjohnwu.magisk.model.events.dialog.UninstallDialog -import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.ui.base.BaseViewModel import com.topjohnwu.magisk.ui.base.itemBindingOf import com.topjohnwu.magisk.utils.KObservableField @@ -114,7 +113,7 @@ class HomeViewModel( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ).map { check(it);it } - .subscribeK { Navigation.install().publish() } + .subscribeK { HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish() } .add() fun toggle(kof: KObservableField) = kof.toggle() 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 68bf24abb..991c58866 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 @@ -19,7 +19,6 @@ import com.topjohnwu.magisk.model.entity.recycler.SettingsItem import com.topjohnwu.magisk.model.events.PermissionEvent import com.topjohnwu.magisk.model.events.RecreateEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog -import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.ui.base.BaseViewModel import com.topjohnwu.magisk.ui.base.adapterOf import com.topjohnwu.magisk.ui.base.diffListOf @@ -95,7 +94,7 @@ class SettingsViewModel( override fun onItemChanged(view: View, item: SettingsItem) = when (item) { // use only instances you want, don't declare everything - is Theme -> Navigation.theme().publish() + is Theme -> SettingsFragmentDirections.actionSettingsFragmentToThemeFragment().publish() is Language -> RecreateEvent().publish() is UpdateChannel -> openUrlIfNecessary(view) 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 d1cb37845..8f559b5ed 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 @@ -20,7 +20,6 @@ import com.topjohnwu.magisk.model.events.PolicyUpdateEvent import com.topjohnwu.magisk.model.events.SnackbarEvent import com.topjohnwu.magisk.model.events.dialog.BiometricDialog import com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog -import com.topjohnwu.magisk.model.navigation.Navigation import com.topjohnwu.magisk.ui.base.BaseViewModel import com.topjohnwu.magisk.ui.base.adapterOf import com.topjohnwu.magisk.ui.base.diffListOf @@ -85,8 +84,11 @@ class SuperuserViewModel( else -> Unit } - private fun safetynetPressed() = Navigation.safetynet().publish() - private fun hidePressed() = Navigation.hide().publish() + private fun safetynetPressed() = + SuperuserFragmentDirections.actionSuperuserFragmentToSafetynetFragment().publish() + + private fun hidePressed() = + SuperuserFragmentDirections.actionSuperuserFragmentToHideFragment().publish() fun deletePressed(item: PolicyItem) { fun updateState() = deletePolicy(item.item) diff --git a/app/src/main/res/layout/activity_main_md2.xml b/app/src/main/res/layout/activity_main_md2.xml index 0af045720..cf46dc819 100644 --- a/app/src/main/res/layout/activity_main_md2.xml +++ b/app/src/main/res/layout/activity_main_md2.xml @@ -19,10 +19,13 @@ android:paddingRight="@{viewModel.insets.right}" tools:ignore="RtlHardcoded"> - + android:layout_height="match_parent" + app:defaultNavHost="true" + app:navGraph="@navigation/main" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index a085790de..2b17ef094 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ if (configPath.exists()) buildscript { ext.vKotlin = '1.3.70' + ext.vNav = '2.3.0-alpha03' repositories { google() @@ -18,6 +19,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.6.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${vKotlin}" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$vNav" // NOTE: Do not place your application dependencies here; they belong