2019-04-11 20:01:49 +02:00
|
|
|
package com.topjohnwu.magisk
|
|
|
|
|
|
|
|
import android.annotation.SuppressLint
|
|
|
|
import android.app.Activity
|
|
|
|
import android.app.Application
|
|
|
|
import android.content.Context
|
|
|
|
import android.content.SharedPreferences
|
|
|
|
import android.content.res.Configuration
|
|
|
|
import android.os.AsyncTask
|
|
|
|
import android.os.Build
|
|
|
|
import android.os.Bundle
|
|
|
|
import androidx.appcompat.app.AppCompatDelegate
|
2019-04-19 02:11:22 -04:00
|
|
|
import androidx.multidex.MultiDex
|
2019-04-11 20:01:49 +02:00
|
|
|
import com.topjohnwu.magisk.data.database.MagiskDB
|
|
|
|
import com.topjohnwu.magisk.data.database.RepoDatabaseHelper
|
|
|
|
import com.topjohnwu.magisk.di.koinModules
|
|
|
|
import com.topjohnwu.magisk.utils.LocaleManager
|
|
|
|
import com.topjohnwu.magisk.utils.RootUtils
|
2019-04-27 11:27:42 +02:00
|
|
|
import com.topjohnwu.magisk.utils.inject
|
2019-04-11 20:01:49 +02:00
|
|
|
import com.topjohnwu.net.Networking
|
|
|
|
import com.topjohnwu.superuser.Shell
|
2019-04-22 16:00:48 +02:00
|
|
|
import org.koin.android.ext.android.inject
|
2019-04-11 20:01:49 +02:00
|
|
|
import org.koin.android.ext.koin.androidContext
|
|
|
|
import org.koin.core.context.startKoin
|
2019-04-14 11:00:16 +02:00
|
|
|
import timber.log.Timber
|
2019-04-11 20:01:49 +02:00
|
|
|
import java.util.concurrent.ThreadPoolExecutor
|
|
|
|
|
|
|
|
open class App : Application(), Application.ActivityLifecycleCallbacks {
|
|
|
|
|
2019-04-26 21:23:25 +02:00
|
|
|
lateinit var protectedContext: Context
|
2019-04-27 11:27:42 +02:00
|
|
|
|
|
|
|
@Deprecated("Use dependency injection")
|
|
|
|
val prefs: SharedPreferences by inject()
|
|
|
|
@Deprecated("Use dependency injection")
|
|
|
|
val DB: MagiskDB by inject()
|
2019-04-22 16:00:48 +02:00
|
|
|
@Deprecated("Use dependency injection")
|
|
|
|
val repoDB: RepoDatabaseHelper by inject()
|
2019-04-27 11:27:42 +02:00
|
|
|
|
2019-04-11 20:01:49 +02:00
|
|
|
@Volatile
|
|
|
|
private var foreground: Activity? = null
|
|
|
|
|
2019-04-27 11:27:42 +02:00
|
|
|
override fun attachBaseContext(base: Context) {
|
|
|
|
super.attachBaseContext(base)
|
|
|
|
MultiDex.install(base)
|
|
|
|
Timber.plant(Timber.DebugTree())
|
2019-04-11 20:01:49 +02:00
|
|
|
|
|
|
|
startKoin {
|
|
|
|
androidContext(this@App)
|
|
|
|
modules(koinModules)
|
|
|
|
}
|
2019-04-14 11:00:16 +02:00
|
|
|
|
2019-04-26 21:23:25 +02:00
|
|
|
protectedContext = baseContext
|
2019-04-11 20:01:49 +02:00
|
|
|
self = this
|
|
|
|
deContext = base
|
|
|
|
|
|
|
|
if (Build.VERSION.SDK_INT >= 24) {
|
2019-04-26 21:23:25 +02:00
|
|
|
protectedContext = base.createDeviceProtectedStorageContext()
|
|
|
|
deContext = protectedContext
|
2019-04-17 14:03:25 +02:00
|
|
|
deContext.moveSharedPreferencesFrom(base, base.defaultPrefsName)
|
2019-04-11 20:01:49 +02:00
|
|
|
}
|
|
|
|
|
2019-04-27 11:27:42 +02:00
|
|
|
registerActivityLifecycleCallbacks(this)
|
|
|
|
|
2019-04-11 20:01:49 +02:00
|
|
|
Networking.init(base)
|
|
|
|
LocaleManager.setLocale(this)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onConfigurationChanged(newConfig: Configuration) {
|
|
|
|
super.onConfigurationChanged(newConfig)
|
|
|
|
LocaleManager.setLocale(this)
|
|
|
|
}
|
|
|
|
|
|
|
|
//region ActivityLifecycleCallbacks
|
|
|
|
override fun onActivityCreated(activity: Activity, bundle: Bundle?) {}
|
|
|
|
|
|
|
|
override fun onActivityStarted(activity: Activity) {}
|
|
|
|
|
|
|
|
@Synchronized
|
|
|
|
override fun onActivityResumed(activity: Activity) {
|
|
|
|
foreground = activity
|
|
|
|
}
|
|
|
|
|
|
|
|
@Synchronized
|
|
|
|
override fun onActivityPaused(activity: Activity) {
|
|
|
|
foreground = null
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onActivityStopped(activity: Activity) {}
|
|
|
|
|
|
|
|
override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {}
|
|
|
|
|
|
|
|
override fun onActivityDestroyed(activity: Activity) {}
|
|
|
|
//endregion
|
|
|
|
|
2019-04-17 14:03:25 +02:00
|
|
|
private val Context.defaultPrefsName get() = "${packageName}_preferences"
|
|
|
|
|
2019-04-11 20:01:49 +02:00
|
|
|
companion object {
|
|
|
|
|
|
|
|
@SuppressLint("StaticFieldLeak")
|
2019-04-22 16:00:48 +02:00
|
|
|
@Deprecated("Use dependency injection")
|
2019-04-11 20:01:49 +02:00
|
|
|
@JvmStatic
|
|
|
|
lateinit var self: App
|
|
|
|
|
|
|
|
@SuppressLint("StaticFieldLeak")
|
2019-04-27 11:27:42 +02:00
|
|
|
@Deprecated("Use dependency injection; replace with protectedContext")
|
2019-04-11 20:01:49 +02:00
|
|
|
@JvmStatic
|
|
|
|
lateinit var deContext: Context
|
|
|
|
|
2019-04-27 11:27:42 +02:00
|
|
|
@Deprecated("Use Rx or similar")
|
2019-04-11 20:01:49 +02:00
|
|
|
@JvmField
|
|
|
|
var THREAD_POOL: ThreadPoolExecutor
|
|
|
|
|
|
|
|
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)
|
|
|
|
THREAD_POOL = AsyncTask.THREAD_POOL_EXECUTOR as ThreadPoolExecutor
|
|
|
|
}
|
|
|
|
|
2019-04-22 16:00:48 +02:00
|
|
|
@Deprecated("")
|
2019-04-11 20:01:49 +02:00
|
|
|
@JvmStatic
|
|
|
|
fun foreground(): Activity? {
|
2019-04-27 11:27:42 +02:00
|
|
|
val app: App by inject()
|
|
|
|
return app.foreground
|
2019-04-11 20:01:49 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|