Add "preset" option for apps (WIP)

This commit is contained in:
frknkrc44 2025-08-17 22:10:21 +03:00
commit e9ecd86816
No known key found for this signature in database
GPG key ID: 784AE1CC0DCFD34F
20 changed files with 340 additions and 29 deletions

View file

@ -1,7 +1,6 @@
package icu.nullptr.hidemyapplist.ui.activity
import android.annotation.SuppressLint
import android.graphics.drawable.ColorDrawable
import android.widget.ImageView
import android.widget.TextView
import com.drakeet.about.AbsAboutActivity
@ -10,11 +9,10 @@ import com.drakeet.about.Category
import com.drakeet.about.Contributor
import com.drakeet.about.License
import com.drakeet.about.Line
import icu.nullptr.hidemyapplist.ui.util.ThemeUtils.themeColor
import org.frknkrc44.hma_oss.BuildConfig
import org.frknkrc44.hma_oss.R
import androidx.core.graphics.drawable.toDrawable
@Suppress("deprecation")
class AboutActivity : AbsAboutActivity() {
@SuppressLint("SetTextI18n")
override fun onCreateHeader(icon: ImageView, slogan: TextView, version: TextView) {
@ -23,7 +21,6 @@ class AboutActivity : AbsAboutActivity() {
version.text = BuildConfig.VERSION_NAME
}
@Suppress("deprecation")
override fun onItemsCreated(items: MutableList<Any>) {
items.add(Category(getString(R.string.title_about_fork)))
items.add(Card(getString(R.string.about_fork_description)))

View file

@ -1,5 +1,6 @@
package icu.nullptr.hidemyapplist.ui.fragment
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import androidx.activity.addCallback
@ -16,11 +17,13 @@ import androidx.preference.SwitchPreference
import by.kirich1409.viewbindingdelegate.viewBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import icu.nullptr.hidemyapplist.common.JsonConfig
import icu.nullptr.hidemyapplist.common.Presets
import icu.nullptr.hidemyapplist.service.ConfigManager
import icu.nullptr.hidemyapplist.ui.util.navController
import icu.nullptr.hidemyapplist.ui.util.setupToolbar
import icu.nullptr.hidemyapplist.ui.viewmodel.AppSettingsViewModel
import icu.nullptr.hidemyapplist.util.PackageHelper
import org.frknkrc44.hma_oss.BuildConfig
import org.frknkrc44.hma_oss.R
import org.frknkrc44.hma_oss.databinding.FragmentSettingsBinding
@ -102,12 +105,18 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) {
getString(R.string.app_template_using, pack.config.applyTemplates.size)
}
private fun updateApplyPresets() {
findPreference<Preference>("applyPresets")?.title =
getString(R.string.app_preset_using, pack.config.applyPresets.size)
}
private fun updateExtraAppList(useWhiteList: Boolean) {
findPreference<Preference>("extraAppList")?.title =
if (useWhiteList) getString(R.string.app_extra_apps_visible_count, pack.config.extraAppList.size)
else getString(R.string.app_extra_apps_invisible_count, pack.config.extraAppList.size)
}
@SuppressLint("DiscouragedApi")
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
preferenceManager.preferenceDataStore = AppPreferenceDataStore(pack)
setPreferencesFromResource(R.xml.app_settings, rootKey)
@ -120,6 +129,7 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) {
pack.config.applyTemplates.clear()
pack.config.extraAppList.clear()
updateApplyTemplates()
updateApplyPresets()
updateExtraAppList(newValue as Boolean)
true
}
@ -143,6 +153,40 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) {
.show()
true
}
findPreference<Preference>("applyPresets")?.setOnPreferenceClickListener {
val presetNames = Presets.instance.getAllPresetNames()
val presetTranslations = presetNames.map { name ->
try {
val id = resources.getIdentifier(
"preset_${name}",
"string",
BuildConfig.APPLICATION_ID
)
return@map if (id != 0) { getString(id) } else { name }
} catch (ignore: Throwable) {}
name
}
val presets = presetNames.zip(presetTranslations).toMap().toSortedMap()
val checked = presets.keys.map {
pack.config.applyPresets.contains(it)
}.toBooleanArray()
val presetValues = presets.values.toTypedArray()
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.app_choose_preset)
.setMultiChoiceItems(presetValues, checked) { _, i, value -> checked[i] = value }
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok) { _, _ ->
pack.config.applyPresets = presetValues.mapIndexedNotNullTo(mutableSetOf()) { i, name ->
if (checked[i]) presets.filterValues { v -> v == name }.keys.first() else null
}
updateApplyPresets()
}
.show()
true
}
findPreference<Preference>("extraAppList")?.setOnPreferenceClickListener {
parent.setFragmentResultListener("app_select") { _, bundle ->
pack.config.extraAppList = bundle.getStringArrayList("checked")!!.toMutableSet()
@ -158,6 +202,7 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) {
true
}
updateApplyTemplates()
updateApplyPresets()
updateExtraAppList(pack.config.useWhitelist)
}
}

View file

@ -82,12 +82,19 @@
<string name="app_enable_hide">Enable hide</string>
<string name="app_template_config">Template config</string>
<string name="app_choose_template">Choose template</string>
<string name="app_choose_preset">Choose preset</string>
<string name="app_exclude_system_apps">Exclude system apps</string>
<string name="app_exclude_system_apps_summary">Turn off this option only when really necessary. It is likely to cause crash with it disabled</string>
<string name="app_template_using">Using %d templates</string>
<string name="app_preset_using">Using %d presets</string>
<string name="app_extra_apps_visible_count">%d additional apps visible</string>
<string name="app_extra_apps_invisible_count">%d additional apps invisible</string>
<!-- Preset names -->
<string name="preset_xposed">LSPosed/Xposed modules</string>
<string name="preset_root_apps">Root managers/Rooted apps</string>
<string name="preset_custom_rom">Custom ROM apps</string>
<!-- Logs -->
<string name="logs_save">Save logs</string>
<string name="logs_clear">Clear logs</string>

View file

@ -34,6 +34,10 @@
android:icon="@drawable/outline_assignment_24"
android:key="applyTemplates"
tools:title="@string/app_template_using" />
<Preference
android:icon="@drawable/outline_assignment_24"
android:key="applyPresets"
tools:title="@string/app_preset_using" />
<Preference
android:icon="@drawable/baseline_apps_24"
android:key="extraAppList"

View file

@ -36,8 +36,8 @@ val targetSdkVer by extra(36)
val appVerCode = gitCommitCount + 0x6f7373
val appVerName by extra("3.3.1-oss-${gitCommitCountAfterOss}${gitHasUncommittedSuffix}")
val configVerCode by extra(90)
val serviceVerCode by extra(97)
val configVerCode by extra(91)
val serviceVerCode by extra(98)
val minBackupVerCode by extra(65)
val androidSourceCompatibility = JavaVersion.VERSION_21

View file

@ -32,6 +32,7 @@ data class JsonConfig(
var useWhitelist: Boolean = false,
var excludeSystemApps: Boolean = true,
var applyTemplates: MutableSet<String> = mutableSetOf(),
var applyPresets: MutableSet<String> = mutableSetOf(),
var extraAppList: MutableSet<String> = mutableSetOf()
) {
override fun toString() = encoder.encodeToString(this)

View file

@ -0,0 +1,58 @@
package icu.nullptr.hidemyapplist.common
import android.content.pm.IPackageManager
import android.content.pm.PackageManager
import icu.nullptr.hidemyapplist.common.Utils.getInstalledApplicationsCompat
import icu.nullptr.hidemyapplist.common.presets.BasePreset
import icu.nullptr.hidemyapplist.common.presets.CustomROMPreset
import icu.nullptr.hidemyapplist.common.presets.RootAppsPreset
import icu.nullptr.hidemyapplist.common.presets.XposedModulesPreset
// TODO: Update presets when package added/removed
class Presets private constructor() {
val presetList = mutableListOf<BasePreset>()
var loggerFunction: ((String) -> Unit)? = null
companion object {
private var hiddenInstance: Presets? = null
val instance: Presets
get() {
if (hiddenInstance == null) {
hiddenInstance = Presets()
}
return hiddenInstance!!
}
}
fun getAllPresetNames() = presetList.map { it.name }.toTypedArray()
// fun filterPresetsByName(names: Array<String>) = presetList.filter { names.contains(it.name) }
fun getPresetByName(name: String) = presetList.firstOrNull { it.name == name }
fun reloadPresetsIfEmpty(pms: IPackageManager) {
presetList.forEach {
if (it.packageNames.isEmpty()) {
it.onAddExactPackages()
for (appInfo in getInstalledApplicationsCompat(pms, PackageManager.GET_META_DATA.toLong(), 0)) {
runCatching {
it.onReloadPreset(appInfo)
}.onFailure { fail ->
loggerFunction?.invoke(fail.toString())
}
}
}
loggerFunction?.invoke("Package list for ${it.name}: ${it.packageNames}")
}
}
init {
presetList.add(CustomROMPreset())
presetList.add(RootAppsPreset())
presetList.add(XposedModulesPreset())
}
}

View file

@ -0,0 +1,79 @@
package icu.nullptr.hidemyapplist.common
import android.content.pm.ApplicationInfo
import android.content.pm.IPackageManager
import android.content.pm.PackageInfo
import android.os.Binder
import android.os.Build
import java.util.Random
object Utils {
fun generateRandomString(length: Int): String {
val leftLimit = 97 // letter 'a'
val rightLimit = 122 // letter 'z'
val random = Random()
val buffer = StringBuilder(length)
for (i in 0 until length) {
val randomLimitedInt = leftLimit + (random.nextFloat() * (rightLimit - leftLimit + 1)).toInt()
buffer.append(randomLimitedInt.toChar())
}
return buffer.toString()
}
fun verifyAppSignature(path: String): Boolean {
/*
val verifier = ApkVerifier.Builder(File(path))
.setMinCheckedPlatformVersion(24)
.build()
val result = verifier.verify()
if (!result.isVerified) return false
val mainCert = result.signerCertificates[0]
return mainCert.encoded.contentEquals(Magic.magicNumbers)
*/
return true
}
fun <T> binderLocalScope(block: () -> T): T {
val identity = Binder.clearCallingIdentity()
val result = block()
Binder.restoreCallingIdentity(identity)
return result
}
fun getInstalledApplicationsCompat(pms: IPackageManager, flags: Long, userId: Int): List<ApplicationInfo> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
pms.getInstalledApplications(flags, userId)
} else {
pms.getInstalledApplications(flags.toInt(), userId)
}.list
}
fun getPackageUidCompat(pms: IPackageManager, packageName: String, flags: Long, userId: Int): Int {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
pms.getPackageUid(packageName, flags, userId)
} else {
pms.getPackageUid(packageName, flags.toInt(), userId)
}
}
fun getPackageInfoCompat(pms: IPackageManager, packageName: String, flags: Long, userId: Int): PackageInfo {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
pms.getPackageInfo(packageName, flags, userId)
} else {
pms.getPackageInfo(packageName, flags.toInt(), userId)
}
}
fun startsWithMultiple(source: String, vararg targets: String): Boolean {
assert(source.isNotEmpty() && targets.isNotEmpty())
for (target in targets) {
if (source.startsWith(target)) {
return true
}
}
return false
}
}

View file

@ -0,0 +1,11 @@
package icu.nullptr.hidemyapplist.common.presets
import android.content.pm.ApplicationInfo
abstract class BasePreset(val name: String) {
val packageNames = mutableSetOf<String>()
abstract fun onAddExactPackages()
abstract fun onReloadPreset(appInfo: ApplicationInfo)
}

View file

@ -0,0 +1,34 @@
package icu.nullptr.hidemyapplist.common.presets
import android.content.pm.ApplicationInfo
import icu.nullptr.hidemyapplist.common.Utils
class CustomROMPreset() : BasePreset("custom_rom") {
override fun onAddExactPackages() {}
override fun onReloadPreset(appInfo: ApplicationInfo) {
val packageName = appInfo.packageName
// LineageOS apps
if (Utils.startsWithMultiple(packageName, "lineageos.", "org.lineageos.")) {
packageNames.add(packageName)
}
// AOSPA
if (packageName.startsWith("co.aospa.")) {
packageNames.add(packageName)
}
// OmniROM
if (packageName.startsWith("org.omnirom.")) {
packageNames.add(packageName)
}
// ProtonAOSP
if (packageName.startsWith("org.protonaosp.")) {
packageNames.add(packageName)
}
// TODO: Add more custom ROM apps
}
}

