diff --git a/app/src/main/java/com/topjohnwu/magisk/core/Config.kt b/app/src/main/java/com/topjohnwu/magisk/core/Config.kt index c8957cda4..615c2a3da 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Config.kt @@ -7,7 +7,6 @@ import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.core.di.AppContext import com.topjohnwu.magisk.core.di.ServiceLocator import com.topjohnwu.magisk.core.ktx.writeTo -import com.topjohnwu.magisk.core.repository.BoolDBPropertyNoWrite import com.topjohnwu.magisk.core.repository.DBConfig import com.topjohnwu.magisk.core.repository.PreferenceConfig import com.topjohnwu.magisk.core.utils.refreshLocale @@ -41,7 +40,6 @@ object Config : PreferenceConfig, DBConfig { const val SU_BIOMETRIC = "su_biometric" const val ZYGISK = "zygisk" const val BOOTLOOP = "bootloop" - const val DENYLIST = "denylist" const val SU_MANAGER = "requester" const val KEYSTORE = "keystore" @@ -56,12 +54,9 @@ object Config : PreferenceConfig, DBConfig { const val CUSTOM_CHANNEL = "custom_channel" const val LOCALE = "locale" const val DARK_THEME = "dark_theme_extended" - const val REPO_ORDER = "repo_order" - const val SHOW_SYSTEM_APP = "show_system" const val DOWNLOAD_DIR = "download_dir" const val SAFETY = "safety_notice" const val THEME_ORDINAL = "theme_ordinal" - const val BOOT_ID = "boot_id" const val ASKED_HOME = "asked_home" const val DOH = "doh" } @@ -102,10 +97,6 @@ object Config : PreferenceConfig, DBConfig { // su timeout val TIMEOUT_LIST = intArrayOf(0, -1, 10, 20, 30, 60) - - // repo order - const val ORDER_NAME = 0 - const val ORDER_DATE = 1 } private val defaultChannel = @@ -119,24 +110,21 @@ object Config : PreferenceConfig, DBConfig { @JvmField var keepVerity = false @JvmField var keepEnc = false @JvmField var recovery = false + var denyList = false - var bootId by preference(Key.BOOT_ID, "") var askedHome by preference(Key.ASKED_HOME, false) - - var downloadDir by preference(Key.DOWNLOAD_DIR, "") - var repoOrder by preference(Key.REPO_ORDER, Value.ORDER_DATE) - - var suDefaultTimeout by preferenceStrInt(Key.SU_REQUEST_TIMEOUT, 10) - var suAutoResponse by preferenceStrInt(Key.SU_AUTO_RESPONSE, Value.SU_PROMPT) - var suNotification by preferenceStrInt(Key.SU_NOTIFICATION, Value.NOTIFICATION_TOAST) - var updateChannel by preferenceStrInt(Key.UPDATE_CHANNEL, defaultChannel) + var bootloop by dbSettings(Key.BOOTLOOP, 0) var safetyNotice by preference(Key.SAFETY, true) var darkTheme by preference(Key.DARK_THEME, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) var themeOrdinal by preference(Key.THEME_ORDINAL, Theme.Piplup.ordinal) - var suReAuth by preference(Key.SU_REAUTH, false) - var suTapjack by preference(Key.SU_TAPJACK, true) + private var checkUpdatePrefs by preference(Key.CHECK_UPDATES, true) + private var localePrefs by preference(Key.LOCALE, "") + var doh by preference(Key.DOH, false) + var updateChannel by preferenceStrInt(Key.UPDATE_CHANNEL, defaultChannel) + var customChannelUrl by preference(Key.CUSTOM_CHANNEL, "") + var downloadDir by preference(Key.DOWNLOAD_DIR, "") var checkUpdate get() = checkUpdatePrefs set(value) { @@ -145,11 +133,6 @@ object Config : PreferenceConfig, DBConfig { JobService.schedule(AppContext) } } - var doh by preference(Key.DOH, false) - var showSystemApp by preference(Key.SHOW_SYSTEM_APP, false) - - var customChannelUrl by preference(Key.CUSTOM_CHANNEL, "") - private var localePrefs by preference(Key.LOCALE, "") var locale get() = localePrefs set(value) { @@ -157,20 +140,24 @@ object Config : PreferenceConfig, DBConfig { refreshLocale() } + var zygisk by dbSettings(Key.ZYGISK, false) + var suManager by dbStrings(Key.SU_MANAGER, "", true) + var keyStoreRaw by dbStrings(Key.KEYSTORE, "", true) + + var suDefaultTimeout by preferenceStrInt(Key.SU_REQUEST_TIMEOUT, 10) + var suAutoResponse by preferenceStrInt(Key.SU_AUTO_RESPONSE, Value.SU_PROMPT) + var suNotification by preferenceStrInt(Key.SU_NOTIFICATION, Value.NOTIFICATION_TOAST) var rootMode by dbSettings(Key.ROOT_ACCESS, Value.ROOT_ACCESS_APPS_AND_ADB) var suMntNamespaceMode by dbSettings(Key.SU_MNT_NS, Value.NAMESPACE_MODE_REQUESTER) var suMultiuserMode by dbSettings(Key.SU_MULTIUSER_MODE, Value.MULTIUSER_MODE_OWNER_ONLY) private var suBiometric by dbSettings(Key.SU_BIOMETRIC, false) - var userAuth + var suAuth get() = Info.isDeviceSecure && suBiometric set(value) { suBiometric = value } - var zygisk by dbSettings(Key.ZYGISK, false) - var bootloop by dbSettings(Key.BOOTLOOP, 0) - var denyList by BoolDBPropertyNoWrite(Key.DENYLIST, false) - var suManager by dbStrings(Key.SU_MANAGER, "", true) - var keyStoreRaw by dbStrings(Key.KEYSTORE, "", true) + var suReAuth by preference(Key.SU_REAUTH, false) + var suTapjack by preference(Key.SU_TAPJACK, true) private const val SU_FINGERPRINT = "su_fingerprint" 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 6435b4f72..c292e8451 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt @@ -7,6 +7,7 @@ import com.topjohnwu.magisk.core.di.AppContext import com.topjohnwu.magisk.core.ktx.getProperty import com.topjohnwu.magisk.core.model.UpdateInfo import com.topjohnwu.magisk.core.repository.NetworkService +import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils.fastCmd val isRunningAsStub get() = Info.stub != null @@ -24,7 +25,8 @@ object Info { } // Device state - @JvmStatic val env by lazy { loadState() } + @JvmStatic var env = Env() + private set @JvmField var isSAR = false var legacySAR = false var isAB = false @@ -36,8 +38,8 @@ object Info { var noDataExec = false var isRooted = false - @JvmField var hasGMS = true - @JvmField val isEmulator = + var hasGMS = true + val isEmulator = getProperty("ro.kernel.qemu", "0") == "1" || getProperty("ro.boot.qemu", "0") == "1" @@ -51,14 +53,6 @@ object Info { val isDeviceSecure get() = AppContext.getSystemService(KeyguardManager::class.java).isDeviceSecure - private fun loadState(): Env { - val v = fastCmd("magisk -v").split(":".toRegex()) - return Env( - v[0], v.size >= 3 && v[2] == "D", - runCatching { fastCmd("magisk -V").toInt() }.getOrDefault(-1) - ) - } - class Env( val versionString: String = "", val isDebug: Boolean = false, @@ -66,10 +60,21 @@ object Info { ) { val versionCode = when { code < Const.Version.MIN_VERCODE -> -1 - isRooted -> code + isRooted -> code else -> -1 } val isUnsupported = code > 0 && code < Const.Version.MIN_VERCODE val isActive = versionCode > 0 } + + fun init(shell: Shell) { + if (shell.isRoot) { + isRooted = true + val v = fastCmd(shell, "magisk -v").split(":".toRegex()) + env = Env( + v[0], v.size >= 3 && v[2] == "D", + runCatching { fastCmd("magisk -V").toInt() }.getOrDefault(-1) + ) + } + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/core/repository/DBConfig.kt b/app/src/main/java/com/topjohnwu/magisk/core/repository/DBConfig.kt index e7df2e7af..1e56bb948 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/repository/DBConfig.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/repository/DBConfig.kt @@ -69,17 +69,6 @@ open class BoolDBProperty( base.setValue(thisRef, property, if (value) 1 else 0) } -class BoolDBPropertyNoWrite( - name: String, - default: Boolean -) : BoolDBProperty(name, default) { - override fun setValue(thisRef: DBConfig, property: KProperty<*>, value: Boolean) { - synchronized(base) { - base.value = if (value) 1 else 0 - } - } -} - class StringDBProperty( private val name: String, private val default: String, diff --git a/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt index 74fb1e31b..0537ba3b9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/ShellInit.kt @@ -20,8 +20,8 @@ import java.util.jar.JarFile class ShellInit : Shell.Initializer() { override fun onInit(context: Context, shell: Shell): Boolean { + Info.init(shell) if (shell.isRoot) { - Info.isRooted = true RootUtils.bindTask?.let { shell.execTask(it) } RootUtils.bindTask = null } @@ -88,6 +88,7 @@ class ShellInit : Shell.Initializer() { Config.recovery = getBool("RECOVERYMODE") Config.keepVerity = getBool("KEEPVERITY") Config.keepEnc = getBool("KEEPFORCEENCRYPT") + Config.denyList = shell.newJob().add("magisk --denylist status").exec().isSuccess return true } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt index dc26bb7ad..62a1e6df7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt @@ -267,7 +267,7 @@ object Tapjack : BaseSettingsItem.Toggle() { object Authentication : BaseSettingsItem.Toggle() { override val title = R.string.settings_su_auth_title.asText() override var description = R.string.settings_su_auth_summary.asText() - override var value by Config::userAuth + override var value by Config::suAuth override fun refresh() { isEnabled = Info.isDeviceSecure 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 af437845d..9e4663eb9 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 @@ -117,7 +117,7 @@ class SuperuserViewModel( } } - if (Config.userAuth) { + if (Config.suAuth) { AuthEvent { updateState() }.publish() } else { SuperuserRevokeDialog(item.title) { updateState() }.show() @@ -170,7 +170,7 @@ class SuperuserViewModel( } } - if (Config.userAuth) { + if (Config.suAuth) { AuthEvent { updateState() }.publish() } else { updateState() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt index 3930a0657..d3825a3f7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt @@ -76,7 +76,7 @@ class SuRequestViewModel( fun grantPressed() { cancelTimer() - if (Config.userAuth) { + if (Config.suAuth) { AuthEvent { respond(ALLOW) }.publish() } else { respond(ALLOW)