Compare commits
14 changed files with 27 additions and 470 deletions
|
|
@ -102,20 +102,6 @@ object ConfigManager {
|
|||
saveConfig()
|
||||
}
|
||||
|
||||
var altAppDataIsolation: Boolean
|
||||
get() = config.altAppDataIsolation
|
||||
set(value) {
|
||||
config.altAppDataIsolation = value
|
||||
saveConfig()
|
||||
}
|
||||
|
||||
var altVoldAppDataIsolation: Boolean
|
||||
get() = config.altVoldAppDataIsolation
|
||||
set(value) {
|
||||
config.altVoldAppDataIsolation = value
|
||||
saveConfig()
|
||||
}
|
||||
|
||||
var skipSystemAppDataIsolation: Boolean
|
||||
get() = config.skipSystemAppDataIsolation
|
||||
set(value) {
|
||||
|
|
|
|||
|
|
@ -230,9 +230,6 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) {
|
|||
R.string.app_force_stop_warning, Toast.LENGTH_LONG).show()
|
||||
true
|
||||
}
|
||||
findPreference<SwitchPreferenceCompat>("excludeVoldIsolation")?.let {
|
||||
it.isEnabled = ConfigManager.altVoldAppDataIsolation
|
||||
}
|
||||
findPreference<SwitchPreferenceCompat>("invertActivityLaunchProtection")?.let {
|
||||
it.summary = getString(R.string.app_invert_activity_launch_protection_desc) + "\n\n" +
|
||||
getString(R.string.app_global_activity_launch_protection_state,
|
||||
|
|
|
|||
|
|
@ -109,8 +109,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
|
|||
"detailLog" -> ConfigManager.detailLog
|
||||
"hideIcon" -> PrefManager.hideIcon
|
||||
"bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning
|
||||
"appDataIsolation" -> ConfigManager.altAppDataIsolation
|
||||
"voldAppDataIsolation" -> ConfigManager.altVoldAppDataIsolation
|
||||
"skipSystemAppDataIsolation" -> ConfigManager.skipSystemAppDataIsolation
|
||||
"disableActivityLaunchProtection" -> ConfigManager.disableActivityLaunchProtection
|
||||
"forceMountData" -> ConfigManager.forceMountData
|
||||
|
|
@ -146,9 +144,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
|
|||
"hideIcon" -> PrefManager.hideIcon = value
|
||||
"bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning = value
|
||||
"disableActivityLaunchProtection" -> ConfigManager.disableActivityLaunchProtection = value
|
||||
"appDataIsolation" -> ConfigManager.altAppDataIsolation = value
|
||||
"voldAppDataIsolation" -> ConfigManager.altVoldAppDataIsolation = value
|
||||
"skipSystemAppDataIsolation" -> ConfigManager.skipSystemAppDataIsolation = value
|
||||
"packageQueryWorkaround" -> ConfigManager.packageQueryWorkaround = value
|
||||
else -> throw IllegalArgumentException("Invalid key: $key")
|
||||
}
|
||||
|
|
@ -172,64 +167,9 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
|
|||
}
|
||||
}
|
||||
|
||||
class DataIsolationPreferenceFragment : PreferenceFragmentCompat() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
preferenceManager.preferenceDataStore = SettingsPreferenceDataStore()
|
||||
setPreferencesFromResource(R.xml.settings_data_isolation, rootKey)
|
||||
|
||||
findPreference<SwitchPreferenceCompat>("appDataIsolation")?.let {
|
||||
it.summary = getString(R.string.settings_need_reboot) + "\n\n" +
|
||||
getString(
|
||||
R.string.settings_default_value,
|
||||
PropertyUtils.isAppDataIsolationEnabled.enabledString(resources)
|
||||
)
|
||||
}
|
||||
|
||||
findPreference<SwitchPreferenceCompat>("voldAppDataIsolation")?.let {
|
||||
it.summary = getString(R.string.settings_need_reboot) + "\n\n" +
|
||||
getString(
|
||||
R.string.settings_default_value,
|
||||
PropertyUtils.isVoldAppDataIsolationEnabled.enabledString(resources)
|
||||
)
|
||||
|
||||
it.setOnPreferenceChangeListener { _, newValue ->
|
||||
val enabled = newValue as Boolean
|
||||
if (enabled) {
|
||||
MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(R.string.settings_warning)
|
||||
.setMessage(R.string.settings_vold_warning)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
it.isChecked = true
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||
it.isChecked = false
|
||||
}
|
||||
.setCancelable(false)
|
||||
.show()
|
||||
}
|
||||
!enabled
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SettingsPreferenceFragment : PreferenceFragmentCompat() {
|
||||
private fun configureDataIsolation() {
|
||||
findPreference<Preference>("dataIsolation")?.let {
|
||||
it.isEnabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
|
||||
it.summary = when {
|
||||
it.isEnabled -> getString(
|
||||
R.string.settings_data_isolation_summary,
|
||||
if (ConfigManager.altAppDataIsolation) getString(R.string.settings_overwritten)
|
||||
else PropertyUtils.isAppDataIsolationEnabled.enabledString(resources),
|
||||
if (ConfigManager.altVoldAppDataIsolation) getString(R.string.settings_overwritten)
|
||||
else PropertyUtils.isVoldAppDataIsolationEnabled.enabledString(resources),
|
||||
ConfigManager.forceMountData.enabledString(resources)
|
||||
)
|
||||
else -> getString(R.string.settings_data_isolation_unsupported)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("deprecation")
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
|
|
@ -365,8 +305,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
|
|||
}
|
||||
}
|
||||
|
||||
configureDataIsolation()
|
||||
|
||||
findPreference<Preference>("stopSystemService")?.setOnPreferenceClickListener {
|
||||
if (ServiceClient.serviceVersion != 0) {
|
||||
MaterialAlertDialogBuilder(requireContext())
|
||||
|
|
@ -403,7 +341,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
|
|||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
configureDataIsolation()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@
|
|||
<string name="template_apps_visible_count">%d ứng dụng không ẩn</string>
|
||||
<string name="template_apps_invisible_count">%d Ứng dụng bị ẩn</string>
|
||||
<!-- App settings -->
|
||||
<string name="app_enable_hide">Bật ẩn</string>
|
||||
<string name="app_enable_hide">Bật vô hình</string>
|
||||
<string name="app_template_config">Mục tùy chỉnh</string>
|
||||
<string name="app_choose_template">Chọn mục</string>
|
||||
<string name="app_choose_preset">Chọn thiết lập trước</string>
|
||||
|
|
@ -95,13 +95,13 @@
|
|||
<string name="app_extra_apps_invisible_count">%d Ứng dụng bổ sung được ẩn</string>
|
||||
<string name="app_warning_risky_package_title">Gói rủi ro</string>
|
||||
<string name="app_warning_risky_package_desc">Gói này được đánh dấu là rủi ro và bạn có thể gây ra lỗi cho các ứng dụng được ẩn. Bạn có muốn tiếp tục không?</string>
|
||||
<string name="app_spoof">Giả lập</string>
|
||||
<string name="app_hide_installation_source">Giả lập các nguồn cài đặt</string>
|
||||
<string name="app_hide_installation_source_desc">Tất cả các ứng dụng của người dùng sẽ bị giả lập là đã cài đặt trên Play Store cho ứng dụng này</string>
|
||||
<string name="app_hide_installation_source_system">Giả lập luôn cho các ứng dụng hệ thống</string>
|
||||
<string name="app_hide_installation_source_system_desc">Tất cả các ứng dụng hệ thống sẽ được giả lập là đã cài đặt từ Play Store cho ứng dụng này</string>
|
||||
<string name="app_spoof">Bịp</string>
|
||||
<string name="app_hide_installation_source">Bịp nguồn cài</string>
|
||||
<string name="app_hide_installation_source_desc">Tất cả các ứng dụng của người dùng sẽ bị bịp là đã cài đặt trên Google Play cho ứng dụng này</string>
|
||||
<string name="app_hide_installation_source_system">Bịp luôn cho các ứng dụng hệ thống</string>
|
||||
<string name="app_hide_installation_source_system_desc">Tất cả các ứng dụng hệ thống sẽ được bịp là đã cài đặt từ Google Play cho ứng dụng này</string>
|
||||
<string name="app_exclude_target_installation_source">Loại trừ ứng dụng mục tiêu(đang thiết lập)</string>
|
||||
<string name="app_exclude_target_installation_source_desc">Bạn có thể bật nó nếu ứng dụng này không có sẵn trên Play Store</string>
|
||||
<string name="app_exclude_target_installation_source_desc">Bạn có thể bật nếu ứng dụng này không có sẵn trên Google Play</string>
|
||||
<string name="app_force_stop_warning">Đừng quên buộc dừng ứng dụng mục tiêu sau khi lưu cấu hình</string>
|
||||
<string name="app_invert_activity_launch_protection">Đảo ngược lựa chọn Tắt bảo vệ khởi chạy hoạt động</string>
|
||||
<string name="app_invert_activity_launch_protection_desc">Tùy chọn này sẽ đảo ngược lựa chọn \"Tắt bảo vệ khởi chạy hoạt động\" trong Cài đặt.</string>
|
||||
|
|
@ -114,12 +114,12 @@
|
|||
<string name="title_settings_preset">Cài đặt mẫu</string>
|
||||
<string name="title_preset_manage">Hiển thị các cài đặt trước</string>
|
||||
<string name="preset_xposed">Các mô-đun LSPosed/Xposed</string>
|
||||
<string name="preset_root_apps">Ứng dụng quản lý Root/Ứng dụng được cấp Root</string>
|
||||
<string name="preset_custom_rom">Ứng dụng ROM tùy biến</string>
|
||||
<string name="preset_sus_apps">Ứng dụng đáng ngờ</string>
|
||||
<string name="preset_detector_apps">ỨD phát hiện/KT Root</string>
|
||||
<string name="preset_shizuku_dhizuku">Shizuku/Dhizuku ứng dụng</string>
|
||||
<string name="preset_webview">Các ứng dụng WebView</string>
|
||||
<string name="preset_root_apps">App Root</string>
|
||||
<string name="preset_custom_rom">App ROM Custom</string>
|
||||
<string name="preset_sus_apps">App linh tinh</string>
|
||||
<string name="preset_detector_apps">App phát hiện / check Root</string>
|
||||
<string name="preset_shizuku_dhizuku">App Shizuku/Dhizuku</string>
|
||||
<string name="preset_webview">App WebView</string>
|
||||
|
||||
<!-- Settings preset names -->
|
||||
<string name="settings_preset_accessibility">Trợ năng</string>
|
||||
|
|
@ -155,9 +155,9 @@
|
|||
<string name="settings_permission_denied">Quyền bị từ chối</string>
|
||||
<string name="settings_force_mount_data">Thực thi cách ly dữ liệu cho tất cả các ứng dụng</string>
|
||||
<string name="settings_force_mount_data_summary">Tính năng cô lập dữ liệu bị vô hiệu hóa đối với các ứng dụng mục tiêu có API thấp hơn 30 theo mặc định</string>
|
||||
<string name="settings_detail_log">Nhật ký chi tiết gỡ lỗi</string>
|
||||
<string name="settings_detail_log">Log debug chi tiết</string>
|
||||
<string name="settings_max_log_size">Kích cỡ bộ đệm nhật ký</string>
|
||||
<string name="settings_hide_icon">Ẩn mô đun trong Trình khởi chạy</string>
|
||||
<string name="settings_hide_icon">Ẩn mô đun trong launcher</string>
|
||||
<string name="settings_hide_icon_summary">Bạn vẫn có thể mở ứng dụng trong Xposed</string>
|
||||
<string name="settings_bypass_risky_package_warning">Bỏ qua cảnh báo gói rủi ro</string>
|
||||
<string name="settings_bypass_risky_package_warning_summary">Lưu ý rằng nhà phát triển không chịu trách nhiệm về các vấn đề liên quan đến gói rủi ro trước hoặc sau khi bạn bật tính năng này</string>
|
||||
|
|
@ -169,7 +169,7 @@
|
|||
<string name="settings_no_undone_warning">Thao tác không thể hoàn tác.</string>
|
||||
<string name="settings_package_query_workaround">Tìm gói cài đặt thay thế</string>
|
||||
<string name="settings_package_query_workaround_summary">Đừng bật lựa chọn này nếu bạn thấy danh sách tên gói ứng dụng trong ứng dụng này đúng cách.</string>
|
||||
<string name="settings_launcher_icon">Biểu tượng khởi động</string>
|
||||
<string name="settings_launcher_icon">Biểu tượng app</string>
|
||||
<string name="settings_language">Ngôn ngữ</string>
|
||||
<string name="settings_translate">Giúp chúng tôi dịch</string>
|
||||
<string name="settings_translate_summary">Giúp chúng tôi dịch %s sang ngôn ngữ của bạn</string>
|
||||
|
|
|
|||
|
|
@ -216,9 +216,10 @@
|
|||
<string name="about_fork_description">
|
||||
The original HMA project has become closed-source and their latest code didn\'t contain some of the latest changes, so I created this fork to continue it as open-source again.
|
||||
</string>
|
||||
<string name="about_how_to_use_title">How to use this module</string>
|
||||
<string name="about_how_to_use_title">How to use HMAL-OSS / MBCP usages</string>
|
||||
<string name="about_how_to_use_description_1">
|
||||
You can create templates in \"Manage templates\".\nThen apply the templates to apps in \"Manage apps\". (You can also select extra apps for targets.)\nYou should and ONLY should check \"System Framework\" in Xposed module scope / whitelist.
|
||||
For MBCP/MBBank app : \nGo to Manage apps -> find for MBCP app, which is [MB Bank] -> [Template config] -> [Using %s presets] -> [Root managers/Rooted apps] -> OK. \nThen try to open MB/MBCP app again.\n
|
||||
For others: \nYou can create templates in \"Manage templates\".\nThen apply the templates to apps in \"Manage apps\". (You can also select extra apps for targets.)\nYou should and ONLY should check \"System Framework\" in Xposed module scope / whitelist.
|
||||
</string>
|
||||
<string name="about_how_to_use_description_2">
|
||||
Config modification effective in real time.
|
||||
|
|
|
|||
|
|
@ -80,12 +80,4 @@
|
|||
android:title="@string/app_exclude_target_installation_source" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:dependency="enableHide"
|
||||
android:title="@string/settings_vold_app_data_isolation">
|
||||
<SwitchPreferenceCompat
|
||||
android:icon="@drawable/baseline_call_split_24"
|
||||
android:key="excludeVoldIsolation"
|
||||
android:title="@string/app_exclude_target_installation_source" />
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
|
|
|||
|
|
@ -68,11 +68,6 @@
|
|||
android:key="disableActivityLaunchProtection"
|
||||
android:title="@string/settings_disable_activity_launch_protection"
|
||||
android:summary="@string/settings_disable_activity_launch_protection_summary" />
|
||||
<Preference
|
||||
android:icon="@drawable/outline_storage_24"
|
||||
android:key="dataIsolation"
|
||||
android:title="@string/settings_data_isolation"
|
||||
app:fragment="icu.nullptr.hidemyapplist.ui.fragment.SettingsFragment$DataIsolationPreferenceFragment" />
|
||||
<SwitchPreferenceCompat
|
||||
android:icon="@drawable/outline_bug_report_24"
|
||||
android:key="detailLog"
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<PreferenceCategory android:title="@string/settings_overwrite">
|
||||
<SwitchPreferenceCompat
|
||||
android:icon="@drawable/ic_outline_layers_24"
|
||||
android:key="appDataIsolation"
|
||||
android:title="@string/settings_app_data_isolation" />
|
||||
<SwitchPreferenceCompat
|
||||
android:icon="@drawable/outline_sd_storage_24"
|
||||
android:key="voldAppDataIsolation"
|
||||
android:title="@string/settings_vold_app_data_isolation" />
|
||||
<Preference
|
||||
android:key="info"
|
||||
android:icon="@drawable/outline_info_24"
|
||||
android:summary="@string/settings_overwrite_summary" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="@string/settings_vold_app_data_isolation"
|
||||
android:dependency="voldAppDataIsolation">
|
||||
|
||||
<SwitchPreferenceCompat
|
||||
android:key="skipSystemAppDataIsolation"
|
||||
android:summary="@string/settings_need_reboot"
|
||||
android:title="@string/app_exclude_system_apps" />
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:title="@string/settings_module">
|
||||
<SwitchPreferenceCompat
|
||||
android:icon="@drawable/outline_storage_24"
|
||||
android:key="forceMountData"
|
||||
android:summary="@string/settings_force_mount_data_summary"
|
||||
android:title="@string/settings_force_mount_data" />
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
|
@ -9,7 +9,6 @@ import icu.nullptr.hidemyapplist.common.Utils.getInstalledApplicationsCompat
|
|||
import icu.nullptr.hidemyapplist.common.Utils.getPackageInfoCompat
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.BasePreset
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.CustomROMPreset
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.DetectorAppsPreset
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.RootAppsPreset
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.SDhizukuAppsPreset
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.SuspiciousAppsPreset
|
||||
|
|
@ -139,7 +138,6 @@ class AppPresets private constructor() {
|
|||
presetList.add(XposedModulesPreset())
|
||||
presetList.add(SuspiciousAppsPreset())
|
||||
presetList.add(SDhizukuAppsPreset())
|
||||
presetList.add(DetectorAppsPreset())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ data class JsonConfig(
|
|||
var forceMountData: Boolean = true,
|
||||
var disableActivityLaunchProtection: Boolean = false,
|
||||
var altAppDataIsolation: Boolean = false,
|
||||
var altVoldAppDataIsolation: Boolean = false,
|
||||
var skipSystemAppDataIsolation: Boolean = true,
|
||||
var packageQueryWorkaround: Boolean = false,
|
||||
val templates: MutableMap<String, Template> = mutableMapOf(),
|
||||
|
|
|
|||
|
|
@ -1,63 +0,0 @@
|
|||
package icu.nullptr.hidemyapplist.common.app_presets
|
||||
|
||||
import android.content.pm.ApplicationInfo
|
||||
|
||||
class DetectorAppsPreset : BasePreset(NAME) {
|
||||
companion object {
|
||||
const val NAME = "detector_apps"
|
||||
}
|
||||
|
||||
override val exactPackageNames = setOf(
|
||||
// Detector apps
|
||||
"com.reveny.nativecheck",
|
||||
"icu.nullptr.nativetest",
|
||||
"io.github.rabehx.securify",
|
||||
"com.zhenxi.hunter",
|
||||
"io.github.vvb2060.mahoshojo",
|
||||
"io.github.huskydg.memorydetector",
|
||||
"org.akanework.checker",
|
||||
"icu.nullptr.applistdetector",
|
||||
"com.byxiaorun.detector",
|
||||
"com.kimchangyoun.rootbeerFresh.sample",
|
||||
"com.androidfung.drminfo",
|
||||
"com.kikyps.crackme",
|
||||
"org.matrix.demo",
|
||||
"com.rem01gaming.disclosure",
|
||||
"luna.safe.luna",
|
||||
"com.AndroLua",
|
||||
"com.detect.mt",
|
||||
"io.liankong.riskdetector",
|
||||
"com.suisho.rc",
|
||||
"com.ahmed.security_tester",
|
||||
"id.my.pjm.qbcd_okr_dvii",
|
||||
"wu.Zygisk.Detector",
|
||||
"com.atominvention.rootchecker",
|
||||
"com.joeykrim.rootcheck",
|
||||
|
||||
// Play Integrity checkers
|
||||
"krypton.tbsafetychecker",
|
||||
"gr.nikolasspyr.integritycheck",
|
||||
"com.henrikherzig.playintegritychecker",
|
||||
"com.thend.integritychecker",
|
||||
"com.flinkapps.safteynet",
|
||||
|
||||
// Other checkers
|
||||
"com.bryancandi.knoxcheck",
|
||||
)
|
||||
|
||||
override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean {
|
||||
val packageName = appInfo.packageName
|
||||
|
||||
// All Garfield packages
|
||||
if (packageName.startsWith("me.garfieldhan.")) {
|
||||
return true
|
||||
}
|
||||
|
||||
// Key attestation apps
|
||||
if (packageName.endsWith(".keyattestation")) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
|
@ -11,6 +11,7 @@ class RootAppsPreset : BasePreset(NAME) {
|
|||
|
||||
override val exactPackageNames = setOf(
|
||||
// rooted apps
|
||||
"io.github.huskydg.magisk",
|
||||
"io.github.a13e300.ksuwebui",
|
||||
"com.fox2code.mmm",
|
||||
"id.kuato.diskhealth",
|
||||
|
|
@ -74,11 +75,6 @@ class RootAppsPreset : BasePreset(NAME) {
|
|||
override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean {
|
||||
val packageName = appInfo.packageName
|
||||
|
||||
// All libxzr apps (konabess, hkf, ...)
|
||||
if (Utils.startsWithMultiple(packageName, "xzr.", "moe.xzr.")) {
|
||||
return true
|
||||
}
|
||||
|
||||
// LSPosed and LSPatch
|
||||
if (packageName.startsWith("org.lsposed")) {
|
||||
return true
|
||||
|
|
@ -89,6 +85,11 @@ class RootAppsPreset : BasePreset(NAME) {
|
|||
return true
|
||||
}
|
||||
|
||||
// Kitsune
|
||||
if (packageName.startsWith("io.github.huskydg.magisk")) {
|
||||
return true
|
||||
}
|
||||
|
||||
// MMRL
|
||||
if (packageName.startsWith("com.dergoogler.mmrl")) {
|
||||
return true
|
||||
|
|
@ -109,16 +110,6 @@ class RootAppsPreset : BasePreset(NAME) {
|
|||
return true
|
||||
}
|
||||
|
||||
// SmartPack Kernel Manager + Busybox Installer
|
||||
if (packageName.startsWith("com.smartpack.")) {
|
||||
return true
|
||||
}
|
||||
|
||||
// F-Droid Privileged
|
||||
if (packageName.startsWith("org.fdroid.fdroid.privileged")) {
|
||||
return true
|
||||
}
|
||||
|
||||
ZipFile(appInfo.sourceDir).use { zipFile ->
|
||||
if (findAppsFromLibs(zipFile, libNames) || findAppsFromAssets(zipFile, assetNames)) {
|
||||
return true
|
||||
|
|
|
|||
|
|
@ -15,12 +15,10 @@ import icu.nullptr.hidemyapplist.common.JsonConfig
|
|||
import icu.nullptr.hidemyapplist.common.RiskyPackageUtils.appHasGMSConnection
|
||||
import icu.nullptr.hidemyapplist.common.SettingsPresets
|
||||
import icu.nullptr.hidemyapplist.common.Utils
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.DetectorAppsPreset
|
||||
import icu.nullptr.hidemyapplist.common.app_presets.WebViewPreset
|
||||
import icu.nullptr.hidemyapplist.common.settings_presets.ReplacementItem
|
||||
import icu.nullptr.hidemyapplist.xposed.hook.AccessibilityHook
|
||||
import icu.nullptr.hidemyapplist.xposed.hook.ActivityHook
|
||||
import icu.nullptr.hidemyapplist.xposed.hook.AppDataIsolationHook
|
||||
import icu.nullptr.hidemyapplist.xposed.hook.ContentProviderHook
|
||||
import icu.nullptr.hidemyapplist.xposed.hook.IFrameworkHook
|
||||
import icu.nullptr.hidemyapplist.xposed.hook.ImmHook
|
||||
|
|
@ -165,7 +163,6 @@ class HMAService(val pms: IPackageManager, val pmn: Any?) : IHMAService.Stub() {
|
|||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
frameworkHooks.add(PlatformCompatHook(this))
|
||||
frameworkHooks.add(AppDataIsolationHook(this))
|
||||
}
|
||||
|
||||
frameworkHooks.add(ActivityHook(this))
|
||||
|
|
@ -180,12 +177,6 @@ class HMAService(val pms: IPackageManager, val pmn: Any?) : IHMAService.Stub() {
|
|||
|
||||
fun isHookEnabled(packageName: String?) = config.scope.containsKey(packageName)
|
||||
|
||||
fun isAppDataIsolationExcluded(packageName: String?): Boolean {
|
||||
if (packageName.isNullOrBlank()) return false
|
||||
|
||||
return config.scope[packageName]?.excludeVoldIsolation ?: false
|
||||
}
|
||||
|
||||
fun getSpoofedSetting(caller: String?, name: String?, database: String): ReplacementItem? {
|
||||
if (caller == null || name == null) return null
|
||||
|
||||
|
|
@ -242,18 +233,8 @@ class HMAService(val pms: IPackageManager, val pmn: Any?) : IHMAService.Stub() {
|
|||
for (presetName in appConfig.applyPresets) {
|
||||
val preset = AppPresets.instance.getPresetByName(presetName) ?: continue
|
||||
|
||||
if (preset.containsPackage(query)) {
|
||||
// Do not hide detector apps from Play Store if they are connected to GMS
|
||||
val overriddenCaller = if (presetName == DetectorAppsPreset.NAME && caller == Constants.VENDING_PACKAGE_NAME) {
|
||||
Constants.GMS_PACKAGE_NAME
|
||||
} else {
|
||||
caller
|
||||
}
|
||||
|
||||
return !isAppInGMSIgnoredPackages(overriddenCaller, query)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return appConfig.useWhitelist
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,222 +0,0 @@
|
|||
package icu.nullptr.hidemyapplist.xposed.hook
|
||||
|
||||
import android.os.Build
|
||||
import android.os.SystemProperties
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.github.kyuubiran.ezxhelper.utils.findMethodOrNull
|
||||
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||
import de.robv.android.xposed.XC_MethodHook
|
||||
import de.robv.android.xposed.XposedHelpers
|
||||
import icu.nullptr.hidemyapplist.common.Utils
|
||||
import icu.nullptr.hidemyapplist.xposed.HMAService
|
||||
import icu.nullptr.hidemyapplist.xposed.logD
|
||||
import icu.nullptr.hidemyapplist.xposed.logE
|
||||
import icu.nullptr.hidemyapplist.xposed.logI
|
||||
import org.frknkrc44.hma_oss.common.BuildConfig
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
class AppDataIsolationHook(private val service: HMAService): IFrameworkHook {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "AppDataIsolationHook"
|
||||
private const val APPDATA_ISOLATION_ENABLED = "mAppDataIsolationEnabled"
|
||||
private const val VOLD_APPDATA_ISOLATION_ENABLED = "mVoldAppDataIsolationEnabled"
|
||||
private const val FUSE_PROP = "persist.sys.fuse"
|
||||
}
|
||||
|
||||
private val hooks = mutableListOf<XC_MethodHook.Unhook>()
|
||||
private var voldHookSkipped = false
|
||||
|
||||
override fun load() {
|
||||
if (!(service.config.altAppDataIsolation || service.config.altVoldAppDataIsolation)) return
|
||||
logI(TAG, "Load hook")
|
||||
|
||||
findMethodOrNull(
|
||||
"com.android.server.am.ProcessList"
|
||||
) {
|
||||
name == "startProcess"
|
||||
}?.hookBefore { param ->
|
||||
if (service.config.altAppDataIsolation) {
|
||||
val isEnabled = XposedHelpers.getBooleanField(
|
||||
param.thisObject,
|
||||
APPDATA_ISOLATION_ENABLED
|
||||
)
|
||||
|
||||
if (!isEnabled) {
|
||||
XposedHelpers.setBooleanField(
|
||||
param.thisObject,
|
||||
APPDATA_ISOLATION_ENABLED,
|
||||
true
|
||||
)
|
||||
|
||||
logI(TAG, "ProcessList - App data isolation is forced")
|
||||
}
|
||||
}
|
||||
|
||||
if (service.config.altVoldAppDataIsolation && !voldHookSkipped) {
|
||||
val fuseEnabled = SystemProperties.getBoolean(FUSE_PROP, false)
|
||||
|
||||
if (!fuseEnabled) {
|
||||
voldHookSkipped = true
|
||||
logE(TAG, "ProcessList - FUSE storage is not enabled, skip vold hook")
|
||||
} else {
|
||||
val isolationEnabled = XposedHelpers.getBooleanField(
|
||||
param.thisObject,
|
||||
VOLD_APPDATA_ISOLATION_ENABLED
|
||||
)
|
||||
|
||||
if (!isolationEnabled) {
|
||||
XposedHelpers.setBooleanField(
|
||||
param.thisObject,
|
||||
VOLD_APPDATA_ISOLATION_ENABLED,
|
||||
true
|
||||
)
|
||||
|
||||
logI(TAG, "ProcessList - Vold app data isolation is forced")
|
||||
}
|
||||
}
|
||||
}
|
||||
}?.let {
|
||||
hooks += it
|
||||
}
|
||||
|
||||
findMethodOrNull(
|
||||
"com.android.server.am.ProcessList"
|
||||
) {
|
||||
name == "needsStorageDataIsolation"
|
||||
}?.hookAfter { param ->
|
||||
if (service.config.altVoldAppDataIsolation) {
|
||||
val app = param.args.find { it.javaClass.simpleName == "ProcessRecord" }
|
||||
val uid = XposedHelpers.getIntField(app, "uid")
|
||||
val processName = runCatching {
|
||||
XposedHelpers.getObjectField(app, "processName")
|
||||
}.getOrDefault("<unknown>")
|
||||
val mountNode = runCatching {
|
||||
XposedHelpers.getIntField(app, "mMountMode")
|
||||
}.getOrDefault(0)
|
||||
val isolated = runCatching {
|
||||
XposedHelpers.getBooleanField(app, "isolated")
|
||||
}.getOrDefault(false)
|
||||
val appZygote = runCatching {
|
||||
XposedHelpers.getBooleanField(app, "appZygote")
|
||||
}.getOrDefault(false)
|
||||
|
||||
val apps = Utils.binderLocalScope {
|
||||
service.pms.getPackagesForUid(uid)
|
||||
} ?: return@hookAfter
|
||||
|
||||
logD(
|
||||
TAG,
|
||||
"@needsStorageDataIsolation $uid and ${apps.contentToString()} - $processName value without override: ${param.result}, mount node: $mountNode, isolated: $isolated, appZygote: $appZygote"
|
||||
)
|
||||
|
||||
// Do not isolate this module for safety
|
||||
if (apps.contains(BuildConfig.APP_PACKAGE_NAME)) {
|
||||
param.result = false
|
||||
return@hookAfter
|
||||
}
|
||||
|
||||
if (apps.any { service.isAppDataIsolationExcluded(it) }) {
|
||||
param.result = false
|
||||
}
|
||||
|
||||
if (service.config.skipSystemAppDataIsolation) {
|
||||
val isSystemApp = service.systemApps.any { apps.contains(it) }
|
||||
logD(
|
||||
TAG,
|
||||
"@needsStorageDataIsolation $uid and ${apps.contentToString()} - isSystemApp: $isSystemApp"
|
||||
)
|
||||
|
||||
if (isSystemApp) {
|
||||
param.result = false
|
||||
return@hookAfter
|
||||
}
|
||||
}
|
||||
}
|
||||
}?.let {
|
||||
hooks += it
|
||||
}
|
||||
|
||||
findMethodOrNull(
|
||||
"com.android.server.StorageManagerService"
|
||||
) {
|
||||
name == "onVolumeStateChangedLocked"
|
||||
}?.hookBefore { param ->
|
||||
runCatching {
|
||||
if (service.config.altVoldAppDataIsolation) {
|
||||
val fuseEnabled = SystemProperties.getBoolean(FUSE_PROP, false)
|
||||
|
||||
if (!fuseEnabled) {
|
||||
logE(TAG, "StorageManagerService - FUSE storage is not enabled, disable hooks")
|
||||
unload()
|
||||
return@hookBefore
|
||||
}
|
||||
|
||||
val isolationEnabled = XposedHelpers.getBooleanField(
|
||||
param.thisObject,
|
||||
VOLD_APPDATA_ISOLATION_ENABLED
|
||||
)
|
||||
|
||||
if (!isolationEnabled) {
|
||||
XposedHelpers.setBooleanField(
|
||||
param.thisObject,
|
||||
VOLD_APPDATA_ISOLATION_ENABLED,
|
||||
true
|
||||
)
|
||||
|
||||
logI(TAG, "StorageManagerService - Vold app data isolation is forced")
|
||||
}
|
||||
}
|
||||
}.onFailure {
|
||||
logE(TAG, "Fatal error occurred, disable hooks", it)
|
||||
unload()
|
||||
}
|
||||
}?.let {
|
||||
hooks += it
|
||||
}
|
||||
|
||||
findMethodOrNull(
|
||||
"com.android.server.StorageManagerService"
|
||||
) {
|
||||
name == "remountAppStorageDirs"
|
||||
}?.hookBefore { param ->
|
||||
if (service.config.altVoldAppDataIsolation && service.config.skipSystemAppDataIsolation) {
|
||||
val pidPkgMap = param.args[0] as java.util.Map<*, *>
|
||||
val userId = param.args[1] as Int
|
||||
|
||||
val keysToRemove = mutableSetOf<Any>()
|
||||
|
||||
for (entry in pidPkgMap.entrySet()) {
|
||||
val pid = entry.key
|
||||
val packageName = entry.value as String
|
||||
|
||||
val apps = Utils.binderLocalScope {
|
||||
val uid = Utils.getPackageUidCompat(service.pms, packageName, 0L, userId)
|
||||
service.pms.getPackagesForUid(uid)
|
||||
} ?: continue
|
||||
|
||||
for (app in apps) {
|
||||
if (app in service.systemApps || app == BuildConfig.APP_PACKAGE_NAME) {
|
||||
logD(
|
||||
TAG,
|
||||
"@remountAppStorageDirs SYSTEM $pid - $packageName is marked to remove"
|
||||
)
|
||||
keysToRemove += pid
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
keysToRemove.forEach { pidPkgMap.remove(it) }
|
||||
}
|
||||
}?.let {
|
||||
hooks += it
|
||||
}
|
||||
}
|
||||
|
||||
override fun unload() {
|
||||
hooks.forEach(XC_MethodHook.Unhook::unhook)
|
||||
hooks.clear()
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue