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
84f92bd6
Commit
84f92bd6
authored
Aug 26, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Cleanup hide fragment code
parent
b44dcc2d
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
162 additions
and
186 deletions
+162
-186
MagiskRepository.kt
.../com/topjohnwu/magisk/data/repository/MagiskRepository.kt
+1
-42
RecyclerViewItems.kt
...ava/com/topjohnwu/magisk/databinding/RecyclerViewItems.kt
+9
-2
RepositoryModule.kt
...src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt
+1
-1
ViewModelsModule.kt
...src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt
+1
-1
XAndroid.kt
app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt
+14
-32
HideApp.kt
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideApp.kt
+47
-0
HideAppInfo.kt
...src/main/java/com/topjohnwu/magisk/ui/hide/HideAppInfo.kt
+0
-25
HideRvItems.kt
...src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItems.kt
+27
-20
HideTarget.kt
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideTarget.kt
+0
-14
HideViewModel.kt
...c/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
+54
-41
item_hide_md2.xml
app/src/main/res/layout/item_hide_md2.xml
+6
-7
item_hide_process_md2.xml
app/src/main/res/layout/item_hide_process_md2.xml
+2
-1
No files found.
app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt
View file @
84f92bd6
package
com.topjohnwu.magisk.data.repository
package
com.topjohnwu.magisk.data.repository
import
android.content.pm.PackageManager
import
com.topjohnwu.magisk.core.Config
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.ktx.await
import
com.topjohnwu.magisk.ktx.getLabel
import
com.topjohnwu.magisk.ktx.packageName
import
com.topjohnwu.magisk.ui.hide.HideAppInfo
import
com.topjohnwu.magisk.ui.hide.HideTarget
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.withContext
import
timber.log.Timber
import
timber.log.Timber
import
java.io.IOException
import
java.io.IOException
class
MagiskRepository
(
class
MagiskRepository
(
private
val
apiRaw
:
GithubRawServices
,
private
val
apiRaw
:
GithubRawServices
private
val
packageManager
:
PackageManager
)
{
)
{
suspend
fun
fetchUpdate
()
=
try
{
suspend
fun
fetchUpdate
()
=
try
{
...
@@ -40,35 +30,4 @@ class MagiskRepository(
...
@@ -40,35 +30,4 @@ class MagiskRepository(
null
null
}
}
suspend
fun
fetchApps
()
=
withContext
(
Dispatchers
.
Default
)
{
packageManager
.
getInstalledApplications
(
0
).
filter
{
it
.
enabled
&&
!
blacklist
.
contains
(
it
.
packageName
)
}.
map
{
val
label
=
it
.
getLabel
(
packageManager
)
val
icon
=
it
.
loadIcon
(
packageManager
)
HideAppInfo
(
it
,
label
,
icon
)
}.
filter
{
it
.
processes
.
isNotEmpty
()
}
}
suspend
fun
fetchHideTargets
()
=
Shell
.
su
(
"magiskhide --ls"
).
await
().
out
.
map
{
HideTarget
(
it
)
}
fun
toggleHide
(
isEnabled
:
Boolean
,
packageName
:
String
,
process
:
String
)
=
Shell
.
su
(
"magiskhide --${isEnabled.state} $packageName $process"
).
submit
()
private
val
Boolean
.
state
get
()
=
if
(
this
)
"add"
else
"rm"
companion
object
{
private
val
blacklist
by
lazy
{
listOf
(
packageName
,
"android"
,
"com.android.chrome"
,
"com.chrome.beta"
,
"com.chrome.dev"
,
"com.chrome.canary"
,
"com.android.webview"
,
"com.google.android.webview"
)
}
}
}
}
app/src/main/java/com/topjohnwu/magisk/databinding/RecyclerViewItems.kt
View file @
84f92bd6
...
@@ -28,10 +28,17 @@ abstract class RvItem {
...
@@ -28,10 +28,17 @@ abstract class RvItem {
abstract
class
ComparableRvItem
<
in
T
>
:
RvItem
()
{
abstract
class
ComparableRvItem
<
in
T
>
:
RvItem
()
{
abstract
fun
itemSameAs
(
other
:
T
):
Boolean
// Use Any.equals by default
abstract
fun
contentSameAs
(
other
:
T
):
Boolean
open
fun
itemSameAs
(
other
:
T
)
=
this
==
other
// Use compareTo if this is Comparable or assume not same
@Suppress
(
"UNCHECKED_CAST"
)
open
fun
contentSameAs
(
other
:
T
)
=
(
this
as
?
Comparable
<
T
>)
?.
run
{
compareTo
(
other
)
==
0
}
?:
false
@Suppress
(
"UNCHECKED_CAST"
)
@Suppress
(
"UNCHECKED_CAST"
)
open
fun
genericItemSameAs
(
other
:
Any
):
Boolean
=
other
::
class
==
this
::
class
&&
itemSameAs
(
other
as
T
)
open
fun
genericItemSameAs
(
other
:
Any
):
Boolean
=
other
::
class
==
this
::
class
&&
itemSameAs
(
other
as
T
)
@Suppress
(
"UNCHECKED_CAST"
)
@Suppress
(
"UNCHECKED_CAST"
)
open
fun
genericContentSameAs
(
other
:
Any
):
Boolean
=
other
::
class
==
this
::
class
&&
contentSameAs
(
other
as
T
)
open
fun
genericContentSameAs
(
other
:
Any
):
Boolean
=
other
::
class
==
this
::
class
&&
contentSameAs
(
other
as
T
)
...
...
app/src/main/java/com/topjohnwu/magisk/di/RepositoryModule.kt
View file @
84f92bd6
...
@@ -7,7 +7,7 @@ import org.koin.dsl.module
...
@@ -7,7 +7,7 @@ import org.koin.dsl.module
val
repositoryModule
=
module
{
val
repositoryModule
=
module
{
single
{
MagiskRepository
(
get
()
,
get
()
)
}
single
{
MagiskRepository
(
get
())
}
single
{
LogRepository
(
get
())
}
single
{
LogRepository
(
get
())
}
single
{
StringRepository
(
get
())
}
single
{
StringRepository
(
get
())
}
}
}
app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt
View file @
84f92bd6
...
@@ -17,7 +17,7 @@ import org.koin.androidx.viewmodel.dsl.viewModel
...
@@ -17,7 +17,7 @@ import org.koin.androidx.viewmodel.dsl.viewModel
import
org.koin.dsl.module
import
org.koin.dsl.module
val
viewModelModules
=
module
{
val
viewModelModules
=
module
{
viewModel
{
HideViewModel
(
get
()
)
}
viewModel
{
HideViewModel
()
}
viewModel
{
HomeViewModel
(
get
())
}
viewModel
{
HomeViewModel
(
get
())
}
viewModel
{
LogViewModel
(
get
())
}
viewModel
{
LogViewModel
(
get
())
}
viewModel
{
ModuleViewModel
(
get
(),
get
(),
get
())
}
viewModel
{
ModuleViewModel
(
get
(),
get
(),
get
())
}
...
...
app/src/main/java/com/topjohnwu/magisk/ktx/XAndroid.kt
View file @
84f92bd6
...
@@ -65,40 +65,22 @@ val PackageInfo.processes
...
@@ -65,40 +65,22 @@ val PackageInfo.processes
val
Array
<
out
ComponentInfo
>.
processNames
get
()
=
mapNotNull
{
it
.
processName
}
val
Array
<
out
ComponentInfo
>.
processNames
get
()
=
mapNotNull
{
it
.
processName
}
val
ApplicationInfo
.
packageInfo
:
PackageInfo
?
val
ApplicationInfo
.
packageInfo
:
PackageInfo
get
()
{
get
()
{
val
pm
=
get
<
PackageManager
>()
val
pm
:
PackageManager
by
inject
()
return
try
{
return
try
{
val
request
=
GET_ACTIVITIES
or
val
request
=
GET_ACTIVITIES
or
GET_SERVICES
or
GET_RECEIVERS
or
GET_PROVIDERS
GET_SERVICES
or
GET_RECEIVERS
or
GET_PROVIDERS
pm
.
getPackageInfo
(
packageName
,
request
)
pm
.
getPackageInfo
(
packageName
,
request
)
}
catch
(
e1
:
Exception
)
{
}
catch
(
e
:
Exception
)
{
try
{
// Exceed binder data transfer limit, fetch each component type separately
pm
.
activities
(
packageName
).
apply
{
pm
.
getPackageInfo
(
packageName
,
0
).
apply
{
services
=
pm
.
services
(
packageName
)
runCatching
{
activities
=
pm
.
getPackageInfo
(
packageName
,
GET_ACTIVITIES
).
activities
}
receivers
=
pm
.
receivers
(
packageName
)
runCatching
{
services
=
pm
.
getPackageInfo
(
packageName
,
GET_SERVICES
).
services
}
providers
=
pm
.
providers
(
packageName
)
runCatching
{
receivers
=
pm
.
getPackageInfo
(
packageName
,
GET_RECEIVERS
).
receivers
}
}
runCatching
{
providers
=
pm
.
getPackageInfo
(
packageName
,
GET_PROVIDERS
).
providers
}
}
catch
(
e2
:
Exception
)
{
null
}
}
}
}
}
}
fun
PackageManager
.
activities
(
packageName
:
String
)
=
getPackageInfo
(
packageName
,
GET_ACTIVITIES
)
fun
PackageManager
.
services
(
packageName
:
String
)
=
getPackageInfo
(
packageName
,
GET_SERVICES
).
services
fun
PackageManager
.
receivers
(
packageName
:
String
)
=
getPackageInfo
(
packageName
,
GET_RECEIVERS
).
receivers
fun
PackageManager
.
providers
(
packageName
:
String
)
=
getPackageInfo
(
packageName
,
GET_PROVIDERS
).
providers
fun
Context
.
rawResource
(
id
:
Int
)
=
resources
.
openRawResource
(
id
)
fun
Context
.
rawResource
(
id
:
Int
)
=
resources
.
openRawResource
(
id
)
...
...
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideApp.kt
0 → 100644
View file @
84f92bd6
package
com.topjohnwu.magisk.ui.hide
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageManager
import
android.graphics.drawable.Drawable
import
com.topjohnwu.magisk.core.utils.currentLocale
import
com.topjohnwu.magisk.ktx.getLabel
class
HideTarget
(
line
:
String
)
{
val
packageName
:
String
val
process
:
String
init
{
val
split
=
line
.
split
(
Regex
(
"\\|"
),
2
)
packageName
=
split
[
0
]
process
=
split
.
getOrElse
(
1
)
{
packageName
}
}
}
class
HideAppInfo
(
info
:
ApplicationInfo
,
pm
:
PackageManager
)
:
ApplicationInfo
(
info
),
Comparable
<
HideAppInfo
>
{
val
label
=
info
.
getLabel
(
pm
)
val
iconImage
:
Drawable
=
info
.
loadIcon
(
pm
)
override
fun
compareTo
(
other
:
HideAppInfo
)
=
comparator
.
compare
(
this
,
other
)
companion
object
{
private
val
comparator
=
compareBy
<
HideAppInfo
>(
{
it
.
label
.
toLowerCase
(
currentLocale
)
},
{
it
.
packageName
}
)
}
}
data class
HideProcessInfo
(
val
name
:
String
,
val
packageName
:
String
,
val
isHidden
:
Boolean
)
class
HideAppTarget
(
val
info
:
HideAppInfo
,
val
processes
:
List
<
HideProcessInfo
>
)
:
Comparable
<
HideAppTarget
>
{
override
fun
compareTo
(
other
:
HideAppTarget
)
=
compareValuesBy
(
this
,
other
)
{
it
.
info
}
}
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideAppInfo.kt
deleted
100644 → 0
View file @
b44dcc2d
package
com.topjohnwu.magisk.ui.hide
import
android.content.pm.ApplicationInfo
import
android.graphics.drawable.Drawable
import
com.topjohnwu.magisk.ktx.packageInfo
import
com.topjohnwu.magisk.ktx.processes
data class
HideAppInfo
(
val
info
:
ApplicationInfo
,
val
name
:
String
,
val
icon
:
Drawable
)
{
val
processes
=
info
.
packageInfo
?.
processes
?.
distinct
()
?:
listOf
(
info
.
packageName
)
}
data class
StatefulProcess
(
val
name
:
String
,
val
packageName
:
String
,
val
isHidden
:
Boolean
)
data class
HideAppTarget
(
val
info
:
HideAppInfo
,
val
processes
:
List
<
StatefulProcess
>
)
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItem.kt
→
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItem
s
.kt
View file @
84f92bd6
...
@@ -9,27 +9,27 @@ import com.topjohnwu.magisk.databinding.ObservableItem
...
@@ -9,27 +9,27 @@ import com.topjohnwu.magisk.databinding.ObservableItem
import
com.topjohnwu.magisk.ktx.startAnimations
import
com.topjohnwu.magisk.ktx.startAnimations
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
com.topjohnwu.superuser.Shell
import
kotlin.math.roundToInt
import
kotlin.math.roundToInt
class
HideItem
(
class
HideItem
(
val
item
:
HideAppTarget
,
app
:
HideAppTarget
viewModel
:
HideViewModel
)
:
ObservableItem
<
HideItem
>(),
Comparable
<
HideItem
>
{
)
:
ObservableItem
<
HideItem
>()
{
override
val
layoutRes
=
R
.
layout
.
item_hide_md2
override
val
layoutRes
=
R
.
layout
.
item_hide_md2
val
packageName
=
item
.
info
.
info
.
packageName
.
orEmpty
()
val
info
=
app
.
info
val
items
=
item
.
processes
.
map
{
HideProcessItem
(
it
,
viewModel
)
}
val
processes
=
app
.
processes
.
map
{
HideProcessItem
(
it
)
}
@get
:
Bindable
@get
:
Bindable
var
isExpanded
=
false
var
isExpanded
=
false
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
expanded
)
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
expanded
)
var
itemsChecked
=
0
var
itemsChecked
=
0
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
itemsC
heckedPercent
)
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
c
heckedPercent
)
@get
:
Bindable
@get
:
Bindable
val
itemsCheckedPercent
get
()
=
(
itemsChecked
.
toFloat
()
/
item
s
.
size
*
100
).
roundToInt
()
val
checkedPercent
get
()
=
(
itemsChecked
.
toFloat
()
/
processe
s
.
size
*
100
).
roundToInt
()
private
var
state
:
Boolean
?
=
false
private
var
state
:
Boolean
?
=
false
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
hiddenState
)
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
hiddenState
)
...
@@ -39,14 +39,14 @@ class HideItem(
...
@@ -39,14 +39,14 @@ class HideItem(
get
()
=
state
get
()
=
state
set
(
value
)
=
set
(
value
,
state
,
{
state
=
it
},
BR
.
hiddenState
)
{
set
(
value
)
=
set
(
value
,
state
,
{
state
=
it
},
BR
.
hiddenState
)
{
if
(
value
==
true
)
{
if
(
value
==
true
)
{
item
s
.
filterNot
{
it
.
isHidden
}
processe
s
.
filterNot
{
it
.
isHidden
}
}
else
{
}
else
{
item
s
processe
s
}.
forEach
{
it
.
toggle
()
}
}.
forEach
{
it
.
toggle
()
}
}
}
init
{
init
{
item
s
.
forEach
{
it
.
addOnPropertyChangedCallback
(
BR
.
hidden
)
{
recalculateChecked
()
}
}
processe
s
.
forEach
{
it
.
addOnPropertyChangedCallback
(
BR
.
hidden
)
{
recalculateChecked
()
}
}
recalculateChecked
()
recalculateChecked
()
}
}
...
@@ -56,37 +56,44 @@ class HideItem(
...
@@ -56,37 +56,44 @@ class HideItem(
}
}
private
fun
recalculateChecked
()
{
private
fun
recalculateChecked
()
{
itemsChecked
=
item
s
.
count
{
it
.
isHidden
}
itemsChecked
=
processe
s
.
count
{
it
.
isHidden
}
state
=
when
(
itemsChecked
)
{
state
=
when
(
itemsChecked
)
{
0
->
false
0
->
false
item
s
.
size
->
true
processe
s
.
size
->
true
else
->
null
else
->
null
}
}
}
}
override
fun
contentSameAs
(
other
:
HideItem
):
Boolean
=
item
==
other
.
item
override
fun
compareTo
(
other
:
HideItem
)
=
comparator
.
compare
(
this
,
other
)
override
fun
itemSameAs
(
other
:
HideItem
):
Boolean
=
item
.
info
==
other
.
item
.
info
companion
object
{
private
val
comparator
=
compareBy
<
HideItem
>(
{
it
.
itemsChecked
==
0
},
{
it
.
info
}
)
}
}
}
class
HideProcessItem
(
class
HideProcessItem
(
val
item
:
StatefulProcess
,
val
process
:
HideProcessInfo
val
viewModel
:
HideViewModel
)
:
ObservableItem
<
HideProcessItem
>()
{
)
:
ObservableItem
<
HideProcessItem
>()
{
override
val
layoutRes
=
R
.
layout
.
item_hide_process_md2
override
val
layoutRes
=
R
.
layout
.
item_hide_process_md2
@get
:
Bindable
@get
:
Bindable
var
isHidden
=
item
.
isHidden
var
isHidden
=
process
.
isHidden
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
hidden
)
{
set
(
value
)
=
set
(
value
,
field
,
{
field
=
it
},
BR
.
hidden
)
{
viewModel
.
toggleItem
(
this
)
val
arg
=
if
(
isHidden
)
"add"
else
"rm"
val
(
name
,
pkg
)
=
process
Shell
.
su
(
"magiskhide --$arg $pkg $name"
).
submit
()
}
}
fun
toggle
()
{
fun
toggle
()
{
isHidden
=
!
isHidden
isHidden
=
!
isHidden
}
}
override
fun
contentSameAs
(
other
:
HideProcessItem
)
=
item
==
other
.
item
override
fun
contentSameAs
(
other
:
HideProcessItem
)
=
process
==
other
.
process
override
fun
itemSameAs
(
other
:
HideProcessItem
)
=
item
.
name
==
other
.
item
.
name
override
fun
itemSameAs
(
other
:
HideProcessItem
)
=
process
.
name
==
other
.
process
.
name
}
}
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideTarget.kt
deleted
100644 → 0
View file @
b44dcc2d
package
com.topjohnwu.magisk.ui.hide
class
HideTarget
(
line
:
String
)
{
val
packageName
:
String
val
process
:
String
init
{
val
split
=
line
.
split
(
Regex
(
"\\|"
),
2
)
packageName
=
split
[
0
]
process
=
split
.
getOrElse
(
1
)
{
packageName
}
}
}
app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
View file @
84f92bd6
package
com.topjohnwu.magisk.ui.hide
package
com.topjohnwu.magisk.ui.hide
import
android.content.pm.ApplicationInfo
import
android.content.pm.ApplicationInfo
import
android.content.pm.PackageManager
import
androidx.databinding.Bindable
import
androidx.databinding.Bindable
import
androidx.lifecycle.viewModelScope
import
androidx.lifecycle.viewModelScope
import
com.topjohnwu.magisk.BR
import
com.topjohnwu.magisk.BR
...
@@ -9,16 +10,17 @@ import com.topjohnwu.magisk.arch.Queryable
...
@@ -9,16 +10,17 @@ import com.topjohnwu.magisk.arch.Queryable
import
com.topjohnwu.magisk.arch.filterableListOf
import
com.topjohnwu.magisk.arch.filterableListOf
import
com.topjohnwu.magisk.arch.itemBindingOf
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.ktx.get
import
com.topjohnwu.magisk.data.repository.MagiskRepository
import
com.topjohnwu.magisk.ktx.packageInfo
import
com.topjohnwu.magisk.ktx.packageName
import
com.topjohnwu.magisk.ktx.processes
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.magisk.utils.set
import
com.topjohnwu.superuser.Shell
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
kotlinx.coroutines.withContext
class
HideViewModel
(
class
HideViewModel
:
BaseViewModel
(),
Queryable
{
private
val
magiskRepo
:
MagiskRepository
)
:
BaseViewModel
(),
Queryable
{
override
val
queryDelay
=
1000L
override
val
queryDelay
=
1000L
...
@@ -45,63 +47,74 @@ class HideViewModel(
...
@@ -45,63 +47,74 @@ class HideViewModel(
override
fun
refresh
()
=
viewModelScope
.
launch
{
override
fun
refresh
()
=
viewModelScope
.
launch
{
state
=
State
.
LOADING
state
=
State
.
LOADING
val
apps
=
magiskRepo
.
fetchApps
()
val
(
apps
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
hides
=
magiskRepo
.
fetchHideTargets
()
val
pm
=
get
<
PackageManager
>()
val
(
appList
,
diff
)
=
withContext
(
Dispatchers
.
Default
)
{
val
hides
=
Shell
.
su
(
"magiskhide --ls"
).
exec
().
out
.
map
{
HideTarget
(
it
)
}
val
list
=
apps
val
apps
=
pm
.
getInstalledApplications
(
0
)
.
asSequence
()
.
filter
{
it
.
enabled
&&
!
blacklist
.
contains
(
it
.
packageName
)
}
.
map
{
HideAppInfo
(
it
,
pm
)
}
.
map
{
createTarget
(
it
,
hides
)
}
.
map
{
createTarget
(
it
,
hides
)
}
.
map
{
HideItem
(
it
,
this
@HideViewModel
)
}
.
filter
{
it
.
processes
.
isNotEmpty
()
}
.
sort
()
.
map
{
HideItem
(
it
)
}
list
to
items
.
calculateDiff
(
list
)
.
toList
()
.
sorted
()
apps
to
items
.
calculateDiff
(
apps
)
}
}
items
.
update
(
app
List
,
diff
)
items
.
update
(
app
s
,
diff
)
submitQuery
()
submitQuery
()
state
=
State
.
LOADED
}
}
// ---
// ---
private
fun
createTarget
(
app
:
HideAppInfo
,
hideList
:
List
<
HideTarget
>):
HideAppTarget
{
private
fun
createTarget
(
info
:
HideAppInfo
,
hideList
:
List
<
HideTarget
>):
HideAppTarget
{
val
hidden
=
hideList
.
filter
{
it
.
packageName
==
app
.
info
.
packageName
}
val
pkg
=
info
.
packageName
val
packageName
=
app
.
info
.
packageName
val
hidden
=
hideList
.
filter
{
it
.
packageName
==
pkg
}
val
processes
=
app
.
processes
.
map
{
name
->
val
processNames
=
info
.
packageInfo
.
processes
.
distinct
()
StatefulProcess
(
name
,
packageName
,
hidden
.
any
{
name
==
it
.
process
})
val
processes
=
processNames
.
map
{
name
->
HideProcessInfo
(
name
,
pkg
,
hidden
.
any
{
name
==
it
.
process
})
}
}
return
HideAppTarget
(
app
,
processes
)
return
HideAppTarget
(
info
,
processes
)
}
}
private
fun
List
<
HideItem
>.
sort
()
=
compareByDescending
<
HideItem
>
{
it
.
itemsChecked
!=
0
}
.
thenBy
{
it
.
item
.
info
.
name
.
toLowerCase
(
currentLocale
)
}
.
thenBy
{
it
.
item
.
info
.
info
.
packageName
}
.
let
{
sortedWith
(
it
)
}
// ---
// ---
override
fun
query
()
=
items
.
filter
{
override
fun
query
()
{
fun
showHidden
()=
it
.
itemsChecked
!=
0
items
.
filter
{
fun
showHidden
()
=
it
.
itemsChecked
!=
0
fun
filterSystem
():
Boolean
{
fun
filterSystem
()
=
return
isShowSystem
||
it
.
item
.
info
.
info
.
flags
and
ApplicationInfo
.
FLAG_SYSTEM
==
0
isShowSystem
||
it
.
info
.
flags
and
ApplicationInfo
.
FLAG_SYSTEM
==
0
}
fun
filterQuery
():
Boolean
{
fun
filterQuery
():
Boolean
{
fun
inName
()
=
it
.
item
.
info
.
name
.
contains
(
query
,
true
)
fun
inName
()
=
it
.
info
.
label
.
contains
(
query
,
true
)
fun
inPackage
()
=
it
.
item
.
info
.
info
.
packageName
.
contains
(
query
,
true
)
fun
inPackage
()
=
it
.
info
.
packageName
.
contains
(
query
,
true
)
fun
inProcesses
()
=
it
.
item
.
processes
.
any
{
it
.
name
.
contains
(
query
,
true
)
}
fun
inProcesses
()
=
it
.
processes
.
any
{
p
->
p
.
process
.
name
.
contains
(
query
,
true
)
}
return
inName
()
||
inPackage
()
||
inProcesses
()
return
inName
()
||
inPackage
()
||
inProcesses
()
}
}
showHidden
()
||
(
filterSystem
()
&&
filterQuery
())
showHidden
()
||
(
filterSystem
()
&&
filterQuery
())
}
}
state
=
State
.
LOADED
}
// ---
// ---
fun
toggleItem
(
item
:
HideProcessItem
)
{
magiskRepo
.
toggleHide
(
item
.
isHidden
,
item
.
item
.
packageName
,
item
.
item
.
name
)
}
fun
resetQuery
()
{
fun
resetQuery
()
{
query
=
""
query
=
""
}
}
companion
object
{
private
val
blacklist
by
lazy
{
listOf
(
packageName
,
"android"
,
"com.android.chrome"
,
"com.chrome.beta"
,
"com.chrome.dev"
,
"com.chrome.canary"
,
"com.android.webview"
,
"com.google.android.webview"
)
}
}
}
}
app/src/main/res/layout/item_hide_md2.xml
View file @
84f92bd6
...
@@ -39,12 +39,12 @@
...
@@ -39,12 +39,12 @@
android:id=
"@+id/hide_icon"
android:id=
"@+id/hide_icon"
style=
"@style/WidgetFoundation.Image"
style=
"@style/WidgetFoundation.Image"
android:layout_margin=
"@dimen/l1"
android:layout_margin=
"@dimen/l1"
android:src=
"@{item.i
tem.info.icon
}"
android:src=
"@{item.i
nfo.iconImage
}"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintVertical_bias=
"0"
app:layout_constraintVertical_bias=
"0"
tools:src=
"@drawable/ic_
magisk
"
/>
tools:src=
"@drawable/ic_
launcher
"
/>
<TextView
<TextView
android:id=
"@+id/hide_name"
android:id=
"@+id/hide_name"
...
@@ -53,7 +53,7 @@
...
@@ -53,7 +53,7 @@
android:layout_marginStart=
"@dimen/l1"
android:layout_marginStart=
"@dimen/l1"
android:ellipsize=
"middle"
android:ellipsize=
"middle"
android:singleLine=
"true"
android:singleLine=
"true"
android:text=
"@{item.i
tem.info.name
}"
android:text=
"@{item.i
nfo.label
}"
android:textAppearance=
"@style/AppearanceFoundation.Body"
android:textAppearance=
"@style/AppearanceFoundation.Body"
android:textStyle=
"bold"
android:textStyle=
"bold"
app:layout_constraintBottom_toTopOf=
"@+id/hide_package"
app:layout_constraintBottom_toTopOf=
"@+id/hide_package"
...
@@ -65,10 +65,9 @@
...
@@ -65,10 +65,9 @@
<TextView
<TextView
android:id=
"@+id/hide_package"
android:id=
"@+id/hide_package"
gone=
"@{item.item.info.info.packageName.empty}"
android:layout_width=
"0dp"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@{item.i
tem.info.i
nfo.packageName}"
android:text=
"@{item.info.packageName}"
android:textAppearance=
"@style/AppearanceFoundation.Caption.Variant"
android:textAppearance=
"@style/AppearanceFoundation.Caption.Variant"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"@+id/hide_name"
app:layout_constraintEnd_toEndOf=
"@+id/hide_name"
...
@@ -90,7 +89,7 @@
...
@@ -90,7 +89,7 @@
<androidx.recyclerview.widget.RecyclerView
<androidx.recyclerview.widget.RecyclerView
goneUnless=
"@{item.isExpanded}"
goneUnless=
"@{item.isExpanded}"
itemBinding=
"@{viewModel.itemInternalBinding}"
itemBinding=
"@{viewModel.itemInternalBinding}"
items=
"@{item.
item
s}"
items=
"@{item.
processe
s}"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:background=
"?colorSurfaceVariant"
android:background=
"?colorSurfaceVariant"
...
@@ -105,7 +104,7 @@
...
@@ -105,7 +104,7 @@
style=
"@style/WidgetFoundation.ProgressBar"
style=
"@style/WidgetFoundation.ProgressBar"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_gravity=
"top"
android:layout_gravity=
"top"
android:progress=
"@{item.
itemsC
heckedPercent}"
/>
android:progress=
"@{item.
c
heckedPercent}"
/>
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView>
...
...
app/src/main/res/layout/item_hide_process_md2.xml
View file @
84f92bd6
...
@@ -29,7 +29,8 @@
...
@@ -29,7 +29,8 @@
android:layout_marginEnd=
"@dimen/l1"
android:layout_marginEnd=
"@dimen/l1"
android:layout_marginBottom=
"@dimen/l_75"
android:layout_marginBottom=
"@dimen/l_75"
android:singleLine=
"true"
android:singleLine=
"true"
android:text=
"@{item.item.name}"
android:ellipsize=
"middle"
android:text=
"@{item.process.name}"
android:textAppearance=
"@style/AppearanceFoundation.Caption.Variant"
android:textAppearance=
"@style/AppearanceFoundation.Caption.Variant"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toStartOf=
"@+id/hide_process_checkbox"
app:layout_constraintEnd_toStartOf=
"@+id/hide_process_checkbox"
...
...
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