From 038f73a5f7102283e857cb1f450e217a648c6a87 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 18 Apr 2021 04:46:11 -0700 Subject: [PATCH] Remove Koin Non static DI is bad --- app/build.gradle.kts | 4 - .../topjohnwu/magisk/arch/BaseViewModel.kt | 3 +- .../java/com/topjohnwu/magisk/core/App.kt | 10 +-- .../java/com/topjohnwu/magisk/core/Config.kt | 12 +-- .../java/com/topjohnwu/magisk/core/Info.kt | 4 +- .../com/topjohnwu/magisk/core/Receiver.kt | 5 +- .../topjohnwu/magisk/core/SplashActivity.kt | 5 +- .../magisk/core/UpdateCheckService.kt | 8 +- .../magisk/core/base/BaseReceiver.kt | 3 +- .../topjohnwu/magisk/core/base/BaseService.kt | 3 +- .../magisk/core/download/BaseDownloader.kt | 10 +-- .../topjohnwu/magisk/core/download/Subject.kt | 5 +- .../magisk/core/magiskdb/PolicyDao.kt | 8 +- .../magisk/core/model/module/OnlineModule.kt | 5 +- .../magisk/core/su/SuCallbackHandler.kt | 6 +- .../topjohnwu/magisk/core/tasks/FlashZip.kt | 10 +-- .../topjohnwu/magisk/core/tasks/HideAPK.kt | 5 +- .../magisk/core/tasks/MagiskInstaller.kt | 16 ++-- .../magisk/core/utils/BiometricHelper.kt | 7 +- .../magisk/core/utils/MediaStoreUtils.kt | 6 +- .../magisk/data/repository/DBConfig.kt | 18 ++-- .../magisk/databinding/DataBindingAdapters.kt | 6 +- .../topjohnwu/magisk/di/ApplicationModule.kt | 19 ---- .../com/topjohnwu/magisk/di/DatabaseModule.kt | 32 ------- .../java/com/topjohnwu/magisk/di/Modules.kt | 9 -- .../di/{NetworkingModule.kt => Networking.kt} | 16 ---- .../topjohnwu/magisk/di/RepositoryModule.kt | 11 --- .../com/topjohnwu/magisk/di/ServiceLocator.kt | 86 +++++++++++++++++++ .../topjohnwu/magisk/di/ViewModelsModule.kt | 32 ------- .../events/dialog/ManagerInstallDialog.kt | 13 ++- .../magisk/events/dialog/MarkDownDialog.kt | 10 +-- .../java/com/topjohnwu/magisk/ktx/XAndroid.kt | 2 - .../java/com/topjohnwu/magisk/ktx/XKoin.kt | 17 ---- .../java/com/topjohnwu/magisk/ktx/XString.kt | 7 -- .../com/topjohnwu/magisk/ui/MainActivity.kt | 2 +- .../magisk/ui/flash/FlashFragment.kt | 12 +-- .../magisk/ui/flash/FlashViewModel.kt | 3 +- .../topjohnwu/magisk/ui/hide/HideFragment.kt | 2 +- .../topjohnwu/magisk/ui/hide/HideViewModel.kt | 8 +- .../topjohnwu/magisk/ui/home/HomeFragment.kt | 2 +- .../magisk/ui/install/InstallFragment.kt | 2 +- .../magisk/ui/install/InstallViewModel.kt | 6 +- .../topjohnwu/magisk/ui/log/LogFragment.kt | 2 +- .../magisk/ui/module/ModuleFragment.kt | 2 +- .../ui/safetynet/CheckSafetyNetEvent.kt | 8 +- .../magisk/ui/safetynet/SafetynetFragment.kt | 2 +- .../magisk/ui/settings/SettingsFragment.kt | 2 +- .../magisk/ui/settings/SettingsItems.kt | 4 +- .../magisk/ui/settings/SettingsViewModel.kt | 5 +- .../magisk/ui/superuser/SuperuserFragment.kt | 2 +- .../magisk/ui/surequest/SuRequestActivity.kt | 2 +- .../magisk/ui/surequest/SuRequestViewModel.kt | 7 +- .../magisk/ui/theme/ThemeFragment.kt | 2 +- .../com/topjohnwu/magisk/utils/TextHolder.kt | 2 +- .../java/com/topjohnwu/magisk/utils/Utils.kt | 6 +- .../topjohnwu/magisk/view/Notifications.kt | 4 +- 56 files changed, 194 insertions(+), 306 deletions(-) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/di/Modules.kt rename app/src/main/java/com/topjohnwu/magisk/di/{NetworkingModule.kt => Networking.kt} (81%) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt create mode 100644 app/src/main/java/com/topjohnwu/magisk/di/ServiceLocator.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt delete mode 100644 app/src/main/java/com/topjohnwu/magisk/ktx/XKoin.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9c3f275dd..1b67c773b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -209,10 +209,6 @@ dependencies { implementation("com.github.topjohnwu.libsu:core:${vLibsu}") implementation("com.github.topjohnwu.libsu:io:${vLibsu}") - val vKoin = "2.2.2" - implementation("io.insert-koin:koin-android:${vKoin}") - implementation("io.insert-koin:koin-androidx-viewmodel:${vKoin}") - val vRetrofit = "2.9.0" implementation("com.squareup.retrofit2:retrofit:${vRetrofit}") implementation("com.squareup.retrofit2:converter-moshi:${vRetrofit}") diff --git a/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt index 46c3c5bb3..aebff32b6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt @@ -19,11 +19,10 @@ import com.topjohnwu.magisk.events.* import com.topjohnwu.magisk.utils.ObservableHost import com.topjohnwu.magisk.utils.set import kotlinx.coroutines.Job -import org.koin.core.component.KoinComponent abstract class BaseViewModel( initialState: State = State.LOADING -) : ViewModel(), ObservableHost, KoinComponent { +) : ViewModel(), ObservableHost { override var callbacks: PropertyChangeRegistry? = null diff --git a/app/src/main/java/com/topjohnwu/magisk/core/App.kt b/app/src/main/java/com/topjohnwu/magisk/core/App.kt index ee8f3c3ac..0e0f41aa0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/App.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/App.kt @@ -13,11 +13,9 @@ import com.topjohnwu.magisk.core.utils.AppShellInit import com.topjohnwu.magisk.core.utils.BusyBoxInit import com.topjohnwu.magisk.core.utils.IODispatcherExecutor import com.topjohnwu.magisk.core.utils.updateConfig -import com.topjohnwu.magisk.di.koinModules +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ktx.unwrap import com.topjohnwu.superuser.Shell -import org.koin.android.ext.koin.androidContext -import org.koin.core.context.startKoin import timber.log.Timber import java.io.File import kotlin.system.exitProcess @@ -64,11 +62,7 @@ open class App() : Application() { }.getOrNull() ?: info.nativeLibraryDir Const.NATIVE_LIB_DIR = File(libDir) - // Normal startup - startKoin { - androidContext(wrapped) - modules(koinModules) - } + ServiceLocator.context = wrapped AssetHack.init(impl) app.registerActivityLifecycleCallbacks(ForegroundTracker) WorkManager.initialize(impl.wrapJob(), androidx.work.Configuration.Builder().build()) 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 a854886db..85898b064 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Config.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Config.kt @@ -1,20 +1,16 @@ package com.topjohnwu.magisk.core import android.annotation.SuppressLint -import android.content.Context import android.content.SharedPreferences import android.util.Xml import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.edit import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.core.magiskdb.SettingsDao -import com.topjohnwu.magisk.core.magiskdb.StringDao import com.topjohnwu.magisk.core.utils.BiometricHelper import com.topjohnwu.magisk.core.utils.refreshLocale import com.topjohnwu.magisk.data.preference.PreferenceModel import com.topjohnwu.magisk.data.repository.DBConfig -import com.topjohnwu.magisk.di.Protected -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ui.theme.Theme import org.xmlpull.v1.XmlPullParser import java.io.File @@ -22,9 +18,9 @@ import java.io.InputStream object Config : PreferenceModel, DBConfig { - override val stringDao: StringDao by inject() - override val settingsDao: SettingsDao by inject() - override val context: Context by inject(Protected) + override val stringDB get() = ServiceLocator.stringDB + override val settingsDB get() = ServiceLocator.settingsDB + override val context get() = ServiceLocator.deContext @get:SuppressLint("ApplySharedPref") val prefsFile: File get() { 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 3e5151385..d00baa3b9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Info.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Info.kt @@ -6,7 +6,7 @@ import com.topjohnwu.magisk.DynAPK import com.topjohnwu.magisk.core.model.UpdateInfo import com.topjohnwu.magisk.core.utils.net.NetworkObserver import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.ktx.getProperty import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils.fastCmd @@ -43,7 +43,7 @@ object Info { val isConnected by lazy { ObservableBoolean(false).also { field -> - NetworkObserver.observe(get()) { + NetworkObserver.observe(AppContext) { UiThreadHandler.run { field.set(it) } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt b/app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt index 758c44d27..35efc2d7f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt @@ -4,8 +4,7 @@ import android.annotation.SuppressLint import android.content.ContextWrapper import android.content.Intent import com.topjohnwu.magisk.core.base.BaseReceiver -import com.topjohnwu.magisk.core.magiskdb.PolicyDao -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.view.Shortcuts import com.topjohnwu.superuser.Shell import kotlinx.coroutines.GlobalScope @@ -13,7 +12,7 @@ import kotlinx.coroutines.launch open class Receiver : BaseReceiver() { - private val policyDB: PolicyDao by inject() + private val policyDB get() = ServiceLocator.policyDB @SuppressLint("InlinedApi") private fun getPkg(intent: Intent): String? { diff --git a/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt index a18fb309f..6f6d2e9e9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt @@ -7,8 +7,7 @@ import com.topjohnwu.magisk.BuildConfig.APPLICATION_ID import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.base.BaseActivity import com.topjohnwu.magisk.core.tasks.HideAPK -import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.magisk.view.Notifications @@ -68,7 +67,7 @@ open class SplashActivity : BaseActivity() { Shortcuts.setupDynamic(this) // Pre-fetch network services - get() + ServiceLocator.networkService DONE = true startActivity(redirect()) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt b/app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt index 824aaafa1..89d01a111 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt @@ -4,16 +4,14 @@ import android.annotation.SuppressLint import android.content.Context import androidx.work.* import com.topjohnwu.magisk.BuildConfig -import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.view.Notifications -import org.koin.core.component.KoinComponent import java.util.concurrent.TimeUnit class UpdateCheckService(context: Context, workerParams: WorkerParameters) - : CoroutineWorker(context, workerParams), KoinComponent { + : CoroutineWorker(context, workerParams) { - private val svc: NetworkService by inject() + private val svc get() = ServiceLocator.networkService override suspend fun doWork(): Result { return svc.fetchUpdate()?.run { diff --git a/app/src/main/java/com/topjohnwu/magisk/core/base/BaseReceiver.kt b/app/src/main/java/com/topjohnwu/magisk/core/base/BaseReceiver.kt index e6fefd92e..50f79539d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/base/BaseReceiver.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/base/BaseReceiver.kt @@ -5,9 +5,8 @@ import android.content.Context import android.content.ContextWrapper import android.content.Intent import com.topjohnwu.magisk.core.wrap -import org.koin.core.component.KoinComponent -abstract class BaseReceiver : BroadcastReceiver(), KoinComponent { +abstract class BaseReceiver : BroadcastReceiver() { final override fun onReceive(context: Context, intent: Intent?) { onReceive(context.wrap() as ContextWrapper, intent) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/base/BaseService.kt b/app/src/main/java/com/topjohnwu/magisk/core/base/BaseService.kt index e6b674483..db9ab53e4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/base/BaseService.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/base/BaseService.kt @@ -3,9 +3,8 @@ package com.topjohnwu.magisk.core.base import android.app.Service import android.content.Context import com.topjohnwu.magisk.core.wrap -import org.koin.core.component.KoinComponent -abstract class BaseService : Service(), KoinComponent { +abstract class BaseService : Service() { override fun attachBaseContext(base: Context) { super.attachBaseContext(base.wrap()) } diff --git a/app/src/main/java/com/topjohnwu/magisk/core/download/BaseDownloader.kt b/app/src/main/java/com/topjohnwu/magisk/core/download/BaseDownloader.kt index 91d90bd6d..591ec3ade 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/download/BaseDownloader.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/download/BaseDownloader.kt @@ -9,15 +9,13 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.ForegroundTracker import com.topjohnwu.magisk.core.base.BaseService import com.topjohnwu.magisk.core.utils.ProgressInputStream -import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.view.Notifications import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import okhttp3.ResponseBody -import org.koin.core.component.KoinComponent import timber.log.Timber import java.io.IOException import java.io.InputStream @@ -25,13 +23,13 @@ import java.util.* import kotlin.collections.HashMap import kotlin.random.Random.Default.nextInt -abstract class BaseDownloader : BaseService(), KoinComponent { +abstract class BaseDownloader : BaseService() { private val hasNotifications get() = notifications.isNotEmpty() private val notifications = Collections.synchronizedMap(HashMap()) private val coroutineScope = CoroutineScope(Dispatchers.IO) - val service: NetworkService by inject() + val service get() = ServiceLocator.networkService // -- Service overrides @@ -174,7 +172,7 @@ abstract class BaseDownloader : BaseService(), KoinComponent { // --- - companion object : KoinComponent { + companion object { const val ACTION_KEY = "download_action" private val progressBroadcast = MutableLiveData?>() diff --git a/app/src/main/java/com/topjohnwu/magisk/core/download/Subject.kt b/app/src/main/java/com/topjohnwu/magisk/core/download/Subject.kt index 2dcc4b4a5..a801c2003 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/download/Subject.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/download/Subject.kt @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.core.download -import android.content.Context import android.net.Uri import android.os.Parcelable import androidx.core.net.toUri @@ -9,12 +8,12 @@ import com.topjohnwu.magisk.core.model.MagiskJson import com.topjohnwu.magisk.core.model.StubJson import com.topjohnwu.magisk.core.model.module.OnlineModule import com.topjohnwu.magisk.core.utils.MediaStoreUtils +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.ktx.cachedFile -import com.topjohnwu.magisk.ktx.get import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize -private fun cachedFile(name: String) = get().cachedFile(name).apply { delete() }.toUri() +private fun cachedFile(name: String) = AppContext.cachedFile(name).apply { delete() }.toUri() sealed class Subject : Parcelable { diff --git a/app/src/main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt b/app/src/main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt index ad1fe4a54..7cafbe1e6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt @@ -1,11 +1,11 @@ package com.topjohnwu.magisk.core.magiskdb -import android.content.Context import android.content.pm.PackageManager import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.model.su.SuPolicy import com.topjohnwu.magisk.core.model.su.toMap import com.topjohnwu.magisk.core.model.su.toPolicy +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.ktx.now import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -13,9 +13,7 @@ import timber.log.Timber import java.util.concurrent.TimeUnit -class PolicyDao( - private val context: Context -) : BaseDao() { +class PolicyDao : BaseDao() { override val table: String = Table.POLICY @@ -56,7 +54,7 @@ class PolicyDao( } private fun Map.toPolicyOrNull(): SuPolicy? { - return runCatching { toPolicy(context.packageManager) }.getOrElse { + return runCatching { toPolicy(AppContext.packageManager) }.getOrElse { Timber.e(it) if (it is PackageManager.NameNotFoundException) { val uid = getOrElse("uid") { null } ?: return null diff --git a/app/src/main/java/com/topjohnwu/magisk/core/model/module/OnlineModule.kt b/app/src/main/java/com/topjohnwu/magisk/core/model/module/OnlineModule.kt index 9552801d1..f3f8809ef 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/model/module/OnlineModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/model/module/OnlineModule.kt @@ -4,8 +4,7 @@ import android.os.Parcelable import androidx.room.Entity import androidx.room.PrimaryKey import com.topjohnwu.magisk.core.model.ModuleJson -import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ktx.legalFilename import kotlinx.parcelize.Parcelize import java.text.DateFormat @@ -26,7 +25,7 @@ data class OnlineModule( val notes_url: String ) : Module(), Parcelable { - private val svc: NetworkService get() = get() + private val svc get() = ServiceLocator.networkService constructor(info: ModuleJson) : this( id = info.id, diff --git a/app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt b/app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt index 7663f53d8..f6ef42ab4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt @@ -13,8 +13,7 @@ import com.topjohnwu.magisk.core.intent import com.topjohnwu.magisk.core.model.su.SuPolicy import com.topjohnwu.magisk.core.model.su.toLog import com.topjohnwu.magisk.core.model.su.toPolicy -import com.topjohnwu.magisk.data.repository.LogRepository -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ktx.startActivity import com.topjohnwu.magisk.ktx.startActivityWithRoot import com.topjohnwu.magisk.ui.surequest.SuRequestActivity @@ -104,9 +103,8 @@ object SuCallbackHandler { command = command ) - val logRepo = get() GlobalScope.launch { - logRepo.insert(log) + ServiceLocator.logRepo.insert(log) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt index cb97984c9..493cb125d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt @@ -1,19 +1,16 @@ package com.topjohnwu.magisk.core.tasks -import android.content.Context import android.net.Uri import androidx.core.net.toFile import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.utils.MediaStoreUtils.displayName import com.topjohnwu.magisk.core.utils.MediaStoreUtils.inputStream import com.topjohnwu.magisk.core.utils.unzip -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.ktx.writeTo import com.topjohnwu.superuser.Shell import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.koin.core.component.KoinComponent - import timber.log.Timber import java.io.File import java.io.FileNotFoundException @@ -23,10 +20,9 @@ open class FlashZip( private val mUri: Uri, private val console: MutableList, private val logs: MutableList -): KoinComponent { +) { - private val context: Context by inject() - private val installDir = File(context.cacheDir, "flash") + private val installDir = File(AppContext.cacheDir, "flash") private lateinit var zipFile: File @Throws(IOException::class) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/HideAPK.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/HideAPK.kt index 34caf6524..ca7eb9c5f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/HideAPK.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/HideAPK.kt @@ -14,8 +14,7 @@ import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.Provider import com.topjohnwu.magisk.core.utils.AXML import com.topjohnwu.magisk.core.utils.Keygen -import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ktx.writeTo import com.topjohnwu.magisk.utils.APKInstall import com.topjohnwu.magisk.utils.Utils @@ -41,7 +40,7 @@ object HideAPK { // Some arbitrary limit const val MAX_LABEL_LENGTH = 32 - private val svc: NetworkService by inject() + private val svc get() = ServiceLocator.networkService private val Context.APK_URI get() = Provider.APK_URI(packageName) private val Context.PREFS_URI get() = Provider.PREFS_URI(packageName) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt index 04e6b4216..e5074c843 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.core.tasks -import android.content.Context import android.net.Uri import android.widget.Toast import androidx.annotation.WorkerThread @@ -12,9 +11,11 @@ import com.topjohnwu.magisk.core.* import com.topjohnwu.magisk.core.utils.MediaStoreUtils import com.topjohnwu.magisk.core.utils.MediaStoreUtils.inputStream import com.topjohnwu.magisk.core.utils.MediaStoreUtils.outputStream -import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.di.Protected -import com.topjohnwu.magisk.ktx.* +import com.topjohnwu.magisk.di.ServiceLocator +import com.topjohnwu.magisk.ktx.reboot +import com.topjohnwu.magisk.ktx.symlink +import com.topjohnwu.magisk.ktx.withStreams +import com.topjohnwu.magisk.ktx.writeTo import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.signing.SignBoot import com.topjohnwu.superuser.Shell @@ -31,7 +32,6 @@ import org.kamranzafar.jtar.TarEntry import org.kamranzafar.jtar.TarHeader import org.kamranzafar.jtar.TarInputStream import org.kamranzafar.jtar.TarOutputStream -import org.koin.core.component.KoinComponent import timber.log.Timber import java.io.* import java.nio.ByteBuffer @@ -42,14 +42,14 @@ import java.util.zip.ZipFile abstract class MagiskInstallImpl protected constructor( protected val console: MutableList = NOPList.getInstance(), private val logs: MutableList = NOPList.getInstance() -) : KoinComponent { +) { protected var installDir = File("xxx") private lateinit var srcBoot: File private val shell = Shell.getShell() - private val service: NetworkService by inject() - protected val context: Context by inject(Protected) + private val service get() = ServiceLocator.networkService + protected val context get() = ServiceLocator.deContext private val useRootDir = shell.isRoot && Info.noDataExec private fun findImage(): Boolean { diff --git a/app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt index 7a4abacf3..4c155599f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt @@ -6,12 +6,11 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Config -import com.topjohnwu.magisk.ktx.get -import org.koin.core.component.KoinComponent +import com.topjohnwu.magisk.di.AppContext -object BiometricHelper: KoinComponent { +object BiometricHelper { - private val mgr by lazy { BiometricManager.from(get()) } + private val mgr by lazy { BiometricManager.from(AppContext) } val isSupported get() = when (mgr.canAuthenticate()) { BiometricManager.BIOMETRIC_SUCCESS -> true diff --git a/app/src/main/java/com/topjohnwu/magisk/core/utils/MediaStoreUtils.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/MediaStoreUtils.kt index f9a17bc85..57e0d785c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/utils/MediaStoreUtils.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/MediaStoreUtils.kt @@ -1,9 +1,7 @@ package com.topjohnwu.magisk.core.utils -import android.content.ContentResolver import android.content.ContentUris import android.content.ContentValues -import android.content.Context import android.net.Uri import android.os.Build import android.os.Environment @@ -13,7 +11,7 @@ import androidx.annotation.RequiresApi import androidx.core.net.toFile import androidx.core.net.toUri import com.topjohnwu.magisk.core.Config -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.AppContext import java.io.File import java.io.FileNotFoundException import java.io.IOException @@ -24,7 +22,7 @@ import kotlin.experimental.and @Suppress("DEPRECATION") object MediaStoreUtils { - private val cr: ContentResolver by lazy { get().contentResolver } + private val cr get() = AppContext.contentResolver @get:RequiresApi(api = 29) private val tableUri diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt index be897fe45..954b86bb0 100644 --- a/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt +++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt @@ -9,8 +9,8 @@ import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty interface DBConfig { - val settingsDao: SettingsDao - val stringDao: StringDao + val settingsDB: SettingsDao + val stringDB: StringDao fun dbSettings( name: String, @@ -41,7 +41,7 @@ class DBSettingsValue( override fun getValue(thisRef: DBConfig, property: KProperty<*>): Int { if (value == null) value = runBlocking { - thisRef.settingsDao.fetch(name, default) + thisRef.settingsDB.fetch(name, default) } return value as Int } @@ -51,7 +51,7 @@ class DBSettingsValue( this.value = value } GlobalScope.launch { - thisRef.settingsDao.put(name, value) + thisRef.settingsDB.put(name, value) } } } @@ -82,7 +82,7 @@ class DBStringsValue( override fun getValue(thisRef: DBConfig, property: KProperty<*>): String { if (value == null) value = runBlocking { - thisRef.stringDao.fetch(name, default) + thisRef.stringDB.fetch(name, default) } return value!! } @@ -94,21 +94,21 @@ class DBStringsValue( if (value.isEmpty()) { if (sync) { runBlocking { - thisRef.stringDao.delete(name) + thisRef.stringDB.delete(name) } } else { GlobalScope.launch { - thisRef.stringDao.delete(name) + thisRef.stringDB.delete(name) } } } else { if (sync) { runBlocking { - thisRef.stringDao.put(name, value) + thisRef.stringDB.put(name, value) } } else { GlobalScope.launch { - thisRef.stringDao.put(name, value) + thisRef.stringDB.put(name, value) } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt index 2e8b37b41..ad77de6fc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt @@ -28,12 +28,11 @@ import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.textfield.TextInputLayout import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ktx.coroutineScope -import com.topjohnwu.magisk.ktx.get import com.topjohnwu.magisk.ktx.replaceRandomWithSpecial import com.topjohnwu.superuser.internal.UiThreadHandler import com.topjohnwu.widget.IndeterminateCheckBox -import io.noties.markwon.Markwon import kotlinx.coroutines.* import kotlin.math.roundToInt @@ -60,8 +59,7 @@ fun setInvisibleUnless(view: View, invisibleUnless: Boolean) { @BindingAdapter("markdownText") fun setMarkdownText(tv: TextView, text: CharSequence) { tv.coroutineScope.launch(Dispatchers.IO) { - val markwon = get() - markwon.setMarkdown(tv, text.toString()) + ServiceLocator.markwon.setMarkdown(tv, text.toString()) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt deleted file mode 100644 index 37e5e5ae5..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.topjohnwu.magisk.di - -import android.content.Context -import androidx.preference.PreferenceManager -import com.topjohnwu.magisk.core.AssetHack -import com.topjohnwu.magisk.ktx.deviceProtectedContext -import org.koin.core.qualifier.named -import org.koin.dsl.module - -val SUTimeout = named("su_timeout") -val Protected = named("protected") - -val applicationModule = module { - factory { AssetHack.resource } - factory { get().packageManager } - factory(Protected) { get().deviceProtectedContext } - single(SUTimeout) { get(Protected).getSharedPreferences("su_timeout", 0) } - single { PreferenceManager.getDefaultSharedPreferences(get(Protected)) } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt deleted file mode 100644 index 111a2e0b8..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.topjohnwu.magisk.di - -import android.content.Context -import androidx.room.Room -import com.topjohnwu.magisk.core.magiskdb.PolicyDao -import com.topjohnwu.magisk.core.magiskdb.SettingsDao -import com.topjohnwu.magisk.core.magiskdb.StringDao -import com.topjohnwu.magisk.core.tasks.RepoUpdater -import com.topjohnwu.magisk.data.database.RepoDatabase -import com.topjohnwu.magisk.data.database.SuLogDatabase -import org.koin.dsl.module - - -val databaseModule = module { - single { PolicyDao(get()) } - single { SettingsDao() } - single { StringDao() } - single { createRepoDatabase(get()) } - single { get().repoDao() } - single { createSuLogDatabase(get(Protected)).suLogDao() } - single { RepoUpdater(get(), get()) } -} - -fun createRepoDatabase(context: Context) = - Room.databaseBuilder(context, RepoDatabase::class.java, "repo.db") - .fallbackToDestructiveMigration() - .build() - -fun createSuLogDatabase(context: Context) = - Room.databaseBuilder(context, SuLogDatabase::class.java, "sulogs.db") - .fallbackToDestructiveMigration() - .build() diff --git a/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt b/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt deleted file mode 100644 index 8fd05268e..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/di/Modules.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.topjohnwu.magisk.di - -val koinModules = listOf( - applicationModule, - networkingModule, - databaseModule, - repositoryModule, - viewModelModules -) diff --git a/app/src/main/java/com/topjohnwu/magisk/di/NetworkingModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/Networking.kt similarity index 81% rename from app/src/main/java/com/topjohnwu/magisk/di/NetworkingModule.kt rename to app/src/main/java/com/topjohnwu/magisk/di/Networking.kt index a0b85104a..f89b8d074 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/NetworkingModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/Networking.kt @@ -4,12 +4,7 @@ import android.content.Context import com.squareup.moshi.Moshi import com.topjohnwu.magisk.BuildConfig import com.topjohnwu.magisk.core.Config -import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.Info -import com.topjohnwu.magisk.data.network.GithubApiServices -import com.topjohnwu.magisk.data.network.GithubPageServices -import com.topjohnwu.magisk.data.network.JSDelivrServices -import com.topjohnwu.magisk.data.network.RawServices import com.topjohnwu.magisk.ktx.precomputedText import com.topjohnwu.magisk.net.Networking import com.topjohnwu.magisk.utils.MarkwonImagePlugin @@ -20,23 +15,12 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import okhttp3.dnsoverhttps.DnsOverHttps import okhttp3.logging.HttpLoggingInterceptor -import org.koin.dsl.module import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory import retrofit2.converter.scalars.ScalarsConverterFactory import java.net.InetAddress import java.net.UnknownHostException -val networkingModule = module { - single { createOkHttpClient(get()) } - single { createRetrofit(get()) } - single { createApiService(get(), Const.Url.GITHUB_RAW_URL) } - single { createApiService(get(), Const.Url.GITHUB_API_URL) } - single { createApiService(get(), Const.Url.GITHUB_PAGE_URL) } - single { createApiService(get(), Const.Url.JS_DELIVR_URL) } - single { createMarkwon(get(), get()) } -} - private class DnsResolver(client: OkHttpClient) : Dns { private val doh by lazy { diff --git a/app/src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt deleted file mode 100644 index 72ac72315..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.topjohnwu.magisk.di - -import com.topjohnwu.magisk.data.repository.LogRepository -import com.topjohnwu.magisk.data.repository.NetworkService -import org.koin.dsl.module - - -val repositoryModule = module { - single { LogRepository(get()) } - single { NetworkService(get(), get(), get(), get()) } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ServiceLocator.kt b/app/src/main/java/com/topjohnwu/magisk/di/ServiceLocator.kt new file mode 100644 index 000000000..f08087de6 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/di/ServiceLocator.kt @@ -0,0 +1,86 @@ +package com.topjohnwu.magisk.di + +import android.content.Context +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStoreOwner +import androidx.room.Room +import com.topjohnwu.magisk.core.Const +import com.topjohnwu.magisk.core.magiskdb.PolicyDao +import com.topjohnwu.magisk.core.magiskdb.SettingsDao +import com.topjohnwu.magisk.core.magiskdb.StringDao +import com.topjohnwu.magisk.core.tasks.RepoUpdater +import com.topjohnwu.magisk.data.database.RepoDatabase +import com.topjohnwu.magisk.data.database.SuLogDatabase +import com.topjohnwu.magisk.data.repository.LogRepository +import com.topjohnwu.magisk.data.repository.NetworkService +import com.topjohnwu.magisk.ktx.deviceProtectedContext +import com.topjohnwu.magisk.ui.home.HomeViewModel +import com.topjohnwu.magisk.ui.install.InstallViewModel +import com.topjohnwu.magisk.ui.log.LogViewModel +import com.topjohnwu.magisk.ui.module.ModuleViewModel +import com.topjohnwu.magisk.ui.settings.SettingsViewModel +import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel +import com.topjohnwu.magisk.ui.surequest.SuRequestViewModel + +val AppContext: Context inline get() = ServiceLocator.context + +object ServiceLocator { + + lateinit var context: Context + val deContext by lazy { context.deviceProtectedContext } + val timeoutPrefs by lazy { deContext.getSharedPreferences("su_timeout", 0) } + + // Database + val policyDB = PolicyDao() + val settingsDB = SettingsDao() + val stringDB = StringDao() + val repoDB by lazy { createRepoDatabase(context).repoDao() } + val sulogDB by lazy { createSuLogDatabase(deContext).suLogDao() } + val repoUpdater by lazy { RepoUpdater(networkService, repoDB) } + val logRepo by lazy { LogRepository(sulogDB) } + + // Networking + val okhttp by lazy { createOkHttpClient(context) } + val retrofit by lazy { createRetrofit(okhttp) } + val markwon by lazy { createMarkwon(context, okhttp) } + val networkService by lazy { + NetworkService( + createApiService(retrofit, Const.Url.GITHUB_PAGE_URL), + createApiService(retrofit, Const.Url.GITHUB_RAW_URL), + createApiService(retrofit, Const.Url.JS_DELIVR_URL), + createApiService(retrofit, Const.Url.GITHUB_API_URL) + ) + } + + object VMFactory : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") + override fun create(clz: Class): T { + return when (clz) { + HomeViewModel::class.java -> HomeViewModel(networkService) + LogViewModel::class.java -> LogViewModel(logRepo) + ModuleViewModel::class.java -> ModuleViewModel(repoDB, repoUpdater) + SettingsViewModel::class.java -> SettingsViewModel(repoDB) + SuperuserViewModel::class.java -> SuperuserViewModel(policyDB) + InstallViewModel::class.java -> InstallViewModel(networkService) + SuRequestViewModel::class.java -> SuRequestViewModel(policyDB, timeoutPrefs) + else -> clz.newInstance() + } as T + } + } +} + +inline fun ViewModelStoreOwner.viewModel() = + lazy(LazyThreadSafetyMode.NONE) { + ViewModelProvider(this, ServiceLocator.VMFactory).get(VM::class.java) + } + +private fun createRepoDatabase(context: Context) = + Room.databaseBuilder(context, RepoDatabase::class.java, "repo.db") + .fallbackToDestructiveMigration() + .build() + +private fun createSuLogDatabase(context: Context) = + Room.databaseBuilder(context, SuLogDatabase::class.java, "sulogs.db") + .fallbackToDestructiveMigration() + .build() diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt deleted file mode 100644 index 4a8b6b1e8..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.topjohnwu.magisk.di - -import com.topjohnwu.magisk.ui.MainViewModel -import com.topjohnwu.magisk.ui.flash.FlashFragmentArgs -import com.topjohnwu.magisk.ui.flash.FlashViewModel -import com.topjohnwu.magisk.ui.hide.HideViewModel -import com.topjohnwu.magisk.ui.home.HomeViewModel -import com.topjohnwu.magisk.ui.install.InstallViewModel -import com.topjohnwu.magisk.ui.log.LogViewModel -import com.topjohnwu.magisk.ui.module.ModuleViewModel -import com.topjohnwu.magisk.ui.safetynet.SafetynetViewModel -import com.topjohnwu.magisk.ui.settings.SettingsViewModel -import com.topjohnwu.magisk.ui.superuser.SuperuserViewModel -import com.topjohnwu.magisk.ui.surequest.SuRequestViewModel -import com.topjohnwu.magisk.ui.theme.ThemeViewModel -import org.koin.androidx.viewmodel.dsl.viewModel -import org.koin.dsl.module - -val viewModelModules = module { - viewModel { HideViewModel() } - viewModel { HomeViewModel(get()) } - viewModel { LogViewModel(get()) } - viewModel { ModuleViewModel(get(), get()) } - viewModel { SafetynetViewModel() } - viewModel { SettingsViewModel(get()) } - viewModel { SuperuserViewModel(get()) } - viewModel { ThemeViewModel() } - viewModel { InstallViewModel(get()) } - viewModel { MainViewModel() } - viewModel { (args: FlashFragmentArgs) -> FlashViewModel(args) } - viewModel { SuRequestViewModel(get(), get(SUTimeout)) } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt b/app/src/main/java/com/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt index 36724c559..f1b9e1bef 100644 --- a/app/src/main/java/com/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt @@ -1,28 +1,25 @@ package com.topjohnwu.magisk.events.dialog -import android.content.Context import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.core.download.Subject -import com.topjohnwu.magisk.data.repository.NetworkService -import com.topjohnwu.magisk.ktx.get -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.AppContext +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.view.MagiskDialog import java.io.File class ManagerInstallDialog : MarkDownDialog() { - private val svc: NetworkService by inject() + private val svc get() = ServiceLocator.networkService override suspend fun getMarkdownText(): String { val text = svc.fetchString(Info.remote.magisk.note) // Cache the changelog - val context = get() - context.cacheDir.listFiles { _, name -> name.endsWith(".md") }.orEmpty().forEach { + AppContext.cacheDir.listFiles { _, name -> name.endsWith(".md") }.orEmpty().forEach { it.delete() } - File(context.cacheDir, "${Info.remote.magisk.versionCode}.md").writeText(text) + File(AppContext.cacheDir, "${Info.remote.magisk.versionCode}.md").writeText(text) return text } diff --git a/app/src/main/java/com/topjohnwu/magisk/events/dialog/MarkDownDialog.kt b/app/src/main/java/com/topjohnwu/magisk/events/dialog/MarkDownDialog.kt index de4b8fcaa..56da30642 100644 --- a/app/src/main/java/com/topjohnwu/magisk/events/dialog/MarkDownDialog.kt +++ b/app/src/main/java/com/topjohnwu/magisk/events/dialog/MarkDownDialog.kt @@ -6,19 +6,15 @@ import androidx.annotation.CallSuper import androidx.lifecycle.lifecycleScope import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.base.BaseActivity -import com.topjohnwu.magisk.ktx.inject +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.view.MagiskDialog -import io.noties.markwon.Markwon import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.koin.core.component.KoinComponent import timber.log.Timber import kotlin.coroutines.cancellation.CancellationException -abstract class MarkDownDialog : DialogEvent(), KoinComponent { - - private val markwon: Markwon by inject() +abstract class MarkDownDialog : DialogEvent() { abstract suspend fun getMarkdownText(): String @@ -31,7 +27,7 @@ abstract class MarkDownDialog : DialogEvent(), KoinComponent { val tv = view.findViewById(R.id.md_txt) withContext(Dispatchers.IO) { try { - markwon.setMarkdown(tv, getMarkdownText()) + ServiceLocator.markwon.setMarkdown(tv, getMarkdownText()) } catch (e: Exception) { if (e is CancellationException) throw e diff --git a/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt b/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt index 9adbebcee..9e2f88a0e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt @@ -60,8 +60,6 @@ import java.io.File import java.lang.reflect.Method import java.lang.reflect.Array as JArray -val packageName: String get() = get().packageName - private lateinit var osSymlink: Method private lateinit var os: Any diff --git a/app/src/main/java/com/topjohnwu/magisk/ktx/XKoin.kt b/app/src/main/java/com/topjohnwu/magisk/ktx/XKoin.kt deleted file mode 100644 index fb1108431..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ktx/XKoin.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.topjohnwu.magisk.ktx - -import org.koin.core.context.GlobalContext -import org.koin.core.parameter.ParametersDefinition -import org.koin.core.qualifier.Qualifier - -fun getKoin() = GlobalContext.get() - -inline fun inject( - qualifier: Qualifier? = null, - noinline parameters: ParametersDefinition? = null -) = lazy { get(qualifier, parameters) } - -inline fun get( - qualifier: Qualifier? = null, - noinline parameters: ParametersDefinition? = null -): T = getKoin().get(qualifier, parameters) diff --git a/app/src/main/java/com/topjohnwu/magisk/ktx/XString.kt b/app/src/main/java/com/topjohnwu/magisk/ktx/XString.kt index 59529d334..4a098a30a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ktx/XString.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ktx/XString.kt @@ -1,7 +1,5 @@ package com.topjohnwu.magisk.ktx -import android.content.res.Resources - val specialChars = arrayOf('!', '@', '#', '$', '%', '&', '?') val fullSpecialChars = arrayOf('!', '@', '#', '$', '%', '&', '?') @@ -34,11 +32,6 @@ fun String.replaceRandomWithSpecial(): String { fun StringBuilder.appendIf(condition: Boolean, builder: StringBuilder.() -> Unit) = if (condition) apply(builder) else this -fun Int.res(vararg args: Any): String { - val resources: Resources by inject() - return resources.getString(this, *args) -} - fun String.trimEmptyToNull(): String? = if (isBlank()) null else this fun String.legalFilename() = replace(" ", "_").replace("'", "").replace("\"", "") diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt index 83b3394c1..227a60659 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt @@ -18,13 +18,13 @@ import com.topjohnwu.magisk.arch.BaseViewModel import com.topjohnwu.magisk.arch.ReselectionTarget import com.topjohnwu.magisk.core.* import com.topjohnwu.magisk.databinding.ActivityMainMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ktx.startAnimations import com.topjohnwu.magisk.ui.home.HomeFragmentDirections import com.topjohnwu.magisk.utils.HideableBehavior import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.magisk.view.Shortcuts -import org.koin.androidx.viewmodel.ext.android.viewModel import java.io.File class MainViewModel : BaseViewModel() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt index 826a309e4..8c63e43bb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt @@ -13,19 +13,21 @@ import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.cmp import com.topjohnwu.magisk.databinding.FragmentFlashMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ui.MainActivity -import org.koin.androidx.viewmodel.ext.android.viewModel -import org.koin.core.parameter.parametersOf class FlashFragment : BaseUIFragment() { override val layoutRes = R.layout.fragment_flash_md2 - override val viewModel by viewModel { - parametersOf(FlashFragmentArgs.fromBundle(requireArguments())) - } + override val viewModel by viewModel() private var defaultOrientation = -1 + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + viewModel.args = FlashFragmentArgs.fromBundle(requireArguments()) + } + override fun onStart() { super.onStart() setHasOptionsMenu(true) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt index a6b55a5d2..d8085295c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt @@ -26,7 +26,7 @@ import com.topjohnwu.superuser.Shell import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -class FlashViewModel(var args: FlashFragmentArgs) : BaseViewModel() { +class FlashViewModel : BaseViewModel() { @get:Bindable var showReboot = Shell.rootAccess() @@ -38,6 +38,7 @@ class FlashViewModel(var args: FlashFragmentArgs) : BaseViewModel() { val adapter = RvBindingAdapter() val items = diffListOf() val itemBinding = itemBindingOf() + lateinit var args: FlashFragmentArgs private val logItems = mutableListOf().synchronized() private val outItems = object : CallbackList() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt index de7649844..78913b150 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt @@ -12,12 +12,12 @@ import androidx.recyclerview.widget.RecyclerView import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.databinding.FragmentHideMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ktx.addSimpleItemDecoration import com.topjohnwu.magisk.ktx.addVerticalPadding import com.topjohnwu.magisk.ktx.fixEdgeEffect import com.topjohnwu.magisk.ktx.hideKeyboard import com.topjohnwu.magisk.utils.MotionRevealHelper -import org.koin.androidx.viewmodel.ext.android.viewModel class HideFragment : BaseUIFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt index 2248a293c..1472633e3 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt @@ -2,7 +2,6 @@ package com.topjohnwu.magisk.ui.hide import android.annotation.SuppressLint import android.content.pm.ApplicationInfo -import android.content.pm.PackageManager import android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES import android.os.Process import androidx.databinding.Bindable @@ -13,8 +12,7 @@ import com.topjohnwu.magisk.arch.Queryable import com.topjohnwu.magisk.arch.filterableListOf import com.topjohnwu.magisk.arch.itemBindingOf import com.topjohnwu.magisk.core.Config -import com.topjohnwu.magisk.ktx.get -import com.topjohnwu.magisk.ktx.packageName +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.set import com.topjohnwu.superuser.Shell @@ -61,7 +59,7 @@ class HideViewModel : BaseViewModel(), Queryable { } state = State.LOADING val (apps, diff) = withContext(Dispatchers.Default) { - val pm = get() + val pm = AppContext.packageManager val hideList = Shell.su("magiskhide ls").exec().out.map { CmdlineHiddenItem(it) } val apps = pm.getInstalledApplications(MATCH_UNINSTALLED_PACKAGES) .asSequence() @@ -113,7 +111,7 @@ class HideViewModel : BaseViewModel(), Queryable { companion object { private val blacklist by lazy { listOf( - packageName, + AppContext.packageName, "com.android.chrome", "com.chrome.beta", "com.chrome.dev", diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt index 3d7f7f001..c68d05bbf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt @@ -8,9 +8,9 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.core.download.BaseDownloader import com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.events.RebootEvent import com.topjohnwu.superuser.Shell -import org.koin.androidx.viewmodel.ext.android.viewModel class HomeFragment : BaseUIFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt index 5958aad16..c9763c292 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt @@ -8,8 +8,8 @@ import androidx.lifecycle.viewModelScope import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ktx.coroutineScope -import org.koin.androidx.viewmodel.ext.android.viewModel class InstallFragment : BaseUIFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt index ee8ef100a..1f8200900 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt @@ -1,7 +1,6 @@ package com.topjohnwu.magisk.ui.install import android.app.Activity -import android.content.Context import android.net.Uri import androidx.databinding.Bindable import androidx.lifecycle.viewModelScope @@ -12,9 +11,9 @@ import com.topjohnwu.magisk.arch.BaseViewModel import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.data.repository.NetworkService +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.events.MagiskInstallFileEvent import com.topjohnwu.magisk.events.dialog.SecondSlotWarningDialog -import com.topjohnwu.magisk.ktx.get import com.topjohnwu.magisk.ui.flash.FlashFragment import com.topjohnwu.magisk.utils.set import com.topjohnwu.superuser.Shell @@ -65,8 +64,7 @@ class InstallViewModel( init { viewModelScope.launch { try { - val context = get() - File(context.cacheDir, "${BuildConfig.VERSION_CODE}.md").run { + File(AppContext.cacheDir, "${BuildConfig.VERSION_CODE}.md").run { notes = when { exists() -> readText() Const.Url.CHANGELOG_URL.isEmpty() -> "" diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt index a7c20ed7b..764e9bf25 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt @@ -9,12 +9,12 @@ import androidx.core.view.isVisible import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.databinding.FragmentLogMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ktx.addSimpleItemDecoration import com.topjohnwu.magisk.ktx.addVerticalPadding import com.topjohnwu.magisk.ktx.fixEdgeEffect import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.utils.MotionRevealHelper -import org.koin.androidx.viewmodel.ext.android.viewModel class LogFragment : BaseUIFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt index 45b02a61f..973aa8e48 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt @@ -13,11 +13,11 @@ import com.topjohnwu.magisk.arch.ReselectionTarget import com.topjohnwu.magisk.arch.ViewEvent import com.topjohnwu.magisk.core.download.BaseDownloader import com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ktx.* import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.MotionRevealHelper -import org.koin.androidx.viewmodel.ext.android.viewModel class ModuleFragment : BaseUIFragment(), ReselectionTarget { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/CheckSafetyNetEvent.kt b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/CheckSafetyNetEvent.kt index 0d28ae096..d3a977842 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/CheckSafetyNetEvent.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/CheckSafetyNetEvent.kt @@ -11,10 +11,9 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.ContextExecutor import com.topjohnwu.magisk.arch.ViewEventWithScope import com.topjohnwu.magisk.core.Const -import com.topjohnwu.magisk.data.repository.NetworkService +import com.topjohnwu.magisk.di.ServiceLocator import com.topjohnwu.magisk.ktx.createClassLoader import com.topjohnwu.magisk.ktx.reflectField -import com.topjohnwu.magisk.ktx.inject import com.topjohnwu.magisk.ktx.writeTo import com.topjohnwu.magisk.view.MagiskDialog import com.topjohnwu.signing.CryptoUtils @@ -27,7 +26,6 @@ import kotlinx.coroutines.withContext import org.bouncycastle.asn1.ASN1Encoding import org.bouncycastle.asn1.ASN1Primitive import org.bouncycastle.est.jcajce.JsseDefaultHostnameAuthorizer -import org.koin.core.component.KoinComponent import timber.log.Timber import java.io.ByteArrayInputStream import java.io.File @@ -40,9 +38,9 @@ import java.security.cert.X509Certificate class CheckSafetyNetEvent( private val callback: (SafetyNetResult) -> Unit = {} -) : ViewEventWithScope(), ContextExecutor, KoinComponent, SafetyNetHelper.Callback { +) : ViewEventWithScope(), ContextExecutor, SafetyNetHelper.Callback { - private val svc by inject() + private val svc get() = ServiceLocator.networkService private lateinit var apk: File private lateinit var dex: File diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt index 033da6ef0..191fda09f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt @@ -7,7 +7,7 @@ import android.view.ViewGroup import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.databinding.FragmentSafetynetMd2Binding -import org.koin.androidx.viewmodel.ext.android.viewModel +import com.topjohnwu.magisk.di.viewModel class SafetynetFragment : BaseUIFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt index 7fc03db2b..5371717de 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt @@ -5,11 +5,11 @@ import android.view.View import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.databinding.FragmentSettingsMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ktx.addSimpleItemDecoration import com.topjohnwu.magisk.ktx.addVerticalPadding import com.topjohnwu.magisk.ktx.fixEdgeEffect import com.topjohnwu.magisk.ktx.setOnViewReadyListener -import org.koin.androidx.viewmodel.ext.android.viewModel class SettingsFragment : BaseUIFragment() { 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 1b532e479..2bc1c8991 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 @@ -21,7 +21,7 @@ import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.databinding.DialogSettingsAppNameBinding import com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding import com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.asText import com.topjohnwu.magisk.utils.set @@ -194,7 +194,7 @@ object UpdateChecker : BaseSettingsItem.Toggle() { override var value = Config.checkUpdate set(value) = setV(value, field, { field = it }) { Config.checkUpdate = it - UpdateCheckService.schedule(get()) + UpdateCheckService.schedule(AppContext) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt index 4589d21ee..6669ad5f2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.ui.settings -import android.content.Context import android.os.Build import android.view.View import android.widget.Toast @@ -18,11 +17,11 @@ import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.isRunningAsStub import com.topjohnwu.magisk.core.tasks.HideAPK import com.topjohnwu.magisk.data.database.RepoDao +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.events.AddHomeIconEvent import com.topjohnwu.magisk.events.RecreateEvent import com.topjohnwu.magisk.events.dialog.BiometricEvent import com.topjohnwu.magisk.ktx.activity -import com.topjohnwu.magisk.ktx.get import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.superuser.Shell import kotlinx.coroutines.launch @@ -42,7 +41,7 @@ class SettingsViewModel( } private fun createItems(): List { - val context = get() + val context = AppContext val hidden = context.packageName != BuildConfig.APPLICATION_ID // Customization diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt index 959ef584a..0022fbe8e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt @@ -5,10 +5,10 @@ import android.view.View import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.databinding.FragmentSuperuserMd2Binding +import com.topjohnwu.magisk.di.viewModel import com.topjohnwu.magisk.ktx.addSimpleItemDecoration import com.topjohnwu.magisk.ktx.addVerticalPadding import com.topjohnwu.magisk.ktx.fixEdgeEffect -import org.koin.androidx.viewmodel.ext.android.viewModel class SuperuserFragment : BaseUIFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt index 99782ec0f..a6844143d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt @@ -12,7 +12,7 @@ import com.topjohnwu.magisk.arch.BaseUIActivity import com.topjohnwu.magisk.core.su.SuCallbackHandler import com.topjohnwu.magisk.core.su.SuCallbackHandler.REQUEST import com.topjohnwu.magisk.databinding.ActivityRequestBinding -import org.koin.androidx.viewmodel.ext.android.viewModel +import com.topjohnwu.magisk.di.viewModel open class SuRequestActivity : BaseUIActivity() { 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 d2f7c5377..6dd4e4957 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 @@ -1,7 +1,6 @@ package com.topjohnwu.magisk.ui.surequest import android.annotation.SuppressLint -import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.content.res.Resources @@ -27,10 +26,10 @@ import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.ALLOW import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.DENY import com.topjohnwu.magisk.core.su.SuRequestHandler import com.topjohnwu.magisk.core.utils.BiometricHelper +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.events.DieEvent import com.topjohnwu.magisk.events.ShowUIEvent import com.topjohnwu.magisk.events.dialog.BiometricEvent -import com.topjohnwu.magisk.ktx.get import com.topjohnwu.magisk.utils.TextHolder import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.set @@ -73,7 +72,7 @@ class SuRequestViewModel( val itemBinding = ItemBinding.of(BR.item, R.layout.item_spinner) - private val handler = SuRequestHandler(get().packageManager, policyDB) + private val handler = SuRequestHandler(AppContext.packageManager, policyDB) private lateinit var timer: CountDownTimer fun grantPressed() { @@ -160,8 +159,6 @@ class SuRequestViewModel( var seconds = 0 set(value) = set(value, field, { field = it }, BR.denyText) - override val isEmpty get() = false - override fun getText(resources: Resources): CharSequence { return if (seconds != 0) "${resources.getString(R.string.deny)} ($seconds)" diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt index 57430b727..202fd0a37 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt @@ -11,7 +11,7 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.arch.BaseUIFragment import com.topjohnwu.magisk.databinding.FragmentThemeMd2Binding import com.topjohnwu.magisk.databinding.ItemThemeBindingImpl -import org.koin.androidx.viewmodel.ext.android.viewModel +import com.topjohnwu.magisk.di.viewModel class ThemeFragment : BaseUIFragment() { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt b/app/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt index 06446247c..7f3404228 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt @@ -6,7 +6,7 @@ import androidx.databinding.BindingAdapter abstract class TextHolder { - abstract val isEmpty: Boolean + open val isEmpty: Boolean get() = false abstract fun getText(resources: Resources): CharSequence // --- diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt index 6c5a9b6be..0041f99e4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt @@ -8,17 +8,17 @@ import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Config import com.topjohnwu.magisk.core.Const import com.topjohnwu.magisk.core.Info -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.superuser.internal.UiThreadHandler object Utils { fun toast(msg: CharSequence, duration: Int) { - UiThreadHandler.run { Toast.makeText(get(), msg, duration).show() } + UiThreadHandler.run { Toast.makeText(AppContext, msg, duration).show() } } fun toast(resId: Int, duration: Int) { - UiThreadHandler.run { Toast.makeText(get(), resId, duration).show() } + UiThreadHandler.run { Toast.makeText(AppContext, resId, duration).show() } } fun showSuperUser(): Boolean { diff --git a/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt b/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt index 1094fbcdb..d14749945 100644 --- a/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt +++ b/app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt @@ -13,13 +13,13 @@ import com.topjohnwu.magisk.core.Const.ID.PROGRESS_NOTIFICATION_CHANNEL import com.topjohnwu.magisk.core.Const.ID.UPDATE_NOTIFICATION_CHANNEL import com.topjohnwu.magisk.core.download.DownloadService import com.topjohnwu.magisk.core.download.Subject -import com.topjohnwu.magisk.ktx.get +import com.topjohnwu.magisk.di.AppContext import com.topjohnwu.magisk.ktx.getBitmap @Suppress("DEPRECATION") object Notifications { - val mgr by lazy { get().getSystemService()!! } + val mgr by lazy { AppContext.getSystemService()!! } fun setup(context: Context) { if (SDK_INT >= 26) {