View file

@ -0,0 +1,95 @@
package icu.nullptr.hidemyapplist.common.presets
import android.content.pm.ApplicationInfo
class RootAppsPreset() : BasePreset("root_apps") {
override fun onAddExactPackages() {
// root managers
packageNames += arrayOf(
"me.weishu.kernelsu",
"com.rifsxd.ksunext",
"com.sukisu.ultra",
)
// rooted apps
packageNames += arrayOf(
"io.github.a13e300.ksuwebui",
"io.github.muntashirakon.AppManager",
"com.fox2code.mmm",
"xzr.hkf",
"com.speedsoftware.rootexplorer",
"id.kuato.diskhealth",
"com.sunilpaulmathew.debloater",
"com.garyodernichts.downgrader",
"eu.roggstar.getmitokens",
"io.github.domi04151309.powerapp",
"eu.roggstar.luigithehunter.batterycalibrate",
"at.or.at.plugoffairplane",
"tk.giesecke.phoenix",
"com.corphish.nightlight.generic",
"com.zinaro.cachecleanerwidget",
"de.buttercookie.simbadroid",
"simple.reboot.com",
"ru.evgeniy.dpitunnel",
"me.zhanghai.android.files",
"ca.mudar.fairphone.peaceofmind",
"com.gitlab.giwiniswut.rwremount",
"com.machiav3lli.backup",
"com.bartixxx.opflashcontrol",
"dev.ukanth.ufirewall",
"org.nuntius35.wrongpinshutdown",
"ru.nsu.bobrofon.easysshfs",
"x1125io.initdlight",
)
// kernel managers
packageNames += arrayOf(
"flar2.exkernelmanager",
"com.franco.kernel",
"com.lybxlpsv.kernelmanager",
"com.html6405.boefflakernelconfig",
"ccc71.st.cpu",
)
// TODO: Add more rooted apps and other root managers
}
override fun onReloadPreset(appInfo: ApplicationInfo) {
val packageName = appInfo.packageName
// Iconify
if (packageName.startsWith("com.drdisagree.iconify")) {
packageNames.add(packageName)
}
// MMRL
if (packageName.startsWith("com.dergoogler.mmrl")) {
packageNames.add(packageName)
}
// Magisk
if (packageName.endsWith(".magisk")) {
packageNames.add(packageName)
}
// APatch
if (packageName.contains(".apatch.") || packageName.endsWith(".apatch")) {
packageNames.add(packageName)
}
// DataBackup
if (packageName.contains("com.xayah.databackup")) {
packageNames.add(packageName)
}
// SmartPack Kernel Manager + Busybox Installer
if (packageName.startsWith("com.smartpack.")) {
packageNames.add(packageName)
}
// F-Droid Privileged
if (packageName.startsWith("org.fdroid.fdroid.privileged")) {
packageNames.add(packageName)
}
}
}

View file

@ -0,0 +1,26 @@
package icu.nullptr.hidemyapplist.common.presets
import android.content.pm.ApplicationInfo
import java.util.zip.ZipFile
class XposedModulesPreset() : BasePreset("xposed") {
override fun onAddExactPackages() {}
override fun onReloadPreset(appInfo: ApplicationInfo) {
ZipFile(appInfo.sourceDir).use { zipFile ->
val manifestFile = zipFile.getInputStream(
zipFile.getEntry("AndroidManifest.xml"))
val manifestBytes = manifestFile.use { it.readBytes() }
val manifestStr = String(manifestBytes, Charsets.US_ASCII)
// Checking with binary because the Android system sucks
if (manifestStr.contains("\u0000x\u0000p\u0000o\u0000s\u0000e\u0000d\u0000m\u0000o\u0000d\u0000u\u0000l\u0000e")) {
packageNames.add(appInfo.packageName)
} else {
if (zipFile.getEntry("META-INF/xposed")?.isDirectory ?: false) {
packageNames.add(appInfo.packageName)
}
}
}
}
}

