Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
038f73a5
Commit
038f73a5
authored
Apr 18, 2021
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove Koin
Non static DI is bad
parent
649b49ff
Show whitespace changes
Inline
Side-by-side
Showing
56 changed files
with
194 additions
and
306 deletions
+194
-306
build.gradle.kts
app/build.gradle.kts
+0
-4
BaseViewModel.kt
app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt
+1
-2
App.kt
app/src/main/java/com/topjohnwu/magisk/core/App.kt
+2
-8
Config.kt
app/src/main/java/com/topjohnwu/magisk/core/Config.kt
+4
-8
Info.kt
app/src/main/java/com/topjohnwu/magisk/core/Info.kt
+2
-2
Receiver.kt
app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt
+2
-3
SplashActivity.kt
...src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt
+2
-3
UpdateCheckService.kt
...main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt
+3
-5
BaseReceiver.kt
.../main/java/com/topjohnwu/magisk/core/base/BaseReceiver.kt
+1
-2
BaseService.kt
...c/main/java/com/topjohnwu/magisk/core/base/BaseService.kt
+1
-2
BaseDownloader.kt
...java/com/topjohnwu/magisk/core/download/BaseDownloader.kt
+4
-6
Subject.kt
...c/main/java/com/topjohnwu/magisk/core/download/Subject.kt
+2
-3
PolicyDao.kt
...main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt
+3
-5
OnlineModule.kt
...va/com/topjohnwu/magisk/core/model/module/OnlineModule.kt
+2
-3
SuCallbackHandler.kt
...in/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt
+2
-4
FlashZip.kt
...src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt
+3
-7
HideAPK.kt
app/src/main/java/com/topjohnwu/magisk/core/tasks/HideAPK.kt
+2
-3
MagiskInstaller.kt
...n/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt
+8
-8
BiometricHelper.kt
...n/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt
+3
-4
MediaStoreUtils.kt
...n/java/com/topjohnwu/magisk/core/utils/MediaStoreUtils.kt
+2
-4
DBConfig.kt
...ain/java/com/topjohnwu/magisk/data/repository/DBConfig.kt
+9
-9
DataBindingAdapters.kt
...a/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt
+2
-4
ApplicationModule.kt
...rc/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt
+0
-19
DatabaseModule.kt
app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt
+0
-32
Modules.kt
app/src/main/java/com/topjohnwu/magisk/di/Modules.kt
+0
-9
Networking.kt
app/src/main/java/com/topjohnwu/magisk/di/Networking.kt
+0
-16
RepositoryModule.kt
...src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt
+0
-11
ServiceLocator.kt
app/src/main/java/com/topjohnwu/magisk/di/ServiceLocator.kt
+86
-0
ViewModelsModule.kt
...src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt
+0
-32
ManagerInstallDialog.kt
...om/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt
+5
-8
MarkDownDialog.kt
...java/com/topjohnwu/magisk/events/dialog/MarkDownDialog.kt
+3
-7
XAndroid.kt
app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt
+0
-2
XKoin.kt
app/src/main/java/com/topjohnwu/magisk/ktx/XKoin.kt
+0
-17
XString.kt
app/src/main/java/com/topjohnwu/magisk/ktx/XString.kt
+0
-7
MainActivity.kt
app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt
+1
-1
FlashFragment.kt
.../main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt
+7
-5
FlashViewModel.kt
...main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt
+2
-1
HideFragment.kt
...rc/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt
+1
-1
HideViewModel.kt
...c/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
+3
-5
HomeFragment.kt
...rc/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt
+1
-1
InstallFragment.kt
...n/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt
+1
-1
InstallViewModel.kt
.../java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt
+2
-4
LogFragment.kt
app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt
+1
-1
ModuleFragment.kt
...ain/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt
+1
-1
CheckSafetyNetEvent.kt
.../com/topjohnwu/magisk/ui/safetynet/CheckSafetyNetEvent.kt
+3
-5
SafetynetFragment.kt
...va/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt
+1
-1
SettingsFragment.kt
...java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt
+1
-1
SettingsItems.kt
...in/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt
+2
-2
SettingsViewModel.kt
...ava/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt
+2
-3
SuperuserFragment.kt
...va/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt
+1
-1
SuRequestActivity.kt
...va/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt
+1
-1
SuRequestViewModel.kt
...a/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt
+2
-5
ThemeFragment.kt
.../main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt
+1
-1
TextHolder.kt
app/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt
+1
-1
Utils.kt
app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt
+3
-3
Notifications.kt
app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt
+2
-2
No files found.
app/build.gradle.kts
View file @
038f73a5
...
...
@@ -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}"
)
...
...
app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt
View file @
038f73a5
...
...
@@ -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
...
...
app/src/main/java/com/topjohnwu/magisk/core/App.kt
View file @
038f73a5
...
...
@@ -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
())
...
...
app/src/main/java/com/topjohnwu/magisk/core/Config.kt
View file @
038f73a5
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
stringD
ao
:
StringDao
by
inject
()
override
val
settingsD
ao
:
SettingsDao
by
inject
()
override
val
context
:
Context
by
inject
(
Protected
)
override
val
stringD
B
get
()
=
ServiceLocator
.
stringDB
override
val
settingsD
B
get
()
=
ServiceLocator
.
settingsDB
override
val
context
get
()
=
ServiceLocator
.
deContext
@get
:
SuppressLint
(
"ApplySharedPref"
)
val
prefsFile
:
File
get
()
{
...
...
app/src/main/java/com/topjohnwu/magisk/core/Info.kt
View file @
038f73a5
...
...
@@ -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.ge
t
import
com.topjohnwu.magisk.
di.AppContex
t
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
)
}
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/core/Receiver.kt
View file @
038f73a5
...
...
@@ -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
?
{
...
...
app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt
View file @
038f73a5
...
...
@@ -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
<
NetworkService
>()
ServiceLocator
.
networkService
DONE
=
true
startActivity
(
redirect
<
MainActivity
>())
...
...
app/src/main/java/com/topjohnwu/magisk/core/UpdateCheckService.kt
View file @
038f73a5
...
...
@@ -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
{
...
...
app/src/main/java/com/topjohnwu/magisk/core/base/BaseReceiver.kt
View file @
038f73a5
...
...
@@ -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
)
...
...
app/src/main/java/com/topjohnwu/magisk/core/base/BaseService.kt
View file @
038f73a5
...
...
@@ -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
())
}
...
...
app/src/main/java/com/topjohnwu/magisk/core/download/BaseDownloader.kt
View file @
038f73a5
...
...
@@ -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
<
Int
,
Notification
.
Builder
>())
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
<
Pair
<
Float
,
Subject
>?>()
...
...
app/src/main/java/com/topjohnwu/magisk/core/download/Subject.kt
View file @
038f73a5
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
<
Context
>()
.
cachedFile
(
name
).
apply
{
delete
()
}.
toUri
()
private
fun
cachedFile
(
name
:
String
)
=
AppContext
.
cachedFile
(
name
).
apply
{
delete
()
}.
toUri
()
sealed
class
Subject
:
Parcelable
{
...
...
app/src/main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt
View file @
038f73a5
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
<
String
,
String
>.
toPolicyOrNull
():
SuPolicy
?
{
return
runCatching
{
toPolicy
(
c
ontext
.
packageManager
)
}.
getOrElse
{
return
runCatching
{
toPolicy
(
AppC
ontext
.
packageManager
)
}.
getOrElse
{
Timber
.
e
(
it
)
if
(
it
is
PackageManager
.
NameNotFoundException
)
{
val
uid
=
getOrElse
(
"uid"
)
{
null
}
?:
return
null
...
...
app/src/main/java/com/topjohnwu/magisk/core/model/module/OnlineModule.kt
View file @
038f73a5
...
...
@@ -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
,
...
...
app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt
View file @
038f73a5
...
...
@@ -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
<
LogRepository
>()
GlobalScope
.
launch
{
logRepo
.
insert
(
log
)
ServiceLocator
.
logRepo
.
insert
(
log
)
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt
View file @
038f73a5
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.injec
t
import
com.topjohnwu.magisk.
di.AppContex
t
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
<
String
>,
private
val
logs
:
MutableList
<
String
>
)
:
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
)
...
...
app/src/main/java/com/topjohnwu/magisk/core/tasks/HideAPK.kt
View file @
038f73a5
...
...
@@ -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
)
...
...
app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt
View file @
038f73a5
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
<
String
>
=
NOPList
.
getInstance
(),
private
val
logs
:
MutableList
<
String
>
=
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
{
...
...
app/src/main/java/com/topjohnwu/magisk/core/utils/BiometricHelper.kt
View file @
038f73a5
...
...
@@ -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
...
...
app/src/main/java/com/topjohnwu/magisk/core/utils/MediaStoreUtils.kt
View file @
038f73a5
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.ge
t
import
com.topjohnwu.magisk.
di.AppContex
t
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
<
Context
>().
contentResolver
}
private
val
cr
get
()
=
AppContext
.
contentResolver
@get
:
RequiresApi
(
api
=
29
)
private
val
tableUri
...
...
app/src/main/java/com/topjohnwu/magisk/data/repository/DBConfig.kt
View file @
038f73a5
...
...
@@ -9,8 +9,8 @@ import kotlin.properties.ReadWriteProperty
import
kotlin.reflect.KProperty
interface
DBConfig
{
val
settingsD
ao
:
SettingsDao
val
stringD
ao
:
StringDao
val
settingsD
B
:
SettingsDao
val
stringD
B
:
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
.
settingsD
ao
.
fetch
(
name
,
default
)
thisRef
.
settingsD
B
.
fetch
(
name
,
default
)
}
return
value
as
Int
}
...
...
@@ -51,7 +51,7 @@ class DBSettingsValue(
this
.
value
=
value
}
GlobalScope
.
launch
{
thisRef
.
settingsD
ao
.
put
(
name
,
value
)
thisRef
.
settingsD
B
.
put
(
name
,
value
)
}
}
}
...
...
@@ -82,7 +82,7 @@ class DBStringsValue(
override
fun
getValue
(
thisRef
:
DBConfig
,
property
:
KProperty
<
*
>):
String
{
if
(
value
==
null
)
value
=
runBlocking
{
thisRef
.
stringD
ao
.
fetch
(
name
,
default
)
thisRef
.
stringD
B
.
fetch
(
name
,
default
)
}
return
value
!!
}
...
...
@@ -94,21 +94,21 @@ class DBStringsValue(
if
(
value
.
isEmpty
())
{
if
(
sync
)
{
runBlocking
{
thisRef
.
stringD
ao
.
delete
(
name
)
thisRef
.
stringD
B
.
delete
(
name
)
}
}
else
{
GlobalScope
.
launch
{
thisRef
.
stringD
ao
.
delete
(
name
)
thisRef
.
stringD
B
.
delete
(
name
)
}
}
}
else
{
if
(
sync
)
{
runBlocking
{
thisRef
.
stringD
ao
.
put
(
name
,
value
)
thisRef
.
stringD
B
.
put
(
name
,
value
)
}
}
else
{
GlobalScope
.
launch
{
thisRef
.
stringD
ao
.
put
(
name
,
value
)
thisRef
.
stringD
B
.
put
(
name
,
value
)
}
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/databinding/DataBindingAdapters.kt
View file @
038f73a5
...
...
@@ -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
>()
markwon
.
setMarkdown
(
tv
,
text
.
toString
())
ServiceLocator
.
markwon
.
setMarkdown
(
tv
,
text
.
toString
())
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt
deleted
100644 → 0
View file @
649b49ff
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
<
Context
>().
packageManager
}
factory
(
Protected
)
{
get
<
Context
>().
deviceProtectedContext
}
single
(
SUTimeout
)
{
get
<
Context
>(
Protected
).
getSharedPreferences
(
"su_timeout"
,
0
)
}
single
{
PreferenceManager
.
getDefaultSharedPreferences
(
get
(
Protected
))
}
}
app/src/main/java/com/topjohnwu/magisk/di/DatabaseModule.kt
deleted
100644 → 0
View file @
649b49ff
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
<
RepoDatabase
>().
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
()
app/src/main/java/com/topjohnwu/magisk/di/Modules.kt
deleted
100644 → 0
View file @
649b49ff
package
com.topjohnwu.magisk.di
val
koinModules
=
listOf
(
applicationModule
,
networkingModule
,
databaseModule
,
repositoryModule
,
viewModelModules
)
app/src/main/java/com/topjohnwu/magisk/di/Networking
Module
.kt
→
app/src/main/java/com/topjohnwu/magisk/di/Networking.kt
View file @
038f73a5
...
...
@@ -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
<
RawServices
>(
get
(),
Const
.
Url
.
GITHUB_RAW_URL
)
}
single
{
createApiService
<
GithubApiServices
>(
get
(),
Const
.
Url
.
GITHUB_API_URL
)
}
single
{
createApiService
<
GithubPageServices
>(
get
(),
Const
.
Url
.
GITHUB_PAGE_URL
)
}
single
{
createApiService
<
JSDelivrServices
>(
get
(),
Const
.
Url
.
JS_DELIVR_URL
)
}
single
{
createMarkwon
(
get
(),
get
())
}
}
private
class
DnsResolver
(
client
:
OkHttpClient
)
:
Dns
{
private
val
doh
by
lazy
{
...
...
app/src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt
deleted
100644 → 0
View file @
649b49ff
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
())
}
}
app/src/main/java/com/topjohnwu/magisk/di/ServiceLocator.kt
0 → 100644
View file @
038f73a5
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
<
T
:
ViewModel
?
>
create
(
clz
:
Class
<
T
>):
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
<
reified
VM
:
ViewModel
>
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
()
app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt
deleted
100644 → 0
View file @
649b49ff
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
))
}
}
app/src/main/java/com/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt
View file @
038f73a5
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
>()
context
.
cacheDir
.
listFiles
{
_
,
name
->
name
.
endsWith
(
".md"
)
}.
orEmpty
().
forEach
{
AppContext
.
cacheDir
.
listFiles
{
_
,
name
->
name
.
endsWith
(
".md"
)
}.
orEmpty
().
forEach
{
it
.
delete
()
}
File
(
c
ontext
.
cacheDir
,
"${Info.remote.magisk.versionCode}.md"
).
writeText
(
text
)
File
(
AppC
ontext
.
cacheDir
,
"${Info.remote.magisk.versionCode}.md"
).
writeText
(
text
)
return
text
}
...
...
app/src/main/java/com/topjohnwu/magisk/events/dialog/MarkDownDialog.kt
View file @
038f73a5
...
...
@@ -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
<
TextView
>(
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
...
...
app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt
View file @
038f73a5
...
...
@@ -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
<
Context
>().
packageName
private
lateinit
var
osSymlink
:
Method
private
lateinit
var
os
:
Any
...
...
app/src/main/java/com/topjohnwu/magisk/ktx/XKoin.kt
deleted
100644 → 0
View file @
649b49ff
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
<
reified
T
>
inject
(
qualifier
:
Qualifier
?
=
null
,
noinline
parameters
:
ParametersDefinition
?
=
null
)
=
lazy
{
get
<
T
>(
qualifier
,
parameters
)
}
inline
fun
<
reified
T
>
get
(
qualifier
:
Qualifier
?
=
null
,
noinline
parameters
:
ParametersDefinition
?
=
null
):
T
=
getKoin
().
get
(
qualifier
,
parameters
)
app/src/main/java/com/topjohnwu/magisk/ktx/XString.kt
View file @
038f73a5
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
(
"\""
,
""
)
...
...
app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt
View file @
038f73a5
...
...
@@ -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
()
...
...
app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt
View file @
038f73a5
...
...
@@ -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
<
FlashViewModel
,
FragmentFlashMd2Binding
>()
{
override
val
layoutRes
=
R
.
layout
.
fragment_flash_md2
override
val
viewModel
by
viewModel
<
FlashViewModel
>
{
parametersOf
(
FlashFragmentArgs
.
fromBundle
(
requireArguments
()))
}
override
val
viewModel
by
viewModel
<
FlashViewModel
>()
private
var
defaultOrientation
=
-
1
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
viewModel
.
args
=
FlashFragmentArgs
.
fromBundle
(
requireArguments
())
}
override
fun
onStart
()
{
super
.
onStart
()
setHasOptionsMenu
(
true
)
...
...
app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt
View file @
038f73a5
...
...
@@ -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
<
ConsoleItem
>()
val
items
=
diffListOf
<
ConsoleItem
>()
val
itemBinding
=
itemBindingOf
<
ConsoleItem
>()
lateinit
var
args
:
FlashFragmentArgs
private
val
logItems
=
mutableListOf
<
String
>().
synchronized
()
private
val
outItems
=
object
:
CallbackList
<
String
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideFragment.kt
View file @
038f73a5
...
...
@@ -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
<
HideViewModel
,
FragmentHideMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
View file @
038f73a5
...
...
@@ -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
<
PackageManager
>()
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"
,
...
...
app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt
View file @
038f73a5
...
...
@@ -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
<
HomeViewModel
,
FragmentHomeMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt
View file @
038f73a5
...
...
@@ -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
<
InstallViewModel
,
FragmentInstallMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt
View file @
038f73a5
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
<
Context
>()
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
()
->
""
...
...
app/src/main/java/com/topjohnwu/magisk/ui/log/LogFragment.kt
View file @
038f73a5
...
...
@@ -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
<
LogViewModel
,
FragmentLogMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt
View file @
038f73a5
...
...
@@ -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
<
ModuleViewModel
,
FragmentModuleMd2Binding
>(),
ReselectionTarget
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/safetynet/CheckSafetyNetEvent.kt
View file @
038f73a5
...
...
@@ -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.d
ata.repository.NetworkService
import
com.topjohnwu.magisk.d
i.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
<
NetworkService
>()
private
val
svc
get
()
=
ServiceLocator
.
networkService
private
lateinit
var
apk
:
File
private
lateinit
var
dex
:
File
...
...
app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetFragment.kt
View file @
038f73a5
...
...
@@ -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
<
SafetynetViewModel
,
FragmentSafetynetMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt
View file @
038f73a5
...
...
@@ -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
<
SettingsViewModel
,
FragmentSettingsMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt
View file @
038f73a5
...
...
@@ -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.ge
t
import
com.topjohnwu.magisk.
di.AppContex
t
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
)
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt
View file @
038f73a5
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
<
BaseSettingsItem
>
{
val
context
=
get
<
Context
>()
val
context
=
AppContext
val
hidden
=
context
.
packageName
!=
BuildConfig
.
APPLICATION_ID
// Customization
...
...
app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt
View file @
038f73a5
...
...
@@ -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
<
SuperuserViewModel
,
FragmentSuperuserMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestActivity.kt
View file @
038f73a5
...
...
@@ -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
<
SuRequestViewModel
,
ActivityRequestBinding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt
View file @
038f73a5
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
<
String
>(
BR
.
item
,
R
.
layout
.
item_spinner
)
private
val
handler
=
SuRequestHandler
(
get
<
Context
>()
.
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)"
...
...
app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeFragment.kt
View file @
038f73a5
...
...
@@ -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
<
ThemeViewModel
,
FragmentThemeMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/utils/TextHolder.kt
View file @
038f73a5
...
...
@@ -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
// ---
...
...
app/src/main/java/com/topjohnwu/magisk/utils/Utils.kt
View file @
038f73a5
...
...
@@ -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.ge
t
import
com.topjohnwu.magisk.
di.AppContex
t
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
{
...
...
app/src/main/java/com/topjohnwu/magisk/view/Notifications.kt
View file @
038f73a5
...
...
@@ -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.ge
t
import
com.topjohnwu.magisk.
di.AppContex
t
import
com.topjohnwu.magisk.ktx.getBitmap
@Suppress
(
"DEPRECATION"
)
object
Notifications
{
val
mgr
by
lazy
{
get
<
Context
>()
.
getSystemService
<
NotificationManager
>()
!!
}
val
mgr
by
lazy
{
AppContext
.
getSystemService
<
NotificationManager
>()
!!
}
fun
setup
(
context
:
Context
)
{
if
(
SDK_INT
>=
26
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment