Add "preset" option for apps (WIP)
This commit is contained in:
parent
a8df39382c
commit
e9ecd86816
20 changed files with 340 additions and 29 deletions
|
|
@ -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)))
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue