Compare commits

...
Message SHA1
feat: strings.xml: modify more strings
Signed-off-by: Cuynu <cuynu@proton.me>

Cuynu   commited 2025-12-17 00:10:30 +07:00
06497e95d3
feat: strings.xml: modify more strings
Signed-off-by: Cuynu <cuynu@proton.me>

Cuynu   commited 2025-12-17 00:10:14 +07:00
4391a749e6
misc: strings change & remove detector preset & more
Signed-off-by: Cuynu <cuynu@proton.me>

Cuynu   commited 2025-12-16 22:57:54 +07:00
f6e3dccf6b
feat: RootAppsPreset.kt: remove unnecessary apps from list
why would F-Droid extension and some apps listed here?

useless.

Signed-off-by: Cuynu <cuynu@proton.me>

Cuynu   commited 2025-12-16 22:17:51 +07:00
f128da3ff2
feat: RootAppsPreset.kt: add kitsune packageName
Signed-off-by: Cuynu <cuynu@proton.me>

Cuynu   commited 2025-12-16 22:05:30 +07:00
5c537e6751
feat! remove void data app isolation
Signed-off-by: Cuynu <cuynu@proton.me>

Cuynu   commited 2025-12-15 23:41:22 +07:00
dba351d9fe
14 changed files with 27 additions and 470 deletions

View file

@ -102,20 +102,6 @@ object ConfigManager {
saveConfig() 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 var skipSystemAppDataIsolation: Boolean
get() = config.skipSystemAppDataIsolation get() = config.skipSystemAppDataIsolation
set(value) { set(value) {

View file

@ -230,9 +230,6 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) {
R.string.app_force_stop_warning, Toast.LENGTH_LONG).show() R.string.app_force_stop_warning, Toast.LENGTH_LONG).show()
true true
} }
findPreference<SwitchPreferenceCompat>("excludeVoldIsolation")?.let {
it.isEnabled = ConfigManager.altVoldAppDataIsolation
}
findPreference<SwitchPreferenceCompat>("invertActivityLaunchProtection")?.let { findPreference<SwitchPreferenceCompat>("invertActivityLaunchProtection")?.let {
it.summary = getString(R.string.app_invert_activity_launch_protection_desc) + "\n\n" + it.summary = getString(R.string.app_invert_activity_launch_protection_desc) + "\n\n" +
getString(R.string.app_global_activity_launch_protection_state, getString(R.string.app_global_activity_launch_protection_state,

View file

@ -109,8 +109,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
"detailLog" -> ConfigManager.detailLog "detailLog" -> ConfigManager.detailLog
"hideIcon" -> PrefManager.hideIcon "hideIcon" -> PrefManager.hideIcon
"bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning "bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning
"appDataIsolation" -> ConfigManager.altAppDataIsolation
"voldAppDataIsolation" -> ConfigManager.altVoldAppDataIsolation
"skipSystemAppDataIsolation" -> ConfigManager.skipSystemAppDataIsolation "skipSystemAppDataIsolation" -> ConfigManager.skipSystemAppDataIsolation
"disableActivityLaunchProtection" -> ConfigManager.disableActivityLaunchProtection "disableActivityLaunchProtection" -> ConfigManager.disableActivityLaunchProtection
"forceMountData" -> ConfigManager.forceMountData "forceMountData" -> ConfigManager.forceMountData
@ -146,9 +144,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
"hideIcon" -> PrefManager.hideIcon = value "hideIcon" -> PrefManager.hideIcon = value
"bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning = value "bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning = value
"disableActivityLaunchProtection" -> ConfigManager.disableActivityLaunchProtection = value "disableActivityLaunchProtection" -> ConfigManager.disableActivityLaunchProtection = value
"appDataIsolation" -> ConfigManager.altAppDataIsolation = value
"voldAppDataIsolation" -> ConfigManager.altVoldAppDataIsolation = value
"skipSystemAppDataIsolation" -> ConfigManager.skipSystemAppDataIsolation = value
"packageQueryWorkaround" -> ConfigManager.packageQueryWorkaround = value "packageQueryWorkaround" -> ConfigManager.packageQueryWorkaround = value
else -> throw IllegalArgumentException("Invalid key: $key") 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() { 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") @Suppress("deprecation")
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@ -365,8 +305,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
} }
} }
configureDataIsolation()
findPreference<Preference>("stopSystemService")?.setOnPreferenceClickListener { findPreference<Preference>("stopSystemService")?.setOnPreferenceClickListener {
if (ServiceClient.serviceVersion != 0) { if (ServiceClient.serviceVersion != 0) {
MaterialAlertDialogBuilder(requireContext()) MaterialAlertDialogBuilder(requireContext())
@ -403,7 +341,6 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
configureDataIsolation()
} }
} }
} }

View file

@ -81,7 +81,7 @@
<string name="template_apps_visible_count">%d ứng dụng không ẩn</string> <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> <string name="template_apps_invisible_count">%d Ứng dụng bị ẩn</string>
<!-- App settings --> <!-- 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_template_config">Mục tùy chỉnh</string>
<string name="app_choose_template">Chọn mục</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> <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_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_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_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_spoof">Bị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">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ị giả lập là đã cài đặt trên Play Store cho ứng dụng này</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">Giả lập luôn cho các ứng dụng hệ thống</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 giả lập là đã cài đặt từ Play Store cho ứng dụng này</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">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_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">Đả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> <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_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="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_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_root_apps">App Root</string>
<string name="preset_custom_rom">Ứng dụng ROM tùy biến</string> <string name="preset_custom_rom">App ROM Custom</string>
<string name="preset_sus_apps">Ứng dụng đáng ngờ</string> <string name="preset_sus_apps">App linh tinh</string>
<string name="preset_detector_apps">ỨD phát hiện/KT Root</string> <string name="preset_detector_apps">App phát hiện / check Root</string>
<string name="preset_shizuku_dhizuku">Shizuku/Dhizuku ứng dụng</string> <string name="preset_shizuku_dhizuku">App Shizuku/Dhizuku</string>
<string name="preset_webview">Các ứng dụng WebView</string> <string name="preset_webview">App WebView</string>
<!-- Settings preset names --> <!-- Settings preset names -->
<string name="settings_preset_accessibility">Trợ năng</string> <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_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">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_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_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_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">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> <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_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">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_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_language">Ngôn ngữ</string>
<string name="settings_translate">Giúp chúng tôi dịch</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> <string name="settings_translate_summary">Giúp chúng tôi dịch %s sang ngôn ngữ của bạn</string>

View file

@ -216,9 +216,10 @@
<string name="about_fork_description"> <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. 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>
<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"> <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>
<string name="about_how_to_use_description_2"> <string name="about_how_to_use_description_2">
Config modification effective in real time. Config modification effective in real time.

View file

@ -80,12 +80,4 @@
android:title="@string/app_exclude_target_installation_source" /> android:title="@string/app_exclude_target_installation_source" />
</PreferenceCategory> </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> </PreferenceScreen>

View file

@ -68,11 +68,6 @@
android:key="disableActivityLaunchProtection" android:key="disableActivityLaunchProtection"
android:title="@string/settings_disable_activity_launch_protection" android:title="@string/settings_disable_activity_launch_protection"
android:summary="@string/settings_disable_activity_launch_protection_summary" /> 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 <SwitchPreferenceCompat
android:icon="@drawable/outline_bug_report_24" android:icon="@drawable/outline_bug_report_24"
android:key="detailLog" android:key="detailLog"

View file

@ -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>

View file

@ -9,7 +9,6 @@ import icu.nullptr.hidemyapplist.common.Utils.getInstalledApplicationsCompat
import icu.nullptr.hidemyapplist.common.Utils.getPackageInfoCompat import icu.nullptr.hidemyapplist.common.Utils.getPackageInfoCompat
import icu.nullptr.hidemyapplist.common.app_presets.BasePreset import icu.nullptr.hidemyapplist.common.app_presets.BasePreset
import icu.nullptr.hidemyapplist.common.app_presets.CustomROMPreset 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.RootAppsPreset
import icu.nullptr.hidemyapplist.common.app_presets.SDhizukuAppsPreset import icu.nullptr.hidemyapplist.common.app_presets.SDhizukuAppsPreset
import icu.nullptr.hidemyapplist.common.app_presets.SuspiciousAppsPreset import icu.nullptr.hidemyapplist.common.app_presets.SuspiciousAppsPreset
@ -139,7 +138,6 @@ class AppPresets private constructor() {
presetList.add(XposedModulesPreset()) presetList.add(XposedModulesPreset())
presetList.add(SuspiciousAppsPreset()) presetList.add(SuspiciousAppsPreset())
presetList.add(SDhizukuAppsPreset()) presetList.add(SDhizukuAppsPreset())
presetList.add(DetectorAppsPreset())
} }
} }

View file

@ -13,7 +13,6 @@ data class JsonConfig(
var forceMountData: Boolean = true, var forceMountData: Boolean = true,
var disableActivityLaunchProtection: Boolean = false, var disableActivityLaunchProtection: Boolean = false,
var altAppDataIsolation: Boolean = false, var altAppDataIsolation: Boolean = false,
var altVoldAppDataIsolation: Boolean = false,
var skipSystemAppDataIsolation: Boolean = true, var skipSystemAppDataIsolation: Boolean = true,
var packageQueryWorkaround: Boolean = false, var packageQueryWorkaround: Boolean = false,
val templates: MutableMap<String, Template> = mutableMapOf(), val templates: MutableMap<String, Template> = mutableMapOf(),

View file

@ -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
}
}

View file

@ -11,6 +11,7 @@ class RootAppsPreset : BasePreset(NAME) {
override val exactPackageNames = setOf( override val exactPackageNames = setOf(
// rooted apps // rooted apps
"io.github.huskydg.magisk",
"io.github.a13e300.ksuwebui", "io.github.a13e300.ksuwebui",
"com.fox2code.mmm", "com.fox2code.mmm",
"id.kuato.diskhealth", "id.kuato.diskhealth",
@ -74,11 +75,6 @@ class RootAppsPreset : BasePreset(NAME) {
override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean { override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean {
val packageName = appInfo.packageName val packageName = appInfo.packageName
// All libxzr apps (konabess, hkf, ...)
if (Utils.startsWithMultiple(packageName, "xzr.", "moe.xzr.")) {
return true
}
// LSPosed and LSPatch // LSPosed and LSPatch
if (packageName.startsWith("org.lsposed")) { if (packageName.startsWith("org.lsposed")) {
return true return true
@ -89,6 +85,11 @@ class RootAppsPreset : BasePreset(NAME) {
return true return true
} }
// Kitsune
if (packageName.startsWith("io.github.huskydg.magisk")) {
return true
}
// MMRL // MMRL
if (packageName.startsWith("com.dergoogler.mmrl")) { if (packageName.startsWith("com.dergoogler.mmrl")) {
return true return true
@ -109,16 +110,6 @@ class RootAppsPreset : BasePreset(NAME) {
return true 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 -> ZipFile(appInfo.sourceDir).use { zipFile ->
if (findAppsFromLibs(zipFile, libNames) || findAppsFromAssets(zipFile, assetNames)) { if (findAppsFromLibs(zipFile, libNames) || findAppsFromAssets(zipFile, assetNames)) {
return true return true

View file

@ -15,12 +15,10 @@ import icu.nullptr.hidemyapplist.common.JsonConfig
import icu.nullptr.hidemyapplist.common.RiskyPackageUtils.appHasGMSConnection import icu.nullptr.hidemyapplist.common.RiskyPackageUtils.appHasGMSConnection
import icu.nullptr.hidemyapplist.common.SettingsPresets import icu.nullptr.hidemyapplist.common.SettingsPresets
import icu.nullptr.hidemyapplist.common.Utils 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.app_presets.WebViewPreset
import icu.nullptr.hidemyapplist.common.settings_presets.ReplacementItem import icu.nullptr.hidemyapplist.common.settings_presets.ReplacementItem
import icu.nullptr.hidemyapplist.xposed.hook.AccessibilityHook import icu.nullptr.hidemyapplist.xposed.hook.AccessibilityHook
import icu.nullptr.hidemyapplist.xposed.hook.ActivityHook 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.ContentProviderHook
import icu.nullptr.hidemyapplist.xposed.hook.IFrameworkHook import icu.nullptr.hidemyapplist.xposed.hook.IFrameworkHook
import icu.nullptr.hidemyapplist.xposed.hook.ImmHook 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) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
frameworkHooks.add(PlatformCompatHook(this)) frameworkHooks.add(PlatformCompatHook(this))
frameworkHooks.add(AppDataIsolationHook(this))
} }
frameworkHooks.add(ActivityHook(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 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? { fun getSpoofedSetting(caller: String?, name: String?, database: String): ReplacementItem? {
if (caller == null || name == null) return null if (caller == null || name == null) return null
@ -242,16 +233,6 @@ class HMAService(val pms: IPackageManager, val pmn: Any?) : IHMAService.Stub() {
for (presetName in appConfig.applyPresets) { for (presetName in appConfig.applyPresets) {
val preset = AppPresets.instance.getPresetByName(presetName) ?: continue 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)
}
} }
} }

View file

@ -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()
}
}