Multiple minor changes

This commit is contained in:
topjohnwu 2019-08-12 01:54:33 -07:00
parent 2225ccb146
commit 5fa452aa74
11 changed files with 68 additions and 100 deletions

View File

@ -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
}
}
}
}
} }

View File

@ -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
} }
} }

View File

@ -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)
} }

View File

@ -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

View File

@ -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()
}

View File

@ -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)
) )
} }

View File

@ -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

View File

@ -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)

View File

@ -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(

View File

@ -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)
} }

View File

@ -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)
} }
} }