View file

@ -6,6 +6,8 @@ import android.os.Build
import icu.nullptr.hidemyapplist.common.Constants
import icu.nullptr.hidemyapplist.common.IHMAService
import icu.nullptr.hidemyapplist.common.JsonConfig
import icu.nullptr.hidemyapplist.common.Presets
import icu.nullptr.hidemyapplist.common.Utils
import icu.nullptr.hidemyapplist.xposed.hook.ActivityHook
import icu.nullptr.hidemyapplist.xposed.hook.IFrameworkHook
import icu.nullptr.hidemyapplist.xposed.hook.PlatformCompatHook
@ -58,6 +60,8 @@ class HMAService(val pms: IPackageManager) : IHMAService.Stub() {
instance = this
loadConfig()
installHooks()
Presets.instance.loggerFunction = { logD(TAG, it) }
Presets.instance.reloadPresetsIfEmpty(pms)
logI(TAG, "HMA service initialized")
}
@ -166,6 +170,13 @@ class HMAService(val pms: IPackageManager) : IHMAService.Stub() {
if (query in tpl.appList) return !appConfig.useWhitelist
}
for (presetName in appConfig.applyPresets) {
val preset = Presets.instance.getPresetByName(presetName) ?: continue
if (query in preset.packageNames)
return !appConfig.useWhitelist
}
return appConfig.useWhitelist
}

View file

@ -7,6 +7,7 @@ import android.os.Build
import android.os.Bundle
import android.os.ServiceManager
import icu.nullptr.hidemyapplist.common.Constants
import icu.nullptr.hidemyapplist.common.Utils
import org.frknkrc44.hma_oss.common.BuildConfig
import rikka.hidden.compat.ActivityManagerApis
import rikka.hidden.compat.adapter.UidObserverAdapter
@ -38,10 +39,8 @@ object UserService {
provider.call(attr, Constants.PROVIDER_AUTHORITY, "", null, extras)
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R) {
provider.call("android", null, Constants.PROVIDER_AUTHORITY, "", null, extras)
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
provider.call("android", Constants.PROVIDER_AUTHORITY, "", null, extras)
} else {
provider.call("android", "", null, extras)
provider.call("android", Constants.PROVIDER_AUTHORITY, "", null, extras)
}
if (reply == null) {
logE(TAG, "Failed to send binder to app")

View file

@ -0,0 +1,16 @@
package icu.nullptr.hidemyapplist.xposed
import android.os.Build
import com.github.kyuubiran.ezxhelper.utils.findField
class Utils4Xposed {
companion object {
fun getPackageNameFromPackageSettings(packageSettings: Any): String? {
return runCatching {
findField(packageSettings::class.java, true) {
name == if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) "mName" else "name"
}.get(packageSettings) as? String
}.getOrNull()
}
}
}

View file

@ -7,8 +7,8 @@ import com.github.kyuubiran.ezxhelper.utils.findMethod
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import de.robv.android.xposed.XC_MethodHook
import icu.nullptr.hidemyapplist.common.CommonUtils
import icu.nullptr.hidemyapplist.common.Utils
import icu.nullptr.hidemyapplist.xposed.HMAService
import icu.nullptr.hidemyapplist.xposed.Utils
import icu.nullptr.hidemyapplist.xposed.logE
import icu.nullptr.hidemyapplist.xposed.logI

View file

@ -6,8 +6,9 @@ import com.github.kyuubiran.ezxhelper.utils.hookAfter
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import de.robv.android.xposed.XC_MethodHook
import icu.nullptr.hidemyapplist.common.Constants
import icu.nullptr.hidemyapplist.common.Utils
import icu.nullptr.hidemyapplist.xposed.HMAService
import icu.nullptr.hidemyapplist.xposed.Utils
import icu.nullptr.hidemyapplist.xposed.Utils4Xposed
import icu.nullptr.hidemyapplist.xposed.logD
import icu.nullptr.hidemyapplist.xposed.logE
import icu.nullptr.hidemyapplist.xposed.logI
@ -35,7 +36,7 @@ class PmsHookTarget28(private val service: HMAService) : IFrameworkHook {
service.pms.getPackagesForUid(callingUid)
} ?: return@hookBefore
val packageSettings = param.args[0] ?: return@hookBefore
val targetApp = Utils.getPackageNameFromPackageSettings(packageSettings)
val targetApp = Utils4Xposed.getPackageNameFromPackageSettings(packageSettings)
for (caller in callingApps) {
if (service.shouldHide(caller, targetApp)) {
param.result = true

View file

@ -6,8 +6,9 @@ import com.github.kyuubiran.ezxhelper.utils.findMethod
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import de.robv.android.xposed.XC_MethodHook
import icu.nullptr.hidemyapplist.common.Constants
import icu.nullptr.hidemyapplist.common.Utils
import icu.nullptr.hidemyapplist.xposed.HMAService
import icu.nullptr.hidemyapplist.xposed.Utils
import icu.nullptr.hidemyapplist.xposed.Utils4Xposed
import icu.nullptr.hidemyapplist.xposed.logD
import icu.nullptr.hidemyapplist.xposed.logE
import icu.nullptr.hidemyapplist.xposed.logI
@ -34,7 +35,7 @@ class PmsHookTarget30(private val service: HMAService) : IFrameworkHook {
val callingApps = Utils.binderLocalScope {
service.pms.getPackagesForUid(callingUid)
} ?: return@hookBefore
val targetApp = Utils.getPackageNameFromPackageSettings(param.args[2])
val targetApp = Utils4Xposed.getPackageNameFromPackageSettings(param.args[2])
for (caller in callingApps) {
if (service.shouldHide(caller, targetApp)) {
param.result = true

View file

@ -6,8 +6,9 @@ import com.github.kyuubiran.ezxhelper.utils.findMethod
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import de.robv.android.xposed.XC_MethodHook
import icu.nullptr.hidemyapplist.common.Constants
import icu.nullptr.hidemyapplist.common.Utils
import icu.nullptr.hidemyapplist.xposed.HMAService
import icu.nullptr.hidemyapplist.xposed.Utils
import icu.nullptr.hidemyapplist.xposed.Utils4Xposed
import icu.nullptr.hidemyapplist.xposed.logD
import icu.nullptr.hidemyapplist.xposed.logE
import icu.nullptr.hidemyapplist.xposed.logI
@ -42,7 +43,7 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook {
val callingApps = Utils.binderLocalScope {
getPackagesForUidMethod.invoke(snapshot, callingUid) as Array<String>?
} ?: return@hookBefore
val targetApp = Utils.getPackageNameFromPackageSettings(param.args[3]) // PackageSettings <- PackageStateInternal
val targetApp = Utils4Xposed.getPackageNameFromPackageSettings(param.args[3]) // PackageSettings <- PackageStateInternal
for (caller in callingApps) {
if (service.shouldHide(caller, targetApp)) {
param.result = true

View file

@ -8,8 +8,9 @@ import com.github.kyuubiran.ezxhelper.utils.findMethodOrNull
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import de.robv.android.xposed.XC_MethodHook
import icu.nullptr.hidemyapplist.common.Constants
import icu.nullptr.hidemyapplist.common.Utils
import icu.nullptr.hidemyapplist.xposed.HMAService
import icu.nullptr.hidemyapplist.xposed.Utils
import icu.nullptr.hidemyapplist.xposed.Utils4Xposed
import icu.nullptr.hidemyapplist.xposed.logD
import icu.nullptr.hidemyapplist.xposed.logE
import icu.nullptr.hidemyapplist.xposed.logI
@ -45,7 +46,7 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook {
val callingApps = Utils.binderLocalScope {
getPackagesForUidMethod.invoke(snapshot, callingUid) as Array<String>?
} ?: return@hookBefore
val targetApp = Utils.getPackageNameFromPackageSettings(param.args[3]) // PackageSettings <- PackageStateInternal
val targetApp = Utils4Xposed.getPackageNameFromPackageSettings(param.args[3]) // PackageSettings <- PackageStateInternal
for (caller in callingApps) {
if (service.shouldHide(caller, targetApp)) {
param.result = true