mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-27 20:15:29 +00:00
Multiple minor changes
This commit is contained in:
parent
2225ccb146
commit
5fa452aa74
@ -3,7 +3,6 @@ package com.topjohnwu.magisk
|
|||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.os.Build
|
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.multidex.MultiDex
|
import androidx.multidex.MultiDex
|
||||||
import androidx.room.Room
|
import androidx.room.Room
|
||||||
@ -14,9 +13,9 @@ import com.topjohnwu.magisk.data.database.RepoDatabase_Impl
|
|||||||
import com.topjohnwu.magisk.di.ActivityTracker
|
import com.topjohnwu.magisk.di.ActivityTracker
|
||||||
import com.topjohnwu.magisk.di.koinModules
|
import com.topjohnwu.magisk.di.koinModules
|
||||||
import com.topjohnwu.magisk.extensions.get
|
import com.topjohnwu.magisk.extensions.get
|
||||||
|
import com.topjohnwu.magisk.net.Networking
|
||||||
import com.topjohnwu.magisk.utils.LocaleManager
|
import com.topjohnwu.magisk.utils.LocaleManager
|
||||||
import com.topjohnwu.magisk.utils.RootUtils
|
import com.topjohnwu.magisk.utils.RootUtils
|
||||||
import com.topjohnwu.magisk.net.Networking
|
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import org.koin.android.ext.koin.androidContext
|
import org.koin.android.ext.koin.androidContext
|
||||||
import org.koin.core.context.startKoin
|
import org.koin.core.context.startKoin
|
||||||
@ -24,7 +23,20 @@ import timber.log.Timber
|
|||||||
|
|
||||||
open class App : Application() {
|
open class App : Application() {
|
||||||
|
|
||||||
lateinit var deContext: Context
|
init {
|
||||||
|
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
|
||||||
|
Shell.Config.setFlags(Shell.FLAG_MOUNT_MASTER or Shell.FLAG_USE_MAGISK_BUSYBOX)
|
||||||
|
Shell.Config.verboseLogging(BuildConfig.DEBUG)
|
||||||
|
Shell.Config.addInitializers(RootUtils::class.java)
|
||||||
|
Shell.Config.setTimeout(2)
|
||||||
|
Room.setFactory {
|
||||||
|
when (it) {
|
||||||
|
WorkDatabase::class.java -> WorkDatabase_Impl()
|
||||||
|
RepoDatabase::class.java -> RepoDatabase_Impl()
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun attachBaseContext(base: Context) {
|
override fun attachBaseContext(base: Context) {
|
||||||
super.attachBaseContext(base)
|
super.attachBaseContext(base)
|
||||||
@ -37,13 +49,6 @@ open class App : Application() {
|
|||||||
modules(koinModules)
|
modules(koinModules)
|
||||||
}
|
}
|
||||||
|
|
||||||
deContext = base
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 24) {
|
|
||||||
deContext = base.createDeviceProtectedStorageContext()
|
|
||||||
deContext.moveSharedPreferencesFrom(base, defaultPrefsName)
|
|
||||||
}
|
|
||||||
|
|
||||||
registerActivityLifecycleCallbacks(get<ActivityTracker>())
|
registerActivityLifecycleCallbacks(get<ActivityTracker>())
|
||||||
|
|
||||||
Networking.init(base)
|
Networking.init(base)
|
||||||
@ -54,24 +59,4 @@ open class App : Application() {
|
|||||||
super.onConfigurationChanged(newConfig)
|
super.onConfigurationChanged(newConfig)
|
||||||
LocaleManager.setLocale(this)
|
LocaleManager.setLocale(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val Context.defaultPrefsName get() = "${packageName}_preferences"
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
init {
|
|
||||||
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
|
|
||||||
Shell.Config.setFlags(Shell.FLAG_MOUNT_MASTER or Shell.FLAG_USE_MAGISK_BUSYBOX)
|
|
||||||
Shell.Config.verboseLogging(BuildConfig.DEBUG)
|
|
||||||
Shell.Config.addInitializers(RootUtils::class.java)
|
|
||||||
Shell.Config.setTimeout(2)
|
|
||||||
Room.setFactory {
|
|
||||||
when (it) {
|
|
||||||
WorkDatabase::class.java -> WorkDatabase_Impl()
|
|
||||||
RepoDatabase::class.java -> RepoDatabase_Impl()
|
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -62,20 +62,14 @@ class PolicyDao(
|
|||||||
|
|
||||||
|
|
||||||
private fun Map<String, String>.toPolicySafe(): MagiskPolicy? {
|
private fun Map<String, String>.toPolicySafe(): MagiskPolicy? {
|
||||||
val taskResult = runCatching { toPolicy(context.packageManager) }
|
return runCatching { toPolicy(context.packageManager) }.getOrElse {
|
||||||
val result = taskResult.getOrNull()
|
Timber.e(it)
|
||||||
val exception = taskResult.exceptionOrNull()
|
if (it is PackageManager.NameNotFoundException) {
|
||||||
|
|
||||||
Timber.e(exception)
|
|
||||||
|
|
||||||
when (exception) {
|
|
||||||
is PackageManager.NameNotFoundException -> {
|
|
||||||
val uid = getOrElse("uid") { null } ?: return null
|
val uid = getOrElse("uid") { null } ?: return null
|
||||||
delete(uid).subscribe()
|
delete(uid).subscribe()
|
||||||
}
|
}
|
||||||
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -5,11 +5,11 @@ import com.topjohnwu.magisk.Config
|
|||||||
import com.topjohnwu.magisk.Info
|
import com.topjohnwu.magisk.Info
|
||||||
import com.topjohnwu.magisk.data.database.base.su
|
import com.topjohnwu.magisk.data.database.base.su
|
||||||
import com.topjohnwu.magisk.data.network.GithubRawServices
|
import com.topjohnwu.magisk.data.network.GithubRawServices
|
||||||
|
import com.topjohnwu.magisk.extensions.getLabel
|
||||||
import com.topjohnwu.magisk.extensions.packageName
|
import com.topjohnwu.magisk.extensions.packageName
|
||||||
import com.topjohnwu.magisk.extensions.toSingle
|
import com.topjohnwu.magisk.extensions.toSingle
|
||||||
import com.topjohnwu.magisk.model.entity.HideAppInfo
|
import com.topjohnwu.magisk.model.entity.HideAppInfo
|
||||||
import com.topjohnwu.magisk.model.entity.HideTarget
|
import com.topjohnwu.magisk.model.entity.HideTarget
|
||||||
import com.topjohnwu.magisk.utils.Utils
|
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ class MagiskRepository(
|
|||||||
.flattenAsFlowable { it }
|
.flattenAsFlowable { it }
|
||||||
.filter { it.enabled && !blacklist.contains(it.packageName) }
|
.filter { it.enabled && !blacklist.contains(it.packageName) }
|
||||||
.map {
|
.map {
|
||||||
val label = Utils.getAppLabel(it, packageManager)
|
val label = it.getLabel(packageManager)
|
||||||
val icon = it.loadIcon(packageManager)
|
val icon = it.loadIcon(packageManager)
|
||||||
HideAppInfo(it, label, icon)
|
HideAppInfo(it, label, icon)
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@ import android.annotation.SuppressLint
|
|||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.skoumal.teanity.rxbus.RxBus
|
import com.skoumal.teanity.rxbus.RxBus
|
||||||
import com.topjohnwu.magisk.App
|
|
||||||
import org.koin.core.qualifier.named
|
import org.koin.core.qualifier.named
|
||||||
import org.koin.dsl.module
|
import org.koin.dsl.module
|
||||||
|
|
||||||
@ -17,15 +17,20 @@ val Protected = named("protected")
|
|||||||
val applicationModule = module {
|
val applicationModule = module {
|
||||||
single { RxBus() }
|
single { RxBus() }
|
||||||
factory { get<Context>().resources }
|
factory { get<Context>().resources }
|
||||||
factory { get<Context>() as App }
|
|
||||||
factory { get<Context>().packageManager }
|
factory { get<Context>().packageManager }
|
||||||
factory(Protected) { get<App>().deContext }
|
factory(Protected) { createDEContext(get()) }
|
||||||
single(SUTimeout) { get<Context>(Protected).getSharedPreferences("su_timeout", 0) }
|
single(SUTimeout) { get<Context>(Protected).getSharedPreferences("su_timeout", 0) }
|
||||||
single { PreferenceManager.getDefaultSharedPreferences(get<Context>(Protected)) }
|
single { PreferenceManager.getDefaultSharedPreferences(get<Context>(Protected)) }
|
||||||
single { ActivityTracker() }
|
single { ActivityTracker() }
|
||||||
factory { get<ActivityTracker>().foreground ?: NullActivity }
|
factory { get<ActivityTracker>().foreground ?: NullActivity }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createDEContext(context: Context): Context {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 24)
|
||||||
|
context.createDeviceProtectedStorageContext()
|
||||||
|
else context
|
||||||
|
}
|
||||||
|
|
||||||
class ActivityTracker : Application.ActivityLifecycleCallbacks {
|
class ActivityTracker : Application.ActivityLifecycleCallbacks {
|
||||||
|
|
||||||
@Volatile
|
@Volatile
|
||||||
|
@ -7,10 +7,12 @@ import android.content.pm.ComponentInfo
|
|||||||
import android.content.pm.PackageInfo
|
import android.content.pm.PackageInfo
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.content.pm.PackageManager.*
|
import android.content.pm.PackageManager.*
|
||||||
|
import android.content.res.Configuration
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.OpenableColumns
|
import android.provider.OpenableColumns
|
||||||
import com.topjohnwu.magisk.utils.FileProvider
|
import com.topjohnwu.magisk.utils.FileProvider
|
||||||
|
import com.topjohnwu.magisk.utils.currentLocale
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
|
|
||||||
@ -81,10 +83,6 @@ fun Context.rawResource(id: Int) = resources.openRawResource(id)
|
|||||||
fun Context.readUri(uri: Uri) =
|
fun Context.readUri(uri: Uri) =
|
||||||
contentResolver.openInputStream(uri) ?: throw FileNotFoundException()
|
contentResolver.openInputStream(uri) ?: throw FileNotFoundException()
|
||||||
|
|
||||||
fun ApplicationInfo.findAppLabel(pm: PackageManager): String {
|
|
||||||
return pm.getApplicationLabel(this).toString().orEmpty()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Intent.startActivity(context: Context) = context.startActivity(this)
|
fun Intent.startActivity(context: Context) = context.startActivity(this)
|
||||||
|
|
||||||
fun File.provide(context: Context = get()): Uri {
|
fun File.provide(context: Context = get()): Uri {
|
||||||
@ -107,3 +105,17 @@ fun <Result> Cursor.toList(transformer: (Cursor) -> Result): List<Result> {
|
|||||||
while (moveToNext()) out.add(transformer(this))
|
while (moveToNext()) out.add(transformer(this))
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun ApplicationInfo.getLabel(pm: PackageManager): String {
|
||||||
|
runCatching {
|
||||||
|
if (labelRes > 0) {
|
||||||
|
val res = pm.getResourcesForApplication(this)
|
||||||
|
val config = Configuration()
|
||||||
|
config.setLocale(currentLocale)
|
||||||
|
res.updateConfiguration(config, res.displayMetrics)
|
||||||
|
return res.getString(labelRes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return loadLabel(pm).toString()
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ package com.topjohnwu.magisk.model.entity
|
|||||||
|
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import com.topjohnwu.magisk.extensions.getLabel
|
||||||
import com.topjohnwu.magisk.model.entity.MagiskPolicy.Companion.INTERACTIVE
|
import com.topjohnwu.magisk.model.entity.MagiskPolicy.Companion.INTERACTIVE
|
||||||
|
|
||||||
|
|
||||||
@ -50,7 +51,7 @@ fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
|
|||||||
logging = get("logging")?.toIntOrNull() != 0,
|
logging = get("logging")?.toIntOrNull() != 0,
|
||||||
notification = get("notification")?.toIntOrNull() != 0,
|
notification = get("notification")?.toIntOrNull() != 0,
|
||||||
applicationInfo = info,
|
applicationInfo = info,
|
||||||
appName = info.loadLabel(pm).toString()
|
appName = info.getLabel(pm)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,20 +33,18 @@ open class GeneralReceiver : BroadcastReceiver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getPkg(intent: Intent): String {
|
private fun getPkg(intent: Intent): String {
|
||||||
return intent.data?.encodedSchemeSpecificPart ?: ""
|
return intent.data?.encodedSchemeSpecificPart.orEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onReceive(context: Context, intent: Intent?) {
|
override fun onReceive(context: Context, intent: Intent?) {
|
||||||
if (intent == null)
|
intent ?: return
|
||||||
return
|
when (intent.action ?: return) {
|
||||||
var action: String? = intent.action ?: return
|
|
||||||
when (action) {
|
|
||||||
Intent.ACTION_REBOOT, Intent.ACTION_BOOT_COMPLETED -> {
|
Intent.ACTION_REBOOT, Intent.ACTION_BOOT_COMPLETED -> {
|
||||||
action = intent.getStringExtra("action")
|
val action = intent.getStringExtra("action")
|
||||||
if (action == null) {
|
if (action == null) {
|
||||||
// Actual boot completed event
|
// Actual boot completed event
|
||||||
Shell.su("mm_patch_dtbo").submit { result ->
|
Shell.su("mm_patch_dtbo").submit {
|
||||||
if (result.isSuccess)
|
if (it.isSuccess)
|
||||||
Notifications.dtboPatched(context)
|
Notifications.dtboPatched(context)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -53,7 +53,7 @@ open class SplashActivity : AppCompatActivity() {
|
|||||||
Notifications.setup(this)
|
Notifications.setup(this)
|
||||||
|
|
||||||
// Schedule periodic update checks
|
// Schedule periodic update checks
|
||||||
Utils.scheduleUpdateCheck()
|
Utils.scheduleUpdateCheck(this)
|
||||||
|
|
||||||
// Setup shortcuts
|
// Setup shortcuts
|
||||||
Shortcuts.setup(this)
|
Shortcuts.setup(this)
|
||||||
|
@ -11,7 +11,6 @@ import androidx.core.view.children
|
|||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.preference.*
|
import androidx.preference.*
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.topjohnwu.magisk.App
|
|
||||||
import com.topjohnwu.magisk.R
|
import com.topjohnwu.magisk.R
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
|
|
||||||
@ -19,7 +18,6 @@ abstract class BasePreferenceFragment : PreferenceFragmentCompat(),
|
|||||||
SharedPreferences.OnSharedPreferenceChangeListener {
|
SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
protected val prefs: SharedPreferences by inject()
|
protected val prefs: SharedPreferences by inject()
|
||||||
protected val app: App by inject()
|
|
||||||
protected val activity get() = requireActivity() as MagiskActivity<*, *>
|
protected val activity get() = requireActivity() as MagiskActivity<*, *>
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
|
@ -26,10 +26,10 @@ import com.topjohnwu.magisk.model.download.DownloadService
|
|||||||
import com.topjohnwu.magisk.model.entity.internal.Configuration
|
import com.topjohnwu.magisk.model.entity.internal.Configuration
|
||||||
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
|
import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
|
||||||
import com.topjohnwu.magisk.model.observer.Observer
|
import com.topjohnwu.magisk.model.observer.Observer
|
||||||
|
import com.topjohnwu.magisk.net.Networking
|
||||||
import com.topjohnwu.magisk.ui.base.BasePreferenceFragment
|
import com.topjohnwu.magisk.ui.base.BasePreferenceFragment
|
||||||
import com.topjohnwu.magisk.utils.*
|
import com.topjohnwu.magisk.utils.*
|
||||||
import com.topjohnwu.magisk.view.dialogs.FingerprintAuthDialog
|
import com.topjohnwu.magisk.view.dialogs.FingerprintAuthDialog
|
||||||
import com.topjohnwu.magisk.net.Networking
|
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import io.reactivex.Completable
|
import io.reactivex.Completable
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
@ -155,7 +155,7 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Shell.rootAccess() && Const.USER_ID == 0) {
|
if (Shell.rootAccess() && Const.USER_ID == 0) {
|
||||||
if (app.packageName == BuildConfig.APPLICATION_ID) {
|
if (activity.packageName == BuildConfig.APPLICATION_ID) {
|
||||||
generalCatagory.removePreference(restoreManager)
|
generalCatagory.removePreference(restoreManager)
|
||||||
} else {
|
} else {
|
||||||
if (!Networking.checkNetworkStatus(requireContext())) {
|
if (!Networking.checkNetworkStatus(requireContext())) {
|
||||||
@ -179,10 +179,12 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onSharedPreferenceChanged(prefs: SharedPreferences, key: String) {
|
override fun onSharedPreferenceChanged(prefs: SharedPreferences, key: String) {
|
||||||
|
fun getStrInt() = prefs.getString(key, null)?.toInt() ?: 0
|
||||||
|
|
||||||
when (key) {
|
when (key) {
|
||||||
Config.Key.ROOT_ACCESS -> Config.rootMode = Utils.getPrefsInt(prefs, key)
|
Config.Key.ROOT_ACCESS -> Config.rootMode = getStrInt()
|
||||||
Config.Key.SU_MULTIUSER_MODE -> Config.suMultiuserMode = Utils.getPrefsInt(prefs, key)
|
Config.Key.SU_MULTIUSER_MODE -> Config.suMultiuserMode = getStrInt()
|
||||||
Config.Key.SU_MNT_NS -> Config.suMntNamespaceMode = Utils.getPrefsInt(prefs, key)
|
Config.Key.SU_MNT_NS -> Config.suMntNamespaceMode = getStrInt()
|
||||||
Config.Key.DARK_THEME -> requireActivity().recreate()
|
Config.Key.DARK_THEME -> requireActivity().recreate()
|
||||||
Config.Key.COREONLY -> {
|
Config.Key.COREONLY -> {
|
||||||
if (prefs.getBoolean(key, false)) {
|
if (prefs.getBoolean(key, false)) {
|
||||||
@ -200,10 +202,10 @@ class SettingsFragment : BasePreferenceFragment() {
|
|||||||
Shell.su("magiskhide --disable").submit()
|
Shell.su("magiskhide --disable").submit()
|
||||||
}
|
}
|
||||||
Config.Key.LOCALE -> {
|
Config.Key.LOCALE -> {
|
||||||
LocaleManager.setLocale(app)
|
LocaleManager.setLocale(activity.application)
|
||||||
requireActivity().recreate()
|
activity.recreate()
|
||||||
}
|
}
|
||||||
Config.Key.CHECK_UPDATES -> Utils.scheduleUpdateCheck()
|
Config.Key.CHECK_UPDATES -> Utils.scheduleUpdateCheck(activity)
|
||||||
}
|
}
|
||||||
setSummary(key)
|
setSummary(key)
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,6 @@ package com.topjohnwu.magisk.utils
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
|
||||||
import android.content.pm.ApplicationInfo
|
|
||||||
import android.content.pm.PackageManager
|
|
||||||
import android.content.res.Configuration
|
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
@ -18,7 +14,6 @@ import com.topjohnwu.magisk.model.update.UpdateCheckService
|
|||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
import com.topjohnwu.superuser.internal.UiThreadHandler
|
import com.topjohnwu.superuser.internal.UiThreadHandler
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
object Utils {
|
object Utils {
|
||||||
@ -33,40 +28,17 @@ object Utils {
|
|||||||
UiThreadHandler.run { Toast.makeText(get(), resId, duration).show() }
|
UiThreadHandler.run { Toast.makeText(get(), resId, duration).show() }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getPrefsInt(prefs: SharedPreferences, key: String, def: Int = 0): Int {
|
|
||||||
return prefs.getString(key, def.toString())!!.toInt()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun dpInPx(dp: Int): Int {
|
fun dpInPx(dp: Int): Int {
|
||||||
val scale = get<Resources>().displayMetrics.density
|
val scale = get<Resources>().displayMetrics.density
|
||||||
return (dp * scale + 0.5).toInt()
|
return (dp * scale + 0.5).toInt()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun fmt(fmt: String, vararg args: Any): String {
|
|
||||||
return String.format(Locale.US, fmt, *args)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getAppLabel(info: ApplicationInfo, pm: PackageManager): String {
|
|
||||||
try {
|
|
||||||
if (info.labelRes > 0) {
|
|
||||||
val res = pm.getResourcesForApplication(info)
|
|
||||||
val config = Configuration()
|
|
||||||
config.setLocale(currentLocale)
|
|
||||||
res.updateConfiguration(config, res.displayMetrics)
|
|
||||||
return res.getString(info.labelRes)
|
|
||||||
}
|
|
||||||
} catch (ignored: Exception) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return info.loadLabel(pm).toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun showSuperUser(): Boolean {
|
fun showSuperUser(): Boolean {
|
||||||
return Shell.rootAccess() && (Const.USER_ID == 0
|
return Shell.rootAccess() && (Const.USER_ID == 0
|
||||||
|| Config.suMultiuserMode != Config.Value.MULTIUSER_MODE_OWNER_MANAGED)
|
|| Config.suMultiuserMode != Config.Value.MULTIUSER_MODE_OWNER_MANAGED)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun scheduleUpdateCheck() {
|
fun scheduleUpdateCheck(context: Context) {
|
||||||
if (Config.checkUpdate) {
|
if (Config.checkUpdate) {
|
||||||
val constraints = Constraints.Builder()
|
val constraints = Constraints.Builder()
|
||||||
.setRequiredNetworkType(NetworkType.CONNECTED)
|
.setRequiredNetworkType(NetworkType.CONNECTED)
|
||||||
@ -76,11 +48,12 @@ object Utils {
|
|||||||
.Builder(ClassMap[UpdateCheckService::class.java], 12, TimeUnit.HOURS)
|
.Builder(ClassMap[UpdateCheckService::class.java], 12, TimeUnit.HOURS)
|
||||||
.setConstraints(constraints)
|
.setConstraints(constraints)
|
||||||
.build()
|
.build()
|
||||||
WorkManager.getInstance().enqueueUniquePeriodicWork(
|
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
|
||||||
Const.ID.CHECK_MAGISK_UPDATE_WORKER_ID,
|
Const.ID.CHECK_MAGISK_UPDATE_WORKER_ID,
|
||||||
ExistingPeriodicWorkPolicy.REPLACE, request)
|
ExistingPeriodicWorkPolicy.REPLACE, request)
|
||||||
} else {
|
} else {
|
||||||
WorkManager.getInstance().cancelUniqueWork(Const.ID.CHECK_MAGISK_UPDATE_WORKER_ID)
|
WorkManager.getInstance(context)
|
||||||
|
.cancelUniqueWork(Const.ID.CHECK_MAGISK_UPDATE_WORKER_ID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user