Better environment status detection
This commit is contained in:
parent
7f6a6016d6
commit
da159e4655
@ -36,20 +36,21 @@ object Info {
|
||||
val str = ShellUtils.fastCmd("magisk -v").split(":".toRegex())[0]
|
||||
val code = ShellUtils.fastCmd("magisk -V").toInt()
|
||||
val hide = Shell.su("magiskhide --status").exec().isSuccess
|
||||
Env(code, str, hide)
|
||||
Env(str, code, hide)
|
||||
}.getOrElse { Env() }
|
||||
|
||||
class Env(
|
||||
code: Int = -1,
|
||||
val magiskVersionString: String = "",
|
||||
code: Int = -1,
|
||||
hide: Boolean = false
|
||||
) {
|
||||
val magiskHide get() = Config.magiskHide
|
||||
val magiskVersionCode = when (code) {
|
||||
in Int.MIN_VALUE..Const.Version.MIN_VERCODE -> -1
|
||||
else -> code
|
||||
else -> if(Shell.rootAccess()) code else -1
|
||||
}
|
||||
val unsupported = code > 0 && code < Const.Version.MIN_VERCODE
|
||||
val isUnsupported = code > 0 && code < Const.Version.MIN_VERCODE
|
||||
val isActive = magiskVersionCode >= 0
|
||||
|
||||
init {
|
||||
Config.magiskHide = hide
|
||||
|
@ -31,7 +31,6 @@ import com.topjohnwu.magisk.ui.module.ReposFragment
|
||||
import com.topjohnwu.magisk.ui.settings.SettingsFragment
|
||||
import com.topjohnwu.magisk.ui.superuser.SuperuserFragment
|
||||
import com.topjohnwu.magisk.utils.Utils
|
||||
import com.topjohnwu.superuser.Shell
|
||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||
import timber.log.Timber
|
||||
import kotlin.reflect.KClass
|
||||
@ -68,7 +67,7 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
if (Info.env.unsupported && !viewModel.shownUnsupportedDialog) {
|
||||
if (Info.env.isUnsupported && !viewModel.shownUnsupportedDialog) {
|
||||
viewModel.shownUnsupportedDialog = true
|
||||
AlertDialog.Builder(this)
|
||||
.setTitle(R.string.unsupport_magisk_title)
|
||||
@ -164,16 +163,11 @@ open class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(), Na
|
||||
|
||||
private fun checkHideSection() {
|
||||
val menu = binding.navView.menu
|
||||
menu.findItem(R.id.magiskHideFragment).isVisible =
|
||||
Shell.rootAccess() && Info.env.magiskHide
|
||||
menu.findItem(R.id.modulesFragment).isVisible =
|
||||
Shell.rootAccess() && Info.env.magiskVersionCode >= 0
|
||||
menu.findItem(R.id.reposFragment).isVisible =
|
||||
(viewModel.isConnected.value && Shell.rootAccess() && Info.env.magiskVersionCode >= 0)
|
||||
menu.findItem(R.id.logFragment).isVisible =
|
||||
Shell.rootAccess()
|
||||
menu.findItem(R.id.superuserFragment).isVisible =
|
||||
Utils.showSuperUser()
|
||||
menu.findItem(R.id.magiskHideFragment).isVisible = Info.env.isActive && Info.env.magiskHide
|
||||
menu.findItem(R.id.modulesFragment).isVisible = Info.env.isActive
|
||||
menu.findItem(R.id.reposFragment).isVisible = Info.isConnected.value && Info.env.isActive
|
||||
menu.findItem(R.id.logFragment).isVisible = Info.env.isActive
|
||||
menu.findItem(R.id.superuserFragment).isVisible = Utils.showSuperUser()
|
||||
}
|
||||
|
||||
private fun FragNavTransactionOptions.Builder.customAnimations(options: MagiskAnimBuilder) =
|
||||
|
@ -92,7 +92,7 @@ class HomeViewModel(
|
||||
}
|
||||
}
|
||||
|
||||
val hasRoot = KObservableField(false)
|
||||
val isActive = KObservableField(false)
|
||||
|
||||
private var shownDialog = false
|
||||
|
||||
@ -175,7 +175,7 @@ class HomeViewModel(
|
||||
if (invalidate)
|
||||
Info.envRef.invalidate()
|
||||
|
||||
hasRoot.value = Shell.rootAccess()
|
||||
isActive.value = Info.env.isActive
|
||||
|
||||
val fetchUpdate = if (isConnected.value)
|
||||
magiskRepo.fetchUpdate().ignoreElement()
|
||||
|
@ -61,7 +61,7 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
nsConfig = findPreference(Config.Key.SU_MNT_NS)!!
|
||||
val reauth = findPreference<SwitchPreferenceCompat>(Config.Key.SU_REAUTH)!!
|
||||
val biometric = findPreference<SwitchPreferenceCompat>(Config.Key.SU_BIOMETRIC)!!
|
||||
val generalCatagory = findPreference<PreferenceCategory>("general")!!
|
||||
val generalCategory = findPreference<PreferenceCategory>("general")!!
|
||||
val magiskCategory = findPreference<PreferenceCategory>("magisk")!!
|
||||
val suCategory = findPreference<PreferenceCategory>("superuser")!!
|
||||
val hideManager = findPreference<Preference>("hide")!!
|
||||
@ -94,9 +94,9 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
biometric.setSummary(R.string.no_biometric)
|
||||
}
|
||||
|
||||
if (Const.USER_ID == 0 && Info.isConnected.value && Shell.rootAccess()) {
|
||||
if (Const.USER_ID == 0 && Info.isConnected.value && Info.env.isActive) {
|
||||
if (activity.packageName == BuildConfig.APPLICATION_ID) {
|
||||
generalCatagory.removePreference(restoreManager)
|
||||
generalCategory.removePreference(restoreManager)
|
||||
hideManager.setOnPreferenceClickListener {
|
||||
showManagerNameDialog {
|
||||
PatchAPK.hideManager(requireContext(), it)
|
||||
@ -104,7 +104,7 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
true
|
||||
}
|
||||
} else {
|
||||
generalCatagory.removePreference(hideManager)
|
||||
generalCategory.removePreference(hideManager)
|
||||
restoreManager.setOnPreferenceClickListener {
|
||||
DownloadService(requireContext()) {
|
||||
subject = DownloadSubject.Manager(Configuration.APK.Restore)
|
||||
@ -114,25 +114,32 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
}
|
||||
} else {
|
||||
// Remove if not primary user, no connection, or no root
|
||||
generalCatagory.removePreference(restoreManager)
|
||||
generalCatagory.removePreference(hideManager)
|
||||
generalCategory.removePreference(restoreManager)
|
||||
generalCategory.removePreference(hideManager)
|
||||
}
|
||||
|
||||
if (!Utils.showSuperUser()) {
|
||||
preferenceScreen.removePreference(suCategory)
|
||||
}
|
||||
|
||||
if (!Shell.rootAccess()) {
|
||||
if (!Info.env.isActive) {
|
||||
preferenceScreen.removePreference(magiskCategory)
|
||||
generalCatagory.removePreference(hideManager)
|
||||
generalCategory.removePreference(hideManager)
|
||||
}
|
||||
|
||||
findPreference<Preference>("clear")?.setOnPreferenceClickListener {
|
||||
Completable.fromAction { repoDB.clear() }.subscribeK {
|
||||
Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT)
|
||||
findPreference<Preference>("clear")?.also {
|
||||
if (Info.env.isActive) {
|
||||
it.setOnPreferenceClickListener {
|
||||
Completable.fromAction { repoDB.clear() }.subscribeK {
|
||||
Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT)
|
||||
}
|
||||
true
|
||||
}
|
||||
} else {
|
||||
generalCategory.removePreference(it)
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
findPreference<Preference>("hosts")?.setOnPreferenceClickListener {
|
||||
Shell.su("add_hosts_module").submit {
|
||||
Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT)
|
||||
@ -142,20 +149,21 @@ class SettingsFragment : BasePreferenceFragment() {
|
||||
|
||||
findPreference<Preference>(Config.Key.DOWNLOAD_PATH)?.apply {
|
||||
summary = Config.downloadPath
|
||||
}?.setOnPreferenceClickListener { preference ->
|
||||
activity.withExternalRW {
|
||||
onSuccess {
|
||||
showDownloadDialog {
|
||||
Config.downloadPath = it
|
||||
preference.summary = it
|
||||
setOnPreferenceClickListener { pref ->
|
||||
activity.withExternalRW {
|
||||
onSuccess {
|
||||
showDownloadDialog {
|
||||
Config.downloadPath = it
|
||||
pref.summary = it
|
||||
}
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
updateChannel.setOnPreferenceChangeListener { _, value ->
|
||||
val channel = Integer.parseInt(value as String)
|
||||
val channel = value.toString().toInt()
|
||||
val previous = Config.updateChannel
|
||||
|
||||
if (channel == Config.Value.CUSTOM_CHANNEL) {
|
||||
|
@ -11,7 +11,6 @@ import com.topjohnwu.magisk.*
|
||||
import com.topjohnwu.magisk.R
|
||||
import com.topjohnwu.magisk.extensions.get
|
||||
import com.topjohnwu.magisk.model.update.UpdateCheckService
|
||||
import com.topjohnwu.superuser.Shell
|
||||
import com.topjohnwu.superuser.internal.UiThreadHandler
|
||||
import java.io.File
|
||||
import java.util.concurrent.TimeUnit
|
||||
@ -34,7 +33,7 @@ object Utils {
|
||||
}
|
||||
|
||||
fun showSuperUser(): Boolean {
|
||||
return Shell.rootAccess() && (Const.USER_ID == 0
|
||||
return Info.env.isActive && (Const.USER_ID == 0
|
||||
|| Config.suMultiuserMode != Config.Value.MULTIUSER_MODE_OWNER_MANAGED)
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,6 @@ import com.topjohnwu.magisk.*
|
||||
import com.topjohnwu.magisk.extensions.getBitmap
|
||||
import com.topjohnwu.magisk.ui.SplashActivity
|
||||
import com.topjohnwu.magisk.utils.Utils
|
||||
import com.topjohnwu.superuser.Shell
|
||||
|
||||
object Shortcuts {
|
||||
|
||||
@ -28,7 +27,6 @@ object Shortcuts {
|
||||
@RequiresApi(api = 25)
|
||||
private fun getShortCuts(context: Context): List<ShortcutInfo> {
|
||||
val shortCuts = mutableListOf<ShortcutInfo>()
|
||||
val root = Shell.rootAccess()
|
||||
val intent = context.intent<SplashActivity>()
|
||||
|
||||
fun getIcon(id: Int): Icon {
|
||||
@ -53,7 +51,7 @@ object Shortcuts {
|
||||
.build()
|
||||
)
|
||||
}
|
||||
if (root && Info.env.magiskHide) {
|
||||
if (Info.env.magiskHide) {
|
||||
shortCuts.add(
|
||||
ShortcutInfo.Builder(context, "magiskhide")
|
||||
.setShortLabel(context.getString(R.string.magiskhide))
|
||||
@ -68,7 +66,7 @@ object Shortcuts {
|
||||
.build()
|
||||
)
|
||||
}
|
||||
if (!Config.coreOnly && root && Info.env.magiskVersionCode >= 0) {
|
||||
if (!Config.coreOnly && Info.env.isActive) {
|
||||
shortCuts.add(
|
||||
ShortcutInfo.Builder(context, "modules")
|
||||
.setShortLabel(context.getString(R.string.modules))
|
||||
|
@ -201,7 +201,7 @@
|
||||
|
||||
<View
|
||||
style="@style/Widget.Divider.Horizontal"
|
||||
gone="@{!viewModel.hasRoot || !viewModel.isConnected}"
|
||||
gone="@{!viewModel.isActive || !viewModel.isConnected}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_margin="@dimen/margin_generic" />
|
||||
|
||||
@ -482,13 +482,13 @@
|
||||
|
||||
<View
|
||||
style="@style/Widget.Divider.Horizontal"
|
||||
gone="@{!viewModel.hasRoot}"
|
||||
gone="@{!viewModel.isActive}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_margin="@dimen/margin_generic" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
style="@style/Widget.Button.Text"
|
||||
gone="@{!viewModel.hasRoot}"
|
||||
gone="@{!viewModel.isActive}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:onClick="@{() -> viewModel.uninstallPressed()}"
|
||||
|
Loading…
Reference in New Issue
Block a user