Files
Magisk/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt

208 lines
7.5 KiB
Kotlin
Raw Normal View History

2020-01-13 00:43:09 +08:00
package com.topjohnwu.magisk.ui
import android.content.Intent
2020-10-30 16:43:11 +08:00
import android.content.pm.ApplicationInfo
import android.os.Bundle
2019-10-18 17:04:41 +02:00
import android.view.MenuItem
import android.view.View
2020-01-12 15:00:49 +08:00
import android.view.WindowManager
2020-08-21 03:36:12 -07:00
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.view.forEach
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.navigation.NavDirections
import com.topjohnwu.magisk.MainDirections
import com.topjohnwu.magisk.R
2021-11-05 04:16:58 -07:00
import com.topjohnwu.magisk.arch.BaseMainActivity
2020-08-18 06:31:15 -07:00
import com.topjohnwu.magisk.arch.BaseViewModel
2020-08-21 03:36:12 -07:00
import com.topjohnwu.magisk.core.*
import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding
2021-04-18 04:46:11 -07:00
import com.topjohnwu.magisk.di.viewModel
2020-07-11 05:36:31 -07:00
import com.topjohnwu.magisk.ktx.startAnimations
import com.topjohnwu.magisk.ui.home.HomeFragmentDirections
2020-12-01 02:59:11 +08:00
import com.topjohnwu.magisk.utils.Utils
import com.topjohnwu.magisk.view.MagiskDialog
2020-08-21 03:36:12 -07:00
import com.topjohnwu.magisk.view.Shortcuts
2020-10-30 16:43:11 +08:00
import java.io.File
2020-07-12 03:17:50 -07:00
class MainViewModel : BaseViewModel()
2021-11-05 04:16:58 -07:00
class MainActivity : BaseMainActivity<MainViewModel, ActivityMainMd2Binding>() {
override val layoutRes = R.layout.activity_main_md2
override val viewModel by viewModel<MainViewModel>()
2021-03-16 04:58:02 -07:00
override val navHostId: Int = R.id.main_nav_host
override val snackbarAnchorView: View?
get() {
val fragmentAnchor = currentFragment?.snackbarAnchorView
return when {
fragmentAnchor?.isVisible == true -> fragmentAnchor
binding.mainNavigation.isVisible -> return binding.mainNavigation
else -> null
}
}
2019-10-16 17:53:35 +02:00
2020-08-19 03:27:12 -07:00
private var isRootFragment = true
2021-11-05 04:16:58 -07:00
override fun showMainUI(savedInstanceState: Bundle?) {
2020-09-11 02:31:41 -07:00
setContentView()
2020-08-21 03:36:12 -07:00
showUnsupportedMessage()
askForHomeShortcut()
2020-01-12 15:00:49 +08:00
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
2020-08-19 03:27:12 -07:00
navigation?.addOnDestinationChangedListener { _, destination, _ ->
isRootFragment = when (destination.id) {
R.id.homeFragment,
R.id.modulesFragment,
R.id.superuserFragment,
R.id.logFragment -> true
else -> false
}
2020-08-19 03:27:12 -07:00
setDisplayHomeAsUpEnabled(!isRootFragment)
requestNavigationHidden(!isRootFragment)
binding.mainNavigation.menu.forEach {
if (it.itemId == destination.id) {
it.isChecked = true
}
}
}
setSupportActionBar(binding.mainToolbar)
2019-10-03 19:38:57 +02:00
binding.mainNavigation.setOnItemSelectedListener {
2020-08-19 03:27:12 -07:00
getScreen(it.itemId)?.navigate()
2019-10-03 19:38:57 +02:00
true
}
2021-11-05 04:16:58 -07:00
binding.mainNavigation.menu.apply {
findItem(R.id.superuserFragment)?.isEnabled = Utils.showSuperUser()
findItem(R.id.modulesFragment)?.isEnabled = Info.env.isActive
2021-11-05 04:16:58 -07:00
}
val section =
if (intent.action == Intent.ACTION_APPLICATION_PREFERENCES)
Const.Nav.SETTINGS
else
intent.getStringExtra(Const.Key.OPEN_SECTION)
getScreen(section)?.navigate()
if (!isRootFragment) {
requestNavigationHidden(requiresAnimation = savedInstanceState == null)
}
}
2019-10-18 17:04:41 +02:00
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> onBackPressed()
else -> return super.onOptionsItemSelected(item)
}
return true
}
fun setDisplayHomeAsUpEnabled(isEnabled: Boolean) {
binding.mainToolbar.startAnimations()
when {
isEnabled -> binding.mainToolbar.setNavigationIcon(R.drawable.ic_back_md2)
else -> binding.mainToolbar.navigationIcon = null
}
}
internal fun requestNavigationHidden(hide: Boolean = true, requiresAnimation: Boolean = true) {
val bottomView = binding.mainNavigation
if (requiresAnimation) {
bottomView.isVisible = true
bottomView.isHidden = hide
} else {
bottomView.isGone = hide
}
}
2019-11-21 17:31:37 +01:00
fun invalidateToolbar() {
//binding.mainToolbar.startAnimations()
binding.mainToolbar.invalidate()
}
private fun getScreen(name: String?): NavDirections? {
return when (name) {
2021-03-16 04:58:02 -07:00
Const.Nav.SUPERUSER -> MainDirections.actionSuperuserFragment()
Const.Nav.MODULES -> MainDirections.actionModuleFragment()
2020-08-19 03:27:12 -07:00
Const.Nav.SETTINGS -> HomeFragmentDirections.actionHomeFragmentToSettingsFragment()
else -> null
}
}
private fun getScreen(id: Int): NavDirections? {
return when (id) {
R.id.homeFragment -> MainDirections.actionHomeFragment()
R.id.modulesFragment -> MainDirections.actionModuleFragment()
R.id.superuserFragment -> MainDirections.actionSuperuserFragment()
R.id.logFragment -> MainDirections.actionLogFragment()
else -> null
}
}
2020-08-21 03:36:12 -07:00
private fun showUnsupportedMessage() {
if (Info.env.isUnsupported) {
MagiskDialog(this)
.applyTitle(R.string.unsupport_magisk_title)
.applyMessage(R.string.unsupport_magisk_msg, Const.Version.MIN_VERSION)
.applyButton(MagiskDialog.ButtonType.POSITIVE) { titleRes = android.R.string.ok }
2020-10-30 16:43:11 +08:00
.cancellable(false)
.reveal()
}
if (!Info.isEmulator && Info.env.isActive && System.getenv("PATH")
2020-10-30 16:43:11 +08:00
?.split(':')
?.filterNot { File("$it/magisk").exists() }
?.any { File("$it/su").exists() } == true) {
MagiskDialog(this)
.applyTitle(R.string.unsupport_general_title)
2020-10-30 16:43:11 +08:00
.applyMessage(R.string.unsupport_other_su_msg)
.applyButton(MagiskDialog.ButtonType.POSITIVE) { titleRes = android.R.string.ok }
.cancellable(false)
.reveal()
}
if (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0) {
MagiskDialog(this)
.applyTitle(R.string.unsupport_general_title)
2020-10-30 16:43:11 +08:00
.applyMessage(R.string.unsupport_system_app_msg)
.applyButton(MagiskDialog.ButtonType.POSITIVE) { titleRes = android.R.string.ok }
.cancellable(false)
.reveal()
}
if (applicationInfo.flags and ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0) {
MagiskDialog(this)
.applyTitle(R.string.unsupport_general_title)
2020-10-30 16:43:11 +08:00
.applyMessage(R.string.unsupport_external_storage_msg)
.applyButton(MagiskDialog.ButtonType.POSITIVE) { titleRes = android.R.string.ok }
.cancellable(false)
.reveal()
}
}
2020-08-21 03:36:12 -07:00
private fun askForHomeShortcut() {
if (isRunningAsStub && !Config.askedHome &&
ShortcutManagerCompat.isRequestPinShortcutSupported(this)) {
2020-08-21 03:36:12 -07:00
// Ask and show dialog
Config.askedHome = true
MagiskDialog(this)
.applyTitle(R.string.add_shortcut_title)
.applyMessage(R.string.add_shortcut_msg)
.applyButton(MagiskDialog.ButtonType.NEGATIVE) {
2020-08-28 08:13:04 +08:00
titleRes = android.R.string.cancel
2020-08-21 03:36:12 -07:00
}.applyButton(MagiskDialog.ButtonType.POSITIVE) {
2020-08-28 08:13:04 +08:00
titleRes = android.R.string.ok
2020-08-21 03:36:12 -07:00
onClick {
Shortcuts.addHomeIcon(this@MainActivity)
}
}.cancellable(true)
.reveal()
}
}
}