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
34450cdd
Commit
34450cdd
authored
Aug 19, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More refactoring
Cleanups, move classes to sane locations, etc.
parent
846bbb4d
Hide whitespace changes
Inline
Side-by-side
Showing
84 changed files
with
365 additions
and
483 deletions
+365
-483
proguard-rules.pro
app/proguard-rules.pro
+3
-3
BaseViewModel.kt
app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt
+4
-4
GeneralReceiver.kt
...rc/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt
+2
-2
DownloadService.kt
...ava/com/topjohnwu/magisk/core/download/DownloadService.kt
+4
-4
ManagerUpgrade.kt
...java/com/topjohnwu/magisk/core/download/ManagerUpgrade.kt
+3
-3
RemoteFileService.kt
...a/com/topjohnwu/magisk/core/download/RemoteFileService.kt
+3
-3
PolicyDao.kt
...main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt
+6
-6
Repo.kt
.../main/java/com/topjohnwu/magisk/core/model/module/Repo.kt
+1
-1
SuLog.kt
...src/main/java/com/topjohnwu/magisk/core/model/su/SuLog.kt
+5
-6
SuPolicy.kt
.../main/java/com/topjohnwu/magisk/core/model/su/SuPolicy.kt
+8
-8
SuCallbackHandler.kt
...in/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt
+5
-5
SuRequestHandler.kt
...ain/java/com/topjohnwu/magisk/core/su/SuRequestHandler.kt
+5
-5
MagiskInstaller.kt
...n/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt
+10
-9
SuLogDao.kt
.../main/java/com/topjohnwu/magisk/data/database/SuLogDao.kt
+5
-5
LogRepository.kt
...ava/com/topjohnwu/magisk/data/repository/LogRepository.kt
+2
-2
MagiskRepository.kt
.../com/topjohnwu/magisk/data/repository/MagiskRepository.kt
+2
-2
RecyclerViewItems.kt
...ava/com/topjohnwu/magisk/databinding/RecyclerViewItems.kt
+11
-0
RvBindingAdapter.kt
...java/com/topjohnwu/magisk/databinding/RvBindingAdapter.kt
+1
-2
InstallExternalModuleEvent.kt
...com/topjohnwu/magisk/events/InstallExternalModuleEvent.kt
+1
-1
OpenInappLinkEvent.kt
...in/java/com/topjohnwu/magisk/events/OpenInappLinkEvent.kt
+1
-1
RebootEvent.kt
app/src/main/java/com/topjohnwu/magisk/events/RebootEvent.kt
+1
-1
SnackbarEvent.kt
...rc/main/java/com/topjohnwu/magisk/events/SnackbarEvent.kt
+46
-0
ViewEvents.kt
app/src/main/java/com/topjohnwu/magisk/events/ViewEvents.kt
+76
-0
BiometricDialog.kt
...ava/com/topjohnwu/magisk/events/dialog/BiometricDialog.kt
+1
-1
DarkThemeDialog.kt
...ava/com/topjohnwu/magisk/events/dialog/DarkThemeDialog.kt
+1
-1
DialogEvent.kt
...in/java/com/topjohnwu/magisk/events/dialog/DialogEvent.kt
+1
-1
EnvFixDialog.kt
...n/java/com/topjohnwu/magisk/events/dialog/EnvFixDialog.kt
+3
-3
ManagerInstallDialog.kt
...om/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt
+3
-3
ModuleInstallDialog.kt
...com/topjohnwu/magisk/events/dialog/ModuleInstallDialog.kt
+3
-3
SecondSlotWarningDialog.kt
...topjohnwu/magisk/events/dialog/SecondSlotWarningDialog.kt
+1
-1
SuperuserRevokeDialog.kt
...m/topjohnwu/magisk/events/dialog/SuperuserRevokeDialog.kt
+2
-2
UninstallDialog.kt
...ava/com/topjohnwu/magisk/events/dialog/UninstallDialog.kt
+3
-3
Snackbar.kt
app/src/main/java/com/topjohnwu/magisk/ktx/Snackbar.kt
+0
-126
LenientRvItem.kt
...m/topjohnwu/magisk/model/entity/recycler/LenientRvItem.kt
+0
-16
ThemeItem.kt
...a/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt
+0
-14
IndeterminateState.kt
...topjohnwu/magisk/model/entity/state/IndeterminateState.kt
+0
-5
Configuration.kt
...java/com/topjohnwu/magisk/model/internal/Configuration.kt
+1
-1
DownloadSubject.kt
...va/com/topjohnwu/magisk/model/internal/DownloadSubject.kt
+1
-1
ConsoleItem.kt
...rc/main/java/com/topjohnwu/magisk/ui/flash/ConsoleItem.kt
+4
-2
FlashViewModel.kt
...main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt
+1
-2
HideAppInfo.kt
...src/main/java/com/topjohnwu/magisk/ui/hide/HideAppInfo.kt
+1
-1
HideRvItem.kt
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItem.kt
+1
-4
HideTarget.kt
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideTarget.kt
+1
-1
HideViewModel.kt
...c/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
+0
-6
DeveloperItem.kt
...c/main/java/com/topjohnwu/magisk/ui/home/DeveloperItem.kt
+1
-1
HomeFragment.kt
...rc/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt
+1
-1
HomeViewModel.kt
...c/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt
+5
-6
InstallFragment.kt
...n/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt
+1
-1
InstallViewModel.kt
.../java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt
+4
-4
LogRvItem.kt
app/src/main/java/com/topjohnwu/magisk/ui/log/LogRvItem.kt
+5
-5
LogViewModel.kt
...src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt
+5
-6
ModuleFragment.kt
...ain/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt
+1
-1
ModuleRvItem.kt
.../main/java/com/topjohnwu/magisk/ui/module/ModuleRvItem.kt
+1
-2
ModuleViewModel.kt
...in/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt
+4
-8
CheckSafetyNetEvent.kt
.../com/topjohnwu/magisk/ui/safetynet/CheckSafetyNetEvent.kt
+6
-75
SafetyNetHelper.kt
...java/com/topjohnwu/magisk/ui/safetynet/SafetyNetHelper.kt
+1
-1
SafetynetViewModel.kt
...a/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt
+1
-2
BaseSettingsItem.kt
...java/com/topjohnwu/magisk/ui/settings/BaseSettingsItem.kt
+9
-9
SettingsItems.kt
...in/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt
+23
-24
SettingsViewModel.kt
...ava/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt
+10
-11
PolicyRvItem.kt
...in/java/com/topjohnwu/magisk/ui/superuser/PolicyRvItem.kt
+9
-10
SpinnerRvItem.kt
...n/java/com/topjohnwu/magisk/ui/superuser/SpinnerRvItem.kt
+2
-2
SuperuserViewModel.kt
...a/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt
+13
-14
SuRequestViewModel.kt
...a/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt
+4
-4
ThemeViewModel.kt
...main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt
+3
-3
TappableHeadlineItem.kt
...in/java/com/topjohnwu/magisk/view/TappableHeadlineItem.kt
+1
-1
TextItem.kt
app/src/main/java/com/topjohnwu/magisk/view/TextItem.kt
+1
-1
fragment_home_md2.xml
app/src/main/res/layout/fragment_home_md2.xml
+1
-1
item_console_md2.xml
app/src/main/res/layout/item_console_md2.xml
+1
-1
item_developer.xml
app/src/main/res/layout/item_developer.xml
+1
-1
item_hide_md2.xml
app/src/main/res/layout/item_hide_md2.xml
+1
-1
item_hide_process_md2.xml
app/src/main/res/layout/item_hide_process_md2.xml
+1
-1
item_icon_link.xml
app/src/main/res/layout/item_icon_link.xml
+1
-1
item_log_access_md2.xml
app/src/main/res/layout/item_log_access_md2.xml
+1
-1
item_module_download.xml
app/src/main/res/layout/item_module_download.xml
+1
-1
item_module_md2.xml
app/src/main/res/layout/item_module_md2.xml
+1
-1
item_policy_md2.xml
app/src/main/res/layout/item_policy_md2.xml
+1
-1
item_repo_md2.xml
app/src/main/res/layout/item_repo_md2.xml
+1
-1
item_section_md2.xml
app/src/main/res/layout/item_section_md2.xml
+1
-1
item_settings.xml
app/src/main/res/layout/item_settings.xml
+2
-2
item_settings_section.xml
app/src/main/res/layout/item_settings_section.xml
+1
-1
item_spinner.xml
app/src/main/res/layout/item_spinner.xml
+2
-2
item_tappable_headline.xml
app/src/main/res/layout/item_tappable_headline.xml
+2
-2
item_text.xml
app/src/main/res/layout/item_text.xml
+2
-2
No files found.
app/proguard-rules.pro
View file @
34450cdd
...
@@ -29,9 +29,9 @@
...
@@ -29,9 +29,9 @@
-
keep
class
a
.
*
{
*
;
}
-
keep
class
a
.
*
{
*
;
}
# Snet
# Snet
-
keepclassmembers
class
com
.
topjohnwu
.
magisk
.
core
.
utils
.
SafetyNetHelper
{
*
;
}
-
keepclassmembers
class
com
.
topjohnwu
.
magisk
.
ui
.
safetynet
.
SafetyNetHelper
{
*
;
}
-
keep
,
allowobfuscation
interface
com
.
topjohnwu
.
magisk
.
core
.
utils
.
SafetyNetHelper
$
Callback
-
keep
,
allowobfuscation
interface
com
.
topjohnwu
.
magisk
.
ui
.
safetynet
.
SafetyNetHelper
$
Callback
-
keepclassmembers
class
*
implements
com
.
topjohnwu
.
magisk
.
core
.
utils
.
SafetyNetHelper
$
Callback
{
-
keepclassmembers
class
*
implements
com
.
topjohnwu
.
magisk
.
ui
.
safetynet
.
SafetyNetHelper
$
Callback
{
void
onResponse
(
int
);
void
onResponse
(
int
);
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/arch/BaseViewModel.kt
View file @
34450cdd
...
@@ -15,10 +15,10 @@ import com.topjohnwu.magisk.BR
...
@@ -15,10 +15,10 @@ import com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.base.BaseActivity
import
com.topjohnwu.magisk.core.base.BaseActivity
import
com.topjohnwu.magisk.
model.
events.BackPressEvent
import
com.topjohnwu.magisk.events.BackPressEvent
import
com.topjohnwu.magisk.
model.
events.PermissionEvent
import
com.topjohnwu.magisk.events.PermissionEvent
import
com.topjohnwu.magisk.
model.
events.SnackbarEvent
import
com.topjohnwu.magisk.events.SnackbarEvent
import
com.topjohnwu.magisk.
model.
events.ViewActionEvent
import
com.topjohnwu.magisk.events.ViewActionEvent
import
com.topjohnwu.magisk.model.navigation.NavigationWrapper
import
com.topjohnwu.magisk.model.navigation.NavigationWrapper
import
com.topjohnwu.magisk.utils.ObservableHost
import
com.topjohnwu.magisk.utils.ObservableHost
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
...
...
app/src/main/java/com/topjohnwu/magisk/core/GeneralReceiver.kt
View file @
34450cdd
...
@@ -8,8 +8,8 @@ import com.topjohnwu.magisk.core.magiskdb.PolicyDao
...
@@ -8,8 +8,8 @@ import com.topjohnwu.magisk.core.magiskdb.PolicyDao
import
com.topjohnwu.magisk.core.model.ManagerJson
import
com.topjohnwu.magisk.core.model.ManagerJson
import
com.topjohnwu.magisk.core.su.SuCallbackHandler
import
com.topjohnwu.magisk.core.su.SuCallbackHandler
import
com.topjohnwu.magisk.ktx.reboot
import
com.topjohnwu.magisk.ktx.reboot
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration
import
com.topjohnwu.magisk.model.internal.Configuration
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.view.Shortcuts
import
com.topjohnwu.magisk.view.Shortcuts
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.GlobalScope
import
kotlinx.coroutines.GlobalScope
...
...
app/src/main/java/com/topjohnwu/magisk/core/download/DownloadService.kt
View file @
34450cdd
...
@@ -13,10 +13,10 @@ import com.topjohnwu.magisk.core.tasks.EnvFixTask
...
@@ -13,10 +13,10 @@ import com.topjohnwu.magisk.core.tasks.EnvFixTask
import
com.topjohnwu.magisk.ktx.chooser
import
com.topjohnwu.magisk.ktx.chooser
import
com.topjohnwu.magisk.ktx.exists
import
com.topjohnwu.magisk.ktx.exists
import
com.topjohnwu.magisk.ktx.provide
import
com.topjohnwu.magisk.ktx.provide
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration.*
import
com.topjohnwu.magisk.model.internal.Configuration.*
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration.Flash.Secondary
import
com.topjohnwu.magisk.model.internal.Configuration.Flash.Secondary
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject.*
import
com.topjohnwu.magisk.model.internal.DownloadSubject.*
import
com.topjohnwu.magisk.ui.flash.FlashFragment
import
com.topjohnwu.magisk.ui.flash.FlashFragment
import
com.topjohnwu.magisk.utils.APKInstall
import
com.topjohnwu.magisk.utils.APKInstall
import
org.koin.core.get
import
org.koin.core.get
...
...
app/src/main/java/com/topjohnwu/magisk/core/download/ManagerUpgrade.kt
View file @
34450cdd
...
@@ -10,9 +10,9 @@ import com.topjohnwu.magisk.core.intent
...
@@ -10,9 +10,9 @@ import com.topjohnwu.magisk.core.intent
import
com.topjohnwu.magisk.core.isRunningAsStub
import
com.topjohnwu.magisk.core.isRunningAsStub
import
com.topjohnwu.magisk.core.utils.PatchAPK
import
com.topjohnwu.magisk.core.utils.PatchAPK
import
com.topjohnwu.magisk.ktx.writeTo
import
com.topjohnwu.magisk.ktx.writeTo
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration.APK.Restore
import
com.topjohnwu.magisk.model.internal.Configuration.APK.Restore
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration.APK.Upgrade
import
com.topjohnwu.magisk.model.internal.Configuration.APK.Upgrade
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
java.io.File
import
java.io.File
...
...
app/src/main/java/com/topjohnwu/magisk/core/download/RemoteFileService.kt
View file @
34450cdd
...
@@ -10,9 +10,9 @@ import com.topjohnwu.magisk.core.utils.ProgressInputStream
...
@@ -10,9 +10,9 @@ import com.topjohnwu.magisk.core.utils.ProgressInputStream
import
com.topjohnwu.magisk.data.network.GithubRawServices
import
com.topjohnwu.magisk.data.network.GithubRawServices
import
com.topjohnwu.magisk.ktx.checkSum
import
com.topjohnwu.magisk.ktx.checkSum
import
com.topjohnwu.magisk.ktx.writeTo
import
com.topjohnwu.magisk.ktx.writeTo
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject.Magisk
import
com.topjohnwu.magisk.model.internal.DownloadSubject.Magisk
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject.Module
import
com.topjohnwu.magisk.model.internal.DownloadSubject.Module
import
com.topjohnwu.magisk.view.Notifications
import
com.topjohnwu.magisk.view.Notifications
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
okhttp3.ResponseBody
import
okhttp3.ResponseBody
...
...
app/src/main/java/com/topjohnwu/magisk/core/magiskdb/PolicyDao.kt
View file @
34450cdd
...
@@ -3,9 +3,9 @@ package com.topjohnwu.magisk.core.magiskdb
...
@@ -3,9 +3,9 @@ package com.topjohnwu.magisk.core.magiskdb
import
android.content.Context
import
android.content.Context
import
android.content.pm.PackageManager
import
android.content.pm.PackageManager
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.model.
Magisk
Policy
import
com.topjohnwu.magisk.core.model.
su.Su
Policy
import
com.topjohnwu.magisk.core.model.toMap
import
com.topjohnwu.magisk.core.model.
su.
toMap
import
com.topjohnwu.magisk.core.model.toPolicy
import
com.topjohnwu.magisk.core.model.
su.
toPolicy
import
com.topjohnwu.magisk.ktx.now
import
com.topjohnwu.magisk.ktx.now
import
kotlinx.coroutines.GlobalScope
import
kotlinx.coroutines.GlobalScope
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
...
@@ -49,11 +49,11 @@ class PolicyDao(
...
@@ -49,11 +49,11 @@ class PolicyDao(
}
}
}.
query
().
first
().
toPolicyOrNull
()
}.
query
().
first
().
toPolicyOrNull
()
suspend
fun
update
(
policy
:
Magisk
Policy
)
=
buildQuery
<
Replace
>
{
suspend
fun
update
(
policy
:
Su
Policy
)
=
buildQuery
<
Replace
>
{
values
(
policy
.
toMap
())
values
(
policy
.
toMap
())
}.
commit
()
}.
commit
()
suspend
fun
<
R
:
Any
>
fetchAll
(
mapper
:
(
Magisk
Policy
)
->
R
)
=
buildQuery
<
Select
>
{
suspend
fun
<
R
:
Any
>
fetchAll
(
mapper
:
(
Su
Policy
)
->
R
)
=
buildQuery
<
Select
>
{
condition
{
condition
{
equals
(
"uid/100000"
,
Const
.
USER_ID
)
equals
(
"uid/100000"
,
Const
.
USER_ID
)
}
}
...
@@ -61,7 +61,7 @@ class PolicyDao(
...
@@ -61,7 +61,7 @@ class PolicyDao(
it
.
toPolicyOrNull
()
?.
let
(
mapper
)
it
.
toPolicyOrNull
()
?.
let
(
mapper
)
}
}
private
fun
Map
<
String
,
String
>.
toPolicyOrNull
():
Magisk
Policy
?
{
private
fun
Map
<
String
,
String
>.
toPolicyOrNull
():
Su
Policy
?
{
return
runCatching
{
toPolicy
(
context
.
packageManager
)
}.
getOrElse
{
return
runCatching
{
toPolicy
(
context
.
packageManager
)
}.
getOrElse
{
Timber
.
e
(
it
)
Timber
.
e
(
it
)
if
(
it
is
PackageManager
.
NameNotFoundException
)
{
if
(
it
is
PackageManager
.
NameNotFoundException
)
{
...
...
app/src/main/java/com/topjohnwu/magisk/core/model/module/Repo.kt
View file @
34450cdd
...
@@ -59,6 +59,6 @@ data class Repo(
...
@@ -59,6 +59,6 @@ data class Repo(
class
IllegalRepoException
(
message
:
String
)
:
Exception
(
message
)
class
IllegalRepoException
(
message
:
String
)
:
Exception
(
message
)
companion
object
{
companion
object
{
val
dateFormat
=
DateFormat
.
getDateTimeInstance
(
DateFormat
.
MEDIUM
,
DateFormat
.
MEDIUM
)
!!
val
dateFormat
=
DateFormat
.
getDateTimeInstance
(
DateFormat
.
MEDIUM
,
DateFormat
.
MEDIUM
)
}
}
}
}
app/src/main/java/com/topjohnwu/magisk/
model/entity/Magisk
Log.kt
→
app/src/main/java/com/topjohnwu/magisk/
core/model/su/Su
Log.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity
package
com.topjohnwu.magisk.
core.model.su
import
androidx.room.Entity
import
androidx.room.Entity
import
androidx.room.Ignore
import
androidx.room.Ignore
import
androidx.room.PrimaryKey
import
androidx.room.PrimaryKey
import
com.topjohnwu.magisk.core.model.MagiskPolicy
import
com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.ALLOW
import
com.topjohnwu.magisk.core.model.MagiskPolicy.Companion.ALLOW
import
com.topjohnwu.magisk.ktx.now
import
com.topjohnwu.magisk.ktx.now
import
com.topjohnwu.magisk.ktx.timeFormatTime
import
com.topjohnwu.magisk.ktx.timeFormatTime
import
com.topjohnwu.magisk.ktx.toTime
import
com.topjohnwu.magisk.ktx.toTime
@Entity
(
tableName
=
"logs"
)
@Entity
(
tableName
=
"logs"
)
data class
Magisk
Log
(
data class
Su
Log
(
val
fromUid
:
Int
,
val
fromUid
:
Int
,
val
toUid
:
Int
,
val
toUid
:
Int
,
val
fromPid
:
Int
,
val
fromPid
:
Int
,
...
@@ -24,8 +23,8 @@ data class MagiskLog(
...
@@ -24,8 +23,8 @@ data class MagiskLog(
@Ignore
val
timeString
=
time
.
toTime
(
timeFormatTime
)
@Ignore
val
timeString
=
time
.
toTime
(
timeFormatTime
)
}
}
fun
Magisk
Policy
.
toLog
(
fun
Su
Policy
.
toLog
(
toUid
:
Int
,
toUid
:
Int
,
fromPid
:
Int
,
fromPid
:
Int
,
command
:
String
command
:
String
)
=
Magisk
Log
(
uid
,
toUid
,
fromPid
,
packageName
,
appName
,
command
,
policy
==
ALLOW
,
now
)
)
=
Su
Log
(
uid
,
toUid
,
fromPid
,
packageName
,
appName
,
command
,
policy
==
ALLOW
,
now
)
app/src/main/java/com/topjohnwu/magisk/core/model/
Magisk
Policy.kt
→
app/src/main/java/com/topjohnwu/magisk/core/model/
su/Su
Policy.kt
View file @
34450cdd
package
com.topjohnwu.magisk.core.model
package
com.topjohnwu.magisk.core.model
.su
import
android.content.pm.ApplicationInfo
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageManager
import
android.content.pm.PackageManager
import
com.topjohnwu.magisk.core.model.
Magisk
Policy.Companion.INTERACTIVE
import
com.topjohnwu.magisk.core.model.
su.Su
Policy.Companion.INTERACTIVE
import
com.topjohnwu.magisk.ktx.getLabel
import
com.topjohnwu.magisk.ktx.getLabel
data class
Magisk
Policy
(
data class
Su
Policy
(
var
uid
:
Int
,
var
uid
:
Int
,
val
packageName
:
String
,
val
packageName
:
String
,
val
appName
:
String
,
val
appName
:
String
,
...
@@ -25,7 +25,7 @@ data class MagiskPolicy(
...
@@ -25,7 +25,7 @@ data class MagiskPolicy(
}
}
fun
Magisk
Policy
.
toMap
()
=
mapOf
(
fun
Su
Policy
.
toMap
()
=
mapOf
(
"uid"
to
uid
,
"uid"
to
uid
,
"package_name"
to
packageName
,
"package_name"
to
packageName
,
"policy"
to
policy
,
"policy"
to
policy
,
...
@@ -35,7 +35,7 @@ fun MagiskPolicy.toMap() = mapOf(
...
@@ -35,7 +35,7 @@ fun MagiskPolicy.toMap() = mapOf(
)
)
@Throws
(
PackageManager
.
NameNotFoundException
::
class
)
@Throws
(
PackageManager
.
NameNotFoundException
::
class
)
fun
Map
<
String
,
String
>.
toPolicy
(
pm
:
PackageManager
):
Magisk
Policy
{
fun
Map
<
String
,
String
>.
toPolicy
(
pm
:
PackageManager
):
Su
Policy
{
val
uid
=
get
(
"uid"
)
?.
toIntOrNull
()
?:
-
1
val
uid
=
get
(
"uid"
)
?.
toIntOrNull
()
?:
-
1
val
packageName
=
get
(
"package_name"
).
orEmpty
()
val
packageName
=
get
(
"package_name"
).
orEmpty
()
val
info
=
pm
.
getApplicationInfo
(
packageName
,
PackageManager
.
GET_UNINSTALLED_PACKAGES
)
val
info
=
pm
.
getApplicationInfo
(
packageName
,
PackageManager
.
GET_UNINSTALLED_PACKAGES
)
...
@@ -43,7 +43,7 @@ fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
...
@@ -43,7 +43,7 @@ fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
if
(
info
.
uid
!=
uid
)
if
(
info
.
uid
!=
uid
)
throw
PackageManager
.
NameNotFoundException
()
throw
PackageManager
.
NameNotFoundException
()
return
Magisk
Policy
(
return
Su
Policy
(
uid
=
uid
,
uid
=
uid
,
packageName
=
packageName
,
packageName
=
packageName
,
policy
=
get
(
"policy"
)
?.
toIntOrNull
()
?:
INTERACTIVE
,
policy
=
get
(
"policy"
)
?.
toIntOrNull
()
?:
INTERACTIVE
,
...
@@ -56,11 +56,11 @@ fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
...
@@ -56,11 +56,11 @@ fun Map<String, String>.toPolicy(pm: PackageManager): MagiskPolicy {
}
}
@Throws
(
PackageManager
.
NameNotFoundException
::
class
)
@Throws
(
PackageManager
.
NameNotFoundException
::
class
)
fun
Int
.
toPolicy
(
pm
:
PackageManager
,
policy
:
Int
=
INTERACTIVE
):
Magisk
Policy
{
fun
Int
.
toPolicy
(
pm
:
PackageManager
,
policy
:
Int
=
INTERACTIVE
):
Su
Policy
{
val
pkg
=
pm
.
getPackagesForUid
(
this
)
?.
firstOrNull
()
val
pkg
=
pm
.
getPackagesForUid
(
this
)
?.
firstOrNull
()
?:
throw
PackageManager
.
NameNotFoundException
()
?:
throw
PackageManager
.
NameNotFoundException
()
val
info
=
pm
.
getApplicationInfo
(
pkg
,
PackageManager
.
GET_UNINSTALLED_PACKAGES
)
val
info
=
pm
.
getApplicationInfo
(
pkg
,
PackageManager
.
GET_UNINSTALLED_PACKAGES
)
return
Magisk
Policy
(
return
Su
Policy
(
uid
=
info
.
uid
,
uid
=
info
.
uid
,
packageName
=
pkg
,
packageName
=
pkg
,
policy
=
policy
,
policy
=
policy
,
...
...
app/src/main/java/com/topjohnwu/magisk/core/su/SuCallbackHandler.kt
View file @
34450cdd
...
@@ -11,14 +11,14 @@ import com.topjohnwu.magisk.ProviderCallHandler
...
@@ -11,14 +11,14 @@ import com.topjohnwu.magisk.ProviderCallHandler
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.intent
import
com.topjohnwu.magisk.core.intent
import
com.topjohnwu.magisk.core.model.MagiskPolicy
import
com.topjohnwu.magisk.core.model.su.SuPolicy
import
com.topjohnwu.magisk.core.model.toPolicy
import
com.topjohnwu.magisk.core.model.su.toLog
import
com.topjohnwu.magisk.core.model.su.toPolicy
import
com.topjohnwu.magisk.core.wrap
import
com.topjohnwu.magisk.core.wrap
import
com.topjohnwu.magisk.data.repository.LogRepository
import
com.topjohnwu.magisk.data.repository.LogRepository
import
com.topjohnwu.magisk.ktx.get
import
com.topjohnwu.magisk.ktx.get
import
com.topjohnwu.magisk.ktx.startActivity
import
com.topjohnwu.magisk.ktx.startActivity
import
com.topjohnwu.magisk.ktx.startActivityWithRoot
import
com.topjohnwu.magisk.ktx.startActivityWithRoot
import
com.topjohnwu.magisk.model.entity.toLog
import
com.topjohnwu.magisk.ui.surequest.SuRequestActivity
import
com.topjohnwu.magisk.ui.surequest.SuRequestActivity
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
...
@@ -132,9 +132,9 @@ object SuCallbackHandler : ProviderCallHandler {
...
@@ -132,9 +132,9 @@ object SuCallbackHandler : ProviderCallHandler {
}
}
}
}
private
fun
notify
(
context
:
Context
,
policy
:
Magisk
Policy
)
{
private
fun
notify
(
context
:
Context
,
policy
:
Su
Policy
)
{
if
(
policy
.
notification
&&
Config
.
suNotification
==
Config
.
Value
.
NOTIFICATION_TOAST
)
{
if
(
policy
.
notification
&&
Config
.
suNotification
==
Config
.
Value
.
NOTIFICATION_TOAST
)
{
val
resId
=
if
(
policy
.
policy
==
Magisk
Policy
.
ALLOW
)
val
resId
=
if
(
policy
.
policy
==
Su
Policy
.
ALLOW
)
R
.
string
.
su_allow_toast
R
.
string
.
su_allow_toast
else
else
R
.
string
.
su_deny_toast
R
.
string
.
su_deny_toast
...
...
app/src/main/java/com/topjohnwu/magisk/core/su/SuRequestHandler.kt
View file @
34450cdd
...
@@ -10,8 +10,8 @@ import com.topjohnwu.magisk.BuildConfig
...
@@ -10,8 +10,8 @@ import com.topjohnwu.magisk.BuildConfig
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.magiskdb.PolicyDao
import
com.topjohnwu.magisk.core.magiskdb.PolicyDao
import
com.topjohnwu.magisk.core.model.
Magisk
Policy
import
com.topjohnwu.magisk.core.model.
su.Su
Policy
import
com.topjohnwu.magisk.core.model.toPolicy
import
com.topjohnwu.magisk.core.model.
su.
toPolicy
import
com.topjohnwu.magisk.ktx.now
import
com.topjohnwu.magisk.ktx.now
import
kotlinx.coroutines.*
import
kotlinx.coroutines.*
import
timber.log.Timber
import
timber.log.Timber
...
@@ -27,7 +27,7 @@ abstract class SuRequestHandler(
...
@@ -27,7 +27,7 @@ abstract class SuRequestHandler(
private
lateinit
var
output
:
DataOutputStream
private
lateinit
var
output
:
DataOutputStream
private
lateinit
var
input
:
DataInputStream
private
lateinit
var
input
:
DataInputStream
protected
lateinit
var
policy
:
Magisk
Policy
protected
lateinit
var
policy
:
Su
Policy
private
set
private
set
abstract
fun
onStart
()
abstract
fun
onStart
()
...
@@ -44,11 +44,11 @@ abstract class SuRequestHandler(
...
@@ -44,11 +44,11 @@ abstract class SuRequestHandler(
when
(
Config
.
suAutoReponse
)
{
when
(
Config
.
suAutoReponse
)
{
Config
.
Value
.
SU_AUTO_DENY
->
{
Config
.
Value
.
SU_AUTO_DENY
->
{
respond
(
Magisk
Policy
.
DENY
,
0
)
respond
(
Su
Policy
.
DENY
,
0
)
return
true
return
true
}
}
Config
.
Value
.
SU_AUTO_ALLOW
->
{
Config
.
Value
.
SU_AUTO_ALLOW
->
{
respond
(
Magisk
Policy
.
ALLOW
,
0
)
respond
(
Su
Policy
.
ALLOW
,
0
)
return
true
return
true
}
}
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt
View file @
34450cdd
...
@@ -14,10 +14,10 @@ import com.topjohnwu.magisk.core.Config
...
@@ -14,10 +14,10 @@ import com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.data.network.GithubRawServices
import
com.topjohnwu.magisk.data.network.GithubRawServices
import
com.topjohnwu.magisk.di.Protected
import
com.topjohnwu.magisk.di.Protected
import
com.topjohnwu.magisk.events.dialog.EnvFixDialog
import
com.topjohnwu.magisk.ktx.readUri
import
com.topjohnwu.magisk.ktx.readUri
import
com.topjohnwu.magisk.ktx.reboot
import
com.topjohnwu.magisk.ktx.reboot
import
com.topjohnwu.magisk.ktx.withStreams
import
com.topjohnwu.magisk.ktx.withStreams
import
com.topjohnwu.magisk.model.events.dialog.EnvFixDialog
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.signing.SignBoot
import
com.topjohnwu.signing.SignBoot
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
...
@@ -100,6 +100,7 @@ abstract class MagiskInstallImpl : KoinComponent {
...
@@ -100,6 +100,7 @@ abstract class MagiskInstallImpl : KoinComponent {
return
true
return
true
}
}
@Suppress
(
"DEPRECATION"
)
private
fun
extractZip
():
Boolean
{
private
fun
extractZip
():
Boolean
{
val
arch
:
String
val
arch
:
String
arch
=
if
(
Build
.
VERSION
.
SDK_INT
>=
21
)
{
arch
=
if
(
Build
.
VERSION
.
SDK_INT
>=
21
)
{
...
@@ -130,14 +131,14 @@ abstract class MagiskInstallImpl : KoinComponent {
...
@@ -130,14 +131,14 @@ abstract class MagiskInstallImpl : KoinComponent {
}
}
if
(
name
==
null
&&
ze
.
name
.
startsWith
(
"chromeos/"
))
if
(
name
==
null
&&
ze
.
name
.
startsWith
(
"chromeos/"
))
name
=
ze
.
name
name
=
ze
.
name
if
(
name
==
null
)
name
?.
also
{
continue
val
dest
=
if
(
installDir
is
SuFile
)
val
dest
=
if
(
installDir
is
SuFile
)
SuFile
(
installDir
,
it
)
SuFile
(
installDir
,
name
)
else
else
File
(
installDir
,
it
)
File
(
installDir
,
name
)
dest
.
parentFile
!!
.
mkdirs
(
)
dest
.
parentFile
!!
.
mkdirs
()
SuFileOutputStream
(
dest
).
use
{
s
->
zi
.
copyTo
(
s
)
}
SuFileOutputStream
(
dest
).
use
{
zi
.
copyTo
(
it
)
}
}
?:
continue
}
}
}
}
}
catch
(
e
:
IOException
)
{
}
catch
(
e
:
IOException
)
{
...
...
app/src/main/java/com/topjohnwu/magisk/data/database/SuLogDao.kt
View file @
34450cdd
package
com.topjohnwu.magisk.data.database
package
com.topjohnwu.magisk.data.database
import
androidx.room.*
import
androidx.room.*
import
com.topjohnwu.magisk.
model.entity.Magisk
Log
import
com.topjohnwu.magisk.
core.model.su.Su
Log
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.withContext
import
kotlinx.coroutines.withContext
import
java.util.*
import
java.util.*
@Database
(
version
=
1
,
entities
=
[
Magisk
Log
::
class
],
exportSchema
=
false
)
@Database
(
version
=
1
,
entities
=
[
Su
Log
::
class
],
exportSchema
=
false
)
abstract
class
SuLogDatabase
:
RoomDatabase
()
{
abstract
class
SuLogDatabase
:
RoomDatabase
()
{
abstract
fun
suLogDao
():
SuLogDao
abstract
fun
suLogDao
():
SuLogDao
...
@@ -20,18 +20,18 @@ abstract class SuLogDao(private val db: SuLogDatabase) {
...
@@ -20,18 +20,18 @@ abstract class SuLogDao(private val db: SuLogDatabase) {
suspend
fun
deleteAll
()
=
withContext
(
Dispatchers
.
IO
)
{
db
.
clearAllTables
()
}
suspend
fun
deleteAll
()
=
withContext
(
Dispatchers
.
IO
)
{
db
.
clearAllTables
()
}
suspend
fun
fetchAll
():
MutableList
<
Magisk
Log
>
{
suspend
fun
fetchAll
():
MutableList
<
Su
Log
>
{
deleteOutdated
()
deleteOutdated
()
return
fetch
()
return
fetch
()
}
}
@Query
(
"SELECT * FROM logs ORDER BY time DESC"
)
@Query
(
"SELECT * FROM logs ORDER BY time DESC"
)
protected
abstract
suspend
fun
fetch
():
MutableList
<
Magisk
Log
>
protected
abstract
suspend
fun
fetch
():
MutableList
<
Su
Log
>
@Query
(
"DELETE FROM logs WHERE time < :timeout"
)
@Query
(
"DELETE FROM logs WHERE time < :timeout"
)
protected
abstract
suspend
fun
deleteOutdated
(
timeout
:
Long
=
twoWeeksAgo
)
protected
abstract
suspend
fun
deleteOutdated
(
timeout
:
Long
=
twoWeeksAgo
)
@Insert
@Insert
abstract
suspend
fun
insert
(
log
:
Magisk
Log
)
abstract
suspend
fun
insert
(
log
:
Su
Log
)
}
}
app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt
View file @
34450cdd
package
com.topjohnwu.magisk.data.repository
package
com.topjohnwu.magisk.data.repository
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.model.su.SuLog
import
com.topjohnwu.magisk.data.database.SuLogDao
import
com.topjohnwu.magisk.data.database.SuLogDao
import
com.topjohnwu.magisk.ktx.await
import
com.topjohnwu.magisk.ktx.await
import
com.topjohnwu.magisk.model.entity.MagiskLog
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
...
@@ -36,6 +36,6 @@ class LogRepository(
...
@@ -36,6 +36,6 @@ class LogRepository(
fun
clearMagiskLogs
(
cb
:
(
Shell
.
Result
)
->
Unit
)
=
fun
clearMagiskLogs
(
cb
:
(
Shell
.
Result
)
->
Unit
)
=
Shell
.
su
(
"echo -n > ${Const.MAGISK_LOG}"
).
submit
(
cb
)
Shell
.
su
(
"echo -n > ${Const.MAGISK_LOG}"
).
submit
(
cb
)
suspend
fun
insert
(
log
:
Magisk
Log
)
=
logDao
.
insert
(
log
)
suspend
fun
insert
(
log
:
Su
Log
)
=
logDao
.
insert
(
log
)
}
}
app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt
View file @
34450cdd
...
@@ -7,8 +7,8 @@ import com.topjohnwu.magisk.data.network.GithubRawServices
...
@@ -7,8 +7,8 @@ import com.topjohnwu.magisk.data.network.GithubRawServices
import
com.topjohnwu.magisk.ktx.await
import
com.topjohnwu.magisk.ktx.await
import
com.topjohnwu.magisk.ktx.getLabel
import
com.topjohnwu.magisk.ktx.getLabel
import
com.topjohnwu.magisk.ktx.packageName
import
com.topjohnwu.magisk.ktx.packageName
import
com.topjohnwu.magisk.
model.entity
.HideAppInfo
import
com.topjohnwu.magisk.
ui.hide
.HideAppInfo
import
com.topjohnwu.magisk.
model.entity
.HideTarget
import
com.topjohnwu.magisk.
ui.hide
.HideTarget
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.withContext
import
kotlinx.coroutines.withContext
...
...
app/src/main/java/com/topjohnwu/magisk/databinding/RecyclerViewItems.kt
View file @
34450cdd
...
@@ -3,6 +3,7 @@ package com.topjohnwu.magisk.databinding
...
@@ -3,6 +3,7 @@ package com.topjohnwu.magisk.databinding
import
androidx.annotation.CallSuper
import
androidx.annotation.CallSuper
import
androidx.databinding.PropertyChangeRegistry
import
androidx.databinding.PropertyChangeRegistry
import
androidx.databinding.ViewDataBinding
import
androidx.databinding.ViewDataBinding
import
androidx.recyclerview.widget.RecyclerView
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.utils.DiffObservableList
import
com.topjohnwu.magisk.utils.DiffObservableList
import
com.topjohnwu.magisk.utils.ObservableHost
import
com.topjohnwu.magisk.utils.ObservableHost
...
@@ -52,3 +53,13 @@ abstract class ComparableRvItem<in T> : RvItem() {
...
@@ -52,3 +53,13 @@ abstract class ComparableRvItem<in T> : RvItem() {
abstract
class
ObservableItem
<
T
>
:
ComparableRvItem
<
T
>(),
ObservableHost
{
abstract
class
ObservableItem
<
T
>
:
ComparableRvItem
<
T
>(),
ObservableHost
{
override
var
callbacks
:
PropertyChangeRegistry
?
=
null
override
var
callbacks
:
PropertyChangeRegistry
?
=
null
}
}
/**
* This item addresses issues where enclosing recycler has to be invalidated or generally
* manipulated with. This shouldn't be however necessary for 99.9% of use-cases. Refrain from using
* this item as it provides virtually no additional functionality. Stick with ComparableRvItem.
* */
interface
LenientRvItem
{
fun
onBindingBound
(
binding
:
ViewDataBinding
,
recyclerView
:
RecyclerView
)
}
app/src/main/java/com/topjohnwu/magisk/databinding/RvBindingAdapter.kt
View file @
34450cdd
...
@@ -2,7 +2,6 @@ package com.topjohnwu.magisk.databinding
...
@@ -2,7 +2,6 @@ package com.topjohnwu.magisk.databinding
import
androidx.databinding.ViewDataBinding
import
androidx.databinding.ViewDataBinding
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView
import
com.topjohnwu.magisk.model.entity.recycler.LenientRvItem
import
me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter
import
me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter
class
RvBindingAdapter
<
T
:
RvItem
>
:
BindingRecyclerViewAdapter
<
T
>()
{
class
RvBindingAdapter
<
T
:
RvItem
>
:
BindingRecyclerViewAdapter
<
T
>()
{
...
@@ -19,7 +18,7 @@ class RvBindingAdapter<T : RvItem> : BindingRecyclerViewAdapter<T>() {
...
@@ -19,7 +18,7 @@ class RvBindingAdapter<T : RvItem> : BindingRecyclerViewAdapter<T>() {
super
.
onBindBinding
(
binding
,
variableId
,
layoutRes
,
position
,
item
)
super
.
onBindBinding
(
binding
,
variableId
,
layoutRes
,
position
,
item
)
when
(
item
)
{
when
(
item
)
{
is
LenientRvItem
<*>
->
{
is
LenientRvItem
->
{
val
recycler
=
recyclerView
?:
return
val
recycler
=
recyclerView
?:
return
item
.
onBindingBound
(
binding
)
item
.
onBindingBound
(
binding
)
item
.
onBindingBound
(
binding
,
recycler
)
item
.
onBindingBound
(
binding
,
recycler
)
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/InstallExternalModuleEvent.kt
→
app/src/main/java/com/topjohnwu/magisk/events/InstallExternalModuleEvent.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events
package
com.topjohnwu.magisk.events
import
android.Manifest
import
android.Manifest
import
android.app.Activity
import
android.app.Activity
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/OpenInappLinkEvent.kt
→
app/src/main/java/com/topjohnwu/magisk/events/OpenInappLinkEvent.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events
package
com.topjohnwu.magisk.events
import
android.content.Context
import
android.content.Context
import
android.content.res.Resources
import
android.content.res.Resources
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/RebootEvent.kt
→
app/src/main/java/com/topjohnwu/magisk/events/RebootEvent.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events
package
com.topjohnwu.magisk.events
import
android.view.ContextThemeWrapper
import
android.view.ContextThemeWrapper
import
android.view.MenuItem
import
android.view.MenuItem
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/SnackbarEvent.kt
→
app/src/main/java/com/topjohnwu/magisk/events/SnackbarEvent.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events
package
com.topjohnwu.magisk.events
import
android.
content.Context
import
android.
view.View
import
androidx.annotation.StringRes
import
androidx.annotation.StringRes
import
com.google.android.material.snackbar.Snackbar
import
com.google.android.material.snackbar.Snackbar
import
com.topjohnwu.magisk.arch.ActivityExecutor
import
com.topjohnwu.magisk.arch.ActivityExecutor
import
com.topjohnwu.magisk.arch.BaseUIActivity
import
com.topjohnwu.magisk.arch.BaseUIActivity
import
com.topjohnwu.magisk.arch.ViewEvent
import
com.topjohnwu.magisk.arch.ViewEvent
import
com.topjohnwu.magisk.core.base.BaseActivity
import
com.topjohnwu.magisk.core.base.BaseActivity
import
com.topjohnwu.magisk.
ktx.snackbar
import
com.topjohnwu.magisk.
utils.TransitiveText
class
SnackbarEvent
private
constructor
(
class
SnackbarEvent
private
constructor
(
@StringRes
private
val
messageRes
:
Int
,
private
val
msg
:
TransitiveText
,
private
val
messageString
:
String
?,
private
val
length
:
Int
,
val
length
:
Int
,
private
val
builder
:
Snackbar
.()
->
Unit
val
f
:
Snackbar
.()
->
Unit
)
:
ViewEvent
(),
ActivityExecutor
{
)
:
ViewEvent
(),
ActivityExecutor
{
constructor
(
constructor
(
@StringRes
messageR
es
:
Int
,
@StringRes
r
es
:
Int
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
f
:
Snackbar
.()
->
Unit
=
{}
builder
:
Snackbar
.()
->
Unit
=
{}
)
:
this
(
messageRes
,
null
,
length
,
f
)
)
:
this
(
TransitiveText
.
Res
(
res
),
length
,
builder
)
constructor
(
constructor
(
message
:
String
,
message
:
String
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
f
:
Snackbar
.()
->
Unit
=
{}
builder
:
Snackbar
.()
->
Unit
=
{}
)
:
this
(
-
1
,
message
,
length
,
f
)
)
:
this
(
TransitiveText
.
String
(
message
),
length
,
builder
)
fun
message
(
context
:
Context
):
String
=
messageString
?:
context
.
getString
(
messageRes
)
private
fun
snackbar
(
view
:
View
,
message
:
String
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
builder
:
Snackbar
.()
->
Unit
=
{}
)
=
Snackbar
.
make
(
view
,
message
,
length
).
apply
(
builder
).
show
()
override
fun
invoke
(
activity
:
BaseActivity
)
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
if
(
activity
is
BaseUIActivity
<*,
*>)
{
if
(
activity
is
BaseUIActivity
<*,
*>)
{
activity
.
snackbar
(
activity
.
snackbarView
,
message
(
activity
),
length
,
f
)
snackbar
(
activity
.
snackbarView
,
msg
.
getText
(
activity
.
resources
).
toString
(),
length
,
builder
)
}
}
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/events/ViewEvents.kt
0 → 100644
View file @
34450cdd
package
com.topjohnwu.magisk.events
import
android.app.Activity
import
android.content.Context
import
android.content.Intent
import
com.topjohnwu.magisk.arch.ActivityExecutor
import
com.topjohnwu.magisk.arch.ContextExecutor
import
com.topjohnwu.magisk.arch.ViewEvent
import
com.topjohnwu.magisk.arch.ViewEventWithScope
import
com.topjohnwu.magisk.core.base.BaseActivity
import
com.topjohnwu.magisk.core.model.module.Repo
import
com.topjohnwu.magisk.view.MarkDownWindow
import
kotlinx.coroutines.launch
class
ViewActionEvent
(
val
action
:
BaseActivity
.()
->
Unit
)
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
=
action
(
activity
)
}
class
OpenChangelogEvent
(
val
item
:
Repo
)
:
ViewEventWithScope
(),
ContextExecutor
{
override
fun
invoke
(
context
:
Context
)
{
scope
.
launch
{
MarkDownWindow
.
show
(
context
,
null
,
item
::
readme
)
}
}
}
class
PermissionEvent
(
private
val
permissions
:
List
<
String
>,
private
val
callback
:
(
Boolean
)
->
Unit
)
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
=
activity
.
withPermissions
(*
permissions
.
toTypedArray
())
{
onSuccess
{
callback
(
true
)
}
onFailure
{
callback
(
false
)
}
}
}
class
BackPressEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
activity
.
onBackPressed
()
}
}
class
DieEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
activity
.
finish
()
}
}
class
RecreateEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
activity
.
recreate
()
}
}
class
RequestFileEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
Intent
(
Intent
.
ACTION_GET_CONTENT
)
.
setType
(
"*/*"
)
.
addCategory
(
Intent
.
CATEGORY_OPENABLE
)
.
also
{
activity
.
startActivityForResult
(
it
,
REQUEST_CODE
)
}
}
companion
object
{
private
const
val
REQUEST_CODE
=
10
fun
resolve
(
requestCode
:
Int
,
resultCode
:
Int
,
data
:
Intent
?)
=
data
?.
takeIf
{
resultCode
==
Activity
.
RESULT_OK
}
?.
takeIf
{
requestCode
==
REQUEST_CODE
}
?.
data
}
}
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/BiometricDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/BiometricDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
com.topjohnwu.magisk.arch.ActivityExecutor
import
com.topjohnwu.magisk.arch.ActivityExecutor
import
com.topjohnwu.magisk.arch.ViewEvent
import
com.topjohnwu.magisk.arch.ViewEvent
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/DarkThemeDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/DarkThemeDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
android.app.Activity
import
android.app.Activity
import
androidx.appcompat.app.AppCompatDelegate
import
androidx.appcompat.app.AppCompatDelegate
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/DialogEvent.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/DialogEvent.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
android.content.Context
import
android.content.Context
import
com.topjohnwu.magisk.arch.ContextExecutor
import
com.topjohnwu.magisk.arch.ContextExecutor
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/EnvFixDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/EnvFixDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
android.content.BroadcastReceiver
import
android.content.BroadcastReceiver
import
android.content.Context
import
android.content.Context
...
@@ -7,8 +7,8 @@ import android.content.IntentFilter
...
@@ -7,8 +7,8 @@ import android.content.IntentFilter
import
androidx.localbroadcastmanager.content.LocalBroadcastManager
import
androidx.localbroadcastmanager.content.LocalBroadcastManager
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration.EnvFix
import
com.topjohnwu.magisk.model.internal.Configuration.EnvFix
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject.Magisk
import
com.topjohnwu.magisk.model.internal.DownloadSubject.Magisk
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MagiskDialog
class
EnvFixDialog
:
DialogEvent
()
{
class
EnvFixDialog
:
DialogEvent
()
{
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/ManagerInstallDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/ManagerInstallDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.ktx.res
import
com.topjohnwu.magisk.ktx.res
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration
import
com.topjohnwu.magisk.model.internal.Configuration
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MarkDownWindow
import
com.topjohnwu.magisk.view.MarkDownWindow
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/ModuleInstallDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/ModuleInstallDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.model.module.Repo
import
com.topjohnwu.magisk.core.model.module.Repo
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration
import
com.topjohnwu.magisk.model.internal.Configuration
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MagiskDialog
class
ModuleInstallDialog
(
private
val
item
:
Repo
)
:
DialogEvent
()
{
class
ModuleInstallDialog
(
private
val
item
:
Repo
)
:
DialogEvent
()
{
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/SecondSlotWarningDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/SecondSlotWarningDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MagiskDialog
...
...
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/SuperuserRevokeDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/SuperuserRevokeDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MagiskDialog
...
@@ -30,4 +30,4 @@ class SuperuserRevokeDialog(
...
@@ -30,4 +30,4 @@ class SuperuserRevokeDialog(
listenerOnSuccess
=
listener
listenerOnSuccess
=
listener
}
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/
model/
events/dialog/UninstallDialog.kt
→
app/src/main/java/com/topjohnwu/magisk/events/dialog/UninstallDialog.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.
events.dialog
package
com.topjohnwu.magisk.events.dialog
import
android.widget.Toast
import
android.widget.Toast
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.model.
entity.
internal.Configuration
import
com.topjohnwu.magisk.model.internal.Configuration
import
com.topjohnwu.magisk.model.
entity.
internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
...
...
app/src/main/java/com/topjohnwu/magisk/ktx/Snackbar.kt
deleted
100644 → 0
View file @
846bbb4d
package
com.topjohnwu.magisk.ktx
import
android.content.Context
import
android.content.res.ColorStateList
import
android.view.View
import
android.widget.TextView
import
androidx.annotation.ColorInt
import
androidx.annotation.ColorRes
import
androidx.annotation.StringRes
import
androidx.appcompat.app.AppCompatActivity
import
androidx.core.content.ContextCompat
import
androidx.core.view.ViewCompat
import
androidx.fragment.app.Fragment
import
com.google.android.material.snackbar.Snackbar
fun
AppCompatActivity
.
snackbar
(
view
:
View
,
@StringRes
messageRes
:
Int
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
f
:
Snackbar
.()
->
Unit
=
{}
)
{
snackbar
(
view
,
getString
(
messageRes
),
length
,
f
)
}
fun
AppCompatActivity
.
snackbar
(
view
:
View
,
message
:
String
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
f
:
Snackbar
.()
->
Unit
=
{}
)
=
Snackbar
.
make
(
view
,
message
,
length
)
.
apply
(
f
)
.
show
()
fun
Fragment
.
snackbar
(
view
:
View
,
@StringRes
messageRes
:
Int
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
f
:
Snackbar
.()
->
Unit
=
{}
)
{
snackbar
(
view
,
getString
(
messageRes
),
length
,
f
)
}
fun
Fragment
.
snackbar
(
view
:
View
,
message
:
String
,
length
:
Int
=
Snackbar
.
LENGTH_SHORT
,
f
:
Snackbar
.()
->
Unit
=
{}
)
=
Snackbar
.
make
(
view
,
message
,
length
)
.
apply
(
f
)
.
show
()
fun
Snackbar
.
action
(
init
:
KSnackbar
.()
->
Unit
)
=
apply
{
val
config
=
KSnackbar
().
apply
(
init
)
setAction
(
config
.
title
(
context
),
config
.
onClickListener
)
when
{
config
.
hasValidColor
->
setActionTextColor
(
config
.
color
(
context
)
?:
return
@apply
)
config
.
hasValidColorStateList
->
setActionTextColor
(
config
.
colorStateList
(
context
)
?:
return
@apply
)
}
}
class
KSnackbar
{
var
colorRes
:
Int
=
-
1
var
colorStateListRes
:
Int
=
-
1
var
title
:
CharSequence
=
""
var
titleRes
:
Int
=
-
1
internal
var
onClickListener
:
(
View
)
->
Unit
=
{}
internal
val
hasValidColor
get
()
=
colorRes
!=
-
1
internal
val
hasValidColorStateList
get
()
=
colorStateListRes
!=
-
1
fun
onClicked
(
listener
:
(
View
)
->
Unit
)
{
onClickListener
=
listener
}
internal
fun
title
(
context
:
Context
)
=
if
(
title
.
isBlank
())
context
.
getString
(
titleRes
)
else
title
internal
fun
colorStateList
(
context
:
Context
)
=
context
.
colorStateListCompat
(
colorStateListRes
)
internal
fun
color
(
context
:
Context
)
=
context
.
colorCompat
(
colorRes
)
}
@Deprecated
(
"Kotlin DSL version is preferred"
,
ReplaceWith
(
"action {}"
))
fun
Snackbar
.
action
(
@StringRes
actionRes
:
Int
,
@ColorRes
colorRes
:
Int
?
=
null
,
listener
:
(
View
)
->
Unit
)
{
view
.
resources
.
getString
(
actionRes
)
colorRes
?.
let
{
ContextCompat
.
getColor
(
view
.
context
,
colorRes
)
}
action
{}
}
@Deprecated
(
"Kotlin DSL version is preferred"
,
ReplaceWith
(
"action {}"
))
fun
Snackbar
.
action
(
action
:
String
,
@ColorInt
color
:
Int
?
=
null
,
listener
:
(
View
)
->
Unit
)
{
setAction
(
action
,
listener
)
color
?.
let
{
setActionTextColor
(
color
)
}
}
fun
Snackbar
.
textColorRes
(
@ColorRes
colorRes
:
Int
)
{
textColor
(
context
.
colorCompat
(
colorRes
)
?:
return
)
}
fun
Snackbar
.
textColor
(
@ColorInt
color
:
Int
)
{
val
tv
=
view
.
findViewById
<
TextView
>(
com
.
google
.
android
.
material
.
R
.
id
.
snackbar_text
)
tv
.
setTextColor
(
color
)
}
fun
Snackbar
.
backgroundColorRes
(
@ColorRes
colorRes
:
Int
)
{
backgroundColor
(
context
.
colorCompat
(
colorRes
)
?:
return
)
}
fun
Snackbar
.
backgroundColor
(
@ColorInt
color
:
Int
)
{
ViewCompat
.
setBackgroundTintList
(
view
,
ColorStateList
.
valueOf
(
color
)
)
}
fun
Snackbar
.
alert
()
{
textColor
(
0
xF44336
)
}
fun
Snackbar
.
success
()
{
textColor
(
0
x4CAF50
)
}
app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/LenientRvItem.kt
deleted
100644 → 0
View file @
846bbb4d
package
com.topjohnwu.magisk.model.entity.recycler
import
androidx.databinding.ViewDataBinding
import
androidx.recyclerview.widget.RecyclerView
import
com.topjohnwu.magisk.databinding.ComparableRvItem
/**
* This item addresses issues where enclosing recycler has to be invalidated or generally
* manipulated with. This shouldn't be however necessary for 99.9% of use-cases. Refrain from using
* this item as it provides virtually no additional functionality. Stick with ComparableRvItem.
* */
abstract
class
LenientRvItem
<
in
T
>
:
ComparableRvItem
<
T
>()
{
open
fun
onBindingBound
(
binding
:
ViewDataBinding
,
recyclerView
:
RecyclerView
)
{}
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/ThemeItem.kt
deleted
100644 → 0
View file @
846bbb4d
package
com.topjohnwu.magisk.model.entity.recycler
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.ui.theme.Theme
class
ThemeItem
(
val
theme
:
Theme
)
:
ComparableRvItem
<
ThemeItem
>()
{
override
val
layoutRes
=
R
.
layout
.
item_theme
override
fun
contentSameAs
(
other
:
ThemeItem
)
=
itemSameAs
(
other
)
override
fun
itemSameAs
(
other
:
ThemeItem
)
=
theme
==
other
.
theme
}
app/src/main/java/com/topjohnwu/magisk/model/entity/state/IndeterminateState.kt
deleted
100644 → 0
View file @
846bbb4d
package
com.topjohnwu.magisk.model.entity.state
enum
class
IndeterminateState
{
CHECKED
,
INDETERMINATE
,
UNCHECKED
}
app/src/main/java/com/topjohnwu/magisk/model/
entity/
internal/Configuration.kt
→
app/src/main/java/com/topjohnwu/magisk/model/internal/Configuration.kt
View file @
34450cdd
package
com.topjohnwu.magisk.model.
entity.
internal
package
com.topjohnwu.magisk.model.internal
import
android.net.Uri
import
android.net.Uri
import
android.os.Parcelable
import
android.os.Parcelable
...
...
app/src/main/java/com/topjohnwu/magisk/model/
entity/
internal/DownloadSubject.kt
→
app/src/main/java/com/topjohnwu/magisk/model/internal/DownloadSubject.kt
View file @
34450cdd
package
com.topjohnwu.magisk.model.
entity.
internal
package
com.topjohnwu.magisk.model.internal
import
android.content.Context
import
android.content.Context
import
android.os.Parcelable
import
android.os.Parcelable
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycler
/ConsoleItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/flash
/ConsoleItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycler
package
com.topjohnwu.magisk.
ui.flash
import
android.view.View
import
android.view.View
import
android.widget.TextView
import
android.widget.TextView
...
@@ -6,9 +6,11 @@ import androidx.core.view.updateLayoutParams
...
@@ -6,9 +6,11 @@ import androidx.core.view.updateLayoutParams
import
androidx.databinding.ViewDataBinding
import
androidx.databinding.ViewDataBinding
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.databinding.LenientRvItem
import
kotlin.math.max
import
kotlin.math.max
class
ConsoleItem
(
val
item
:
String
)
:
LenientRvItem
<
ConsoleItem
>()
{
class
ConsoleItem
(
val
item
:
String
)
:
ComparableRvItem
<
ConsoleItem
>(),
LenientRvItem
{
override
val
layoutRes
=
R
.
layout
.
item_console_md2
override
val
layoutRes
=
R
.
layout
.
item_console_md2
private
var
parentWidth
=
-
1
private
var
parentWidth
=
-
1
...
...
app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt
View file @
34450cdd
...
@@ -15,9 +15,8 @@ import com.topjohnwu.magisk.core.Const
...
@@ -15,9 +15,8 @@ import com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.tasks.FlashZip
import
com.topjohnwu.magisk.core.tasks.FlashZip
import
com.topjohnwu.magisk.core.tasks.MagiskInstaller
import
com.topjohnwu.magisk.core.tasks.MagiskInstaller
import
com.topjohnwu.magisk.databinding.RvBindingAdapter
import
com.topjohnwu.magisk.databinding.RvBindingAdapter
import
com.topjohnwu.magisk.events.SnackbarEvent
import
com.topjohnwu.magisk.ktx.*
import
com.topjohnwu.magisk.ktx.*
import
com.topjohnwu.magisk.model.entity.recycler.ConsoleItem
import
com.topjohnwu.magisk.model.events.SnackbarEvent
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.view.Notifications
import
com.topjohnwu.magisk.view.Notifications
import
com.topjohnwu.superuser.CallbackList
import
com.topjohnwu.superuser.CallbackList
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity
/HideAppInfo.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/hide
/HideAppInfo.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity
package
com.topjohnwu.magisk.
ui.hide
import
android.content.pm.ApplicationInfo
import
android.content.pm.ApplicationInfo
import
android.graphics.drawable.Drawable
import
android.graphics.drawable.Drawable
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycler
/HideRvItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/hide
/HideRvItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycler
package
com.topjohnwu.magisk.
ui.hide
import
android.view.View
import
android.view.View
import
android.view.ViewGroup
import
android.view.ViewGroup
...
@@ -7,9 +7,6 @@ import com.topjohnwu.magisk.BR
...
@@ -7,9 +7,6 @@ import com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.ktx.startAnimations
import
com.topjohnwu.magisk.ktx.startAnimations
import
com.topjohnwu.magisk.model.entity.HideAppTarget
import
com.topjohnwu.magisk.model.entity.StatefulProcess
import
com.topjohnwu.magisk.ui.hide.HideViewModel
import
com.topjohnwu.magisk.utils.addOnPropertyChangedCallback
import
com.topjohnwu.magisk.utils.addOnPropertyChangedCallback
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
kotlin.math.roundToInt
import
kotlin.math.roundToInt
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity
/HideTarget.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/hide
/HideTarget.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity
package
com.topjohnwu.magisk.
ui.hide
class
HideTarget
(
line
:
String
)
{
class
HideTarget
(
line
:
String
)
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
View file @
34450cdd
...
@@ -11,12 +11,6 @@ import com.topjohnwu.magisk.arch.itemBindingOf
...
@@ -11,12 +11,6 @@ import com.topjohnwu.magisk.arch.itemBindingOf
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.utils.currentLocale
import
com.topjohnwu.magisk.core.utils.currentLocale
import
com.topjohnwu.magisk.data.repository.MagiskRepository
import
com.topjohnwu.magisk.data.repository.MagiskRepository
import
com.topjohnwu.magisk.model.entity.HideAppInfo
import
com.topjohnwu.magisk.model.entity.HideAppTarget
import
com.topjohnwu.magisk.model.entity.HideTarget
import
com.topjohnwu.magisk.model.entity.StatefulProcess
import
com.topjohnwu.magisk.model.entity.recycler.HideItem
import
com.topjohnwu.magisk.model.entity.recycler.HideProcessItem
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity
/DeveloperItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/home
/DeveloperItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity
package
com.topjohnwu.magisk.
ui.home
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.Const
...
...
app/src/main/java/com/topjohnwu/magisk/ui/home/HomeFragment.kt
View file @
34450cdd
...
@@ -5,7 +5,7 @@ import android.view.*
...
@@ -5,7 +5,7 @@ import android.view.*
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.arch.BaseUIFragment
import
com.topjohnwu.magisk.arch.BaseUIFragment
import
com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding
import
com.topjohnwu.magisk.databinding.FragmentHomeMd2Binding
import
com.topjohnwu.magisk.
model.
events.RebootEvent
import
com.topjohnwu.magisk.events.RebootEvent
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
org.koin.androidx.viewmodel.ext.android.viewModel
import
org.koin.androidx.viewmodel.ext.android.viewModel
...
...
app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt
View file @
34450cdd
...
@@ -16,15 +16,14 @@ import com.topjohnwu.magisk.core.download.RemoteFileService
...
@@ -16,15 +16,14 @@ import com.topjohnwu.magisk.core.download.RemoteFileService
import
com.topjohnwu.magisk.core.model.MagiskJson
import
com.topjohnwu.magisk.core.model.MagiskJson
import
com.topjohnwu.magisk.core.model.ManagerJson
import
com.topjohnwu.magisk.core.model.ManagerJson
import
com.topjohnwu.magisk.data.repository.MagiskRepository
import
com.topjohnwu.magisk.data.repository.MagiskRepository
import
com.topjohnwu.magisk.events.OpenInappLinkEvent
import
com.topjohnwu.magisk.events.dialog.EnvFixDialog
import
com.topjohnwu.magisk.events.dialog.ManagerInstallDialog
import
com.topjohnwu.magisk.events.dialog.UninstallDialog
import
com.topjohnwu.magisk.ktx.await
import
com.topjohnwu.magisk.ktx.await
import
com.topjohnwu.magisk.ktx.packageName
import
com.topjohnwu.magisk.ktx.packageName
import
com.topjohnwu.magisk.ktx.res
import
com.topjohnwu.magisk.ktx.res
import
com.topjohnwu.magisk.model.entity.IconLink
import
com.topjohnwu.magisk.model.internal.DownloadSubject.Manager
import
com.topjohnwu.magisk.model.entity.internal.DownloadSubject.Manager
import
com.topjohnwu.magisk.model.events.OpenInappLinkEvent
import
com.topjohnwu.magisk.model.events.dialog.EnvFixDialog
import
com.topjohnwu.magisk.model.events.dialog.ManagerInstallDialog
import
com.topjohnwu.magisk.model.events.dialog.UninstallDialog
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
...
...
app/src/main/java/com/topjohnwu/magisk/ui/install/InstallFragment.kt
View file @
34450cdd
...
@@ -5,7 +5,7 @@ import androidx.lifecycle.viewModelScope
...
@@ -5,7 +5,7 @@ import androidx.lifecycle.viewModelScope
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.arch.BaseUIFragment
import
com.topjohnwu.magisk.arch.BaseUIFragment
import
com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding
import
com.topjohnwu.magisk.databinding.FragmentInstallMd2Binding
import
com.topjohnwu.magisk.
model.
events.RequestFileEvent
import
com.topjohnwu.magisk.events.RequestFileEvent
import
org.koin.androidx.viewmodel.ext.android.viewModel
import
org.koin.androidx.viewmodel.ext.android.viewModel
class
InstallFragment
:
BaseUIFragment
<
InstallViewModel
,
FragmentInstallMd2Binding
>()
{
class
InstallFragment
:
BaseUIFragment
<
InstallViewModel
,
FragmentInstallMd2Binding
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt
View file @
34450cdd
...
@@ -11,10 +11,10 @@ import com.topjohnwu.magisk.core.Info
...
@@ -11,10 +11,10 @@ import com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.download.RemoteFileService
import
com.topjohnwu.magisk.core.download.RemoteFileService
import
com.topjohnwu.magisk.data.repository.StringRepository
import
com.topjohnwu.magisk.data.repository.StringRepository
import
com.topjohnwu.magisk.
model.entity.internal.Configuration
import
com.topjohnwu.magisk.
events.RequestFileEvent
import
com.topjohnwu.magisk.
model.entity.internal.DownloadSubject
import
com.topjohnwu.magisk.
events.dialog.SecondSlotWarningDialog
import
com.topjohnwu.magisk.model.
events.RequestFileEvent
import
com.topjohnwu.magisk.model.
internal.Configuration
import
com.topjohnwu.magisk.model.
events.dialog.SecondSlotWarningDialog
import
com.topjohnwu.magisk.model.
internal.DownloadSubject
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycler
/LogRvItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/log
/LogRvItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycler
package
com.topjohnwu.magisk.
ui.log
import
androidx.databinding.Bindable
import
androidx.databinding.Bindable
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.model.su.SuLog
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.ktx.timeDateFormat
import
com.topjohnwu.magisk.ktx.timeDateFormat
import
com.topjohnwu.magisk.ktx.toTime
import
com.topjohnwu.magisk.ktx.toTime
import
com.topjohnwu.magisk.model.entity.MagiskLog
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
class
Log
Item
(
val
item
:
MagiskLog
)
:
ObservableItem
<
Log
Item
>()
{
class
Log
RvItem
(
val
item
:
SuLog
)
:
ObservableItem
<
LogRv
Item
>()
{
override
val
layoutRes
=
R
.
layout
.
item_log_access_md2
override
val
layoutRes
=
R
.
layout
.
item_log_access_md2
...
@@ -23,9 +23,9 @@ class LogItem(val item: MagiskLog) : ObservableItem<LogItem>() {
...
@@ -23,9 +23,9 @@ class LogItem(val item: MagiskLog) : ObservableItem<LogItem>() {
var
isBottom
=
false
var
isBottom
=
false
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
bottom
)
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
bottom
)
override
fun
itemSameAs
(
other
:
LogItem
)
=
item
.
appName
==
other
.
item
.
appName
override
fun
itemSameAs
(
other
:
Log
Rv
Item
)
=
item
.
appName
==
other
.
item
.
appName
override
fun
contentSameAs
(
other
:
LogItem
)
=
item
.
fromUid
==
other
.
item
.
fromUid
&&
override
fun
contentSameAs
(
other
:
Log
Rv
Item
)
=
item
.
fromUid
==
other
.
item
.
fromUid
&&
item
.
toUid
==
other
.
item
.
toUid
&&
item
.
toUid
==
other
.
item
.
toUid
&&
item
.
fromPid
==
other
.
item
.
fromPid
&&
item
.
fromPid
==
other
.
item
.
fromPid
&&
item
.
packageName
==
other
.
item
.
packageName
&&
item
.
packageName
==
other
.
item
.
packageName
&&
...
...
app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt
View file @
34450cdd
...
@@ -10,10 +10,9 @@ import com.topjohnwu.magisk.arch.itemBindingOf
...
@@ -10,10 +10,9 @@ import com.topjohnwu.magisk.arch.itemBindingOf
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.data.repository.LogRepository
import
com.topjohnwu.magisk.data.repository.LogRepository
import
com.topjohnwu.magisk.model.entity.recycler.LogItem
import
com.topjohnwu.magisk.events.SnackbarEvent
import
com.topjohnwu.magisk.model.entity.recycler.TextItem
import
com.topjohnwu.magisk.model.events.SnackbarEvent
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.view.TextItem
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
...
@@ -34,8 +33,8 @@ class LogViewModel(
...
@@ -34,8 +33,8 @@ class LogViewModel(
// --- su log
// --- su log
val
items
=
diffListOf
<
LogItem
>()
val
items
=
diffListOf
<
Log
Rv
Item
>()
val
itemBinding
=
itemBindingOf
<
LogItem
>
{
val
itemBinding
=
itemBindingOf
<
Log
Rv
Item
>
{
it
.
bindExtra
(
BR
.
viewModel
,
this
)
it
.
bindExtra
(
BR
.
viewModel
,
this
)
}
}
...
@@ -47,7 +46,7 @@ class LogViewModel(
...
@@ -47,7 +46,7 @@ class LogViewModel(
override
fun
refresh
()
=
viewModelScope
.
launch
{
override
fun
refresh
()
=
viewModelScope
.
launch
{
consoleText
=
repo
.
fetchMagiskLogs
()
consoleText
=
repo
.
fetchMagiskLogs
()
val
(
suLogs
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
(
suLogs
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
suLogs
=
repo
.
fetchSuLogs
().
map
{
LogItem
(
it
)
}
val
suLogs
=
repo
.
fetchSuLogs
().
map
{
Log
Rv
Item
(
it
)
}
suLogs
to
items
.
calculateDiff
(
suLogs
)
suLogs
to
items
.
calculateDiff
(
suLogs
)
}
}
items
.
firstOrNull
()
?.
isTop
=
false
items
.
firstOrNull
()
?.
isTop
=
false
...
...
app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleFragment.kt
View file @
34450cdd
...
@@ -13,8 +13,8 @@ import com.topjohnwu.magisk.arch.BaseUIFragment
...
@@ -13,8 +13,8 @@ import com.topjohnwu.magisk.arch.BaseUIFragment
import
com.topjohnwu.magisk.arch.ReselectionTarget
import
com.topjohnwu.magisk.arch.ReselectionTarget
import
com.topjohnwu.magisk.arch.ViewEvent
import
com.topjohnwu.magisk.arch.ViewEvent
import
com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding
import
com.topjohnwu.magisk.databinding.FragmentModuleMd2Binding
import
com.topjohnwu.magisk.events.InstallExternalModuleEvent
import
com.topjohnwu.magisk.ktx.hideKeyboard
import
com.topjohnwu.magisk.ktx.hideKeyboard
import
com.topjohnwu.magisk.model.events.InstallExternalModuleEvent
import
com.topjohnwu.magisk.ui.MainActivity
import
com.topjohnwu.magisk.ui.MainActivity
import
com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
import
com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
import
com.topjohnwu.magisk.utils.MotionRevealHelper
import
com.topjohnwu.magisk.utils.MotionRevealHelper
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycler
/ModuleRvItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/module
/ModuleRvItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycler
package
com.topjohnwu.magisk.
ui.module
import
androidx.databinding.Bindable
import
androidx.databinding.Bindable
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.BR
...
@@ -7,7 +7,6 @@ import com.topjohnwu.magisk.core.model.module.Module
...
@@ -7,7 +7,6 @@ import com.topjohnwu.magisk.core.model.module.Module
import
com.topjohnwu.magisk.core.model.module.Repo
import
com.topjohnwu.magisk.core.model.module.Repo
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.ui.module.ModuleViewModel
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
object
InstallModule
:
ComparableRvItem
<
InstallModule
>()
{
object
InstallModule
:
ComparableRvItem
<
InstallModule
>()
{
...
...
app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt
View file @
34450cdd
...
@@ -14,16 +14,12 @@ import com.topjohnwu.magisk.core.tasks.RepoUpdater
...
@@ -14,16 +14,12 @@ import com.topjohnwu.magisk.core.tasks.RepoUpdater
import
com.topjohnwu.magisk.data.database.RepoByNameDao
import
com.topjohnwu.magisk.data.database.RepoByNameDao
import
com.topjohnwu.magisk.data.database.RepoByUpdatedDao
import
com.topjohnwu.magisk.data.database.RepoByUpdatedDao
import
com.topjohnwu.magisk.databinding.RvItem
import
com.topjohnwu.magisk.databinding.RvItem
import
com.topjohnwu.magisk.events.InstallExternalModuleEvent
import
com.topjohnwu.magisk.events.OpenChangelogEvent
import
com.topjohnwu.magisk.events.dialog.ModuleInstallDialog
import
com.topjohnwu.magisk.ktx.addOnListChangedCallback
import
com.topjohnwu.magisk.ktx.addOnListChangedCallback
import
com.topjohnwu.magisk.ktx.reboot
import
com.topjohnwu.magisk.ktx.reboot
import
com.topjohnwu.magisk.model.entity.internal.DownloadSubject
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.model.entity.recycler.InstallModule
import
com.topjohnwu.magisk.model.entity.recycler.ModuleItem
import
com.topjohnwu.magisk.model.entity.recycler.RepoItem
import
com.topjohnwu.magisk.model.entity.recycler.SectionTitle
import
com.topjohnwu.magisk.model.events.InstallExternalModuleEvent
import
com.topjohnwu.magisk.model.events.OpenChangelogEvent
import
com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog
import
com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
import
com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
...
...
app/src/main/java/com/topjohnwu/magisk/
model/events/ViewEvents
.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/safetynet/CheckSafetyNetEvent
.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.events
package
com.topjohnwu.magisk.
ui.safetynet
import
android.app.Activity
import
android.content.Context
import
android.content.Context
import
android.content.Intent
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.arch.ActivityExecutor
import
com.topjohnwu.magisk.arch.ContextExecutor
import
com.topjohnwu.magisk.arch.ContextExecutor
import
com.topjohnwu.magisk.arch.ViewEvent
import
com.topjohnwu.magisk.arch.ViewEventWithScope
import
com.topjohnwu.magisk.arch.ViewEventWithScope
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.Const
import
com.topjohnwu.magisk.core.base.BaseActivity
import
com.topjohnwu.magisk.core.model.module.Repo
import
com.topjohnwu.magisk.core.utils.SafetyNetHelper
import
com.topjohnwu.magisk.data.network.GithubRawServices
import
com.topjohnwu.magisk.data.network.GithubRawServices
import
com.topjohnwu.magisk.ktx.DynamicClassLoader
import
com.topjohnwu.magisk.ktx.DynamicClassLoader
import
com.topjohnwu.magisk.ktx.writeTo
import
com.topjohnwu.magisk.ktx.writeTo
import
com.topjohnwu.magisk.ui.safetynet.SafetyNetResult
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MagiskDialog
import
com.topjohnwu.magisk.view.MarkDownWindow
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
dalvik.system.DexFile
import
dalvik.system.DexFile
import
kotlinx.coroutines.CancellationException
import
kotlinx.coroutines.CancellationException
...
@@ -32,6 +23,7 @@ import java.io.File
...
@@ -32,6 +23,7 @@ import java.io.File
import
java.io.IOException
import
java.io.IOException
import
java.lang.reflect.InvocationHandler
import
java.lang.reflect.InvocationHandler
@Suppress
(
"DEPRECATION"
)
class
CheckSafetyNetEvent
(
class
CheckSafetyNetEvent
(
private
val
callback
:
(
SafetyNetResult
)
->
Unit
=
{}
private
val
callback
:
(
SafetyNetResult
)
->
Unit
=
{}
)
:
ViewEventWithScope
(),
ContextExecutor
,
KoinComponent
,
SafetyNetHelper
.
Callback
{
)
:
ViewEventWithScope
(),
ContextExecutor
,
KoinComponent
,
SafetyNetHelper
.
Callback
{
...
@@ -78,8 +70,10 @@ class CheckSafetyNetEvent(
...
@@ -78,8 +70,10 @@ class CheckSafetyNetEvent(
val
helper
=
helperClass
val
helper
=
helperClass
.
getMethod
(
"get"
,
Class
::
class
.
java
,
Context
::
class
.
java
,
Any
::
class
.
java
)
.
getMethod
(
"get"
,
Class
::
class
.
java
,
Context
::
class
.
java
,
Any
::
class
.
java
)
.
invoke
(
null
,
SafetyNetHelper
::
class
.
java
,
.
invoke
(
context
,
this
@CheckSafetyNetEvent
)
as
SafetyNetHelper
null
,
SafetyNetHelper
::
class
.
java
,
context
,
this
@CheckSafetyNetEvent
)
as
SafetyNetHelper
if
(
helper
.
version
<
Const
.
SNET_EXT_VER
)
if
(
helper
.
version
<
Const
.
SNET_EXT_VER
)
throw
Exception
()
throw
Exception
()
...
@@ -136,66 +130,3 @@ class CheckSafetyNetEvent(
...
@@ -136,66 +130,3 @@ class CheckSafetyNetEvent(
callback
(
SafetyNetResult
(
response
))
callback
(
SafetyNetResult
(
response
))
}
}
}
}
class
ViewActionEvent
(
val
action
:
BaseActivity
.()
->
Unit
)
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
=
action
(
activity
)
}
class
OpenChangelogEvent
(
val
item
:
Repo
)
:
ViewEventWithScope
(),
ContextExecutor
{
override
fun
invoke
(
context
:
Context
)
{
scope
.
launch
{
MarkDownWindow
.
show
(
context
,
null
,
item
::
readme
)
}
}
}
class
PermissionEvent
(
private
val
permissions
:
List
<
String
>,
private
val
callback
:
(
Boolean
)
->
Unit
)
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
=
activity
.
withPermissions
(*
permissions
.
toTypedArray
())
{
onSuccess
{
callback
(
true
)
}
onFailure
{
callback
(
false
)
}
}
}
class
BackPressEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
activity
.
onBackPressed
()
}
}
class
DieEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
activity
.
finish
()
}
}
class
RecreateEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
activity
.
recreate
()
}
}
class
RequestFileEvent
:
ViewEvent
(),
ActivityExecutor
{
override
fun
invoke
(
activity
:
BaseActivity
)
{
Intent
(
Intent
.
ACTION_GET_CONTENT
)
.
setType
(
"*/*"
)
.
addCategory
(
Intent
.
CATEGORY_OPENABLE
)
.
also
{
activity
.
startActivityForResult
(
it
,
REQUEST_CODE
)
}
}
companion
object
{
private
const
val
REQUEST_CODE
=
10
fun
resolve
(
requestCode
:
Int
,
resultCode
:
Int
,
data
:
Intent
?)
=
data
?.
takeIf
{
resultCode
==
Activity
.
RESULT_OK
}
?.
takeIf
{
requestCode
==
REQUEST_CODE
}
?.
data
}
}
app/src/main/java/com/topjohnwu/magisk/
core/utils
/SafetyNetHelper.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/safetynet
/SafetyNetHelper.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
core.utils
package
com.topjohnwu.magisk.
ui.safetynet
import
org.json.JSONObject
import
org.json.JSONObject
...
...
app/src/main/java/com/topjohnwu/magisk/ui/safetynet/SafetynetViewModel.kt
View file @
34450cdd
...
@@ -4,7 +4,6 @@ import androidx.databinding.Bindable
...
@@ -4,7 +4,6 @@ import androidx.databinding.Bindable
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.arch.BaseViewModel
import
com.topjohnwu.magisk.arch.BaseViewModel
import
com.topjohnwu.magisk.model.events.CheckSafetyNetEvent
import
com.topjohnwu.magisk.ui.safetynet.SafetyNetState.*
import
com.topjohnwu.magisk.ui.safetynet.SafetyNetState.*
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
org.json.JSONObject
import
org.json.JSONObject
...
@@ -54,7 +53,7 @@ class SafetynetViewModel : BaseViewModel() {
...
@@ -54,7 +53,7 @@ class SafetynetViewModel : BaseViewModel() {
private
fun
attest
()
{
private
fun
attest
()
{
currentState
=
LOADING
currentState
=
LOADING
CheckSafetyNetEvent
()
{
CheckSafetyNetEvent
{
resolveResponse
(
it
)
resolveResponse
(
it
)
}.
publish
()
}.
publish
()
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycler/
SettingsItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/settings/Base
SettingsItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycler
package
com.topjohnwu.magisk.
ui.settings
import
android.content.Context
import
android.content.Context
import
android.content.res.Resources
import
android.content.res.Resources
...
@@ -16,7 +16,7 @@ import com.topjohnwu.magisk.view.MagiskDialog
...
@@ -16,7 +16,7 @@ import com.topjohnwu.magisk.view.MagiskDialog
import
org.koin.core.KoinComponent
import
org.koin.core.KoinComponent
import
org.koin.core.get
import
org.koin.core.get
sealed
class
SettingsItem
:
ObservableItem
<
SettingsItem
>()
{
sealed
class
BaseSettingsItem
:
ObservableItem
<
Base
SettingsItem
>()
{
override
val
layoutRes
get
()
=
R
.
layout
.
item_settings
override
val
layoutRes
get
()
=
R
.
layout
.
item_settings
...
@@ -46,19 +46,19 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
...
@@ -46,19 +46,19 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
open
fun
refresh
()
{}
open
fun
refresh
()
{}
override
fun
itemSameAs
(
other
:
SettingsItem
)
=
this
===
other
override
fun
itemSameAs
(
other
:
Base
SettingsItem
)
=
this
===
other
override
fun
contentSameAs
(
other
:
SettingsItem
)
=
itemSameAs
(
other
)
override
fun
contentSameAs
(
other
:
Base
SettingsItem
)
=
itemSameAs
(
other
)
// ---
// ---
interface
Callback
{
interface
Callback
{
fun
onItemPressed
(
view
:
View
,
item
:
SettingsItem
,
callback
:
()
->
Unit
=
{})
fun
onItemPressed
(
view
:
View
,
item
:
Base
SettingsItem
,
callback
:
()
->
Unit
=
{})
fun
onItemChanged
(
view
:
View
,
item
:
SettingsItem
)
fun
onItemChanged
(
view
:
View
,
item
:
Base
SettingsItem
)
}
}
// ---
// ---
abstract
class
Value
<
T
>
:
SettingsItem
()
{
abstract
class
Value
<
T
>
:
Base
SettingsItem
()
{
/**
/**
* Represents last agreed-upon value by the validation process and the user for current
* Represents last agreed-upon value by the validation process and the user for current
...
@@ -176,9 +176,9 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
...
@@ -176,9 +176,9 @@ sealed class SettingsItem : ObservableItem<SettingsItem>() {
}
}
abstract
class
Blank
:
SettingsItem
()
abstract
class
Blank
:
Base
SettingsItem
()
abstract
class
Section
:
SettingsItem
()
{
abstract
class
Section
:
Base
SettingsItem
()
{
override
val
layoutRes
=
R
.
layout
.
item_settings_section
override
val
layoutRes
=
R
.
layout
.
item_settings_section
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsItems.kt
View file @
34450cdd
...
@@ -19,7 +19,6 @@ import com.topjohnwu.magisk.databinding.DialogSettingsAppNameBinding
...
@@ -19,7 +19,6 @@ import com.topjohnwu.magisk.databinding.DialogSettingsAppNameBinding
import
com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding
import
com.topjohnwu.magisk.databinding.DialogSettingsDownloadPathBinding
import
com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding
import
com.topjohnwu.magisk.databinding.DialogSettingsUpdateChannelBinding
import
com.topjohnwu.magisk.ktx.get
import
com.topjohnwu.magisk.ktx.get
import
com.topjohnwu.magisk.model.entity.recycler.SettingsItem
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.asTransitive
import
com.topjohnwu.magisk.utils.asTransitive
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
...
@@ -30,11 +29,11 @@ import java.io.File
...
@@ -30,11 +29,11 @@ import java.io.File
// --- Customization
// --- Customization
object
Customization
:
SettingsItem
.
Section
()
{
object
Customization
:
Base
SettingsItem
.
Section
()
{
override
val
title
=
R
.
string
.
settings_customization
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_customization
.
asTransitive
()
}
}
object
Language
:
SettingsItem
.
Selector
()
{
object
Language
:
Base
SettingsItem
.
Selector
()
{
override
var
value
=
-
1
override
var
value
=
-
1
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
locale
=
entryValues
[
it
]
Config
.
locale
=
entryValues
[
it
]
...
@@ -56,18 +55,18 @@ object Language : SettingsItem.Selector() {
...
@@ -56,18 +55,18 @@ object Language : SettingsItem.Selector() {
}
}
}
}
object
Theme
:
SettingsItem
.
Blank
()
{
object
Theme
:
Base
SettingsItem
.
Blank
()
{
override
val
icon
=
R
.
drawable
.
ic_paint
override
val
icon
=
R
.
drawable
.
ic_paint
override
val
title
=
R
.
string
.
section_theme
.
asTransitive
()
override
val
title
=
R
.
string
.
section_theme
.
asTransitive
()
}
}
// --- Manager
// --- Manager
object
Manager
:
SettingsItem
.
Section
()
{
object
Manager
:
Base
SettingsItem
.
Section
()
{
override
val
title
=
R
.
string
.
manager
.
asTransitive
()
override
val
title
=
R
.
string
.
manager
.
asTransitive
()
}
}
object
ClearRepoCache
:
SettingsItem
.
Blank
()
{
object
ClearRepoCache
:
Base
SettingsItem
.
Blank
()
{
override
val
title
=
R
.
string
.
settings_clear_cache_title
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_clear_cache_title
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_clear_cache_summary
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_clear_cache_summary
.
asTransitive
()
...
@@ -76,7 +75,7 @@ object ClearRepoCache : SettingsItem.Blank() {
...
@@ -76,7 +75,7 @@ object ClearRepoCache : SettingsItem.Blank() {
}
}
}
}
object
Hide
:
SettingsItem
.
Input
()
{
object
Hide
:
Base
SettingsItem
.
Input
()
{
override
val
title
=
R
.
string
.
settings_hide_manager_title
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_hide_manager_title
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_hide_manager_summary
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_hide_manager_summary
.
asTransitive
()
...
@@ -99,7 +98,7 @@ object Hide : SettingsItem.Input() {
...
@@ -99,7 +98,7 @@ object Hide : SettingsItem.Input() {
}
}
object
Restore
:
SettingsItem
.
Blank
()
{
object
Restore
:
Base
SettingsItem
.
Blank
()
{
override
val
title
=
R
.
string
.
settings_restore_manager_title
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_restore_manager_title
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_restore_manager_summary
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_restore_manager_summary
.
asTransitive
()
}
}
...
@@ -108,7 +107,7 @@ object Restore : SettingsItem.Blank() {
...
@@ -108,7 +107,7 @@ object Restore : SettingsItem.Blank() {
fun
HideOrRestore
()
=
fun
HideOrRestore
()
=
if
(
get
<
Context
>().
packageName
==
BuildConfig
.
APPLICATION_ID
)
Hide
else
Restore
if
(
get
<
Context
>().
packageName
==
BuildConfig
.
APPLICATION_ID
)
Hide
else
Restore
object
DownloadPath
:
SettingsItem
.
Input
()
{
object
DownloadPath
:
Base
SettingsItem
.
Input
()
{
override
var
value
=
Config
.
downloadPath
override
var
value
=
Config
.
downloadPath
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
downloadPath
=
it
}
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
downloadPath
=
it
}
...
@@ -130,7 +129,7 @@ object DownloadPath : SettingsItem.Input() {
...
@@ -130,7 +129,7 @@ object DownloadPath : SettingsItem.Input() {
.
inflate
(
LayoutInflater
.
from
(
context
)).
also
{
it
.
data
=
this
}.
root
.
inflate
(
LayoutInflater
.
from
(
context
)).
also
{
it
.
data
=
this
}.
root
}
}
object
UpdateChannel
:
SettingsItem
.
Selector
()
{
object
UpdateChannel
:
Base
SettingsItem
.
Selector
()
{
override
var
value
=
Config
.
updateChannel
override
var
value
=
Config
.
updateChannel
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
updateChannel
=
it
}
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
updateChannel
=
it
}
...
@@ -142,7 +141,7 @@ object UpdateChannel : SettingsItem.Selector() {
...
@@ -142,7 +141,7 @@ object UpdateChannel : SettingsItem.Selector() {
override
val
entryValRes
=
R
.
array
.
value_array
override
val
entryValRes
=
R
.
array
.
value_array
}
}
object
UpdateChannelUrl
:
SettingsItem
.
Input
()
{
object
UpdateChannelUrl
:
Base
SettingsItem
.
Input
()
{
override
val
title
=
R
.
string
.
settings_update_custom
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_update_custom
.
asTransitive
()
override
var
value
=
Config
.
customChannelUrl
override
var
value
=
Config
.
customChannelUrl
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
customChannelUrl
=
it
}
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
customChannelUrl
=
it
}
...
@@ -162,7 +161,7 @@ object UpdateChannelUrl : SettingsItem.Input() {
...
@@ -162,7 +161,7 @@ object UpdateChannelUrl : SettingsItem.Input() {
.
inflate
(
LayoutInflater
.
from
(
context
)).
also
{
it
.
data
=
this
}.
root
.
inflate
(
LayoutInflater
.
from
(
context
)).
also
{
it
.
data
=
this
}.
root
}
}
object
UpdateChecker
:
SettingsItem
.
Toggle
()
{
object
UpdateChecker
:
Base
SettingsItem
.
Toggle
()
{
override
val
title
=
R
.
string
.
settings_check_update_title
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_check_update_title
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_check_update_summary
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_check_update_summary
.
asTransitive
()
override
var
value
=
Config
.
checkUpdate
override
var
value
=
Config
.
checkUpdate
...
@@ -173,12 +172,12 @@ object UpdateChecker : SettingsItem.Toggle() {
...
@@ -173,12 +172,12 @@ object UpdateChecker : SettingsItem.Toggle() {
}
}
// check whether is module already installed beforehand?
// check whether is module already installed beforehand?
object
SystemlessHosts
:
SettingsItem
.
Blank
()
{
object
SystemlessHosts
:
Base
SettingsItem
.
Blank
()
{
override
val
title
=
R
.
string
.
settings_hosts_title
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_hosts_title
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_hosts_summary
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_hosts_summary
.
asTransitive
()
}
}
object
Biometrics
:
SettingsItem
.
Toggle
()
{
object
Biometrics
:
Base
SettingsItem
.
Toggle
()
{
override
val
title
=
R
.
string
.
settings_su_biometric_title
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_su_biometric_title
.
asTransitive
()
override
var
value
=
Config
.
suBiometric
override
var
value
=
Config
.
suBiometric
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
suBiometric
=
it
}
set
(
value
)
=
setV
(
value
,
field
,
{
field
=
it
})
{
Config
.
suBiometric
=
it
}
...
@@ -193,7 +192,7 @@ object Biometrics : SettingsItem.Toggle() {
...
@@ -193,7 +192,7 @@ object Biometrics : SettingsItem.Toggle() {
}
}
}
}
object
Reauthenticate
:
SettingsItem
.
Toggle
()
{
object
Reauthenticate
:
Base
SettingsItem
.
Toggle
()
{
override
val
title
=
R
.
string
.
settings_su_reauth_title
.
asTransitive
()
override
val
title
=
R
.
string
.
settings_su_reauth_title
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_su_reauth_summary
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_su_reauth_summary
.
asTransitive
()
override
var
value
=
Config
.
suReAuth
override
var
value
=
Config
.
suReAuth
...
@@ -206,11 +205,11 @@ object Reauthenticate : SettingsItem.Toggle() {
...
@@ -206,11 +205,11 @@ object Reauthenticate : SettingsItem.Toggle() {
// --- Magisk
// --- Magisk
object
Magisk
:
SettingsItem
.
Section
()
{
object
Magisk
:
Base
SettingsItem
.
Section
()
{
override
val
title
=
R
.
string
.
magisk
.
asTransitive
()
override
val
title
=
R
.
string
.
magisk
.
asTransitive
()
}
}
object
MagiskHide
:
SettingsItem
.
Toggle
()
{
object
MagiskHide
:
Base
SettingsItem
.
Toggle
()
{
override
val
title
=
R
.
string
.
magiskhide
.
asTransitive
()
override
val
title
=
R
.
string
.
magiskhide
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_magiskhide_summary
.
asTransitive
()
override
val
description
=
R
.
string
.
settings_magiskhide_summary
.
asTransitive
()
override
var
value
=
Config
.
magiskHide
override
var
value
=
Config
.
magiskHide
...
@@ -225,11 +224,11 @@ object MagiskHide : SettingsItem.Toggle() {
...
@@ -225,11 +224,11 @@ object MagiskHide : SettingsItem.Toggle() {
// --- Superuser
// --- Superuser
object
Superuser
:
SettingsItem
.
Section
()
{
object
Superuser
:
Base
SettingsItem
.
Section
()
{
override
val
title
=
R
.
string
.
superuser
.
asTransitive
()
override
val
title
=
R
.
string
.
superuser
.
asTransitive
()
}
}
object
AccessMode
:
SettingsItem
.
Selector
()
{
object
AccessMode
:
Base
SettingsItem
.
Selector
()
{
override
val
title
=
R
.
string
.
superuser_access
.
asTransitive
()
override
val
title
=
R
.
string
.
superuser_access
.
asTransitive
()
override
val
entryRes
=
R
.
array
.
su_access
override
val
entryRes
=
R
.
array
.
su_access
override
val
entryValRes
=
R
.
array
.
value_array
override
val
entryValRes
=
R
.
array
.
value_array
...
@@ -240,7 +239,7 @@ object AccessMode : SettingsItem.Selector() {
...
@@ -240,7 +239,7 @@ object AccessMode : SettingsItem.Selector() {
}
}
}
}
object
MultiuserMode
:
SettingsItem
.
Selector
()
{
object
MultiuserMode
:
Base
SettingsItem
.
Selector
()
{
override
val
title
=
R
.
string
.
multiuser_mode
.
asTransitive
()
override
val
title
=
R
.
string
.
multiuser_mode
.
asTransitive
()
override
val
entryRes
=
R
.
array
.
multiuser_mode
override
val
entryRes
=
R
.
array
.
multiuser_mode
override
val
entryValRes
=
R
.
array
.
value_array
override
val
entryValRes
=
R
.
array
.
value_array
...
@@ -258,7 +257,7 @@ object MultiuserMode : SettingsItem.Selector() {
...
@@ -258,7 +257,7 @@ object MultiuserMode : SettingsItem.Selector() {
}
}
}
}
object
MountNamespaceMode
:
SettingsItem
.
Selector
()
{
object
MountNamespaceMode
:
Base
SettingsItem
.
Selector
()
{
override
val
title
=
R
.
string
.
mount_namespace_mode
.
asTransitive
()
override
val
title
=
R
.
string
.
mount_namespace_mode
.
asTransitive
()
override
val
entryRes
=
R
.
array
.
namespace
override
val
entryRes
=
R
.
array
.
namespace
override
val
entryValRes
=
R
.
array
.
value_array
override
val
entryValRes
=
R
.
array
.
value_array
...
@@ -272,7 +271,7 @@ object MountNamespaceMode : SettingsItem.Selector() {
...
@@ -272,7 +271,7 @@ object MountNamespaceMode : SettingsItem.Selector() {
get
()
=
resources
.
getStringArray
(
R
.
array
.
namespace_summary
)[
value
].
asTransitive
()
get
()
=
resources
.
getStringArray
(
R
.
array
.
namespace_summary
)[
value
].
asTransitive
()
}
}
object
AutomaticResponse
:
SettingsItem
.
Selector
()
{
object
AutomaticResponse
:
Base
SettingsItem
.
Selector
()
{
override
val
title
=
R
.
string
.
auto_response
.
asTransitive
()
override
val
title
=
R
.
string
.
auto_response
.
asTransitive
()
override
val
entryRes
=
R
.
array
.
auto_response
override
val
entryRes
=
R
.
array
.
auto_response
override
val
entryValRes
=
R
.
array
.
value_array
override
val
entryValRes
=
R
.
array
.
value_array
...
@@ -283,7 +282,7 @@ object AutomaticResponse : SettingsItem.Selector() {
...
@@ -283,7 +282,7 @@ object AutomaticResponse : SettingsItem.Selector() {
}
}
}
}
object
RequestTimeout
:
SettingsItem
.
Selector
()
{
object
RequestTimeout
:
Base
SettingsItem
.
Selector
()
{
override
val
title
=
R
.
string
.
request_timeout
.
asTransitive
()
override
val
title
=
R
.
string
.
request_timeout
.
asTransitive
()
override
val
entryRes
=
R
.
array
.
request_timeout
override
val
entryRes
=
R
.
array
.
request_timeout
override
val
entryValRes
=
R
.
array
.
request_timeout_value
override
val
entryValRes
=
R
.
array
.
request_timeout_value
...
@@ -297,7 +296,7 @@ object RequestTimeout : SettingsItem.Selector() {
...
@@ -297,7 +296,7 @@ object RequestTimeout : SettingsItem.Selector() {
get
()
=
entryValues
.
indexOfFirst
{
it
.
toInt
()
==
Config
.
suDefaultTimeout
}
get
()
=
entryValues
.
indexOfFirst
{
it
.
toInt
()
==
Config
.
suDefaultTimeout
}
}
}
object
SUNotification
:
SettingsItem
.
Selector
()
{
object
SUNotification
:
Base
SettingsItem
.
Selector
()
{
override
val
title
=
R
.
string
.
superuser_notification
.
asTransitive
()
override
val
title
=
R
.
string
.
superuser_notification
.
asTransitive
()
override
val
entryRes
=
R
.
array
.
su_notification
override
val
entryRes
=
R
.
array
.
su_notification
override
val
entryValRes
=
R
.
array
.
value_array
override
val
entryValRes
=
R
.
array
.
value_array
...
...
app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt
View file @
34450cdd
...
@@ -15,11 +15,10 @@ import com.topjohnwu.magisk.core.Info
...
@@ -15,11 +15,10 @@ import com.topjohnwu.magisk.core.Info
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.download.DownloadService
import
com.topjohnwu.magisk.core.utils.PatchAPK
import
com.topjohnwu.magisk.core.utils.PatchAPK
import
com.topjohnwu.magisk.data.database.RepoDao
import
com.topjohnwu.magisk.data.database.RepoDao
import
com.topjohnwu.magisk.model.entity.internal.Configuration
import
com.topjohnwu.magisk.events.RecreateEvent
import
com.topjohnwu.magisk.model.entity.internal.DownloadSubject
import
com.topjohnwu.magisk.events.dialog.BiometricDialog
import
com.topjohnwu.magisk.model.entity.recycler.SettingsItem
import
com.topjohnwu.magisk.model.internal.Configuration
import
com.topjohnwu.magisk.model.events.RecreateEvent
import
com.topjohnwu.magisk.model.internal.DownloadSubject
import
com.topjohnwu.magisk.model.events.dialog.BiometricDialog
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.magisk.utils.Utils
import
com.topjohnwu.superuser.Shell
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
...
@@ -27,10 +26,10 @@ import org.koin.core.get
...
@@ -27,10 +26,10 @@ import org.koin.core.get
class
SettingsViewModel
(
class
SettingsViewModel
(
private
val
repositoryDao
:
RepoDao
private
val
repositoryDao
:
RepoDao
)
:
BaseViewModel
(),
SettingsItem
.
Callback
{
)
:
BaseViewModel
(),
Base
SettingsItem
.
Callback
{
val
adapter
=
adapterOf
<
SettingsItem
>()
val
adapter
=
adapterOf
<
Base
SettingsItem
>()
val
itemBinding
=
itemBindingOf
<
SettingsItem
>
{
it
.
bindExtra
(
BR
.
callback
,
this
)
}
val
itemBinding
=
itemBindingOf
<
Base
SettingsItem
>
{
it
.
bindExtra
(
BR
.
callback
,
this
)
}
val
items
=
diffListOf
(
createItems
())
val
items
=
diffListOf
(
createItems
())
init
{
init
{
...
@@ -39,7 +38,7 @@ class SettingsViewModel(
...
@@ -39,7 +38,7 @@ class SettingsViewModel(
}
}
}
}
private
fun
createItems
():
List
<
SettingsItem
>
{
private
fun
createItems
():
List
<
Base
SettingsItem
>
{
// Customization
// Customization
val
list
=
mutableListOf
(
val
list
=
mutableListOf
(
Customization
,
Customization
,
...
@@ -90,7 +89,7 @@ class SettingsViewModel(
...
@@ -90,7 +89,7 @@ class SettingsViewModel(
return
list
return
list
}
}
override
fun
onItemPressed
(
view
:
View
,
item
:
SettingsItem
,
callback
:
()
->
Unit
)
=
when
(
item
)
{
override
fun
onItemPressed
(
view
:
View
,
item
:
Base
SettingsItem
,
callback
:
()
->
Unit
)
=
when
(
item
)
{
is
DownloadPath
->
withExternalRW
(
callback
)
is
DownloadPath
->
withExternalRW
(
callback
)
is
Biometrics
->
authenticate
(
callback
)
is
Biometrics
->
authenticate
(
callback
)
is
Theme
->
SettingsFragmentDirections
.
actionSettingsFragmentToThemeFragment
().
publish
()
is
Theme
->
SettingsFragmentDirections
.
actionSettingsFragmentToThemeFragment
().
publish
()
...
@@ -100,7 +99,7 @@ class SettingsViewModel(
...
@@ -100,7 +99,7 @@ class SettingsViewModel(
else
->
callback
()
else
->
callback
()
}
}
override
fun
onItemChanged
(
view
:
View
,
item
:
SettingsItem
)
=
when
(
item
)
{
override
fun
onItemChanged
(
view
:
View
,
item
:
Base
SettingsItem
)
=
when
(
item
)
{
is
Language
->
RecreateEvent
().
publish
()
is
Language
->
RecreateEvent
().
publish
()
is
UpdateChannel
->
openUrlIfNecessary
(
view
)
is
UpdateChannel
->
openUrlIfNecessary
(
view
)
is
Hide
->
PatchAPK
.
hideManager
(
view
.
context
,
item
.
value
)
is
Hide
->
PatchAPK
.
hideManager
(
view
.
context
,
item
.
value
)
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycl
er/PolicyRvItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/superus
er/PolicyRvItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycl
er
package
com.topjohnwu.magisk.
ui.superus
er
import
android.graphics.drawable.Drawable
import
android.graphics.drawable.Drawable
import
androidx.databinding.Bindable
import
androidx.databinding.Bindable
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.core.model.
Magisk
Policy
import
com.topjohnwu.magisk.core.model.
su.Su
Policy
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.ui.superuser.SuperuserViewModel
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
class
PolicyItem
(
class
Policy
Rv
Item
(
val
item
:
Magisk
Policy
,
val
item
:
Su
Policy
,
val
icon
:
Drawable
,
val
icon
:
Drawable
,
val
viewModel
:
SuperuserViewModel
val
viewModel
:
SuperuserViewModel
)
:
ObservableItem
<
PolicyItem
>()
{
)
:
ObservableItem
<
Policy
Rv
Item
>()
{
override
val
layoutRes
=
R
.
layout
.
item_policy_md2
override
val
layoutRes
=
R
.
layout
.
item_policy_md2
@get
:
Bindable
@get
:
Bindable
...
@@ -21,7 +20,7 @@ class PolicyItem(
...
@@ -21,7 +20,7 @@ class PolicyItem(
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
expanded
)
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
expanded
)
// This property hosts the policy state
// This property hosts the policy state
var
policyState
=
item
.
policy
==
Magisk
Policy
.
ALLOW
var
policyState
=
item
.
policy
==
Su
Policy
.
ALLOW
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
enabled
)
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
enabled
)
// This property binds with the UI state
// This property binds with the UI state
...
@@ -44,7 +43,7 @@ class PolicyItem(
...
@@ -44,7 +43,7 @@ class PolicyItem(
private
val
updatedPolicy
private
val
updatedPolicy
get
()
=
item
.
copy
(
get
()
=
item
.
copy
(
policy
=
if
(
policyState
)
MagiskPolicy
.
ALLOW
else
Magisk
Policy
.
DENY
,
policy
=
if
(
policyState
)
SuPolicy
.
ALLOW
else
Su
Policy
.
DENY
,
notification
=
shouldNotify
,
notification
=
shouldNotify
,
logging
=
shouldLog
logging
=
shouldLog
)
)
...
@@ -65,7 +64,7 @@ class PolicyItem(
...
@@ -65,7 +64,7 @@ class PolicyItem(
viewModel
.
deletePressed
(
this
)
viewModel
.
deletePressed
(
this
)
}
}
override
fun
contentSameAs
(
other
:
PolicyItem
)
=
itemSameAs
(
other
)
override
fun
contentSameAs
(
other
:
Policy
Rv
Item
)
=
itemSameAs
(
other
)
override
fun
itemSameAs
(
other
:
PolicyItem
)
=
item
.
uid
==
other
.
item
.
uid
override
fun
itemSameAs
(
other
:
Policy
Rv
Item
)
=
item
.
uid
==
other
.
item
.
uid
}
}
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycl
er/SpinnerRvItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
ui/superus
er/SpinnerRvItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycl
er
package
com.topjohnwu.magisk.
ui.superus
er
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.databinding.ComparableRvItem
...
@@ -10,4 +10,4 @@ class SpinnerRvItem(val item: String) : ComparableRvItem<SpinnerRvItem>() {
...
@@ -10,4 +10,4 @@ class SpinnerRvItem(val item: String) : ComparableRvItem<SpinnerRvItem>() {
override
fun
contentSameAs
(
other
:
SpinnerRvItem
)
=
itemSameAs
(
other
)
override
fun
contentSameAs
(
other
:
SpinnerRvItem
)
=
itemSameAs
(
other
)
override
fun
itemSameAs
(
other
:
SpinnerRvItem
)
=
item
==
other
.
item
override
fun
itemSameAs
(
other
:
SpinnerRvItem
)
=
item
==
other
.
item
}
}
\ No newline at end of file
app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserViewModel.kt
View file @
34450cdd
...
@@ -11,16 +11,15 @@ import com.topjohnwu.magisk.arch.adapterOf
...
@@ -11,16 +11,15 @@ import com.topjohnwu.magisk.arch.adapterOf
import
com.topjohnwu.magisk.arch.diffListOf
import
com.topjohnwu.magisk.arch.diffListOf
import
com.topjohnwu.magisk.arch.itemBindingOf
import
com.topjohnwu.magisk.arch.itemBindingOf
import
com.topjohnwu.magisk.core.magiskdb.PolicyDao
import
com.topjohnwu.magisk.core.magiskdb.PolicyDao
import
com.topjohnwu.magisk.core.model.
Magisk
Policy
import
com.topjohnwu.magisk.core.model.
su.Su
Policy
import
com.topjohnwu.magisk.core.utils.BiometricHelper
import
com.topjohnwu.magisk.core.utils.BiometricHelper
import
com.topjohnwu.magisk.core.utils.currentLocale
import
com.topjohnwu.magisk.core.utils.currentLocale
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.model.entity.recycler.PolicyItem
import
com.topjohnwu.magisk.events.SnackbarEvent
import
com.topjohnwu.magisk.model.entity.recycler.TappableHeadlineItem
import
com.topjohnwu.magisk.events.dialog.BiometricDialog
import
com.topjohnwu.magisk.model.entity.recycler.TextItem
import
com.topjohnwu.magisk.events.dialog.SuperuserRevokeDialog
import
com.topjohnwu.magisk.model.events.SnackbarEvent
import
com.topjohnwu.magisk.view.TappableHeadlineItem
import
com.topjohnwu.magisk.model.events.dialog.BiometricDialog
import
com.topjohnwu.magisk.view.TextItem
import
com.topjohnwu.magisk.model.events.dialog.SuperuserRevokeDialog
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
kotlinx.coroutines.withContext
...
@@ -34,7 +33,7 @@ class SuperuserViewModel(
...
@@ -34,7 +33,7 @@ class SuperuserViewModel(
private
val
itemNoData
=
TextItem
(
R
.
string
.
superuser_policy_none
)
private
val
itemNoData
=
TextItem
(
R
.
string
.
superuser_policy_none
)
private
val
itemsPolicies
=
diffListOf
<
PolicyItem
>()
private
val
itemsPolicies
=
diffListOf
<
Policy
Rv
Item
>()
private
val
itemsHelpers
=
ObservableArrayList
<
TextItem
>()
private
val
itemsHelpers
=
ObservableArrayList
<
TextItem
>()
val
adapter
=
adapterOf
<
ComparableRvItem
<*>>()
val
adapter
=
adapterOf
<
ComparableRvItem
<*>>()
...
@@ -52,7 +51,7 @@ class SuperuserViewModel(
...
@@ -52,7 +51,7 @@ class SuperuserViewModel(
state
=
State
.
LOADING
state
=
State
.
LOADING
val
(
policies
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
(
policies
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
policies
=
db
.
fetchAll
{
val
policies
=
db
.
fetchAll
{
PolicyItem
(
it
,
it
.
applicationInfo
.
loadIcon
(
packageManager
),
this
@SuperuserViewModel
)
Policy
Rv
Item
(
it
,
it
.
applicationInfo
.
loadIcon
(
packageManager
),
this
@SuperuserViewModel
)
}.
sortedWith
(
compareBy
(
}.
sortedWith
(
compareBy
(
{
it
.
item
.
appName
.
toLowerCase
(
currentLocale
)
},
{
it
.
item
.
appName
.
toLowerCase
(
currentLocale
)
},
{
it
.
item
.
packageName
}
{
it
.
item
.
packageName
}
...
@@ -77,7 +76,7 @@ class SuperuserViewModel(
...
@@ -77,7 +76,7 @@ class SuperuserViewModel(
private
fun
hidePressed
()
=
private
fun
hidePressed
()
=
SuperuserFragmentDirections
.
actionSuperuserFragmentToHideFragment
().
publish
()
SuperuserFragmentDirections
.
actionSuperuserFragmentToHideFragment
().
publish
()
fun
deletePressed
(
item
:
PolicyItem
)
{
fun
deletePressed
(
item
:
Policy
Rv
Item
)
{
fun
updateState
()
=
viewModelScope
.
launch
{
fun
updateState
()
=
viewModelScope
.
launch
{
db
.
delete
(
item
.
item
.
uid
)
db
.
delete
(
item
.
item
.
uid
)
itemsPolicies
.
removeAll
{
it
.
genericItemSameAs
(
item
)
}
itemsPolicies
.
removeAll
{
it
.
genericItemSameAs
(
item
)
}
...
@@ -100,7 +99,7 @@ class SuperuserViewModel(
...
@@ -100,7 +99,7 @@ class SuperuserViewModel(
//---
//---
fun
updatePolicy
(
policy
:
Magisk
Policy
,
isLogging
:
Boolean
)
=
viewModelScope
.
launch
{
fun
updatePolicy
(
policy
:
Su
Policy
,
isLogging
:
Boolean
)
=
viewModelScope
.
launch
{
db
.
update
(
policy
)
db
.
update
(
policy
)
val
str
=
when
{
val
str
=
when
{
isLogging
->
when
{
isLogging
->
when
{
...
@@ -115,16 +114,16 @@ class SuperuserViewModel(
...
@@ -115,16 +114,16 @@ class SuperuserViewModel(
SnackbarEvent
(
resources
.
getString
(
str
,
policy
.
appName
)).
publish
()
SnackbarEvent
(
resources
.
getString
(
str
,
policy
.
appName
)).
publish
()
}
}
fun
togglePolicy
(
item
:
PolicyItem
,
enable
:
Boolean
)
{
fun
togglePolicy
(
item
:
Policy
Rv
Item
,
enable
:
Boolean
)
{
fun
updateState
()
{
fun
updateState
()
{
item
.
policyState
=
enable
item
.
policyState
=
enable
val
policy
=
if
(
enable
)
MagiskPolicy
.
ALLOW
else
Magisk
Policy
.
DENY
val
policy
=
if
(
enable
)
SuPolicy
.
ALLOW
else
Su
Policy
.
DENY
val
app
=
item
.
item
.
copy
(
policy
=
policy
)
val
app
=
item
.
item
.
copy
(
policy
=
policy
)
viewModelScope
.
launch
{
viewModelScope
.
launch
{
db
.
update
(
app
)
db
.
update
(
app
)
val
res
=
if
(
app
.
policy
==
Magisk
Policy
.
ALLOW
)
R
.
string
.
su_snack_grant
val
res
=
if
(
app
.
policy
==
Su
Policy
.
ALLOW
)
R
.
string
.
su_snack_grant
else
R
.
string
.
su_snack_deny
else
R
.
string
.
su_snack_deny
SnackbarEvent
(
resources
.
getString
(
res
).
format
(
item
.
item
.
appName
)).
publish
()
SnackbarEvent
(
resources
.
getString
(
res
).
format
(
item
.
item
.
appName
)).
publish
()
}
}
...
...
app/src/main/java/com/topjohnwu/magisk/ui/surequest/SuRequestViewModel.kt
View file @
34450cdd
...
@@ -13,12 +13,12 @@ import com.topjohnwu.magisk.R
...
@@ -13,12 +13,12 @@ import com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.arch.BaseViewModel
import
com.topjohnwu.magisk.arch.BaseViewModel
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.Config
import
com.topjohnwu.magisk.core.magiskdb.PolicyDao
import
com.topjohnwu.magisk.core.magiskdb.PolicyDao
import
com.topjohnwu.magisk.core.model.
Magisk
Policy.Companion.ALLOW
import
com.topjohnwu.magisk.core.model.
su.Su
Policy.Companion.ALLOW
import
com.topjohnwu.magisk.core.model.
Magisk
Policy.Companion.DENY
import
com.topjohnwu.magisk.core.model.
su.Su
Policy.Companion.DENY
import
com.topjohnwu.magisk.core.su.SuRequestHandler
import
com.topjohnwu.magisk.core.su.SuRequestHandler
import
com.topjohnwu.magisk.core.utils.BiometricHelper
import
com.topjohnwu.magisk.core.utils.BiometricHelper
import
com.topjohnwu.magisk.
model.entity.recycler.SpinnerRvItem
import
com.topjohnwu.magisk.
events.DieEvent
import
com.topjohnwu.magisk.
model.events.DieEvent
import
com.topjohnwu.magisk.
ui.superuser.SpinnerRvItem
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.superuser.internal.UiThreadHandler
import
com.topjohnwu.superuser.internal.UiThreadHandler
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
...
...
app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt
View file @
34450cdd
package
com.topjohnwu.magisk.ui.theme
package
com.topjohnwu.magisk.ui.theme
import
com.topjohnwu.magisk.arch.BaseViewModel
import
com.topjohnwu.magisk.arch.BaseViewModel
import
com.topjohnwu.magisk.
model.entity.recycler.TappableHeadlineItem
import
com.topjohnwu.magisk.
events.RecreateEvent
import
com.topjohnwu.magisk.
model.events.RecreateEvent
import
com.topjohnwu.magisk.
events.dialog.DarkThemeDialog
import
com.topjohnwu.magisk.
model.events.dialog.DarkThemeDialog
import
com.topjohnwu.magisk.
view.TappableHeadlineItem
class
ThemeViewModel
:
BaseViewModel
(),
TappableHeadlineItem
.
Listener
{
class
ThemeViewModel
:
BaseViewModel
(),
TappableHeadlineItem
.
Listener
{
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycler
/TappableHeadlineItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
view
/TappableHeadlineItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycler
package
com.topjohnwu.magisk.
view
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.databinding.ComparableRvItem
...
...
app/src/main/java/com/topjohnwu/magisk/
model/entity/recycler
/TextItem.kt
→
app/src/main/java/com/topjohnwu/magisk/
view
/TextItem.kt
View file @
34450cdd
package
com.topjohnwu.magisk.
model.entity.recycler
package
com.topjohnwu.magisk.
view
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.R
import
com.topjohnwu.magisk.databinding.ComparableRvItem
import
com.topjohnwu.magisk.databinding.ComparableRvItem
...
...
app/src/main/res/layout/fragment_home_md2.xml
View file @
34450cdd
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
<import
type=
"com.topjohnwu.magisk.ui.home.MagiskState"
/>
<import
type=
"com.topjohnwu.magisk.ui.home.MagiskState"
/>
<import
type=
"com.topjohnwu.magisk.
model.entity
.DeveloperItem"
/>
<import
type=
"com.topjohnwu.magisk.
ui.home
.DeveloperItem"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_console_md2.xml
View file @
34450cdd
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.ConsoleItem"
/>
type=
"com.topjohnwu.magisk.
ui.flash
.ConsoleItem"
/>
</data>
</data>
...
...
app/src/main/res/layout/item_developer.xml
View file @
34450cdd
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity
.DeveloperItem"
/>
type=
"com.topjohnwu.magisk.
ui.home
.DeveloperItem"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_hide_md2.xml
View file @
34450cdd
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.HideItem"
/>
type=
"com.topjohnwu.magisk.
ui.hide
.HideItem"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_hide_process_md2.xml
View file @
34450cdd
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.HideProcessItem"
/>
type=
"com.topjohnwu.magisk.
ui.hide
.HideProcessItem"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_icon_link.xml
View file @
34450cdd
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity
.IconLink"
/>
type=
"com.topjohnwu.magisk.
ui.home
.IconLink"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_log_access_md2.xml
View file @
34450cdd
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler.Log
Item"
/>
type=
"com.topjohnwu.magisk.
ui.log.LogRv
Item"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_module_download.xml
View file @
34450cdd
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.InstallModule"
/>
type=
"com.topjohnwu.magisk.
ui.module
.InstallModule"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_module_md2.xml
View file @
34450cdd
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.ModuleItem"
/>
type=
"com.topjohnwu.magisk.
ui.module
.ModuleItem"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_policy_md2.xml
View file @
34450cdd
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler.Policy
Item"
/>
type=
"com.topjohnwu.magisk.
ui.superuser.PolicyRv
Item"
/>
</data>
</data>
...
...
app/src/main/res/layout/item_repo_md2.xml
View file @
34450cdd
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.RepoItem"
/>
type=
"com.topjohnwu.magisk.
ui.module
.RepoItem"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_section_md2.xml
View file @
34450cdd
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.SectionTitle"
/>
type=
"com.topjohnwu.magisk.
ui.module
.SectionTitle"
/>
<variable
<variable
name=
"viewModel"
name=
"viewModel"
...
...
app/src/main/res/layout/item_settings.xml
View file @
34450cdd
...
@@ -7,11 +7,11 @@
...
@@ -7,11 +7,11 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler.
SettingsItem"
/>
type=
"com.topjohnwu.magisk.
ui.settings.Base
SettingsItem"
/>
<variable
<variable
name=
"callback"
name=
"callback"
type=
"com.topjohnwu.magisk.
model.entity.recycler.
SettingsItem.Callback"
/>
type=
"com.topjohnwu.magisk.
ui.settings.Base
SettingsItem.Callback"
/>
</data>
</data>
...
...
app/src/main/res/layout/item_settings_section.xml
View file @
34450cdd
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler.
SettingsItem"
/>
type=
"com.topjohnwu.magisk.
ui.settings.Base
SettingsItem"
/>
</data>
</data>
...
...
app/src/main/res/layout/item_spinner.xml
View file @
34450cdd
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycl
er.SpinnerRvItem"
/>
type=
"com.topjohnwu.magisk.
ui.superus
er.SpinnerRvItem"
/>
</data>
</data>
...
@@ -25,4 +25,4 @@
...
@@ -25,4 +25,4 @@
android:textAlignment=
"inherit"
android:textAlignment=
"inherit"
tools:text=
"Forever"
/>
tools:text=
"Forever"
/>
</layout>
</layout>
\ No newline at end of file
app/src/main/res/layout/item_tappable_headline.xml
View file @
34450cdd
...
@@ -7,11 +7,11 @@
...
@@ -7,11 +7,11 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.TappableHeadlineItem"
/>
type=
"com.topjohnwu.magisk.
view
.TappableHeadlineItem"
/>
<variable
<variable
name=
"listener"
name=
"listener"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.TappableHeadlineItem.Listener"
/>
type=
"com.topjohnwu.magisk.
view
.TappableHeadlineItem.Listener"
/>
</data>
</data>
...
...
app/src/main/res/layout/item_text.xml
View file @
34450cdd
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
<variable
<variable
name=
"item"
name=
"item"
type=
"com.topjohnwu.magisk.
model.entity.recycler
.TextItem"
/>
type=
"com.topjohnwu.magisk.
view
.TextItem"
/>
</data>
</data>
...
@@ -19,4 +19,4 @@
...
@@ -19,4 +19,4 @@
android:textAppearance=
"@style/AppearanceFoundation.Tiny.Variant"
android:textAppearance=
"@style/AppearanceFoundation.Tiny.Variant"
tools:text=
"@tools:sample/lorem/random"
/>
tools:text=
"@tools:sample/lorem/random"
/>
</layout>
</layout>
\ No newline at end of file
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