From 1581e099f361c0ae140805fb8efc6c0893914580 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Fri, 5 Sep 2025 18:17:15 +0300 Subject: [PATCH 01/28] Add spoofing for system apps too, also improve description of exclude option --- app/build.gradle.kts | 2 +- .../ui/fragment/AppSettingsFragment.kt | 7 +++ app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/app_settings.xml | 6 +++ build.gradle.kts | 2 +- .../hidemyapplist/common/JsonConfig.kt | 1 + packages.xml | Bin 432966 -> 0 bytes .../hidemyapplist/xposed/HMAService.kt | 18 ++++---- .../xposed/hook/PmsHookTarget28.kt | 12 +++-- .../xposed/hook/PmsHookTarget30.kt | 39 +++++++++++++---- .../xposed/hook/PmsHookTarget33.kt | 40 +++++++++++++---- .../xposed/hook/PmsHookTarget34.kt | 41 ++++++++++++++---- 12 files changed, 130 insertions(+), 42 deletions(-) delete mode 100644 packages.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 52daff5..b2d9a3f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -69,7 +69,7 @@ dependencies { android.applicationVariants.all { outputs.all { (this as BaseVariantOutputImpl).apply { - outputFileName = "${rootProject.name.replace(" ", "_")}-v${versionName}-${buildType.name}.apk" + outputFileName = "${rootProject.name.replace(" ", "_")}-${versionName}-${buildType.name}.apk" } } } diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSettingsFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSettingsFragment.kt index ed91962..7b73f27 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSettingsFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSettingsFragment.kt @@ -108,6 +108,7 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) { "useWhiteList" -> pack.config.useWhitelist "excludeSystemApps" -> pack.config.excludeSystemApps "hideInstallationSource" -> pack.config.hideInstallationSource + "hideSystemInstallationSource" -> pack.config.hideSystemInstallationSource "excludeTargetInstallationSource" -> pack.config.excludeTargetInstallationSource else -> throw IllegalArgumentException("Invalid key: $key") } @@ -119,6 +120,7 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) { "useWhiteList" -> pack.config.useWhitelist = value "excludeSystemApps" -> pack.config.excludeSystemApps = value "hideInstallationSource" -> pack.config.hideInstallationSource = value + "hideSystemInstallationSource" -> pack.config.hideSystemInstallationSource = value "excludeTargetInstallationSource" -> pack.config.excludeTargetInstallationSource = value else -> throw IllegalArgumentException("Invalid key: $key") } @@ -165,6 +167,11 @@ class AppSettingsFragment : Fragment(R.layout.fragment_settings) { R.string.app_force_stop_warning, Toast.LENGTH_LONG).show() true } + findPreference("hideSystemInstallationSource")?.setOnPreferenceChangeListener { _, newValue -> + Toast.makeText(requireContext(), + R.string.app_force_stop_warning, Toast.LENGTH_LONG).show() + true + } findPreference("excludeTargetInstallationSource")?.setOnPreferenceChangeListener { _, newValue -> Toast.makeText(requireContext(), R.string.app_force_stop_warning, Toast.LENGTH_LONG).show() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 274c6fc..0548ea3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -98,8 +98,10 @@ Spoofing Spoof installation sources All of user apps will be spoofed as installed over Play Store for this application + Spoof system apps too + All of system apps will be spoofed as installed over nothing for this application Exclude the target app - This app will be excluded from the Play Store spoofing + You can enable it if this app is not available at Play Store Don\'t forget to force stop the target app after saving the configuration diff --git a/app/src/main/res/xml/app_settings.xml b/app/src/main/res/xml/app_settings.xml index 375116e..11b43c9 100644 --- a/app/src/main/res/xml/app_settings.xml +++ b/app/src/main/res/xml/app_settings.xml @@ -57,6 +57,12 @@ android:key="hideInstallationSource" android:summary="@string/app_hide_installation_source_desc" android:title="@string/app_hide_installation_source" /> + = mutableSetOf(), var applyPresets: MutableSet = mutableSetOf(), diff --git a/packages.xml b/packages.xml deleted file mode 100644 index 27aa528190c09b2849bd8c4c3715f787c54fe5d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432966 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 }&5}A6pDVlSe$P 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%0Du&Yy(EK@8^ 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 diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt index 1e8b504..1b61cae 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt @@ -192,23 +192,25 @@ class HMAService(val pms: IPackageManager) : IHMAService.Stub() { return appConfig.useWhitelist } - fun shouldHideInstallationSource(caller: String?, query: String?): Boolean { - if (caller == null || query == null) return false - val appConfig = config.scope[caller] ?: return false + fun shouldHideInstallationSource(caller: String?, query: String?): Int { + if (caller == null || query == null) return 0 + val appConfig = config.scope[caller] ?: return 0 + if (!appConfig.hideInstallationSource) return 0 logD(TAG, "@shouldHideInstallationSource $caller -> $query") - if (!appConfig.hideInstallationSource || query in systemApps) return false - if (caller == query && appConfig.excludeTargetInstallationSource) return false + if (caller == query && appConfig.excludeTargetInstallationSource) return 0 try { val uid = Utils.getPackageUidCompat(pms, query, 0L, 0) logD(TAG, "@shouldHideInstallationSource UID for $caller -> $query: $uid") - if (uid < 0) return false // invalid package installation source request + if (uid < 0) return 0 // invalid package installation source request } catch (e: Throwable) { logD(TAG, "@shouldHideInstallationSource UID error", e) - return false + return 0 } - return appConfig.hideInstallationSource + return if (query in systemApps) { + if (appConfig.hideSystemInstallationSource) { 2 } else { 0 } + } else { 1 } } override fun stopService(cleanEnv: Boolean) { diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt index c0f55d5..0b2b160 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt @@ -99,11 +99,15 @@ class PmsHookTarget28(private val service: HMAService) : IFrameworkHook { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - if (service.shouldHideInstallationSource(caller, targetApp)) { - param.result = VENDING_PACKAGE_NAME - service.filterCount++ - break + val blockingMode = service.shouldHideInstallationSource(caller, targetApp) + when (blockingMode) { + 1 -> param.result = VENDING_PACKAGE_NAME + 2 -> param.result = null + else -> continue } + + service.filterCount++ + break } } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt index e906aaf..c1cfdeb 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt @@ -26,7 +26,20 @@ class PmsHookTarget30(private val service: HMAService) : IFrameworkHook { private const val TAG = "PmsHookTarget30" } - private val fakePackageInstallInfo by lazy { + private val fakeSystemPackageInstallInfo by lazy { + findConstructor( + "android.content.pm.InstallSourceInfo" + ) { + paramCount == 4 + }.newInstance( + null, + null, + null, + null, + ) + } + + private val fakeUserPackageInstallInfo by lazy { var psInfo = Utils.getPackageInfoCompat( service.pms, VENDING_PACKAGE_NAME, @@ -88,11 +101,15 @@ class PmsHookTarget30(private val service: HMAService) : IFrameworkHook { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - if (service.shouldHideInstallationSource(caller, targetApp)) { - param.result = fakePackageInstallInfo - service.filterCount++ - break + val blockingMode = service.shouldHideInstallationSource(caller, targetApp) + when (blockingMode) { + 1 -> param.result = fakeUserPackageInstallInfo + 2 -> param.result = fakeSystemPackageInstallInfo + else -> continue } + + service.filterCount++ + break } }?.let { hooks.add(it) @@ -109,11 +126,15 @@ class PmsHookTarget30(private val service: HMAService) : IFrameworkHook { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - if (service.shouldHideInstallationSource(caller, targetApp)) { - param.result = VENDING_PACKAGE_NAME - service.filterCount++ - break + val blockingMode = service.shouldHideInstallationSource(caller, targetApp) + when (blockingMode) { + 1 -> param.result = VENDING_PACKAGE_NAME + 2 -> param.result = null + else -> continue } + + service.filterCount++ + break } } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt index 164e121..a71d602 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt @@ -33,7 +33,21 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { } } - private val fakePackageInstallInfo by lazy { + private val fakeSystemPackageInstallInfo by lazy { + findConstructor( + "android.content.pm.InstallSourceInfo" + ) { + paramCount == 5 + }.newInstance( + null, + null, + null, + null, + PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, + ) + } + + private val fakeUserPackageInstallInfo by lazy { var psInfo = Utils.getPackageInfoCompat( service.pms, VENDING_PACKAGE_NAME, @@ -98,11 +112,15 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - if (service.shouldHideInstallationSource(caller, targetApp)) { - param.result = fakePackageInstallInfo - service.filterCount++ - break + val blockingMode = service.shouldHideInstallationSource(caller, targetApp) + when (blockingMode) { + 1 -> param.result = fakeUserPackageInstallInfo + 2 -> param.result = fakeSystemPackageInstallInfo + else -> continue } + + service.filterCount++ + break } }?.let { hooks.add(it) @@ -119,11 +137,15 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - if (service.shouldHideInstallationSource(caller, targetApp)) { - param.result = VENDING_PACKAGE_NAME - service.filterCount++ - break + val blockingMode = service.shouldHideInstallationSource(caller, targetApp) + when (blockingMode) { + 1 -> param.result = VENDING_PACKAGE_NAME + 2 -> param.result = null + else -> continue } + + service.filterCount++ + break } } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt index edef3a4..5d6f895 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt @@ -33,7 +33,22 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { } } - private val fakePackageInstallInfo by lazy { + private val fakeSystemPackageInstallInfo by lazy { + findConstructor( + "android.content.pm.InstallSourceInfo" + ) { + paramCount == 6 + }.newInstance( + null, + null, + null, + null, + null, + PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, + ) + } + + private val fakeUserPackageInstallInfo by lazy { var psInfo = Utils.getPackageInfoCompat( service.pms, VENDING_PACKAGE_NAME, @@ -128,11 +143,15 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - if (service.shouldHideInstallationSource(caller, targetApp)) { - param.result = fakePackageInstallInfo - service.filterCount++ - break + val blockingMode = service.shouldHideInstallationSource(caller, targetApp) + when (blockingMode) { + 1 -> param.result = fakeUserPackageInstallInfo + 2 -> param.result = fakeSystemPackageInstallInfo + else -> continue } + + service.filterCount++ + break } }?.let { hooks.add(it) @@ -149,11 +168,15 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - if (service.shouldHideInstallationSource(caller, targetApp)) { - param.result = VENDING_PACKAGE_NAME - service.filterCount++ - break + val blockingMode = service.shouldHideInstallationSource(caller, targetApp) + when (blockingMode) { + 1 -> param.result = VENDING_PACKAGE_NAME + 2 -> param.result = null + else -> continue } + + service.filterCount++ + break } } } From f61026feb68a5eac2b0f58c08acbd67e9babe502 Mon Sep 17 00:00:00 2001 From: Cuynu Date: Sun, 7 Sep 2025 06:58:03 +0700 Subject: [PATCH 02/28] feat: strings.xml: update vietnamese translation Signed-off-by: Cuynu --- app/src/main/res/values-vi-rVN/strings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index c6b1bd6..c5acf73 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -88,8 +88,10 @@ Giả mạo Giả mạo nguồn cài đặt app Tất cả ứng dụng không phải hệ thống sẽ được giả mạo nguồn cài thành từ Google Play + Giả mạo cả ứng dụng hệ thống + Toàn bộ ứng dụng hệ thống sẽ được giả mạo như là đã được cài đặt qua Google Play thay vì là không cho ứng dụng này Loại trừ app đang ẩn - Ứng dụng được ẩn sẽ được loại trừ khỏi giả mạo nguồn cài đặt sang Google Play + Bạn có thể bật tùy chọn này nếu ứng dụng đang ẩn không có ở Google Play Đừng quên buộc dừng app được ẩn sau khi bật tùy chọn này ! From aa72a2b5ea3eb8f41f63271593a664afbb0051f0 Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 00:57:51 +0700 Subject: [PATCH 03/28] feat: add credit, links & translate strings in vietnamese Signed-off-by: Cuynu --- .../hidemyapplist/ui/activity/AboutActivity.kt | 9 ++++++--- app/src/main/res/drawable/cont_cuynu.webp | Bin 0 -> 73952 bytes app/src/main/res/values-vi-rVN/strings.xml | 6 ++++++ app/src/main/res/values/strings.xml | 4 +++- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/cont_cuynu.webp diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt index dafcd3b..8949de8 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt @@ -22,6 +22,10 @@ class AboutActivity : AbsAboutActivity() { } override fun onItemsCreated(items: MutableList) { + + items.add(Category(getString(R.string.about_mychanges_title))) + items.add(Card(getString(R.string.about_mychanges_summary))) + items.add(Category(getString(R.string.title_about_fork))) items.add(Card(getString(R.string.about_fork_description))) @@ -45,11 +49,10 @@ class AboutActivity : AbsAboutActivity() { items.add(Contributor(R.drawable.cont_icon_designer, "辉少菌", "Icon designer", "http://www.coolapk.com/u/1560270")) items.add(Line()) items.add(Contributor(R.drawable.cont_cpp_master, "LoveSy", "Idea provider", "https://github.com/yujincheng08")) + items.add(Contributor(R.drawable.cont_cuynu, "Cuynu", "loser?", "https://git.disroot.org/cuynu")) items.add(Category(getString(R.string.about_support))) - items.add(Card("Github\nhttps://github.com/frknkrc44/HMA-OSS")) - items.add(Line()) - items.add(Card("Telegram\nhttps://t.me/aerathfuns")) + items.add(Card("Disroot\nhttps://git.disroot.org/cuynu/HMAL-OSS")) items.add(Category(getString(R.string.about_open_source))) items.add(License("MultiType", "drakeet", License.APACHE_2, "https://github.com/drakeet/MultiType")) diff --git a/app/src/main/res/drawable/cont_cuynu.webp b/app/src/main/res/drawable/cont_cuynu.webp new file mode 100644 index 0000000000000000000000000000000000000000..749d2e9ead1682bf85c8335d49cf9f598657241e GIT binary patch literal 73952 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ⅇTi;-y#0(n09w{sOhvdPfs%~x@fX!(Wb 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 z {yE(h&g|D1PG_tT4yJ_Z-RGgm+5CNn?7yGm}^&bvuH9#KbBZuwgu54}F?^358* ztv>J5t`_qjU1YyUwV!2enDfEkzHe1du9;yI$iHyye}*nWf&K26ilbgV_k0|f3MvE!HOf=n|J)0xX&s>$%A<^<;jKlwZ}@uuII%(W7jvWr`cPsn-ok54pjcSAj3_N=RX6_SLNA~{hW8#&6=M!)wgHa%8Ta@ z-pX5k?OFQ*$!R(o=I@s1=((D&bt}|7G5fLVxvQC%g8xPwh`4)u#>o#gE5hp++g$fDoI3*mtvsmTZw3Fvv&%C9*Gg)8JSf$_MqUEN;?>jnf zPwn8oU-SA7$9t1^`|cTPN&^g5)WKjo)fcaENXS@MfZ-n&zJ?!JkLu8ul; z+IG)YUWZxi=G`~7IiB`d8qc1@WS$<{`u=F`A(d4gUGGx8Q?8x9y?RpImHF$;bwO_nr^0yXt-ZH*ylU4h5uDhQ4+FjpP9aY|iK(Hxl#-n%EY2>~UbR|8V$Po#7p?9$>0DJ?dAcsKFF3!T zK1{NlQ*3M5zWH0lj?Oh#bU(YCcj?KW??T^7@Xxv_q$u?xG;Z-O#Zjc4Yc4p{jr<$|xhgsm6b)s!cV+$VYE<^{aG?9$?{$PpyGNndyY<5f|)qrB52 zYwkSzc8X`lleEjc`9~*yu1&nI`HcUIl5le6}gbmE#9-}J@J zIpbBP2p3FWWMEj5|E;6)i0aJr_CHRZH=?u-24D5(lsS=dVs%PioU`=g8kXyKye>uO zule(9?aac3x@o0c(<6gFiP~2-Gai;*J~MvxUz5F4f9EdqnSEl-m38K?uj|yG@F-|o z*HrW(E;x7U;kn;UN-B9TmU z_C8v`z+LF?u{=zlfg$1~-vO=}`)te=_)Is-@4jO5=)ujIQzp$@wM?YuKf^iiXGNc% z7-b31X0Gykgs{#p@IoOYXM z^RTwn>w~9*AF&l$&)T!%Tj(8cp^P=22b?PpyHC00()4iG>tKn_ z%^H`#D>>`b$6ns&mUJxTPM7rNwL1JSU-I*=wN^~`5So{$m37N4WKn18i|v}yPx>{D zoTN-xc6=5Rz1MzX?>D3M>~GbzrX&=F25hT~T=T48<&}!(C87R0MN^I4rG8n_lx?tsD6btn|{Z~ z`H6lf9T=h)m2*;GNErn~>aE#zs z*=6X7?p>W5dTVCj)Hy3FLq5f=3oZ+74|REbDdN*1<=2&xn~&^#e*Vj^gFBL(`L?hr zzkPSyF8xte@5*{Je<|V9igE{cyL>s|G*xJN(s^O6i1*X#y_L^%N%`lTe^`Mq^gzf;wXDPOnG+MoRCm32YL`McAY?AE2R=6~H8 zmGV?7{9&%eo#nyDHZ4skO40Z1JmvRs$@U%EM^sO4`_I6gxyzPca7OzTy>|&NpP%;q z6?pnoaC>21KUY)fV)u?ub*5$OcBXv!=6#Z*V^6_W=ZNrb z%gFS}ubNU`sf7l=j7-;>XP-A$@nLWU=N@6tiJW%D8q1#U*IIXdz5P|ql1{cw7V!&o z?s-m5sS~(zv*Ou$Po9(YEph7~$@Pl+zH&8l7k@ZI)ZYDBeRAueI;o3WO4c8`wQ^(F zdNq#X%9^-|`~2kgR3*RTcb}u7&#^-0Na`_!kY(bJ1J9b=9+n!b6qN1S*3qHtXq zg_5h9KY5v*C*-hhShj78v+pr4?*j+d+zquj%xAlg>ulJ+_7HxKE2rjP$hDff@JsSx zxrY|KvPv%}c~5w1l~v5+`_!OojYo9oYVD+6XB9QCS?*5-%+D>oroQ~<8}2%u_mfQb zZvVkl8Tx0I*?DP*hKK=2I@<+;Fk1v+r=%YK+_t41@m8jB| zx<|Xk{B>(XysMqF?8MgGj(PgI-{ky7j>DH1S7hBhw&U&GqsO-EU5)jw7TJ^Pr!gsE z-rD7>cFpDF?-6J_6?;6gc*0XNr^(Z6%6W7I7An;?L^&-?^f8}&HfEyBy;YN9{QPD< z^7*;5{KYqp?j zsjUjtOmlltRgt*Q@O@9o5%+a|w=H|+1s2IzvnE*<`|jQPrtH`Lj5Ss9CXUHZ{9kn* zbNF!V7BL{9VU}=J`qYwT&b`+@GJ!=I;OI*K~i2 z>vyN@op>j;;d7Yf&nMra{eu0~h09elj;<<<4E4XrQE%tLZE@5wQ)0H>W~IBQSErj6 zu5;DS*6seaYVAx_-D%tP`Q@dSzwnvx(!{0Ywv^hcqiJgQV!fOHGu%D1^^CVx`ZT+6 zeN&_QeTl&J;1(3UojvuZ-iG91m; z2B|eI^Z$Cv;=ZAg_lNaU|JFaaX`FE@T1VL}V@Y$#>8UD{RJei;$qKZXv!(XDUb0m& zIdHM6znSGz&nG_XYS}#bw*4q_`E!GPL!P7X)TA@-kGF1_vigwZpH+UpSbg?fDfQja z`(?-HOpe`4Dr=AbC=HzFyzBfj?wqn8p<8rxpLV2M6y5&iYvX7-Uu(Th%PaMFdJS)j z%6UQrl`r~DWASf{-A3bKmL;9jtZrwX*L`%T!&`E8r*aTzci{ zWsGm4XQ}z;<(z5jpJb+`le(5;ruXfB&&Bs8-ph8TuKD?E(sRk9Dhh&nk3a7UTI+Cv zfx!y22MejD#bC0xJrNVp+bTFg^YlFirOSe0-^vp-KG9)IoGRKl9e{s#Vvl> zvbEn+acf?))b#4ANufc(uVX^-v{u(8{urF&?ZQu5}E3Ck2&9Q_VFIUcA zJxh8qe~L@}!&$55MCk-y3FF#azm!#G{t>l;I#r`Dhc5(+nC%N+l=e6`{`W++qc26d zRbPsxzvsHivtEaNam2Hvn`86rJ zyD)p-j%#)TDy?{8X?bw@r;VIDPMXy0jh?yrcYL3x z<(wchJ!PAljG_0P-dS<)Z~ACTpn|mi2rB!?qeo?@RDYt+x~N#d^dZBU(NQP9w{^NF2CQ$YOa<4 z8UF5ik(7R`PHnmPmS=*}KabuN+Za_Bc}!>Cs+5h^T1WO*EJ-~(`D#c%=gm0#jw533 z)1tPfOuxgxz>vYfz`(7hX*VnF;pwa2IDYL6+BNTZ(k1_xOCJA{3--vUUb*W2G_bEP z-bX=2NBz52XKwth$h9`lHN^vU&Rl=3vc_^_LvL+f;jIrDJIv}I6#c7TR4f1f$(vPo zk}iH(C;H^;JZIl5%SBP!j9MyRXBT1x--yVNb(6_XyS88GKFhk8m0g$8z27|h*j%)7v-WJadAe3yiRPEeK3)4% zRIzds&n@ZhM=u>(@4pdwC%68#`^v*=GODINl}mMB#aYdnyM0^9)b-oXy!;gw(#-a9 ziPNf-Nf%1bMHHWvi#Vd0`czJ2@#PZEPL(Y^N8ZeN^3;6WsdniAzildfH#h#-HGh|} zdhnvtvr^Qh7Z-cq5q9-S4YfLMSIT=Nnd4jJ>5JkL5_&gRo-NUMzIM)^Ea^Fk1q`BR z-@duEWYLyZt58+fCcCL;kIvp?#q_1?RP3RHXIHgNELgPo#%F1D&3&16%dFcywkDNM z3lC~a?d)5Ym!o)EqT}w4uf5KlYuvYO6_Gk+w(!Y&;X<34&VHdq@BhwstUA2$i0h4+ zVd0j08@K8CZTa}k>Abw@PnNT?FQ5HBdv}M$ZuhJwW_gzdn{(EsX^Ck%@oZWU?6qo0_A9SywmiFc#pr71$ET{^ zuXy~nl)BxKjAM>fY7H$?d2Qw?Il0#DM&6y0*%giXeUi?0?X|C>GPM1r2qt-8Yb**gI!s+vtPu&w1z0JZ) z%RJ}J%wmTN?Rp(9W+JcO#NB?iI&*c3k#)C^`1$oJmu9y-h>JMTXnBy=!_7PVi^)~l zrUgM2du|8R6-@}T^gq3S?jDQVe+!mv3Eh~kwTyG!+AQ^!>8H4FSbmrEFIYe2{$y{S ztVEGnH+DqrUaGiT?50$k^ZMMW5sN;~Zc2$n@ttY@b{4;P<(O`?jkWL?5}ackL8$H-n8UrZX_G_JSJn7=<^60Ar$4$FdLIKK;3` zxdTfwZ@jr0RBU8^?a5CicY~>izqIi_WZRbij*sWuzmOZ};yv!Xb@Q0>H(sTL#rvgd zlF9mLS=049f>uv#KUK9Y;lsLsnlo+Tp=Y%wv6KkMg{g-Ne?4Ge*|N=KUIVkF>qPH)MYY8* z{qqR z)2vEZ`3l>lrETXZ{r$Ul`rA~^AD2{upMH7Ke?y`tU3`oGW__u^!0gO2N#%ZysSKx2 z>|Crq>)$4q({gbQtubqoZ*j$*xpEKN?KYa-%XQo{VZ$=jE1$9zMFL8W#Z40T6yTSYN@Wu!SjDN>bp8GT|Q@C&K|=r?C)Jp=Y;;<{B~7ksIc-((`dI#O`AR) zOk4GhfAKrnuA64zS0yxy)(Xa|e`t-fR6gr{+~`y*vnu~3=@&+U?+u+Us(+a3Gd2C^ zwc88l+U2cETx@?!w$-)Cn%^$sU375T^67?q)*V^bBxQG^<>>Qfy?f`vtj@f;d1brN zzLF!FKkV||KXPR~QNDU$(ru@t&xaDu++Pq~dVaOu#@g(=@(EsA{v4&ZR!;kvE9~$6 zvUg!@6!+?<)4sjGBWqmGx|d<{IjetpCFYg7f%O7wFV*o&iz?1|+ket{zLmaVIG<7K z=`T*^#cxdB9q78{B7ZG(>&qQ8?}diuysBMu{)y?b#-P)$rk5zFM>FQFJ}$?9D|c?X zR?fMoS%Eq;OQv30^}^-Y<$1D#XRLm2&3a+Q&SI{ct6BV z!@Nc62SOPqJhMM?e)hG#4Y!;Y%Y|>UbN#Se{%Mruubr}?6@TWhZER~O7gt=j=y`p| z6dsGhqNO|De9GB3v&eygL8A>)aFVb$!h@KkrtR=mhIpIn%4c-R(1$)SYF# zoX{@NzEjNn!JW6~b}e6inkDr7`I7cf{~Rm#c#~4lJ)T}4vT z5C63Ihj4{PgdSr~|0G-AHMv&Y=c@ONr!#-_bnfTh6LvEuQFp!if`U26r}qEww4Y_$ zzxdd@iLnd$IExRKuBC1DmQ7OULjJ5*y_|L=V5LgUO_7U7;&YUY zV{IZ|pLthtF8{7z&U~FJshS+ln^|AQov-upy?l6XyHwljGWQ0CHTh}h411JM3otNP z=tT1*T;6C|Yp-_g_k+7;waXs*b+4Sh&Aa36iHsN5UVQnbcv)am%~6W%@fmY$H$HvG^PBGrt7FN!sv8ZvdN=RBzWPJuu04k)+dY2T@92H@x9if$ zA9}=01A1b=*J}UX7eAovq%f}piG@a6%^6!yZwmPvapd3XD`k!Uk@-6n9(YidNcO5-PzV2M3qoE)=#r{^XJcIOD=B` zxL0h}KiS6Q_${$juEOy))do9)((R14Z&_>6nA%k{X*0V``mdAI3@*vPUY0x8$U0qj za#2(3sYPCs*cBJv=Xlp~&FhI#rLxAhNvESuUI_SgG$`ZFN`d2d_q!-^lyI!u`%`_* zZPBXQv)y68wT%SQo7D?;s4QK&XzO-!&}POyB5OpS#3fnFc%*%n>P7B%Ro9v3rMYV2 z>1FIXRZ3=$=Ini7HS=?4on}-!_da3u$-5-~9XsmYQgM8RPy0{dUyEYj_`aENuR82j z%8i!>D=vF~UbEU>iv3T~FD0qzEmpIet!KMmy)bR+Z+D*1d;`tS`DT9kn;p_WS#_1S z=L80eKA9`t|0GXh$+olSwU1?q*O>hB7C4$eDaxdOvbvnmza?AzUiPkXxBMZjZ*7q% zepzaglvB;8NefJcUp`9h%09!FuhcYWCig9aT=UOz?K^pHUJ%>mX*zkqZ^t;BXBL)^ zKNVcOAo`oX^(L>hhw-lKduQc8*Q)dkwOd(Xe$TR?{U@f|Rb;N&nJ1jR^X0Sm zqTYHdy{BBieZXRE#J)X2Z}(PSxVzzU*UO{saYA=vg_rakb zYPo)m@*Zbb{-DqZn-7h;KK|4GwQH;ttUS%M&*P6u#L~ASeg}8DnEY^=Z&2EK$|$7& z=(3fkY*sya?QrVDZrs^go--6?Q z8!n&EJs|m2ac|DdA2!ovS8SfNzw>oLeZfSf1~0Q-y~|Bz&Gb_^z&51YPoR#2V%2oTfBB2YnLo} zr5T>N{&{Ecyo-J__uf9_`N{6X{#dqZSGlhHM(ZClG;&+rdsKO?>RLzx149Mq)@@KF zrQ725J8D|F)0s7AI{wv9|CyPzck$t=`iqj@ad&L1o6zY#%St8rwv}F(^J15{hiM;t zbC*7|-MiXj&#I{vPhI}3H;VgQ*1sq&)^4JS?-ivL6H|)jnsPIX9CnYLEs|k1=b788$qQL->plKmB+zc}@43Ku zy6ds3^!){YW;{uD^S)8LfPp3G27`wA2T7l&t9@c8id5ZsT$UgzvC~#@w@z>2vk9lv zX8Y-EY@C=|%^mNy^YgAdvkp(5Ztj-Kd-By3o9B~Lf~IYoeDb1i%iNWv8443k3dCgQ z9hiRmmRfXPZnRaHUv2qmyUNLq_w^+TH8QFzZ3Sc}>|C{1FSFdny0@@(vi{-6CF^YM z1H>6@&N8YT+4swqfq}WfL{!yUca?_al(sCVc`-kk7p-R(EG~Wcn)e5TW$d)zq)q#J zc@7;9zue8;b$#2m%@3BTwfQGkesT?;u6gdDRuAUOIQ3N)w8|AD?hP zqiH+m>w~YSrd>Sp@#<}_t6%l&cd5JyiJQ1O>!W$lm6&aIJGwvz(YSQnP?M9&_ji53 zz+eT6bTrJJX27t+<}71dy2n(R=a!yd&gm|DD4IA|w5#r#^GnVfYo!IaT@7}LsG#a& zZ+jxw&wGMFx%rSz=%mBG1|M3^ub!KA^_#@PrFXbnUABIRj;^vjGiSZ_cHgP4-P7eN zXT@f`dtt6nIZxoQnHtZ{x#$1B^Q+ovocH@k?8CGhd-jz#g=)=O^km9!(XXdht(S_n zR9akcizyxsp9zOGE(_Q&1++;PAE3<(8S zO#_Wqt@7QJQvX5V)e`@N+u^}&=hb zPsKaC-+U{yGC?Hr8K3T@_clM5tW10P;*R2Uk@NFvR2Qqfopy4I%6dMJr%&%Mcl&5E zO?Th%mguV6E9UeveW+&JE*JChnO)iA8ygPqyeePzpJAGgtKP$iOIEYCr5`BWyz-{P z^;wJFn3>qk*m(Iv^0_sYvzYr#9kwSdKJton*NgODjCFHbSG;*St;EIRnw=Am(b<`^ z8@lUmJf3G|eRcEvnODEMPS8-l^Il`ITF&44o087$llNE!>w5m|;=65L;2c#YaIMS# zg2HPVo@?qYO(9RyyC+99+s-s8e|PPp!v*1tm#26mcNRT88R#hVEado|phL2c1hhR5 z+c;Lla(r@J`_WjubEEdWRh>)nHP$au71XJY()p0Ao_*}#CP+vRV&Xxw(+ z=4{BnOUD@3RM@AvdrjT3N%%j*&Ch@K@09D$VOgcR^2M@8A}b&7)Mx&^R#0h+*YQ{4 z9rq4gpYr+m$!DM46-us7s=A$Q^q+ylbkZm8U%Tb>k1C$7nttO814GRcL^@|QS+hiU z{-USiy&YS2eqwh$<^I~qW`DUt*RDH z>eR|f+L-q4NZZFqGtrQ_r=tEdm>c9w+W9T?;VJ*ed=J)j=x;E0T5@=ux}2w0S)JAd ztJ;lMbT<`Fjrm!+uOqeZKf@yRByU}tUs2~$^&`5yV^moMikx36wVM5K*?VZAEdv(8_bJKJ==&xxCIcK26_TGs3pTHXe&%fl=$_ukx+dfNNeA2>}t8P;tc>AW!+dp$Fx!zB> zo}>3AJ3ys!=a;<3PcKZoFD`M*A>;wL$H1`41G` z4;8A;vDhP0bLGvMEpsiy*0TO;wae45NV;j^xFxdSOh)Q6x0$wTMk}xWJCgfu4WHZ9 zkeBCeU8KB?C#)2{G5@3FnY?eBIXyqOTz&GW=CIbjq%7B@N&D{nWqg((_c79nuXDcF zs_Qy0U#+}6=XUX?jB5)y3J#k)6z}Lc(k8iVnpC;Utg{i<_2!t^9ctO{)UGwLohPAg z*}so`M$P?ZXG5>}tyzEgP}}483j+`Nsm(}|JNdRR(6cpJ*KA$hnfXPnUw!1%@*c9t z@k!>K)QR;?^SQaMXKrTFY){WKI>rTQUyk@4tnZi{bLa84G>d6E1)Ju2A1n!-y(3#@ zpX)big6_0t;+D^Fl=*#H_26hKfP1K$Kg7L^VSMyfM%hSW8?p;2k_;Kfy z-+d8gXWMH%iVh390w!?&=oKO1rySeVx#~_SNgc&QIkpxEgA%HdFa=Y?)7!cIMN4hK!rBlyvZi8R)>5YNaFZTl+gr=K{dty0;4Y5DW?<1>qA9DVXse5?1fi%(=CvjnGa zJl4RaR&-eLL=ud|rmhQrCak`u@Yt8ay%MaC9w@TC?3tTdr1QMd z{xk2MeL-E4=jx1mZ`Ql>TJl&fzj55xNTtt7SgCem`QpC??=Le(eAZ$1eUqGj;BevA zlsi{Us<{t3dlz3Rs#g!(_V3d@>#oP@tMUrlUNcCvMPAt`Z6CSEQM@K?xy`ycAJjfC zUH)f7L$&6UPbYS|tP6-#UbKtrv#8I73mI;*20i8+$w#ivt!!W8XS`}fZZ((Xrw_A& z{Vtv57q`@!xh>aj{o*|i8;gvu?$E0--dN9_{PTMLgzHxtTi+wOl*JP!NMd_9mZ*rnvbsO9~dGP4#D$aA}TUy z%GSJ_t4*SfUDjN1nV{vV;>+SE(AMFw??j$V?cRkc-`?Hu&WsGS5Y$V({#tKI4*URqjU|`^%!uf)Mf#CrI1H%&Io_M<(OTPKa zPbe&sNc%PMlB(|duaS2B9|Wy?mu`#B&rFM&TXsA~Vf#(~pPXS+cHCMS##dJex}Aq5 zY+tS1ITL zkYa>fYQy6z*JiAUv`SmfzN{m4D;{HrMuU%j{Wr{@8Yj z6~WW@glOHqxx6PNYytxVr?*qj%<8psA9DDc-i)V@*`Wbj!u<`MsW7}3e-?H|^vB0O>_31nZSG2-1q#d>+@$v&Q5u46W*xwpTXe4 z%iH1pUY~TW&zi>UdABG&p*K$Sn|qbX%sbWWtUI=!Ree}49bC39Hbpt@)S9|eEAJa4YM}K$R_wL?5Z(47^^j|a0Ud5>LplHJHNB=zIHkx#LAO79{V$Iw3 zv+G>#-ZD1bJvn9DgCC(CADdb0^n!F!V~V?{%$;|lW*V!1Ux>!P74r)w_O5ucV!_$6 zCm*EqcB-mq%Tch-1s)Z0^?^LkzLt|QA-mwfB$ ztW=+*`&jGYp~wJ-S$68npYp$Z@`t(RP;YzG>h<=zUmu-ITRF30$D}3SefV~5{Fz*} ztJ0iTPUb^?X!zCkr%G?%cAT7}y;W6zc3R-+%`Y!6xw(DHqWGmIzd60l&dxU1$}m^q zn&^GTXF^+t6O+E#z2k4T?NU4$U(6J)ZFw(OTUaUe?bp4BR~N+eT=~VUzNG2WoQx-L z*`sgzpLwdgk-sK3OW!ub|;p;PW@@ivBa~QF)bdJ$1gN;>l|d zzjv(LxJ*_5;f9@;L`tJoPO8^sZ$DJw5bT}#a$a}Hqu1U28#NUem|Yf#EbF{ub7k?2 z=WqIhecs7V6!A!&bI@zji4zBTUe`^$W}adno9Cai>dfg@!R(V+{>mylg><${J^Oo6 zHu$Ws;KOIr_C&|snEdR7sQ#>wS7IvWKV9a|SY-5ZMyF;?TBOzAbW2mc(%i{^ld`7# zXL#D<@>OKo#7XOJ-c2s9y{NWd`8~(ki2I?@viWm#c*NLN305Yjb{=yTYV3Z~W72YK zSN_kFv*%q*3RIJO=HDHDw&VWB1Ck=X&nN0%S2z+BbvEK(Py7lq2mUt)H9am$xt;l2 z%&^HU<@ucB(ifQ1LzeVb8C}b8wiHxGfsAC8nK-Io!2@Sh=yT_$AOOk;7iis{F0*sYwfJ@H-0 zX|9L^Gd*94&Nse!-!0r~szv64Sv_~Op1pg1Ncn}Av(>aKB_*qB)hgUSt!z%YYZlXX zDKywdQNm5`p~#I#8(&=g_Eq|+LFG%cd99*#;)^yxn^@Fjn-m^39w%#vj9c?AEK-23sxraIz&NHOOam2*1#k%_09v zFYh>9-CQpIpJ7Q-;3WXSkSadH%m?l%&GjO z7JpOY`IXh0Po|$Jf0=FjP;14i*5&$qUFt?gm%bK%l(Kz1{j^|Z7{5um`r_!$gL}QM zyva45aBNfV@*9daCz~hDKU!S&Zs&cE{dp6WzAejqyvO9i<(OY@H@V%+x$mjead7Y1 zu=>`jvm5#HFD}>?RMmEQ`5n1?eCcu4A1ZD)zg4YRY-TOhuK%hh=|z8CFVlRjslK<| zR?CZ7?C=t-zMQ<4fkClbx7ohp(z)e6Dn{ayBUc}p;XP}i==9j+7fLDmI!VfYA1Yjy zOxd+-cC}Wnwe#%lKB8Tz;d_>}{gqE}S+e*}mB`KfOPy}#?`gG^bS&DkPl&CQx9paG z{H2wiH+IB_KaQ;4o8?h!bi88nO`T8CcFS&_Q}w@8cl1)!5mAp{9!r!jbF`|>hz^}< z>nSV1%4+s7;>8J2+GJp0;PSnoC3gN2qYi82?l!f}H@|gloyg(uFlE-wn!n1fX6aiM zXUzH3J8whF^PaNx(l+T^wnePoYHo7GZqEG#RZ-PtmYiNIi`TP@PS=YNKM+6BulY&=)^V8^-@*JYI! z6&Fvt!N4G7X2#S%@jKTc>5l9vy=xBb^$-53yE}CAMvrF~*TnoWxcH{+!|iE{Hx@K+ z3herH;`mY4f^)BaxT<_v&GXu8$?9cSR(<}uT=C25#TSfTz1*7X5U&{;@~r%E7o&UU zvQKgE3#C<0P7-W?B+O%TX>;V>T+{XHEY}r6{lZTFdA0mr#_#5(tCr-h;?6gnWTRFh zt0?r;{x<(TN$s`IcF*{pC)uoe*i!j&MortUDK*ae78+0a(cR`x&r03Ot=PGWw zCcg8}vD6LrE2TXGg3p@dJ>r~wQ}&ljZNS#8X=~-4T@PAfe#mym%OxL=ee%9tdZmB= zBi*{L)FWfw9G~wcoGizQ+O-hLj7B+S?nX}_rrJqDT|GPtP_@7@6pLD%L zr+L{CBRAy^m#+6O`X);J*s{bgw`qx5ZR?|eypK%9#*-_R^4>B}+Eh`vUz{)R`~y>G z<7FyGow&_rRGc{C((>Zs{s|F}*ZO)K{J49mjCMv{+&AC3XLemNUB2vEeME@v(p75H zQY2q{mGdRPP_#@IlrYbhzWOxO;)iYClGi6v*BMXM4V$XQ_U2jJ4-xH8_Uv~PgF`xY z?lPTssVVKpX8gIRV0NGX+pen~LFrzXbGNP87yEfj*Y2gY%X{o6>@S}3 zTh3v5zf0-5BRx=f zh~aUxW#p47lT{Ro3iRUd2|V~Xc~0|hHW3s+MWs;S4zLBlj-73 zJDqZCYWmi6FPSqJb&`}Kqh2oh-u~p=w#N?@f26;c%)PadYmNKj7Z=8}d zG3%~IrN{~YMX`+Q9j4mp%=)R6sj{iaz}@oX)3fKyQ%Y8LwYt6(UMwoQB<;MsTV_P^ww9#Oh{m0OB;-sH0Q8BFR8ZWP6gAsz#lf>_2h(mR_1=8zDL#9a z=KJq_rVDSyt#yx1&x#0*2;aW>&ChQqrE4=gZ#NZa?yq7ljaHsDTj{>p8s_K&d%Y@` z@$xH1+RnUdZW%i>I=lFZ&z+RtJ+f~-?q@BUzxeve*>CR2G+$)y2ztt`bR=M}(n8NF zSI5t%zJmLm(DDpSG3qQ1yBU@jxj!d-((?}4-Aj1)Ecf`M){=Pn4~tHGcd6B3J@Y4< zwQ|dKRkC+|+^TMre<^5wCv*AqS!y$sXS8ftaqo?$Z)S+cM6H$i&$%*B{yZ8pp)Y02 zFTU7&7v*leU%Bl^eaAn!=l#h)QzAEf`~ImiA;P$#|M~R!QZq_sY_u^K_Fv7grMrRe zn9YR1IG%ZaE}zy--DZ2rKZk*Vb>j5^2G%(@1?}aRcW=IDHSJ#C@%-(RZntx6cX_Q- z>%}>}3d1YPyv*K&k)GDj3S=nzE@kUzyk>>2~uN&Kc?{XJ2 zvDk4=@cG0&5ARr+I$zzqGcJPPfw3g3taxh3mdW1vc2jkq-8BrAQ+oMa{Ng3^dwf>S zx|7#sGl{$pm~m@U&ywrWQ}(xye&H#Lqpy$TUs%SCt9d({`($bJu*B zwr9eISsN=|&&$cKyL9(hk;v;pRepEtmeh)M)0Le!`d)eb&W}ZTNu0#V6-KUdU0=4i zzHeFe+mR9<+L(|Zrq>x}KA<3*C^RM*sowy&P( z@2TcHfazP4c2`3>y4AE)I;o1faAKL6Rn#XnvOI#=n7 z)^~gVRmnN${Oq5;>f|kIwPAHT`(J+Pym5H%I=>5vQBxQ5%e%)%@JDEoSraKCW(;)50>( z?V2VDJnc!Ay~WJAW5(tcS==q&)rp$hO+&7_D$V-5)+cFFEL*3Qd0GF0eHW%(5uID# z6TRrhTgC(Yr3GJFU!>km|1z<%V*T3phu;cEp2)g(e09_=hZmQFp9Ec< z-@oLpl=mg8KRWkTrfNSp-kMnS%0*gHJ2vLlbAj$&w!WlgNuQpZJ34=v=aDj%r!_O= zSIDhGy@-ukYv*lmYB5nhz007ZHR{*Ro2SeVnLO*??JsYz&Fz|<c_2Vd8bMzpFgL_$@^5nB{uoc$y+PAOll`?-|aJZKbK6ekp0`j z*{@j`pIR3gw%6Gd96E5~$qTE$YU>KOC``ZHx!p11uLP66)0|X|Pp6j%tc$sInVajb z={nstd$@u^yRwg7TNQE9d3({mxOs9icWoIjMBOQhit0Om@}G3bJjK;Tuj0)@cmC*$ zpQ6`M>?5pZ$1^+6D|g=IP@ju)UhOm5T_hfqe0;iQ@}5K=8_6x7RxEN8x5~T8QgiLX ziFU)f69>wl#kQP$cz#bir~Xma_E~;rX61UJTmM{IW>o*IMZr4r>Xk*QWp(Az%693d zlf7=vy}a0{z_s__MV^g)Kic>$KBS)CYV|VrMAFmxsiAlF9KHKa>SP^5_DSQzZ^ZQ? z>Q(t<=cafp>uVOj_^nfLle?{rx#~(o-8mH=>!Q03yjPhrW#e3nS^qpYH_2&h`Sl!o z@tsq9Q~9Cj(t=&*9-Whr>vXP+uQ-2lk@NH=%k4T`_CDMh74Cm0UQKM*D^JbHTwmq$ zM;>`}b)5^+Hx63&BJZ1v-OQ=hit_^XGIt)CJLlB=lD4Ilg}0|^tnm2aGE0$v7h~zp z(pQppT~SYsRf{`Ao<+G&TDjWtaH!?#O(ClV?tMCDz^gA2c2s(H?#nR#=XL5+jc2~) z-j?UD_0G!N*UST{C&}?w!1+`jB_N=aV;Ai*`Q|(Oamp^KM2a z_uEI?zjI#p%4?W>x_*gh@Y=ch+WZQQ=BrkIDfZ_3FzdF}qG-(zi)4Qt2@gB(x99Ay zTbw8VGZ_4x7uTtNm~}aiW^Bpvw42|ia~)#Wsw#Q$&CO;P>zYKD#k={f_bd0TPIWWQ zJX|Yf@ynmrlxNoLX(uB0B)QyL$nx`7`IjS_d^)~SSC=21miE-?o9MrShV8ohF7LPT zR8DfaW0N(b=W4)yiSwnt2N&sS|<)!OnX zWTB}>_9V-b2j|TGE39_V$E0A&YW4I zb3<$M@(x$yT+R$l^QtPB>L2#cy@O}Gnjf^<-fZC^?(Lz<@AQhK4HNn19t=6Qb~izw42(IhVd_iQ)xQkg%71gNzTNp8?-|LnbMNHB_-CfyQkE`0VZ;@CSXAD`==3F77m+O?3=A4C zbBd?(?3wJPR;U{>>&YGCK;g8n3nlpGB+oS9^bhjC(apniW?s;amYvt`KGF+RFlUaBp*I&)LuBiD%3*9ZMJHn$v_J9*m0 zX?N$jcyHSL@cQgIZ;Oks{;srTym$4=npIo28Se@!XuGU6%Q$fLq^h>I-updl?rKG| zpVqPL{#h*Ce_3>)z@fX(+}=Oz^Z5JgsH)#lCi7X_&L5w%d%^PS?E)oAESj886Ps(Q zD^``Sjhf+msy9t)orQHq?Mv;8M|o}bU9|jEdD-%=*158SC&iLpa_BVe+`;4Q?6I!p za#Zrnicc+jJ=RZ)?N6U%8S3t}XY#qHCwx==CU@mU?ocbz=J=H;a9)dt`{AZyqsUWN zZhcxRVwSUJ8Jkb*x1#oBgW0mBo6H{gZ!=}mo#tM3(OPWJs%a0+%Pt%f6zDhp}owMqMnpB#Dk z+Zm}vQ$mc^i8gZYlKt4wT_byDMx0DVtn|tNKWUqJ<`pHWK~F;)ulm~0(XnRL>u^$- zd{L?E%bfd7u5V3OFMAt0bK0dXw^?QjiY(l+`g&~K#8Pq$1|FIHBW z)oC+Fcgv^umzj>YzvFwmWbbS?m0bOt$!<%ZEoll+dTgvlv)%5t?O--6--1DJTLKQg*RXsNb*+SzhCrQ(^!!bjiS;%gMIUEHzZ+Y#*~ zq1>0;Ck`8jo%(!H^WTDA$@Z2@7xfiq3VEu}t2nZD%8e@pm!uZ2Ufk?2Hdo4tHS>># z@cH&?*1MBTqx=?a)VryYk((7C?o-@SH8J+&#=|FO-E#hSB(>G;u}9$i;QE=bPeztb zs%*0Jxq14k;lh)51*YA&{W9Rp>ch9XSE_{h$8PpM|7po9fwxt6|0;$r`PiBG>W8s% z)|O2#c71l8xg_oBx56)NAJzAWnQi?rUp7-YbI!HO%{du%iVqg+$?fD`?7!dR@jmU% zI+=_9Gx&MEx;N>a-A0*;Pg{(mK4#}V>s%&U8E!E*>uSwKjc3n3Jnu2jc;7L3$rEk) z-=1!34~tG{pXPG>^jU)$S9JT9ga=k1-x?|RqP06d&Sy`}r@P@At94f|U1nu3ai_HC zOLe`#&K&_A#*xXNg}u~%D=sPjvFGrut1j)I*1Mbzb=xs%>6+rrlNINw#D72igY9PS zYo?gpUQcIF2~D?f)t#0wUGcP>$NYOnKSi{bUifaueKf3AruWY+VQy~Snf~is6APC4 zZq=|VT3lJbp6B*?hW9fz-V(bmGv{Kn|E0G}MQ*3@PSiHjJUhDBeEh78m?s~mM^|Tj)3;SIDGrXR5X6@$O z`E&kUH=b4W`wQEWZ$3x=GfbIO!sb}z#%=Rk()jaNmp^QURnAL{7W(Bq^w_lNh^NkT zGbaYCANmZ1`m2@%opY;;){kCga-Ul*>RpoK^c>;KI@t$LY_jf>;BR4a`{WxJeY@*m z+vQEqeTxNtR$Mj_ao;^n`bcMhsd3h!Q$bsUjbBfg={2eFcWR68Hy4wdq?8pO(k&{U z&fDo}wWM^a{*+h8Z=N!{A-I~~?!cW@0Z)F)d&bP&cc!k&Q@W$&kCUS5*(J8MV&OeI zuP4^7nf+uXNBta+qC}T<(tmts&pWl#sZ4$G35y;}qbCgv41r+`49lDS*D zNEO4C>7@%m3o9WNGMls5?vRI@?dOE+@4h4+mV420rl89l&KLSO1TCeTOxH-RsY}b* z@9q)Pl^<`vf^#+>&%&2p@x|&5MN?A_Zdr8SH-3-(1lNs!m-SR``0ehJ$`MzQHGR?^ zw~WsZ)~w8V8)(Awv#8jwqDV;ai$hV@($ZC$Qb(rj?wE5a;aR?2R{i z&wsJ`+SI_?+1t`|PtQErdHU!@hK*Ok%tE|!QemGpD%^Gj;ADHaJzE@qt)m7P)W{MD+?xvKeTp*$!4Gl-@&p8ay3qhONU z#>G3#=h$4*f7NxUygW;!_?-IbSE;V%AroIu|Fhv6kM=`@;G;CpIi&+Q(N`t zqV1kJs(+l{Z`@LCe@bLt$XS_5E42g+Ev$swf_^`i{m+oGa$Dh)IrBs1?yuC{>TBhE zYDtR6MrhMn$i6r&irKXm~R7X6TO6sGT`y=2|*!N9;E zGJApQ_QrYl+qB+p^jz1uWc7#HFOJ_4bzDAkW6nR9XHm~st;;!OO}XlP*;*19`aRXm zbJVVIoHy|Gd}2R6X-d@k%Tu28D-vDRwc2utnEoKs1qs;8cxaFY3W z$!F=C8GDrirDq!{YSg`W75&|q-P~^Zlc~C9&qD2{n$0~mM_lV|?DnRXVE@8}5_}UX zr!hJ+^R3w<_oH;x*3;f8{VTp7d+mAe80+8W%m$~q6}l^uc1K?3ZZ+2Wy;bVlhX=uz za(_Sk#+fW9v2c4#d{K^Z(aK*c4o80;%q`B&eLQRKR;N~fKhw)wb9xrDUTDwP_qdi& z>y z!t_Y$!WA=d;c9Q@nOiLuZ3qhZtyY|IdB;TaC5zUbQVf~0_`%(Rd&+jIE+6x<=dSDd z#qVGS!Kyvd?=nML`U|1NZA_fB}4a!!7B9-q@D{e|)(b4$IhO)B2Ad^zv3 zUHe2Yc>MHhsb$kCKm10vqQBC1@yhFaE^DgVTKteNd%AkgrmueMmTIo*{It#9E#pgx zi)P3=6}jNAo35C?nXuk1~>6UgU(=k{1?v8rddrZN;#0_9_O~LBwBBBAYW?jcEIqeMQ#)Dx&y(#v%ell)c;6~qwfxe>v+Y|P z11Fmr@0+#itIB_dPZ@@samwB|r!MuK_UEISPN2i?%_*;4H16@-j(a-SJov8UwC#`Q z&%W`^M0~CU$H#QHyEVS|(p9Ey4w)RzS!pc)rL41Ps;y1qgT(2=qJLXg-Mo4Fz*)8{ zr$xWTYuyic6u*D|#Tj!SyLQTXy!pi6v1#daajD;3`z+*AKQt!3f86SxS}|+Z{=Z4T zk8E0?&@2${HDmWYp{(4e+Uw_ToxUgUSjcXdMYUB+&1Ss%Ui-`CwYS&yj>y-0{wOdPvQ|pxbfjc(LrZ=aF;%sqtUxw!k} zOQEQ`i4yw+SiW2-oAM<0*uAt;q4*V3Dry;pqSYR)y)#i|)8w>?#`c-3>Yp~;>ecCW zlAAhhPW!oe$L0kWr9Eue^YN3;%-7Qlf~yo)oC<#0S$lZOt<6@)!y6Ww&G8qjKj43{ z{*2+W%c;xsjfw?cP2c)f>LJtV=qk6(?95Y(Z{OJ#)ZM_)mT@j@-Gs%#(Uo6XPnw?a zkyz2$Rkv-@argax4Tm={N7yVkl#h$P`Rds9eV12xPYzoh>@rcYa&qJ9iMLiv-5-`Ap`w^y zH}9hRnog^;`x{(~o`_GZjGcCC}Y{yggCxO{Gz$H|pj=g(h#XkxYdi#sx1 z#nUG0b>4kdbmiB{S*JS-)ZEe^mBdMkUc0>h%Dbz}FZ0^XXc5_eB);Tf`e)TSJ0Hh7 zKQma8wPI;7%fy#AuAbX9X?|hgR?*2;UK@&ft~bSeSn41B*-Lzq-GK+Iycc?%dKs?0 zd8W$WLoIy^*`A+Cc6aw*V07?V1jqG+>#1|zZi>*@cs=5^{Je#mrEkkVb`S8Id3j3B zwX**VUp%Xg*Q^6wW!Pf-r@2a6Pi6UWTVdS=lJjjIEh=)kq-mb^xGnZy&;5q!IeV?X zS%!o>UzYIjo7cbMpwMu)g^Fb_51(0UW$O89cKr?iRjOtOPks$qa;m7PZpt2EZ}Wr+ z{|Y}(~ye{m! z8Y`m`?Dl8kOO+Ci@~}5;6H5<$R_w0so$oVk=JrLeHC0RVBSNNpJ~IFGJoOn}6aL%} zvg9b~u*~zfa+bxZMKJnchzQl`l?XD}PSEr{>I5)}l zQ~gqJ(K`=y?bgls@aw`Ig@fk09v4zVU$|fCKg(aD>3aUgImb(q8J0~IgDgxdA)$p>BC*z~r{^UD)mCOyo*d-U}39Uj}%U!{wz<9uztHY{-Va^5nd zRepu0d(`^f`edySnKs<=l`Ipzw%YHe?yiat&u)2M_n4#dHTEA(<4Aw};Mq!vs-ySBxM%uqS)Jn>>Tl_u>HB13(5v6>jV05+w>T$+ zZ7BAva9CBvc

0&RKsIm)?n{m(0~~NY_fG&QV%>H2dGYC3mMBdaz*W9c@0*29wR| z-o}$Hi(EoVS9)oQvQ)mxXqzkWgu>T{>}BMmLV_>YVvGvrb2?=k3e77;nA5DqXSsr3uTmfT>JZ zT^B5SC3rzK=B1oE@_15quGX40s_WI#r|)~v=d}J)y5O=eUt%8LwD+F3{j>WjgDfA( zM^Vi?&)<$}@1JvNUFVdQVhJ9p4Z~gNtrRUnK&=sBv!Pz{`u4T)kf9-s{ zOFmmt=g-=Qbq8|Wr)}7*yKb+?P0h6qKZAcvkN!JTqx93aUcnp3!cI@+zixSG|Bg`c10 z9(1p+^WoFZ)qmJNigT>$XZ+mqSifTJuG8kxRyNF=x<0rT=5JWuQ1m9frBF6_zS8nL zi5HeF+hTOB#dOgR2FAm!8%5&;+WSR!Zd(^}=GBuk3#Y$Yy4bL)^}D7vscqY{dIW-+U81`9G_yYR44W4Kf{eFJEM<8MoR`yoD~SP1xHT55m-C#m$LKWjfo;}v)7$E zz`)Vg0BV=GKC@X_b}~jwYE{Iu^w}qu>~en?7$j|2EWG>j5--MzX%GHRxNf*H@4V50 z;9ql|oZD;nlXJOo&&flUJ{~2XBy3qPr$}$oUYq5=;=Qh}kJo+fEw!GX`j?!{uA9R> z<$lGJx#}xsTDouAc}j2&>(!Qd31>d}mR(xXmbAG3+N<-&Vm^FneY7Bd#j1O?I`=bn zu6?K8Tlni|yzz%D1_t(77h7&D30S7y9ar;g|GSGEtQ>n5N-VjX^R-Ij`KRoH*_-km zB7>jsdVJB7OiAyU^dWo}qt?2sXU)^De+@LhEwD^y*-Bw;*&}*$Et}-6W>j2SQncM> zUao$M{WEL1C3X5a$-O6bZz~NcS-R=h^VhGUTHl^r?Yb7BhFHLJDcTJ z+QONR&S_sKcicXw&ATb8?94?Y%blmBFNjR**m2Wh;^C*Y=hUyf>33CqDatof9dvfm z0~V`o^D3?_xjFGK>w3<*Ih9UxgZ*p*-FFs$diF`9*5cFgJJRp%{}%5)dX3j}U!~MP z{;nl=KgWu@{+c>{N(ck5;8sw7tUGaO@Y6pFemJR@@=q$(S{^yk?5@@3X=*CAze;8= zo?tQSRgG8Lr7Onobd$rQuvZBqlBXTuQw=Mnh^5Gq=oL_z!VwUBz z_gNo}y>Gj*fAdW>c@=3{Uv2G=XHQHxUHNj&hnbtdai9Lq$?dXJP|;d(){UQaw=1_D z{<$sZ+``&reF2|4FKAj!`MEyun`_PP=?siL3%5G0$m|GHeD`JFiNvU7>*b|mc9)nM z9lM+E&%aaTKSOp+^+Lhp5A`}{UHaiY)lcj4iho;Ii`x8JSh3#boys_1Syfd`;!wOMbho-tH>4=0ul@rhv}|P4Bx5E!({3 zB*%!@Z0=vX!YXXv(y+-_gUT+4wLO~{RJdI3qVK7Q?*|N5O=iwZy&7b^J2qNhz3hIc zikej7KAHPE^E%$WZ-|?)Cs=cPOImrZs)1)#-TY-7kFxUO`?OXTiJQ9xvDUi#g+|Ae z_TGA6*PyjHy`JUPx-&;~yS$O`uWuI)Q zCy&>S+a^z0_Rs&#^YEC4A!E?)ZZ2c~Vok4Sm#0?V%USum+)2J7JXf-iW3R`ScOS16 z9Xo61G-r~R=aYvo1B=}ZFW-sZqRV!!u3lnAk!a@Ijlb6}3jGuw6<<7gUx=sPG@)0k z65FTMEY4lH&^l|m%v1Gi7Z(_x;klna+4IYz!&g3Cnc=7T#q`qG&&Sw`=GEDJcsu2O zMqO^KEPG4D{P=6_6$#?Ax{Gu7=zptw9;kD{wQ91pd=mcwq9gAHnwNafz z>tP(9saJkNZ}PqF8o52M-_**hysq81;ey!SXSWBAz@mZpc6#_asp_x$#RjNDA zW%aCu>wL>zirQ|pn{iw}N>)kd`OZ(Xa$+jNJAbTLYX0UAXXwHMZysd^tqi`$u9mw+ ze~roB-FseJs_VJ-|9C2ts<`~gm$O>uJQb%aYD_ov4r@+(dSX(+_mbXQHJ5uP{7G7T zW5ubnCr(X!_N%%=TVLS|1Gl2YsuTg zH}S*#Ynyf_t55#tpZd9Ta)`qHxJL;q{no|%82w^Cez;G6o$l-1zDp***7-DV;+iS- zcIM@CcL{!dP;|)pcS}NI^3k>Le$TGi(>gnHsl&vZ+e!`coL6sC%M+S#Gg;^vf3Dls zQ1;jfug!}6{i1)aTYmqf(2?MqQ&V-#zx=dSZ?Ca!Jen~lds6TIOY0!z}1eaN?uXU$VC* z&0l?NW#^A6TIW_+$-aL%#ngIs7FYXE)0l#a z;=KOl)N{_BDSKl3Ry}`#YnLon&5fOx=5y@V&MkirZ$0D3Gk=TplG|KnS}FY#7fxC} z_u1!72>>dp#Y{LUwpn3lJ9ZCd5pnLC0xSBq5a;|a+#J*oY&(O1^+@{1=jw`0#) z9E$h&$o4AQ#5!JW`!wgRH+k=!zn3PiJNu;d&#W&;3w3pDvX#rvtGgBb+U4{_TbzDC#5gQ<&|3FZRsg{;vQaYle&CSa;@0;ON!cZ!OQ1=X$+QTTbbJy zF}XHun}GS0=;`hnvyDqQ_>LVp(Emqey@Wyfyrix-leN#qY&6_C%ZmG+^34bH8@6Zv z21BWp{w46(c({Enz`CO_~bOJk_?G_-d^pH{+>B|X6~7893JyD_+M#WQO12{kv)+vMJM-8 zI;W}Wm)hYZY?pBC%{@bvuQflnn#XVUnmtb^Nv-+We}+Yx!Zpvm41YO!YW|EiS-N76 z;)$oOLQO3(vrkX6o$;SRP-)kdrB~LTI^AbuzHa@-Cw=pk<9qgee)eqoCR6dCnNI5u zuTA&e>B>5JhSzkL-GLP*M>bv*E_rA6Ve#}clW!TusI%UZm6>@W$z|CeC7qC>2@YL2yz)oTPmBsV#uRPGe zAk43$qU*#5S>tE=TQqsH&7!3WE18uZ>x-u;nlf<9#OyAd{p3^W=T~dqU%GK~ za!~szi9Z`<5_T{Me$wBrRC6i8<}~9A2KQ`G7xCT!1_nNkqqRo2vzA0IK9d!v^y^vM zjQLbMn$R`-2Sri$yJm3BZ{`RHx~u$z5HoPO4&Dm^)#nN&1RZPL6fiOHQZjkXy@u0 zg%DHQzinQPGWuVBOzD5%!5*fa^>h7{{Yjy7HGAp{Pe1(HKXFBx`)jRPs^6V`>OMSo zQck}4O6R25zYiasYc-s#nC=+uG|u~()2O#*n?R3CY}>VbZc){=;_1gc7mB2M%0HEv zC&l^Ay{5LY#IVKm@uN*MV{AMwniYA}maG&%sq{JY)A}$&@5zg2c>FHum{cWuY;9!P zjP(_kZ%=>QHf`0OQYEz?juAdrjJ#K$Gh*rc{5Sbo$Aqp!%M#shYku`NjaYGdX--JV z%H9_`COuJX6B8Y8dL{Kwo*Z;2SkH46>pR7g{BLdDeWz|d=CSk6y|QBFv#H6O%tLmT z{N#|5s?V}g5O{iOn{ABh%xR0i|2y$`L%x1xK+txs&wlo6R%d?dR>=QjRd^wOpWjJH*kr@X1-`CokVUy&!9mbWb4brc^Q4m*n&R8BPeU4E|W3-?GR3 z;@xG8-C~PuLt@r=3I&|`bxl)#i-+`E$)_)6eA#{<3rm|ZQ#M(5i}!`#h`Qi374`y2 z7fW5w#fOXdjmvqfkDu7;Z2A40m!-OJyVmLhwf?JO4;~fQJ1%td-m`aXc@Jji^3~PG z-|pDgbMR68tx)^R_rzbGFjaJslb%rcBE(I{M6a(tqIqG~OL33qivK1$NoDUaU956c zP`>Z9SatudEL_Z7zk7-G$z_)6SDKFzW)Coe31>HNJte0~=vob~99I_h%QFxen~;;~7eHE*+FKkH9i zYxwV$cca$MYhIoqr{-i|E@&}*@_Nb2#3K3|4PvvE1zY>nOUDIb4~_n z9Nn~Y;r#YapJh)j$=|5r{iHk9Qm`d|QhNdetJ({`iT%DO48$~f=d`O^uf8Q&xj;C3 zew6WooT=_1_A$Melg_#db)H{r_@&_R<#X?3YQ@eSv^?orso?d&Gi+;|==OhFb!TTk z$qHE}^mop!QkQ@~bL^iAFAfVd@?MyATku)zPPZdQ{F@4wEsM3gD^Fp!)t49*0 z%;sj-+%ItzbyZ%e`}B%U;@V`3>8od|RtLPDeoL;FKhj`#nD1}n`DwFeZi(9G(SD+& zU+Bd(@!iX0W*^V2%3YmxugQ8^il!EuYFBTM-ySPZfnzJII{7g!)azAcQxzEe+x~-n(SHU(e}9II zoR5|M1~YTSxf)hxn5UWxt=eSt;@=fTju+oq%jWM7>ssM5Piy_tsL#a#WslSC->h8x zkxzY-%|g=$ZuygiqTd8YSMSzxWxMTi)-vYziqcELB}(~zeIGvVYsivVQ>ry9Q8Zmg zZSDLO_wp{LZ1v+>maom{D|kufNU!VkMJe4fbFvMc+tqqMdMp%-Sv)!D%jInML`D7Q z&GWCyp19~0@n+4AKab|T56QPwkeVJAF7doCLe6&L=lIH1nW~Nt^H!Rk3$I_d`a=F0 zL+%OfnkH557q7g0cGT-^Tzz@kqIrEz$CRJt-8*@4?H~0kRma`)YpvEidKk3I|GLZF zxOI(U_gRngM^CxGDP>mhH@U)k!=oiJ_biW`l}ejjadS?e!`)yd*8nTaj&=3!%QY%O z{>kK)irT51>RB3jN=;QSX!V{ya}7GTyfCkbo0!+-t+P>3Q#{yh%MlfYNR zR;HY?S=*y5xWi&eo~_WodQb08m36ll%CcoHWU~9pzevjD_<~zZzRfw#J`>hX+!#9Z z&cx3mW@TDF=Vi0JC;zs~3wG8qm$G}o>1C8;w6U|@a{8gg_h#p>&o#|on0YzOrLB0* zETbLzYvLcsX1Z^5W2iDPhFe6@y4y3xl2sjetqnz?+9!+_uP78?VE|)&u;YCpO|3f z*tdDj?eE&Bvx+#lrk>kV`|#YYw0+UPsupgQ*|p=ar@6?zx0WuyXHRkHQx4Q!@L}hn zlzpooJi2^LxM|77eZfmv`IpA8eR-eZY=4xlf!K46--{}^@)d8Mz9u-O=kTYG4@*Aj ze>;^nF+R-gZhZG~zgoLZdk=n(={hMD&VAK3q3f2?J)d%pv}ex^E9|Qbc=MURG#?W? zwQ6lzq*zeFkCR)&L#G_~nboY!Y{VQBfsZ!~mN@AQ({1mm?JDGFiq)#DgMGE3`j3ej2R57%zTd_$+ed7TJ2Jr=q zLUO{#&w2E2$tnKHueC8q-QI5Qqo^Zk6+SEH);2C&b$?2_xwReN8WFvu%z2%oT zl}URms(JEu&rmiw_;**G|C9;a%;gIeL=S83v;5hrmvCs0{C7jC?W`v*=ga&nU3TT> z`L%YFXDa6_{+%oEjeW--<-xvTyC)w(CHoUeM#XVuG#a&tC5;am60SL;?a?^l~^{a19uHYcx1 zUz?H6a{ls@?nQ?0c)vaLsFSbo*1dLYlQgfFDU61*_I` zPL0l$-sV;4r?zU}^6p^&wY(S3%5O0~EAd@@$4)n^5AJ(zC3g6@$DMC3R-b(G&XLm- zO>X|!>-Oo|Evt{36~RJp+vaF*-n^+K{c84+RaGBTHogApdgb)V&mLd?X0*quPFi%` zdah?+%$*o1#o4zPPcgBHjmerfVSZGn%iNPUJeP%Xxy|0Gmv82(cyN|%z~w0EP2bBF z%Qc^`)tq*A>GE9T>83MH%`Me)Pp#yAXQIq_$UEomnkhcteunN{KFjWTwx_1|G`l`o z0WM?Hjz&lZ|IY(SYCb_gIse-QjX=&jKoW}TYCsUtXk81C9 zdx;Z2{%$#aslKJIDyWYcNU&^@Wc`4_v-gxWW zU0U7nyDLyqv~8VP0k3`OmT?(b+xOAHD_Np2#J#w0?3)(ggQ?iYttQ&6SUzx%lU{ z*`=JlAy;4icD~}b%JN>}qS*Lw#pBwQnp3iFOB=bgoO`(|+Bvy=di?|8BL;6uyo}tM zAKKZ*sf)I}o_<=_Eq-yWeVh7@oHaJN`7)RJr(M_AH=lI=oKfJvK<*`nqDsWh^=)|} z-TlWqoLcjt`Es$!){aB-r)j;`Uq5}xy$fIesD>^+bn{o5$p!Dl?v-u#4<66Dwk&7PuRZlzUQtVa*2e5vqUPT{dHvVkA8abyzQu(+ z4&zz+bW+?**N+b?*%yB5fo!ujh*9cp@#{Phye#RdpXqfUpV`&g zv|i->YrQ~P{npPFJuSxaAupfLof2UwrNKrYS3YB^Jc~OsGh;ubVN8$!UGa^oM++>qO?KX&>G-!O~}C-lM)%RwkM6 z1@1ohx?;{L!*)n5S;;W~x+HPN65!JHp;k0Agn{Mhbh=?rO zm{2kKJ<_U3P%X^Bz`z{Oz+m3K3B==Ldv0g5o4>UAQ00-QUA4;|{!`w^k)|vsxK1QX zB+SltWr*OH;{N47IKG!G^M7Lb35K-8ZTcNx#n5hLe1$%Dot-* zy(0Tb^>aYK-lWxXeJ5NeU3V%|4fi~C;#+&6^Qt9VZC`(|zkEqjNqgI><#SV=M2bbmMus$qe}r zmz_&{6oRIyeJz>2!&7q4g`PV>Hc^W|Oo%*XE8_K(rL^jc>0R}3yPTbSS$RD_>k1pn z|8Duu5M=$~d(rY66~_)|+B$7Js8+JSJN>@y?iDplUyIr7ZgmDyr+s-2e_kE*pTQ$?%kx!!z9owL7f;!tZ%#Y}qGpVr?wnlZ6co!d(Fj3?dB-jH!oPqBmP! zvkX-96qa~y=QK^=%P~cvsA%4kW%?}VUdMRl-HM8w>Kwc$RBUF_EDjUiUFF{Bxkgdtxv#34{H~hpU;9j$ zdAn6Z@=<|a|rw(gR+f%JKInz+wf8z^Tp8i9wai$(`S4k&p z&B^&yY%~4rl>7s6J3mjeGWo?Gv&GsbJ^R`EjfR#FbY|xMs%p}R_~AMK{L=k1-*%_v zeRVflT5W9jIzW1qaESy{7p1r2$mf6Iqfnlfo zy-o^hSLSS8DCn%1$ZJ`Zd|xi$+{TX%S3{?X-mqC3QE|1>`)u*Fquvq8>OwE>a^zor z)8hPD)0Inoj^^5l56z`5?*|Egc-))$beY1 zcRo6OxvK8SVD`t zf5O>C+e&#_gya7>9d>a}JgU+j8sw2BRI@RuYkx@TjL3PpB0i6t>ffw>J^7nN^2YxR zx1W3M=lP}FSO4li16T6%b(_~O{?EXCfPujz9aN<=dhTMImTZ!)J$YxnQPFI(-qWI@ zp}_}QbQCX39EqKACfYmYz5E$5Z8zPZuI^REFEl+lijFDC=|8=$(z$ZuJ!rs zxNLLHoa|$=evia2h&`XI61DjA@mJG-wjRw1{brdZ@K$tj{*vZ9e;?XKWjrn2`ON)= zyu(t<$%l$%=KQQq?{VIC?}pzLshiXx@4uYofeFaV>L{76XGtL0>RE?!{fUo}nXdgCWw>4{f5e<%N(I>9RKYsoYN0r}iJx>h5BlLyQCLpbMGEf z^Y^vix!^%y@5Ft}{|2U<(ur9wrk-+9V@ZVTLAlM!ljLJ&-4eO>{Om0Dwz*bSt{-#e cT{}N-UCg$V)n@y5FfhnUf|@G`Z2$iz0Qo;wh5!Hn literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index c5acf73..20f3382 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -146,6 +146,12 @@ Nhận bản beta Bản beta có thể ko tương thích + + Dự án HideMyAppList đã thành mã nguồn đóng và repository của họ không chứa code của các thay đổi mới trên phiên bản mới hơn, vì thế nên tôi đã tạo ra cái fork này để tiếp tục nó như là mã nguồn mở. + + Về các thay đổi do tôi tự làm + Về fork của frknkrc44 + Tôi KHÔNG thích việc app được đặt tên là HMA-OSS vì nó sẽ gây nhầm lẫn với HMA VPN, vì thế nên tôi đã fork về và tự đổi tên thành theo ý riêng mình. Mặc dù việc phát hiện cài đặt ứng dụng cụ thể là không chính xác, nhưng không phải mọi ứng dụng sử dụng root đều cung cấp hỗ trợ tên gói ngẫu nhiên. Trong trường hợp này, các ứng dụng được phát hiện sử dụng quyền root (chẳng hạn như Fake GPS) tương đương với chính ứng dụng gốc được phát hiện. \n\n Đồng thời, một số ứng dụng thông minh sử dụng nhiều kẽ hở khác nhau để lấy danh sách ứng dụng của bạn, để nó có thể thu hút một cá tính dành cho bạn. \n\nMô-đun này cung cấp một số phương pháp để kiểm tra xem bạn đã ẩn danh sách ứng dụng của mình hay chưa. Ngoài ra, nó có thể hoạt động như một mô-đun Xposed để ẩn một số ứng dụng hoặc từ chối các yêu cầu danh sách ứng dụng để bảo vệ quyền riêng tư của bạn. Làm sao để dùng mô đun này diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0548ea3..3cfc0f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,7 +11,7 @@ Select apps App settings About - About this fork + About frknkrc44\'s fork Do not install HMAL to secondary user Show crash log @@ -170,6 +170,8 @@ 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. + About my personal changes + I don\'t like the app being named as HMA-OSS as it will conflict with HMA VPN app so i forked this and changing name to HMAL-OSS myself. How to use this module 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. From 4b8ce7737c5b17275fe3f1257d3e42ac998c2bb0 Mon Sep 17 00:00:00 2001 From: cvnertnc <148134890+cvnertnc@users.noreply.github.com> Date: Sat, 6 Sep 2025 19:08:10 +0300 Subject: [PATCH 04/28] Update Turkish translations (WIP) (#1) * app/src/main/res: update values-tr-rTR strings.xml Co-authored-by: cvnertnc * app: fixed values-tr-rTR strings.xml Co-authored-by: cvnertnc --- app/src/main/res/values-tr-rTR/strings.xml | 286 ++++++++++++--------- 1 file changed, 169 insertions(+), 117 deletions(-) diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 5897a03..12ccc24 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -1,23 +1,24 @@ - Ev - Kütükler + Ana Sayfa + Kayıtlar Ayarlar - Şablon Yönetimi + Şablonları Yönet Şablon Ayarları - Uygulama yöneticisi + Uygulamaları Yönet Uygulama Seç - Uygulama ayarları + Uygulama Ayarları Hakkında - HMAL\'yı 2. Kullanıcı Hesabına Yüklemeyin - Kilitlenme günlüğünü göster - Ayar Dosyası Bozuk. Uygulama Önbelleğini Silin - Listeyi Düzenle + Bu Çatal Hakkında + HMA’yı ikincil kullanıcıya yüklemeyin + Çökme kaydını göster + Yapılandırma dosyası hasarlı. Lütfen uygulama verilerini temizleyin + Listeyi düzenle Sil Etkin - Disabled + Devre Dışı Çalışma Modu - Karaliste + Kara Liste Beyaz Liste Uygulama Tercihler @@ -26,130 +27,181 @@ Evet Hayır Ara - System + Sistem + Sistemi Takip Et + - Modül Aktif [%s] - Modül Aktif Değil - Sistem hizmeti çalışıyor [%d] + Modül Etkin [%s] + Modül Etkin Değil + Sistem servisi çalışıyor [%d] Sistem servisi çalışmıyor - Modül güncellendi, yeniden başlatma gerekli - HMAL, Toplam %d isteği filtreledi - Manage + Modül güncellendi, yeniden başlatma gerekiyor + HMA-OSS toplam %d isteği filtreledi + Yönet Tespit testi - Test uygulamasını indir - Bir tespit testi uygulaması geliştirdik ve tespit testini birleştirdik. İndirmek istiyor musun? + Test uygulaması indir + Bireysel bir tespit test uygulaması geliştirdik ve tespit testini bu uygulamaya taşıdık. Şimdi indirmek ister misiniz? Yedekle & Geri Yükle - Yedekle - Geri yükle + Yapılandırmayı yedekle + Yapılandırmayı geri yükle İçe aktarma başarılı İçe aktarma başarısız - Modül versiyonu yedekten eski - Yedek versiyonu çok eski - Yedek dosyası bozuk + Modül sürümü yedeğinkinden düşük + Yedek sürümü çok eski + Yedek dosyası hasarlı Dışa aktarma başarısız - Ayarlar yedeklendi - Yeni güncelleme : %s + Yapılandırma yedeklendi + Yeni güncelleme mevcut: %s Güncelleme: %s + Sistem uygulamalarını göster Sıralama - Reverse order - By app name - By package name - By install time - By update time - - Establish templates for \"restless\" apps, controlling applist they can obtain.\n\nBlacklist (recommended): the apps selected in the template will be invisible to the apps applying the template.\nWhitelist: the apps not selected in the template will be invisible to the apps applying the template. - Create a blacklist template - Create a whitelist template - Are you sure to delete the template? - Template name - Name invalid - Delete Template - Template name already exist - Applied to %d apps - %d apps visible - %d apps invisible + Ters sırala + Uygulama adına göre + Paket adına göre + Yükleme zamanına göre + Güncelleme zamanına göre + + + "Huzursuz" uygulamalar için şablonlar oluşturun ve bu uygulamaların hangi uygulama listesini görebileceğini kontrol edin.\n\nKara liste (önerilen): Şablonda seçilen uygulamalar, şablonu uygulayan uygulamalar için görünmez olacaktır.\nBeyaz liste: Şablonda seçilmeyen uygulamalar, şablonu uygulayan uygulamalar için görünmez olacaktır. + Kara liste şablonu oluştur + Beyaz liste şablonu oluştur + Şablonu silmek istediğinizden emin misiniz? + Şablon adı + Geçersiz ad + Şablonu Sil + Şablon adı zaten var + %d uygulamaya uygulandı + %d uygulama görünür + %d uygulama görünmez + - Enable hide - Template config - Choose template - Exclude system apps - Turn off this option only when really necessary. It is likely to cause crash with it disabled - Using %d templates - %d additional apps visible - %d additional apps invisible + Gizlemeyi etkinleştir + Şablon yapılandırması + Şablon seç + Ön ayar seç + Sistem uygulamalarını hariç tut + Bu seçeneği yalnızca gerçekten gerekliyse kapatın. Kapalıyken çökme riski yüksektir + %d şablon kullanılıyor + %d ön ayar kullanılıyor + %d ayar ön ayarı kullanılıyor + %d ek uygulama görünür + %d ek uygulama görünmez + Riskli paket + Bu paket riskli olarak işaretlenmiş ve gizli uygulamalarda sorunlara neden olabilir. Devam etmek istiyor musunuz? + Sahteleme + Yükleme kaynaklarını gizle + Bu uygulama için tüm kullanıcı uygulamaları Play Store üzerinden yüklenmiş gibi görünecek + Sistem uygulamalarını da gizle + Bu uygulama için tüm sistem uygulamaları hiçbir şey üzerinden yüklenmemiş gibi görünecek + Hedef uygulamayı hariç tut + Bu uygulamayı Play Store’da bulamıyorsanız etkinleştirin + Yapılandırmayı kaydettikten sonra hedef uygulamayı zorla durdurmayı unutmayın + + + LSPosed/Xposed modülleri + Root yöneticileri/Rootlu uygulamalar + Özel ROM uygulamaları + + + Erişilebilirlik + Geliştirici seçenekleri + - Save logs - Clear logs - No logs to save - Logs saved + Kayıtları kaydet + Kayıtları temizle + Kaydedilecek kayıt yok + Kayıtlar kaydedildi + - Module - Data isolation - App data: %s\nVold app data: %s\nForce mount: %s - This option is only available on Android 11 and above - App data isolation - Vold app data isolation - Changing requires root permission - Changing requires reboot - Permission denied - Enforce data isolation for all apps - Data isolation is disabled for apps target API lower than 30 by default - Detail log for debugging - Logger buffer sizes - Hide module icon in launcher - You can still open the app in Xposed manager - Language - Participate in translation - Help us translate %s into your language - Theme - System theme color - Theme color - Dark theme - Pure black dark theme - Use the pure black theme if dark theme is enabled - Service - Stop system service - Need reboot to restart service - Clean runtime environment at the same time? - Remove system service cache in /data/misc/hide_my_applist_*. This means you need to launch the module app once manually after next reboot in order to enable interceptions, and interception counts will also be cleaned. - Force clean runtime environment (root) - Only if system service fails to start, otherwise you should click the above option. - Runtime environment cleaned - Update - Disable update notification - Receive beta update - Beta version may be unstable + Modül + Veri izolasyonu + Uygulama verisi: %s\nVold uygulama verisi: %s\nZorla bağla: %s + Bu seçenek yalnızca Android 11 ve üstünde kullanılabilir + Uygulama verisi izolasyonu + Vold uygulama verisi izolasyonu + Uyarı + Bu, AOSP özelliğini etkinleştirerek uygulamanın harici özel depolama dizinini izole eder. Bu, uygulamaları gizlemeye yardımcı olabilir ancak kararlılık sorunlarına neden olabilir. Bu özellik herhangi bir zamanda çalışmayı durdurabilir, çünkü AOSP tarafından terk edilmiştir. + Değişiklik için root izni gerekiyor + Değişiklik için yeniden başlatma gerekiyor + İzin reddedildi + Tüm uygulamalar için veri izolasyonunu zorla + API seviyesi 30’un altında olan uygulamalar için veri izolasyonu varsayılan olarak devre dışıdır + Hata ayıklama için detaylı kayıt + Kayıt arabelleği boyutları + Başlatıcıda modül simgesini gizle + Uygulamayı Xposed yöneticisinden açabilirsiniz + Riskli paket uyarısını atla + Bu özelliği etkinleştirmeden önce veya sonra riskli paketle ilgili sorunlardan geliştiriciler sorumlu değildir + + Dil + Çeviriye katkıda bulun + %s’i kendi dilinize çevirmemize yardımcı olun + + Tema + Sistem tema rengi + Tema rengi + Koyu tema + Saf siyah koyu tema + Koyu tema etkinse saf siyah temayı kullan + + Servis + Sistem servisini durdur + Servisi yeniden başlatmak için yeniden başlatma gerekiyor + Çalışma zamanı ortamını temizle? + /data/misc/hide_my_applist_* içindeki sistem servisi önbelleğini kaldırır. Bu, bir sonraki yeniden başlatmadan sonra modül uygulaması el ile başlatılmalıdır ve müdahale sayımları da temizlenecektir. + Çalışma zamanı ortamını zorla temizle (root) + Sadece sistem servisi başlatılamazsa bu seçeneği kullanın, aksi takdirde yukarıdaki seçeneği tıklayın. + Çalışma zamanı ortamı temizlendi + + Güncelleme + Güncelleme bildirimini devre dışı bırak + Beta güncellemelerini al + Beta sürümleri kararsız olabilir + - Although It is incorrect to detect specific app installation, yet not every app using root provides random package name support. In this case, detected apps that use root (such as Fake Location and Storage Isolation) is equal to detected root itself.\n\nAt the same time, some smart apps use various loopholes to acquire your app list, so that it can draw a persona for you.\n\nThis module provides some methods to test whether you have already hidden your applist nicely. Also, it can work as an Xposed module to hide some apps or reject app list requests to protect your privacy. + + Belirli bir uygulamanın yüklü olup olmadığını tespit etmek yanlış olsa da, root kullanan her uygulama rastgele paket adı desteği sunmaz. Bu durumda, root kullanan tespit edilen uygulamalar (örneğin, Sahte Konum ve Depolama İzolasyonu), root’un kendisinin tespit edilmesiyle eşdeğerdir.\n\nAynı zamanda, bazı akıllı uygulamalar, uygulama listenizi elde etmek için çeşitli açıkları kullanır, böylece sizin için bir profil çizebilir.\n\nBu modül, uygulama listenizi başarıyla gizleyip gizlemediğinizi test etmenin bazı yollarını sunar. Ayrıca, bir Xposed modülü olarak çalışarak bazı uygulamaları gizlemek veya uygulama liste isteklerini reddederek gizliliğinizi korumak için kullanılabilir. - How to use this module - You can create templates in \"Template manage\".\nThen apply the templates to apps in \"App manage\". (You can also select extra apps for targets.)\nYou should and ONLY should check \"System Framework\" in Xposed module scope / whitelist. + + Orijinal HMA projesi kapalı kaynak haline geldi ve en son kodları bazı son değişiklikleri içermiyordu, bu yüzden bu çatalı oluşturup projeyi tekrar açık kaynak olarak sürdürmeye karar verdim. - Config modification effective in real time. + Bu modülü nasıl kullanırsınız + + "Şablonları Yönet" bölümünde şablonlar oluşturabilirsiniz.\nSonra "Uygulamaları Yönet" bölümünde uygulamalara şablonları uygulayabilirsiniz. (Hedefler için ek uygulamalar da seçebilirsiniz.)\nXposed modül kapsamında/beyaz listede YALNIZCA "Sistem Çerçevesi"ni işaretlemelisiniz. - Developer - Support and feedback - Open source licenses + + Yapılandırma değişiklikleri gerçek zamanlı olarak etkilidir. + + Geliştirici + Destek ve geri bildirim + Açık kaynak lisansları + Sakura - Red - Pink - Purple - Deep purple - Indigo - Blue - Light blue - Cyan - Teal - Green - Light green - Lime - Yellow - Amber - Orange - Deep orange - Brown - Blue grey + Kırmızı + Pembe + Mor + Koyu mor + Çivit mavisi + Mavi + Açık mavi + Camgöbeği + Çuha çiçeği yeşili + Yeşil + Açık yeşil + Limet + Sarı + Kehribar + Turuncu + Koyu turuncu + Kahverengi + Mavi gri + + + Koyu tema + Her zaman kapalı + Her zaman açık + From 1180bd5899840aacddadbd60295b0f61578a16ce Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 01:08:13 +0700 Subject: [PATCH 05/28] Revert "Update Turkish translations (WIP) (#1)" This reverts commit 4b8ce7737c5b17275fe3f1257d3e42ac998c2bb0. --- app/src/main/res/values-tr-rTR/strings.xml | 286 +++++++++------------ 1 file changed, 117 insertions(+), 169 deletions(-) diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 12ccc24..5897a03 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -1,24 +1,23 @@ - Ana Sayfa - Kayıtlar + Ev + Kütükler Ayarlar - Şablonları Yönet + Şablon Yönetimi Şablon Ayarları - Uygulamaları Yönet + Uygulama yöneticisi Uygulama Seç - Uygulama Ayarları + Uygulama ayarları Hakkında - Bu Çatal Hakkında - HMA’yı ikincil kullanıcıya yüklemeyin - Çökme kaydını göster - Yapılandırma dosyası hasarlı. Lütfen uygulama verilerini temizleyin - Listeyi düzenle + HMAL\'yı 2. Kullanıcı Hesabına Yüklemeyin + Kilitlenme günlüğünü göster + Ayar Dosyası Bozuk. Uygulama Önbelleğini Silin + Listeyi Düzenle Sil Etkin - Devre Dışı + Disabled Çalışma Modu - Kara Liste + Karaliste Beyaz Liste Uygulama Tercihler @@ -27,181 +26,130 @@ Evet Hayır Ara - Sistem - Sistemi Takip Et - + System - Modül Etkin [%s] - Modül Etkin Değil - Sistem servisi çalışıyor [%d] + Modül Aktif [%s] + Modül Aktif Değil + Sistem hizmeti çalışıyor [%d] Sistem servisi çalışmıyor - Modül güncellendi, yeniden başlatma gerekiyor - HMA-OSS toplam %d isteği filtreledi - Yönet + Modül güncellendi, yeniden başlatma gerekli + HMAL, Toplam %d isteği filtreledi + Manage Tespit testi - Test uygulaması indir - Bireysel bir tespit test uygulaması geliştirdik ve tespit testini bu uygulamaya taşıdık. Şimdi indirmek ister misiniz? + Test uygulamasını indir + Bir tespit testi uygulaması geliştirdik ve tespit testini birleştirdik. İndirmek istiyor musun? Yedekle & Geri Yükle - Yapılandırmayı yedekle - Yapılandırmayı geri yükle + Yedekle + Geri yükle İçe aktarma başarılı İçe aktarma başarısız - Modül sürümü yedeğinkinden düşük - Yedek sürümü çok eski - Yedek dosyası hasarlı + Modül versiyonu yedekten eski + Yedek versiyonu çok eski + Yedek dosyası bozuk Dışa aktarma başarısız - Yapılandırma yedeklendi - Yeni güncelleme mevcut: %s + Ayarlar yedeklendi + Yeni güncelleme : %s Güncelleme: %s - Sistem uygulamalarını göster Sıralama - Ters sırala - Uygulama adına göre - Paket adına göre - Yükleme zamanına göre - Güncelleme zamanına göre - - - "Huzursuz" uygulamalar için şablonlar oluşturun ve bu uygulamaların hangi uygulama listesini görebileceğini kontrol edin.\n\nKara liste (önerilen): Şablonda seçilen uygulamalar, şablonu uygulayan uygulamalar için görünmez olacaktır.\nBeyaz liste: Şablonda seçilmeyen uygulamalar, şablonu uygulayan uygulamalar için görünmez olacaktır. - Kara liste şablonu oluştur - Beyaz liste şablonu oluştur - Şablonu silmek istediğinizden emin misiniz? - Şablon adı - Geçersiz ad - Şablonu Sil - Şablon adı zaten var - %d uygulamaya uygulandı - %d uygulama görünür - %d uygulama görünmez - + Reverse order + By app name + By package name + By install time + By update time + + Establish templates for \"restless\" apps, controlling applist they can obtain.\n\nBlacklist (recommended): the apps selected in the template will be invisible to the apps applying the template.\nWhitelist: the apps not selected in the template will be invisible to the apps applying the template. + Create a blacklist template + Create a whitelist template + Are you sure to delete the template? + Template name + Name invalid + Delete Template + Template name already exist + Applied to %d apps + %d apps visible + %d apps invisible - Gizlemeyi etkinleştir - Şablon yapılandırması - Şablon seç - Ön ayar seç - Sistem uygulamalarını hariç tut - Bu seçeneği yalnızca gerçekten gerekliyse kapatın. Kapalıyken çökme riski yüksektir - %d şablon kullanılıyor - %d ön ayar kullanılıyor - %d ayar ön ayarı kullanılıyor - %d ek uygulama görünür - %d ek uygulama görünmez - Riskli paket - Bu paket riskli olarak işaretlenmiş ve gizli uygulamalarda sorunlara neden olabilir. Devam etmek istiyor musunuz? - Sahteleme - Yükleme kaynaklarını gizle - Bu uygulama için tüm kullanıcı uygulamaları Play Store üzerinden yüklenmiş gibi görünecek - Sistem uygulamalarını da gizle - Bu uygulama için tüm sistem uygulamaları hiçbir şey üzerinden yüklenmemiş gibi görünecek - Hedef uygulamayı hariç tut - Bu uygulamayı Play Store’da bulamıyorsanız etkinleştirin - Yapılandırmayı kaydettikten sonra hedef uygulamayı zorla durdurmayı unutmayın - - - LSPosed/Xposed modülleri - Root yöneticileri/Rootlu uygulamalar - Özel ROM uygulamaları - - - Erişilebilirlik - Geliştirici seçenekleri - + Enable hide + Template config + Choose template + Exclude system apps + Turn off this option only when really necessary. It is likely to cause crash with it disabled + Using %d templates + %d additional apps visible + %d additional apps invisible - Kayıtları kaydet - Kayıtları temizle - Kaydedilecek kayıt yok - Kayıtlar kaydedildi - + Save logs + Clear logs + No logs to save + Logs saved - Modül - Veri izolasyonu - Uygulama verisi: %s\nVold uygulama verisi: %s\nZorla bağla: %s - Bu seçenek yalnızca Android 11 ve üstünde kullanılabilir - Uygulama verisi izolasyonu - Vold uygulama verisi izolasyonu - Uyarı - Bu, AOSP özelliğini etkinleştirerek uygulamanın harici özel depolama dizinini izole eder. Bu, uygulamaları gizlemeye yardımcı olabilir ancak kararlılık sorunlarına neden olabilir. Bu özellik herhangi bir zamanda çalışmayı durdurabilir, çünkü AOSP tarafından terk edilmiştir. - Değişiklik için root izni gerekiyor - Değişiklik için yeniden başlatma gerekiyor - İzin reddedildi - Tüm uygulamalar için veri izolasyonunu zorla - API seviyesi 30’un altında olan uygulamalar için veri izolasyonu varsayılan olarak devre dışıdır - Hata ayıklama için detaylı kayıt - Kayıt arabelleği boyutları - Başlatıcıda modül simgesini gizle - Uygulamayı Xposed yöneticisinden açabilirsiniz - Riskli paket uyarısını atla - Bu özelliği etkinleştirmeden önce veya sonra riskli paketle ilgili sorunlardan geliştiriciler sorumlu değildir - - Dil - Çeviriye katkıda bulun - %s’i kendi dilinize çevirmemize yardımcı olun - - Tema - Sistem tema rengi - Tema rengi - Koyu tema - Saf siyah koyu tema - Koyu tema etkinse saf siyah temayı kullan - - Servis - Sistem servisini durdur - Servisi yeniden başlatmak için yeniden başlatma gerekiyor - Çalışma zamanı ortamını temizle? - /data/misc/hide_my_applist_* içindeki sistem servisi önbelleğini kaldırır. Bu, bir sonraki yeniden başlatmadan sonra modül uygulaması el ile başlatılmalıdır ve müdahale sayımları da temizlenecektir. - Çalışma zamanı ortamını zorla temizle (root) - Sadece sistem servisi başlatılamazsa bu seçeneği kullanın, aksi takdirde yukarıdaki seçeneği tıklayın. - Çalışma zamanı ortamı temizlendi - - Güncelleme - Güncelleme bildirimini devre dışı bırak - Beta güncellemelerini al - Beta sürümleri kararsız olabilir - + Module + Data isolation + App data: %s\nVold app data: %s\nForce mount: %s + This option is only available on Android 11 and above + App data isolation + Vold app data isolation + Changing requires root permission + Changing requires reboot + Permission denied + Enforce data isolation for all apps + Data isolation is disabled for apps target API lower than 30 by default + Detail log for debugging + Logger buffer sizes + Hide module icon in launcher + You can still open the app in Xposed manager + Language + Participate in translation + Help us translate %s into your language + Theme + System theme color + Theme color + Dark theme + Pure black dark theme + Use the pure black theme if dark theme is enabled + Service + Stop system service + Need reboot to restart service + Clean runtime environment at the same time? + Remove system service cache in /data/misc/hide_my_applist_*. This means you need to launch the module app once manually after next reboot in order to enable interceptions, and interception counts will also be cleaned. + Force clean runtime environment (root) + Only if system service fails to start, otherwise you should click the above option. + Runtime environment cleaned + Update + Disable update notification + Receive beta update + Beta version may be unstable - - Belirli bir uygulamanın yüklü olup olmadığını tespit etmek yanlış olsa da, root kullanan her uygulama rastgele paket adı desteği sunmaz. Bu durumda, root kullanan tespit edilen uygulamalar (örneğin, Sahte Konum ve Depolama İzolasyonu), root’un kendisinin tespit edilmesiyle eşdeğerdir.\n\nAynı zamanda, bazı akıllı uygulamalar, uygulama listenizi elde etmek için çeşitli açıkları kullanır, böylece sizin için bir profil çizebilir.\n\nBu modül, uygulama listenizi başarıyla gizleyip gizlemediğinizi test etmenin bazı yollarını sunar. Ayrıca, bir Xposed modülü olarak çalışarak bazı uygulamaları gizlemek veya uygulama liste isteklerini reddederek gizliliğinizi korumak için kullanılabilir. + Although It is incorrect to detect specific app installation, yet not every app using root provides random package name support. In this case, detected apps that use root (such as Fake Location and Storage Isolation) is equal to detected root itself.\n\nAt the same time, some smart apps use various loopholes to acquire your app list, so that it can draw a persona for you.\n\nThis module provides some methods to test whether you have already hidden your applist nicely. Also, it can work as an Xposed module to hide some apps or reject app list requests to protect your privacy. - - Orijinal HMA projesi kapalı kaynak haline geldi ve en son kodları bazı son değişiklikleri içermiyordu, bu yüzden bu çatalı oluşturup projeyi tekrar açık kaynak olarak sürdürmeye karar verdim. + How to use this module + You can create templates in \"Template manage\".\nThen apply the templates to apps in \"App manage\". (You can also select extra apps for targets.)\nYou should and ONLY should check \"System Framework\" in Xposed module scope / whitelist. - Bu modülü nasıl kullanırsınız - - "Şablonları Yönet" bölümünde şablonlar oluşturabilirsiniz.\nSonra "Uygulamaları Yönet" bölümünde uygulamalara şablonları uygulayabilirsiniz. (Hedefler için ek uygulamalar da seçebilirsiniz.)\nXposed modül kapsamında/beyaz listede YALNIZCA "Sistem Çerçevesi"ni işaretlemelisiniz. + Config modification effective in real time. - - Yapılandırma değişiklikleri gerçek zamanlı olarak etkilidir. - - Geliştirici - Destek ve geri bildirim - Açık kaynak lisansları - + Developer + Support and feedback + Open source licenses Sakura - Kırmızı - Pembe - Mor - Koyu mor - Çivit mavisi - Mavi - Açık mavi - Camgöbeği - Çuha çiçeği yeşili - Yeşil - Açık yeşil - Limet - Sarı - Kehribar - Turuncu - Koyu turuncu - Kahverengi - Mavi gri - - - Koyu tema - Her zaman kapalı - Her zaman açık + Red + Pink + Purple + Deep purple + Indigo + Blue + Light blue + Cyan + Teal + Green + Light green + Lime + Yellow + Amber + Orange + Deep orange + Brown + Blue grey - From bdc2e446cb5662c5e37ad1a7ed578878c3fb53b6 Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 01:58:41 +0700 Subject: [PATCH 06/28] feat: WebViewPreset.kt: new preset this is weird preset, but useful for disabling ads on the MBBank/MBCP app Signed-off-by: Cuynu --- app/src/main/res/values-vi-rVN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../hidemyapplist/common/AppPresets.kt | 2 ++ .../common/app_presets/WebViewPreset.kt | 29 +++++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 20f3382..7a9da6e 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -98,6 +98,7 @@ Mô-đun LSPosed/Xposed Các app quản lý root/App root Các app từ custom ROM + Các ứng dụng WebView Quyền trợ năng (Accessibility) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3cfc0f0..ec2047b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,6 +108,7 @@ LSPosed/Xposed modules Root managers/Rooted apps Custom ROM apps + WebView apps Accessibility diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt index 91a0656..73851b7 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt @@ -7,6 +7,7 @@ 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.RootAppsPreset +import icu.nullptr.hidemyapplist.common.app_presets.WebViewPreset import icu.nullptr.hidemyapplist.common.app_presets.XposedModulesPreset // TODO: Update presets when package added/removed @@ -93,6 +94,7 @@ class AppPresets private constructor() { init { presetList.add(CustomROMPreset()) + presetList.add(WebViewPreset()) presetList.add(RootAppsPreset()) presetList.add(XposedModulesPreset()) } diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt new file mode 100644 index 0000000..6ee3d5b --- /dev/null +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt @@ -0,0 +1,29 @@ +package icu.nullptr.hidemyapplist.common.app_presets + +import android.content.pm.ApplicationInfo + +class WebViewPreset() : BasePreset("webview") { + override val exactPackageNames = setOf( + "com.android.webview", + "com.google.android.webview", + ) + + override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean { + val packageName = appInfo.packageName + + if (containsPackage(packageName)) { + return false + } + + // AOSP WebView + if (packageName.startsWith("com.android.webview")) { + return true + } + + if (packageName.startsWith("com.google.android.webview")) { + return true + } + + return false + } +} From ced2a93b48bcda0a2cc67ce5faf9d687243cba2b Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 11:10:03 +0700 Subject: [PATCH 07/28] feat: WebViewPreset.kt: add support for mulch webview found on crdroid Signed-off-by: Cuynu --- .../nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt index 6ee3d5b..cfb585a 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt @@ -6,6 +6,7 @@ class WebViewPreset() : BasePreset("webview") { override val exactPackageNames = setOf( "com.android.webview", "com.google.android.webview", + "us.spotco.mulch_ww" ) override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean { @@ -24,6 +25,9 @@ class WebViewPreset() : BasePreset("webview") { return true } + if (packageName.startsWith("us.spotco.mulch_ww")) { + return true + } return false } } From 91184f643f23eddb6d3141128db8c5ac6996b459 Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 11:55:16 +0700 Subject: [PATCH 08/28] feat: about: move myself to fake dev category im not a dev Signed-off-by: Cuynu --- .../icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt | 3 +++ app/src/main/res/values-vi-rVN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 5 insertions(+) diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt index 8949de8..c5869a0 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt @@ -49,6 +49,9 @@ class AboutActivity : AbsAboutActivity() { items.add(Contributor(R.drawable.cont_icon_designer, "辉少菌", "Icon designer", "http://www.coolapk.com/u/1560270")) items.add(Line()) items.add(Contributor(R.drawable.cont_cpp_master, "LoveSy", "Idea provider", "https://github.com/yujincheng08")) + + + items.add(Category(getString(R.string.about_fakedev))) items.add(Contributor(R.drawable.cont_cuynu, "Cuynu", "loser?", "https://git.disroot.org/cuynu")) items.add(Category(getString(R.string.about_support))) diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 7a9da6e..e0c683c 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -159,6 +159,7 @@ Bạn có thể tạo danh mục trong \"Quản lý danh mục\". \nSau đó, áp dụng cho các ứng dụng trong \"Quản lý ứng dụng\". (Bạn cũng có thể chọn các ứng dụng bổ sung cho các mục tiêu.) \nBạn nên và CHỈ nên kiểm tra \"Khung hệ thống\" trong phạm vi mô-đun Xposed / danh sách trắng. Sửa đổi cấu hình hiệu quả trong thời gian thực. Nhà phát triển + Dev giả [không phải là dev] Giúp và phản hồi Giấy phép nguồn mở diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ec2047b..7ec42ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -181,6 +181,7 @@ Config modification effective in real time. Developer + Fake developer (tinkerer) Support and feedback Open source licenses From 9f1dd0bb363f437a3dba75a172bbc32ce88495f9 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Sun, 7 Sep 2025 23:43:31 +0300 Subject: [PATCH 09/28] Fix ReLSPosed module not activated issue --- app/proguard-rules.pro | 5 ----- app/src/main/java/icu/nullptr/hidemyapplist/MyApp.kt | 4 ---- .../java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt | 3 +-- .../java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt | 7 +------ 4 files changed, 2 insertions(+), 17 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 9ef9c9f..d5645a4 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,8 +1,3 @@ -# Xposed --keepclassmembers class icu.nullptr.hidemyapplist.MyApp { - boolean isHooked; -} - # Enum class -keepclassmembers,allowoptimization enum * { public static **[] values(); diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/MyApp.kt b/app/src/main/java/icu/nullptr/hidemyapplist/MyApp.kt index 48f4da9..042764f 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/MyApp.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/MyApp.kt @@ -17,10 +17,6 @@ import kotlin.system.exitProcess lateinit var hmaApp: MyApp class MyApp : Application() { - - @JvmField - var isHooked = false - val globalScope = CoroutineScope(Dispatchers.Default) val appIconLoader by lazy { val iconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size) diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt index 6327c59..62fc204 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt @@ -116,7 +116,6 @@ class HomeFragment : Fragment(R.layout.fragment_home) { val serviceVersion = ServiceClient.serviceVersion val color = when { - !hmaApp.isHooked -> getColor(R.color.gray) serviceVersion == 0 -> getColor(R.color.invalid) else -> themeColor(android.R.attr.colorPrimary) } @@ -126,7 +125,7 @@ class HomeFragment : Fragment(R.layout.fragment_home) { root.outlineAmbientShadowColor = color root.outlineSpotShadowColor = color - if (hmaApp.isHooked) { + if (serviceVersion > 0) { moduleStatusIcon.setImageResource(R.drawable.sentiment_calm_24px) val versionNameSimple = BuildConfig.VERSION_NAME.substringBefore(".r") moduleStatus.text = diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt index 79962ed..f691005 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt @@ -23,12 +23,7 @@ class XposedEntry : IXposedHookZygoteInit, IXposedHookLoadPackage { } override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - if (lpparam.packageName == Constants.APP_PACKAGE_NAME) { - EzXHelperInit.initHandleLoadPackage(lpparam) - hookAllConstructorAfter("icu.nullptr.hidemyapplist.MyApp") { - getFieldByDesc("Licu/nullptr/hidemyapplist/MyApp;->isHooked:Z").setBoolean(it.thisObject, true) - } - } else if (lpparam.packageName == "android") { + if (lpparam.packageName == "android") { EzXHelperInit.initHandleLoadPackage(lpparam) logI(TAG, "Hook entry") From 0e10062bb9e1ecf34f4de25050bc3fd3e42d082c Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 14:27:19 +0700 Subject: [PATCH 10/28] chore: AboutActivity.kt: new fact about myself this is true tho Signed-off-by: Cuynu --- .../java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt index c5869a0..42d24d2 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/activity/AboutActivity.kt @@ -52,7 +52,7 @@ class AboutActivity : AbsAboutActivity() { items.add(Category(getString(R.string.about_fakedev))) - items.add(Contributor(R.drawable.cont_cuynu, "Cuynu", "loser?", "https://git.disroot.org/cuynu")) + items.add(Contributor(R.drawable.cont_cuynu, "Cuynu", "another loser with no coding skills", "https://git.disroot.org/cuynu")) items.add(Category(getString(R.string.about_support))) items.add(Card("Disroot\nhttps://git.disroot.org/cuynu/HMAL-OSS")) From 0dee4195a7ed0962e075301873064847c45500fb Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 14:52:37 +0700 Subject: [PATCH 11/28] fix: WebViewPreset.kt: wrong mulch webview packageName my eye issues Signed-off-by: Cuynu --- .../nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt index cfb585a..8aad80a 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt @@ -6,7 +6,7 @@ class WebViewPreset() : BasePreset("webview") { override val exactPackageNames = setOf( "com.android.webview", "com.google.android.webview", - "us.spotco.mulch_ww" + "us.spotco.mulch_wv" ) override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean { @@ -25,7 +25,7 @@ class WebViewPreset() : BasePreset("webview") { return true } - if (packageName.startsWith("us.spotco.mulch_ww")) { + if (packageName.startsWith("us.spotco.mulch_wv")) { return true } return false From 2891fc384f917c20d5055e4a7eb8577d52572054 Mon Sep 17 00:00:00 2001 From: Cuynu Date: Mon, 8 Sep 2025 15:00:10 +0700 Subject: [PATCH 12/28] fix: WebViewPreset.kt: missing [,] my eye issues Signed-off-by: Cuynu --- .../nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt index 8aad80a..9aea4f4 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/WebViewPreset.kt @@ -6,7 +6,7 @@ class WebViewPreset() : BasePreset("webview") { override val exactPackageNames = setOf( "com.android.webview", "com.google.android.webview", - "us.spotco.mulch_wv" + "us.spotco.mulch_wv", ) override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean { From 8c1ea074e412a70edafcb49f5b8243004dc8343a Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Tue, 9 Sep 2025 03:54:52 +0300 Subject: [PATCH 13/28] Fix signing info bug, simplify PmsHook, add caf and calyxos to custom ROM preset --- .../common/app_presets/CustomROMPreset.kt | 10 +++ .../xposed/hook/PmsHookTarget28.kt | 35 ++------ .../xposed/hook/PmsHookTarget30.kt | 76 ++-------------- .../xposed/hook/PmsHookTarget33.kt | 72 ++-------------- .../xposed/hook/PmsHookTarget34.kt | 74 ++-------------- .../xposed/hook/PmsHookTargetBase.kt | 86 +++++++++++++++++++ 6 files changed, 119 insertions(+), 234 deletions(-) create mode 100644 xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt index d4fea46..96e6c4d 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt @@ -21,6 +21,16 @@ class CustomROMPreset() : BasePreset("custom_rom") { return true } + // CAF (CodeAuroraForum) apps + if (packageName.startsWith("com.caf.")) { + return true + } + + // CalyxOS + if (packageName.startsWith("org.calyxos.")) { + return true + } + // AOSPA if (packageName.startsWith("co.aospa.")) { return true diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt index 0b2b160..873947a 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt @@ -16,14 +16,15 @@ import icu.nullptr.hidemyapplist.xposed.logE import icu.nullptr.hidemyapplist.xposed.logI import java.util.concurrent.atomic.AtomicReference -class PmsHookTarget28(private val service: HMAService) : IFrameworkHook { +class PmsHookTarget28(service: HMAService) : PmsHookTargetBase(service) { companion object { private const val TAG = "PmsHookTarget28" } - private val hooks = mutableListOf() - private var lastFilteredApp: AtomicReference = AtomicReference(null) + // not required until SDK 30 + override val fakeSystemPackageInstallInfo = null + override val fakeUserPackageInstallInfo = null @Suppress("UNCHECKED_CAST") override fun load() { @@ -88,32 +89,6 @@ class PmsHookTarget28(private val service: HMAService) : IFrameworkHook { } } - hooks += findMethod(service.pms::class.java, findSuper = true) { - name == "getInstallerPackageName" - }.hookBefore { param -> - val targetApp = param.args[0] as String? - - val callingUid = Binder.getCallingUid() - if (callingUid == Constants.UID_SYSTEM) return@hookBefore - val callingApps = Utils.binderLocalScope { - service.pms.getPackagesForUid(callingUid) - } ?: return@hookBefore - for (caller in callingApps) { - val blockingMode = service.shouldHideInstallationSource(caller, targetApp) - when (blockingMode) { - 1 -> param.result = VENDING_PACKAGE_NAME - 2 -> param.result = null - else -> continue - } - - service.filterCount++ - break - } - } - } - - override fun unload() { - hooks.forEach(XC_MethodHook.Unhook::unhook) - hooks.clear() + super.load() } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt index c1cfdeb..e33585b 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt @@ -1,14 +1,12 @@ package icu.nullptr.hidemyapplist.xposed.hook -import android.os.Binder +import android.content.pm.PackageManager import android.os.Build import androidx.annotation.RequiresApi import com.github.kyuubiran.ezxhelper.utils.findConstructor import com.github.kyuubiran.ezxhelper.utils.findMethod -import com.github.kyuubiran.ezxhelper.utils.findMethodOrNull import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.github.kyuubiran.ezxhelper.utils.paramCount -import de.robv.android.xposed.XC_MethodHook import icu.nullptr.hidemyapplist.common.Constants import icu.nullptr.hidemyapplist.common.Constants.VENDING_PACKAGE_NAME import icu.nullptr.hidemyapplist.common.Utils @@ -17,16 +15,15 @@ import icu.nullptr.hidemyapplist.xposed.Utils4Xposed import icu.nullptr.hidemyapplist.xposed.logD import icu.nullptr.hidemyapplist.xposed.logE import icu.nullptr.hidemyapplist.xposed.logI -import java.util.concurrent.atomic.AtomicReference @RequiresApi(Build.VERSION_CODES.R) -class PmsHookTarget30(private val service: HMAService) : IFrameworkHook { +class PmsHookTarget30(service: HMAService) : PmsHookTargetBase(service) { companion object { private const val TAG = "PmsHookTarget30" } - private val fakeSystemPackageInstallInfo by lazy { + override val fakeSystemPackageInstallInfo: Any by lazy { findConstructor( "android.content.pm.InstallSourceInfo" ) { @@ -39,29 +36,19 @@ class PmsHookTarget30(private val service: HMAService) : IFrameworkHook { ) } - private val fakeUserPackageInstallInfo by lazy { - var psInfo = Utils.getPackageInfoCompat( - service.pms, - VENDING_PACKAGE_NAME, - 0L, - 0 - ).signingInfo - + override val fakeUserPackageInstallInfo: Any by lazy { findConstructor( "android.content.pm.InstallSourceInfo" ) { paramCount == 4 }.newInstance( VENDING_PACKAGE_NAME, - psInfo, + psSigningInfo, VENDING_PACKAGE_NAME, VENDING_PACKAGE_NAME, ) } - private val hooks = mutableSetOf() - private var lastFilteredApp: AtomicReference = AtomicReference(null) - override fun load() { logI(TAG, "Load hook") hooks += findMethod("com.android.server.pm.AppsFilter") { @@ -90,57 +77,6 @@ class PmsHookTarget30(private val service: HMAService) : IFrameworkHook { } } - findMethodOrNull(service.pms::class.java, findSuper = true) { - name == "getInstallSourceInfo" - }?.hookBefore { param -> - val targetApp = param.args[0] as String? - - val callingUid = Binder.getCallingUid() - if (callingUid == Constants.UID_SYSTEM) return@hookBefore - val callingApps = Utils.binderLocalScope { - service.pms.getPackagesForUid(callingUid) - } ?: return@hookBefore - for (caller in callingApps) { - val blockingMode = service.shouldHideInstallationSource(caller, targetApp) - when (blockingMode) { - 1 -> param.result = fakeUserPackageInstallInfo - 2 -> param.result = fakeSystemPackageInstallInfo - else -> continue - } - - service.filterCount++ - break - } - }?.let { - hooks.add(it) - } - - hooks += findMethod(service.pms::class.java, findSuper = true) { - name == "getInstallerPackageName" - }.hookBefore { param -> - val targetApp = param.args[0] as String? - - val callingUid = Binder.getCallingUid() - if (callingUid == Constants.UID_SYSTEM) return@hookBefore - val callingApps = Utils.binderLocalScope { - service.pms.getPackagesForUid(callingUid) - } ?: return@hookBefore - for (caller in callingApps) { - val blockingMode = service.shouldHideInstallationSource(caller, targetApp) - when (blockingMode) { - 1 -> param.result = VENDING_PACKAGE_NAME - 2 -> param.result = null - else -> continue - } - - service.filterCount++ - break - } - } - } - - override fun unload() { - hooks.forEach(XC_MethodHook.Unhook::unhook) - hooks.clear() + super.load() } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt index a71d602..a5688a7 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt @@ -1,6 +1,7 @@ package icu.nullptr.hidemyapplist.xposed.hook import android.content.pm.PackageInstaller +import android.content.pm.PackageManager import android.os.Binder import android.os.Build import androidx.annotation.RequiresApi @@ -21,7 +22,7 @@ import icu.nullptr.hidemyapplist.xposed.logI import java.util.concurrent.atomic.AtomicReference @RequiresApi(Build.VERSION_CODES.TIRAMISU) -class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { +class PmsHookTarget33(service: HMAService) : PmsHookTargetBase(service) { companion object { private const val TAG = "PmsHookTarget33" @@ -33,7 +34,7 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { } } - private val fakeSystemPackageInstallInfo by lazy { + override val fakeSystemPackageInstallInfo: Any by lazy { findConstructor( "android.content.pm.InstallSourceInfo" ) { @@ -47,30 +48,20 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { ) } - private val fakeUserPackageInstallInfo by lazy { - var psInfo = Utils.getPackageInfoCompat( - service.pms, - VENDING_PACKAGE_NAME, - 0L, - 0 - ).signingInfo - + override val fakeUserPackageInstallInfo: Any by lazy { findConstructor( "android.content.pm.InstallSourceInfo" ) { paramCount == 5 }.newInstance( VENDING_PACKAGE_NAME, - psInfo, + psSigningInfo, VENDING_PACKAGE_NAME, VENDING_PACKAGE_NAME, PackageInstaller.PACKAGE_SOURCE_STORE, ) } - private val hooks = mutableSetOf() - private var lastFilteredApp: AtomicReference = AtomicReference(null) - @Suppress("UNCHECKED_CAST") override fun load() { logI(TAG, "Load hook") @@ -101,57 +92,6 @@ class PmsHookTarget33(private val service: HMAService) : IFrameworkHook { } } - findMethodOrNull(service.pms::class.java, findSuper = true) { - name == "getInstallSourceInfo" - }?.hookBefore { param -> - val targetApp = param.args[0] as String? - - val callingUid = Binder.getCallingUid() - if (callingUid == Constants.UID_SYSTEM) return@hookBefore - val callingApps = Utils.binderLocalScope { - service.pms.getPackagesForUid(callingUid) - } ?: return@hookBefore - for (caller in callingApps) { - val blockingMode = service.shouldHideInstallationSource(caller, targetApp) - when (blockingMode) { - 1 -> param.result = fakeUserPackageInstallInfo - 2 -> param.result = fakeSystemPackageInstallInfo - else -> continue - } - - service.filterCount++ - break - } - }?.let { - hooks.add(it) - } - - hooks += findMethod(service.pms::class.java, findSuper = true) { - name == "getInstallerPackageName" - }.hookBefore { param -> - val targetApp = param.args[0] as String? - - val callingUid = Binder.getCallingUid() - if (callingUid == Constants.UID_SYSTEM) return@hookBefore - val callingApps = Utils.binderLocalScope { - service.pms.getPackagesForUid(callingUid) - } ?: return@hookBefore - for (caller in callingApps) { - val blockingMode = service.shouldHideInstallationSource(caller, targetApp) - when (blockingMode) { - 1 -> param.result = VENDING_PACKAGE_NAME - 2 -> param.result = null - else -> continue - } - - service.filterCount++ - break - } - } - } - - override fun unload() { - hooks.forEach(XC_MethodHook.Unhook::unhook) - hooks.clear() + super.load() } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt index 5d6f895..5e67c86 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt @@ -1,6 +1,7 @@ package icu.nullptr.hidemyapplist.xposed.hook import android.content.pm.PackageInstaller +import android.content.pm.PackageManager import android.os.Binder import android.os.Build import androidx.annotation.RequiresApi @@ -9,7 +10,6 @@ import com.github.kyuubiran.ezxhelper.utils.findMethod import com.github.kyuubiran.ezxhelper.utils.findMethodOrNull import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.github.kyuubiran.ezxhelper.utils.paramCount -import de.robv.android.xposed.XC_MethodHook import icu.nullptr.hidemyapplist.common.Constants import icu.nullptr.hidemyapplist.common.Constants.VENDING_PACKAGE_NAME import icu.nullptr.hidemyapplist.common.Utils @@ -18,10 +18,9 @@ import icu.nullptr.hidemyapplist.xposed.Utils4Xposed import icu.nullptr.hidemyapplist.xposed.logD import icu.nullptr.hidemyapplist.xposed.logE import icu.nullptr.hidemyapplist.xposed.logI -import java.util.concurrent.atomic.AtomicReference @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) -class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { +class PmsHookTarget34(service: HMAService) : PmsHookTargetBase(service) { companion object { private const val TAG = "PmsHookTarget34" @@ -33,7 +32,7 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { } } - private val fakeSystemPackageInstallInfo by lazy { + override val fakeSystemPackageInstallInfo: Any by lazy { findConstructor( "android.content.pm.InstallSourceInfo" ) { @@ -48,21 +47,14 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { ) } - private val fakeUserPackageInstallInfo by lazy { - var psInfo = Utils.getPackageInfoCompat( - service.pms, - VENDING_PACKAGE_NAME, - 0L, - 0 - ).signingInfo - + override val fakeUserPackageInstallInfo: Any by lazy { findConstructor( "android.content.pm.InstallSourceInfo" ) { paramCount == 6 }.newInstance( VENDING_PACKAGE_NAME, - psInfo, + psSigningInfo, VENDING_PACKAGE_NAME, VENDING_PACKAGE_NAME, VENDING_PACKAGE_NAME, @@ -70,9 +62,6 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { ) } - private val hooks = mutableSetOf() - private var lastFilteredApp: AtomicReference = AtomicReference(null) - @Suppress("UNCHECKED_CAST") override fun load() { logI(TAG, "Load hook") @@ -132,57 +121,6 @@ class PmsHookTarget34(private val service: HMAService) : IFrameworkHook { hooks.add(it) } - findMethodOrNull(service.pms::class.java, findSuper = true) { - name == "getInstallSourceInfo" - }?.hookBefore { param -> - val targetApp = param.args[0] as String? - - val callingUid = Binder.getCallingUid() - if (callingUid == Constants.UID_SYSTEM) return@hookBefore - val callingApps = Utils.binderLocalScope { - service.pms.getPackagesForUid(callingUid) - } ?: return@hookBefore - for (caller in callingApps) { - val blockingMode = service.shouldHideInstallationSource(caller, targetApp) - when (blockingMode) { - 1 -> param.result = fakeUserPackageInstallInfo - 2 -> param.result = fakeSystemPackageInstallInfo - else -> continue - } - - service.filterCount++ - break - } - }?.let { - hooks.add(it) - } - - hooks += findMethod(service.pms::class.java, findSuper = true) { - name == "getInstallerPackageName" - }.hookBefore { param -> - val targetApp = param.args[0] as String? - - val callingUid = Binder.getCallingUid() - if (callingUid == Constants.UID_SYSTEM) return@hookBefore - val callingApps = Utils.binderLocalScope { - service.pms.getPackagesForUid(callingUid) - } ?: return@hookBefore - for (caller in callingApps) { - val blockingMode = service.shouldHideInstallationSource(caller, targetApp) - when (blockingMode) { - 1 -> param.result = VENDING_PACKAGE_NAME - 2 -> param.result = null - else -> continue - } - - service.filterCount++ - break - } - } - } - - override fun unload() { - hooks.forEach(XC_MethodHook.Unhook::unhook) - hooks.clear() + super.load() } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt new file mode 100644 index 0000000..49b2402 --- /dev/null +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt @@ -0,0 +1,86 @@ +package icu.nullptr.hidemyapplist.xposed.hook + +import android.content.pm.PackageManager +import android.os.Binder +import android.os.Build +import com.github.kyuubiran.ezxhelper.utils.findMethod +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.Constants.VENDING_PACKAGE_NAME +import icu.nullptr.hidemyapplist.common.Utils +import icu.nullptr.hidemyapplist.xposed.HMAService +import java.util.concurrent.atomic.AtomicReference + +abstract class PmsHookTargetBase(protected val service: HMAService) : IFrameworkHook { + protected val hooks = mutableListOf() + protected var lastFilteredApp: AtomicReference = AtomicReference(null) + + protected val psSigningInfo by lazy { + Utils.getPackageInfoCompat( + service.pms, + VENDING_PACKAGE_NAME, + PackageManager.GET_SIGNING_CERTIFICATES.toLong(), + 0 + ).signingInfo + } + + abstract val fakeSystemPackageInstallInfo: Any? + abstract val fakeUserPackageInstallInfo: Any? + + override fun load() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + findMethodOrNull(service.pms::class.java, findSuper = true) { + name == "getInstallSourceInfo" + }?.hookBefore { param -> + val targetApp = param.args[0] as String? + + val callingUid = Binder.getCallingUid() + if (callingUid == Constants.UID_SYSTEM) return@hookBefore + val callingApps = Utils.binderLocalScope { + service.pms.getPackagesForUid(callingUid) + } ?: return@hookBefore + for (caller in callingApps) { + when (service.shouldHideInstallationSource(caller, targetApp)) { + 1 -> param.result = fakeUserPackageInstallInfo + 2 -> param.result = fakeSystemPackageInstallInfo + else -> continue + } + + service.filterCount++ + break + } + }?.let { + hooks.add(it) + } + } + + hooks += findMethod(service.pms::class.java, findSuper = true) { + name == "getInstallerPackageName" + }.hookBefore { param -> + val targetApp = param.args[0] as String? + + val callingUid = Binder.getCallingUid() + if (callingUid == Constants.UID_SYSTEM) return@hookBefore + val callingApps = Utils.binderLocalScope { + service.pms.getPackagesForUid(callingUid) + } ?: return@hookBefore + for (caller in callingApps) { + when (service.shouldHideInstallationSource(caller, targetApp)) { + 1 -> param.result = VENDING_PACKAGE_NAME + 2 -> param.result = null + else -> continue + } + + service.filterCount++ + break + } + } + } + + final override fun unload() { + hooks.forEach(XC_MethodHook.Unhook::unhook) + hooks.clear() + } +} \ No newline at end of file From fc89fe78ea2f77574451d1c4a692cf140740ecb6 Mon Sep 17 00:00:00 2001 From: karigane <169052233+karigane-cha@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:54:04 +0900 Subject: [PATCH 14/28] Update Japanese translation (#4) * Update ja-rJP translation * Fix minor Japanese translation --- app/src/main/res/values-ja-rJP/strings.xml | 145 ++++++++++++++------- 1 file changed, 101 insertions(+), 44 deletions(-) diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 4b5b111..2df9dc2 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1,5 +1,7 @@ + HMA-OSS + ホーム ログ 設定 @@ -8,14 +10,16 @@ アプリの管理 アプリの選択 アプリの設定 - About - Do not install HMAL to secondary user + このアプリについて + このフォークについて + + HMA をセカンダリユーザーにインストールしないでください クラッシュログの表示 - 構成ファイルが破損しています。 アプリのデータを消去してください。 + 設定ファイルが破損しています。アプリデータを削除してください リストの編集 削除 有効 - Disabled + 無効 作業モード ブラックリスト ホワイトリスト @@ -25,110 +29,158 @@ フィルター はい いいえ - Search - System + 検索 + システム + システムに従う + モジュールは有効です [%s] モジュールは無効です システムサービスの実行中 [%d] システムサービスは実行されていません - モジュールが更新されました。再起動してください。 - HMAL-OSS は合計 %d リクエストをフィルタリングしました + モジュールが更新されました。再起動してください + HMA-OSS は合計 %d 件のリクエストをフィルタリングしました 管理 検出のテスト テストアプリのダウンロード - 個別検知テストアプリを開発し、検知テストを移行しました。 今すぐダウンロードしますか? - バックアップ & リストア - コンフィグのバックアップ - コンフィグのリストア + 個別検知テストアプリを開発し、検知テストを移行しました。今すぐダウンロードしますか? + バックアップ & 復元 + 設定をバックアップ + 設定を復元 インポート成功 - インポートの失敗 - バックアップよりも低いモジュール バージョン + インポート失敗 + モジュールのバージョンが古すぎます バックアップのバージョンが古すぎます バックアップは破損しています 書き出しの失敗 - バックアップ済みのコンフィグ + 設定をバックアップしました 利用可能なアップデート: %s アップデート: %s + - Show system apps + システムアプリを表示 並び替え 逆順 アプリ名で パッケージネームで インストール日時で アップデート時間で + 「落ち着きのない」アプリのテンプレートを確立し、取得できるアプリリストを制御します。\n\nブラックリスト (推奨): テンプレートで選択されたアプリは、テンプレートを適用するアプリから見えなくなります。\nホワイトリスト: テンプレートで選択されていないアプリは、テンプレートを適用するアプリには表示されません。 ブラックリストのテンプレートを作成 - ホワイトリストのテンプレートの作成 + ホワイトリストのテンプレートを作成 テンプレートを削除してもよろしいですか? テンプレート名 無効な名前 - Delete Template + テンプレートを削除 このテンプレート名は既に存在します %d 個のアプリに適用 %d 個のアプリが表示されます %d 個のアプリが表示されません + 非表示を有効にする - コンフィグのテンプレート - テンプレートのチョイス + テンプレート設定 + テンプレートを選択する + プリセットを選択する システムアプリを除外 - 本当に必要な場合にのみ、このオプションをオフにしてください。 無効にするとクラッシュする可能性があります - %d テンプレートの使用 + 本当に必要な場合にのみ、このオプションをオフにしてください。無効にするとクラッシュする可能性があります + %d 個のテンプレートを使用中 + %d 個のプリセットを使用中 + %d 個のプリセット設定を使用中 %d 個の追加アプリが表示されます %d 個の追加アプリが表示されません + 危険なパッケージ + このパッケージは危険とマークされており、非表示のアプリに問題を引き起こす可能性があります。続行しますか? + 偽装 + インストールソースを偽装する + このアプリケーションでは、すべてのユーザーアプリが Play ストア経由でインストールされたように偽装されます + システムアプリにも偽装する + このアプリケーションでは、すべてのシステムアプリが何もインストールされていないように偽装されます + 対象アプリを除外する + このアプリが Play ストアで利用できない場合、有効にすることができます + 設定を保存した後に対象のアプリを強制終了することを忘れないでください + + + LSPosed/Xposed モジュール + Root マネージャー/Rooted アプリ + カスタム ROM アプリ + + + アクセシビリティ + 開発者向けオプション + ログの保存 ログのクリア 保存するログがありません ログを保存しました + モジュール - Data isolation - App data: %s\nVold app data: %s\nForce mount: %s - This option is only available on Android 11 and above - App data isolation - Vold app data isolation - Changing requires root permission - Changing requires reboot - Permission denied - Enforce data isolation for all apps - Data isolation is disabled for apps target API lower than 30 by default + データ分離 + アプリデータ: %s\nVold アプリデータ: %s\n強制マウント: %s + このオプションは Android 11 以上で使用できます + アプリのデータ分離 + Vold アプリのデータ分離 + 警告 + この機能は AOSP の「アプリの外部ストレージディレクトリを隔離する」という機能を有効化します。これにより、アプリの非表示機能が向上する可能性がありますが、システムの安定性に問題が生じる可能性もあります。また、この機能は AOSP で廃止されているため、いつ動作しなくなるか分からない点にも注意が必要です。 + 変更には root 権限が必要です + 変更には再起動が必要です + 権限が拒否されました + 全てのアプリに対してデータ分離を強制する + ターゲット API が 30 未満のアプリに対してはデフォルトでデータ分離が無効になっています デバッグ用詳細ログ ロガーのバッファサイズ - ランチャーでモジュール アイコンを非表示にする - Xposedマネージャーで引き続きアプリを開くことができます + ランチャーでモジュールアイコンを非表示にする + LSPosed マネージャーで引き続きアプリを開くことができます + 危険なパッケージに関する警告を無視する + この機能を有効にする前後で、危険なパッケージに関する問題が発生した場合、開発者は一切責任を負わないことをご了承ください + 言語 翻訳に参加する %s をあなたの言語に翻訳するのにご協力ください + テーマ システムのテーマカラー テーマカラー ダークテーマ ピュアブラックテーマ - ブラック有効になっている場合は、ピュアブラックのテーマを使用してください + ダークテーマが有効になっている場合、ピュアブラックテーマを使用します + サービス システムサービスを停止する サービスを再開するには再起動が必要です 実行環境のクリーンアップをしますか? - /data/misc/hide_my_applist_* のシステム サービス キャッシュを削除します。つまり、インターセプトを有効にするには、次回の再起動後にモジュール アプリを手動で 1 回起動する必要があり、インターセプト カウントも消去されます。 - クリーンなランタイム環境を強制する(root) - システム サービスの開始に失敗した場合のみ、それ以外の場合は上記のオプションをクリックする必要があります。 - ランタイムのクリーン + /data/misc/hide_my_applist_* のシステムサービスキャッシュを削除します。つまり、インターセプトを有効にするには、次回の再起動後にモジュールアプリを手動で 1 回起動する必要があり、インターセプトカウントも消去されます。 + クリーンな実行環境を強制する (root) + システムサービスの開始に失敗した場合のみ、それ以外の場合は上記のオプションをクリックする必要があります。 + 実行環境がクリーンアップされました + アップデート アップデートの通知を無効にする ベータ版アップデートを受け取る ベータ版は不安定な場合があります + - 特定のアプリのインストールを検出するのは正しくありませんが、ルートを使用するすべてのアプリがランダムなパッケージ名のサポートを提供するわけではありません。 この場合、検出された root を使用するアプリ (Fake Location や Storage Isolation など) は、検出された root 自体と同じです。\n\n同時に、一部のスマート アプリは、さまざまな抜け穴を使用してアプリ リストを取得し、描画できるようにします。 \n\nこのモジュールは、アプリリストを適切に非表示にしているかどうかをテストする方法をいくつか提供します。 また、Xposed モジュールとして機能して、一部のアプリを非表示にしたり、アプリ リストのリクエストを拒否してプライバシーを保護したりできます。 + + 特定のアプリのインストールを検出することは正しくありませんが、root 権限を使用するすべてのアプリがランダムなパッケージ名に対応しているわけではありません。この場合、root 権限を使用しているアプリ (Fake Location や Storage Isolation など) の検出は、root 権限自体が検出されることと同等です。\n\n同時に、一部のスマートアプリは、さまざまな抜け穴を使用してアプリリストを取得して、ユーザーの行動特性を分析する場合があります。\n\nこのモジュールは、アプリリストを適切に非表示にしているかどうかを検証する方法をいくつか提供します。また、Xposed モジュールとして動作することで、特定のアプリを非表示にしたり、アプリリストの取得要求を拒否したりして、プライバシーを保護することも可能です。 + + + オリジナルの HMA プロジェクトはクローズドソースになり、最新版のコードには一部の重要な変更点が反映されていませんでした。そこで、再びオープンソースとして継続していくために、このフォーク版を作成しました。 + このモジュールの使用方法 - 「テンプレート管理」でテンプレートを作成できます。\n次に、「アプリ管理」でテンプレートをアプリに適用します。 (ターゲットに追加のアプリを選択することもできます。)\nXposed モジュール スコープ/ホワイトリストで「システム フレームワーク」をチェックする必要があります。 - リアルタイムで有効な構成変更。 - デベロッパー + + 「テンプレート管理」でテンプレートを作成できます。\n次に、「アプリ管理」でテンプレートをアプリに適用します。 (ターゲットに追加のアプリを選択することもできます。)\nXposed モジュール スコープ/ホワイトリストで「システム フレームワーク」をチェックする必要があります。 + + + 設定変更はリアルタイムで行われます。 + + 開発者 サポートとフィードバック オープンソースライセンス + 桜 レッド @@ -148,5 +200,10 @@ オレンジ ディープオレンジ ブラウン - グレーブルー + ブルーグレー + + + ダークテーマ + 常にオフ + 常にオン From cba451f01ca02b73798eb9f6dfd2cd42a393f8cb Mon Sep 17 00:00:00 2001 From: Neebe3289 Date: Tue, 9 Sep 2025 08:54:30 +0700 Subject: [PATCH 15/28] Import `Indonesian` strings.xml (#3) Change-Id: Ica5a606007c75096124eab2a16b732e82fc6b334 --- app/src/main/res/values-id-rID/strings.xml | 206 +++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100755 app/src/main/res/values-id-rID/strings.xml diff --git a/app/src/main/res/values-id-rID/strings.xml b/app/src/main/res/values-id-rID/strings.xml new file mode 100755 index 0000000..2712e48 --- /dev/null +++ b/app/src/main/res/values-id-rID/strings.xml @@ -0,0 +1,206 @@ + + + Beranda + Log + Pengaturan + Kelola templat + Pengaturan templat + Kelola aplikasi + Pilih aplikasi + Pengaturan aplikasi + Tentang + Tentang fork ini + Jangan instal HMA pada pengguna sekunder + Tampilkan log kerusakan + File konfigurasi rusak. Harap bersihkan data aplikasi + Edit daftar + Menghapus + Diaktifkan + Dinonaktifkan + Mode kerja + Blacklist + Whitelist + Aplikasi + Preferensi + Segarkan + Filter + Ya + Tidak + Cari + Sistem + Mengikuti sistem + + + Modul Diaktifkan [%s] + Modul Tidak Diaktifkan + Layanan sistem sedang berjalan [%d] + Layanan sistem tidak berjalan + Modul diperbarui, perlu di-boot ulang + HMA-OSS telah memfilter total %d permintaan + Kelola + Uji deteksi + Unduh aplikasi uji + Kami telah mengembangkan aplikasi uji deteksi individual dan memigrasikan uji deteksi ke dalamnya. Ingin mengunduhnya sekarang? + Cadangan & Pemulihan + Konfigurasi cadangan + Konfigurasi pemulihan + Impor berhasil + Impor gagal + Versi modul lebih rendah dari versi cadangan + Versi cadangan terlalu lama + File cadangan rusak + Ekspor gagal + Konfigurasi yang dicadangkan + Pembaruan baru tersedia: %s + Memperbarui: %s + + + Tampilkan aplikasi sistem + Urutkan + Urutkan terbalik + Nama aplikasi + Nama paket + Waktu instalasi + Waktu pembaruan + + + Buat templat untuk aplikasi \"restless\", guna mengontrol akses daftar aplikasi.\n\nBlacklist (disarankan): aplikasi yang dipilih dalam templat akan tersembunyi dari aplikasi yang menerapkan templat tersebut.\nWhitelist: aplikasi yang tidak dipilih dalam templat akan tersembunyi oleh aplikasi yang menerapkan templat tersebut. + Buat templat blacklist + Buat templat whitelist + Apakah anda yakin ingin menghapus templat tersebut? + Nama templat + Nama tidak valid + Hapus Templat + Nama templat sudah ada + Diterapkan ke %d aplikasi + %d apl terlihat + %d apl tidak terlihat + + + Aktifkan penyembunyian + Konfigurasi templat + Pilih templat + Pilih preset + Kecualikan aplikasi sistem + Matikan opsi ini hanya jika benar-benar diperlukan. Kemungkinan menyebabkan crash jika dinonaktifkan + Menggunakan %d templat + Menggunakan %d preset + Menggunakan %d preset pengaturan + %d apl tambahan terlihat + %d apl tambahan tidak terlihat + Paket berisiko + Paket ini ditandai sebagai berisiko dan dapat menyebabkan masalah pada aplikasi tersembunyi. Apakah anda ingin melanjutkan? + Spoofing + Sumber instalasi spoof + Semua aplikasi pengguna akan di-spoof seolah-olah terpasang di Play Store untuk aplikasi ini + Spoof apl sistem juga + Semua aplikasi sistem akan di-spoof seolah-olah terpasang tanpa alasan apa pun untuk aplikasi ini + Kecualikan aplikasi target + Anda dapat mengaktifkannya jika aplikasi ini tidak tersedia di Play Store + Jangan lupa untuk menghentikan paksa aplikasi target setelah menyimpan konfigurasi + + + Modul LSPosed/Xposed + Manajer root/Aplikasi root + Aplikasi ROM kustom + + + Aksesibilitas + Opsi pengembang + + + Simpan log + Hapus log + Tidak ada log tersimpan + Log disimpan + + + Modul + Isolasi data + Data apl: %s\nData apl Vold: %s\nPaksa mount: %s + Opsi ini hanya tersedia di Android 11 dan di atasnya + Isolasi data aplikasi + Isolasi data aplikasi Vold + Peringatan + Ini akan mengaktifkan fitur AOSP yang membuat direktori penyimpanan pribadi eksternal aplikasi terisolasi. Ini dapat membantu meningkatkan penyembunyian aplikasi meskipun dapat menyebabkan masalah stabilitas. Fitur ini dapat berhenti berfungsi kapan saja karena ditinggalkan oleh AOSP. + Perubahan diperlukan izin root + Perubahan diperlukan reboot + Izin ditolak + Paksa isolasi data untuk semua aplikasi + Isolasi data dinonaktifkan untuk aplikasi target API yang lebih rendah dari 30 secara default + Log detail untuk debugging + Ukuran buffer logger + Sembunyikan ikon modul di launcher + Anda masih dapat membuka aplikasi di manajer Xposed + Lewati peringatan paket berisiko + Perlu diketahui bahwa pengembang tidak bertanggung jawab atas masalah terkait paket berisiko sebelum atau setelah anda mengaktifkan fitur ini + + Bahasa + Berpartisipasi dalam penerjemahan + Bantu kami menerjemahkan %s ke bahasa anda + + Tema + Warna tema sistem + Warna tema + Tema gelap + Tema gelap hitam murni + Gunakan tema hitam murni jika tema gelap diaktifkan + + Layanan + Hentikan layanan sistem + Perlu reboot untuk memulai kembali layanan + Bersihkan lingkungan runtime pada saat yang bersamaan? + Hapus cache layanan sistem di /data/misc/hide_my_applist_*. Setelah reboot berikutnya, Diperlukan membuka aplikasi modul sekali secara manual untuk mengaktifkan intersepsi, dan jumlah intersepsi juga akan dihapus. + Paksa bersihkan lingkungan runtime (root) + Hanya jika layanan sistem gagal untuk memulai, jika tidak, Anda harus mengklik opsi di atas. + Lingkungan runtime dibersihkan + + Pembaruan + Nonaktifkan pemberitahuan pembaruan + Terima pembaruan beta + Versi beta mungkin tidak stabil + + + + Meskipun tidak tepat untuk mendeteksi instalasi aplikasi tertentu, tidak semua aplikasi yang menggunakan root mendukung nama paket acak. Dalam kasus ini, aplikasi terdeteksi yang menggunakan root (seperti Lokasi Palsu dan Isolasi Penyimpanan) dianggap sama dengan root itu sendiri.\n\nPada saat yang sama, beberapa aplikasi cerdas memanfaatkan celah untuk mendapatkan daftar aplikasi anda, sehingga mereka bisa membangun profil tentang anda.\n\nModul ini menyediakan beberapa metode untuk menguji apakah anda telah menyembunyikan daftar aplikasi dengan baik. Selain itu, dapat berfungsi sebagai modul Xposed untuk menyembunyikan aplikasi tertentu atau menolak permintaan daftar aplikasi guna melindungi privasi anda. + + + Proyek HMA asli telah menjadi sumber tertutup dan kode terbaru mereka tidak memuat beberapa perubahan terbaru, jadi saya membuat percabangan ini untuk melanjutkannya sebagai sumber terbuka lagi. + + Cara menggunakan modul ini + + Anda dapat membuat template di \"Kelola templat\".\nKemudian terapkan templat ke aplikasi di \"Kelola aplikasi\". (Anda juga dapat memilih aplikasi tambahan untuk target.)\nAnda harus dan HANYA memeriksa \"Kerangka Sistem\" dalam scope modul Xposed / whitelist. + + + Modifikasi konfigurasi efektif secara real time. + + Pengembang + Dukungan dan umpan balik + Lisensi sumber terbuka + + + Sakura + Merah + Merah muda + Ungu + Ungu tua + Biru nila + Biru + Biru muda + Sian + Toska + Hijau + Hijau muda + Hijau limau + Kuning + Kuning amber + Oranye + Oranye tua + Cokelat + Biru abu + + + Tema gelap + Selalu mati + Selalu aktif + From cb55dea35b393bf6d7edcab47237f18b5040584b Mon Sep 17 00:00:00 2001 From: DanGLES3 Date: Mon, 8 Sep 2025 22:54:57 -0300 Subject: [PATCH 16/28] Proper PT-BR (Brazilian Portuguese) translation (#2) --- app/src/main/res/values-pt-rBR/strings.xml | 233 ++++++++++++--------- 1 file changed, 129 insertions(+), 104 deletions(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 06ac949..3072e42 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -3,52 +3,54 @@ Início Registros Configurações - Gerenciador de modelo - Configurações de modelos - Gerenciador de aplicativos + Gerenciar modelos + Configurações do modelo + Gerenciar apps Selecionar aplicativo Configurações do aplicativo Sobre - Não instale HMAL no usuário secundário - Mostrar registro do crash + Sobre essa versão + Não instale HMA no usuário secundário + Mostrar registro do erro Arquivo de configuração danificado. Por favor limpe os dados do aplicativo Editar lista Deletar - Ligado - Disabled - Modo de trabalho - Lista negra - Lista branca - Aplicação - Preferencias + Habilitado + Desabilitado + Modo de funcionamento + Lista Negra + Lista Branca + Aplicativo + Configurações Recarregar Filtro Sim Não Pesquisar - System + Sistema + Seguir o sistema Módulo ativado [%s] Módulo não ativado Serviço do sistema funcionando [%d] Serviço do sistema não está funcionando - Módulo atualizado, precisa reiniciar - HMAL-OSS foi filtrado total %d requisitos + Módulo atualizado, necessário reiniciar + HMA-OSS filtrou no total %d de pedidos Gerenciar Teste de detecção Baixar aplicativo de teste Desenvolvemos um aplicativo de teste de detecção individual e migramos o teste de detecção para ele. Deseja baixá-lo agora? - Cópia de segurança & Restaurar - Configurações da cópia de segurança - Configurações de restauração + Backup & Restaurar + Backup das configurações + Restaurar backup Importado com sucesso Erro ao importar - Versão do módulo inferior a copia de segurança - Versão da cópia de segurança muito velho - Arquivo da cópia de segurança foi danificado + Versão do módulo inferior ao backup + Versão do backup é muito antiga + Arquivo de backup esta danificado Erro ao exportar - Configuração salvada - Nova atualização acessível: %s + Configuração salva + Nova atualização disponivel: %s Atualização: %s Mostrar apps do sistema @@ -59,97 +61,120 @@ Pela data de instalação Pela data de atualização - Establish templates for \"restless\" apps, controlling applist they can obtain.\n\nBlacklist (recommended): the apps selected in the template will be invisible to the apps applying the template.\nWhitelist: the apps not selected in the template will be invisible to the apps applying the template. - Create a blacklist template - Create a whitelist template - Are you sure to delete the template? - Template name - Name invalid - Delete Template - Template name already exist - Applied to %d apps - %d apps visible - %d apps invisible + Estabalecer modelos para apps \"inquietos\", controlando a lista de aplicativos que eles podem obter.\n\nLista Negra (recomendado): Os apps selecionados no modelo seram invisiveis para os apps no qual esse modelo for aplicado.\nLista Branca: Os apps não selecionados nesse modelo serão invisiveis aos apps no qual esse modelo for aplicado + Criar modelo de lista negra + Criar modelo de lista branca + Tem certeza que quer apagar a configuração + Nome do modelo + Nome inválido + Apagar modelo + Nome de modelo ja existe + "Aplicado a %d aplicativos " + %d aplicativos visiveis + %d aplicativos invisiveis - Enable hide - Template config - Choose template - Exclude system apps - Turn off this option only when really necessary. It is likely to cause crash with it disabled - Using %d templates - %d additional apps visible - %d additional apps invisible + "Ativar escondimento " + Configurações do modelo + Escolher modelo + Escolher perfil + Excluir apps dos sistema + Desative essa opção somente quando REALMENTE necessário, ja que pode ocasionar do app parar de funcionar se desativado + Usando %d modelos + Usando %d perfis de configuração + %d apps adicionais expostos + %d apps adicionais escondidos - Save logs - Clear logs - No logs to save - Logs saved + Opções de desenvolvedor + Salvar registros + Limpar registros + Sem registros pra salvar + Registros salvos - Module - Data isolation - App data: %s\nVold app data: %s\nForce mount: %s - This option is only available on Android 11 and above + Modulo + Isolamento de dados + App data: %s\nVold app data: %s\nForçar montagem: %s + Esta opção só esta disponivel no Android 11 pra cima App data isolation Vold app data isolation - Changing requires root permission - Changing requires reboot - Permission denied - Enforce data isolation for all apps - Data isolation is disabled for apps target API lower than 30 by default - Detail log for debugging - Logger buffer sizes - Hide module icon in launcher - You can still open the app in Xposed manager - Language - Participate in translation - Help us translate %s into your language - Theme - System theme color - Theme color - Dark theme - Pure black dark theme - Use the pure black theme if dark theme is enabled - Service - Stop system service - Need reboot to restart service - Limpar o ambiente do runtime ao mesmo tempo? - Remover arquivo temporário do serviço do sistema em /data/misc/hide_my_applist_*. Isso significa que você precisa iniciar o aplicativo de módulos uma vez manualmente no próximo reinício para habilitar interceptações, e a contagens de interceptações será apagada. - Forçar a limpar o ambiente do runtime (root) - Apenas se o serviço de sistema falhar ao iniciar, por outro lado, você deve clicar acima da opção. - Ambiente do runtime limpado - Atualize - Desabilitar notificações de atualizações + Isso ira ativar um recurso do Android que isola as pastas externas de aplicativos. Isso pode ajudar a melhor esconder apps mas pode causar instabilidade. Esse recurso pode parar de funcionar a qualquer momento ja que esta abandonada no Android. + Alterar requer permissão d root + Alterar requer reinicialização + Permissão negada + Impor isolamento de dados em todos os apps + Isolamento de dados esta desativado para apps q usam API inferior a 30 por padrão + Registros detalhados para depuração + Tamanho do registro + Esconder icone do modulo no launcher + Voce ainda podera abrir o app pelo Lsposed + Nota que o desenvolvedor não é responsavel por problemas causados por apps de risco antes ou depois de voce ativar esse recurso + Idioma + Participe na tradução + Nos ajude a traduzir %s na sua lingua + Tema + Cor de tema do sistema + Cor do tema + Tema escuro + Tema puramente preto + Usar o tema puramente preto se o tema escuro estivar habilitado + Serviço + Parar serviço do sistema + Reinicialização necessario para reiniciar o serviço + Limpar o ambiente de operação ao mesmo tempo? + Remover arquivo temporário do serviço do sistema em /data/misc/hide_my_applist_*. Isso significa que você precisa iniciar o aplicativo manualmente uma vez na próxima reinicialização para habilitar interceptações, e a contagens de interceptações será apagada. + Forçar a limpar o ambiente de operações (root) + Apenas se o serviço de sistema falhar ao iniciar, se não voce deve clicar a opção acima. + Ambiente de operação limpo + Atualizar + Desativar notificações de atualizações Receber atualizações beta A versão beta pode ser instável Although It is incorrect to detect specific app installation, yet not every app using root provides random package name support. In this case, detected apps that use root (such as Fake Location and Storage Isolation) is equal to detected root itself.\n\nAt the same time, some smart apps use various loopholes to acquire your app list, so that it can draw a persona for you.\n\nThis module provides some methods to test whether you have already hidden your applist nicely. Also, it can work as an Xposed module to hide some apps or reject app list requests to protect your privacy. - How to use this module - You can create templates in \"Template manage\".\nThen apply the templates to apps in \"App manage\". (You can also select extra apps for targets.)\nYou should and ONLY should check \"System Framework\" in Xposed module scope / whitelist. - - Config modification effective in real time. - - Developer - Support and feedback - Open source licenses + Como usar esse modulo + " Voce pode criar modelos em \"Gerenciar modelos\".\nEntão aplique os modelos nos apps em \"Gerenciar app\". (Voce tamber pode selecionar apps extra para esconder de tais.)\nVoce só deve habilitar o \"Sistema Android\" na lista de ativação do Xposed.\n " + " A modificação de configurações tem efeito imediato.\n " + Desenvolvedor + Suporte e ajuda + Licensas de codigo aberto Sakura - Red - Pink - Purple - Deep purple - Indigo - Blue - Light blue - Cyan - Teal - Green - Light green - Lime - Yellow - Amber - Orange - Deep orange - Brown - Blue grey + Vermelho + Rosa + Roxo + Roxo Intenso + Aníl + Azul + Azul Claro + Ciano + Verde-Azulado + Verde + Verde Claro + Lima + Amarelo + Ãmbar + Laranja + Laranaja Intenso + Marrom + Azul Acinzentado + Usando %d perfis + Aplicativo de risco + Esse aplicativo foi marcado como de risco e pode ocasionar em problemas se escondidos dos apps. Deseja continuar? + Esconder + Esconder fontes de instalação + Todos os apps de usuário serão marcados como instalados a partir da Play Store para esse aplicativo + Esconder apps de sistema tambem + Todos os apps de sistema serão marcados como instalados pelo nada para esse applicativo + Ignorar este app + Ative isso se esse app não esta disponivel na Play Store + Não esqueça de fechar o app após salvar a configuração + Modulos Lsposed/Xposed + Gerenciadores de root/Apps de root + Apps de ROM modificado + "Acessibilidade " + Aviso + Ignorar aviso de app de risco + Tema escuro + Sempre desligado + Sempre ligado From 7f21297ac9a532520c660723163a865abc59fc9a Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Tue, 9 Sep 2025 05:37:32 +0300 Subject: [PATCH 17/28] Revert channel message template to old one, improve multi-user support (WIP) --- .../icu/nullptr/hidemyapplist/xposed/HMAService.kt | 9 +++++---- .../hidemyapplist/xposed/hook/PmsHookTargetBase.kt | 12 +++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt index 1b61cae..9777bf0 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.IPackageManager import android.os.Build +import android.os.UserHandle import icu.nullptr.hidemyapplist.common.AppPresets import icu.nullptr.hidemyapplist.common.Constants import icu.nullptr.hidemyapplist.common.IHMAService @@ -192,7 +193,7 @@ class HMAService(val pms: IPackageManager) : IHMAService.Stub() { return appConfig.useWhitelist } - fun shouldHideInstallationSource(caller: String?, query: String?): Int { + fun shouldHideInstallationSource(caller: String?, query: String?, user: UserHandle): Int { if (caller == null || query == null) return 0 val appConfig = config.scope[caller] ?: return 0 if (!appConfig.hideInstallationSource) return 0 @@ -200,11 +201,11 @@ class HMAService(val pms: IPackageManager) : IHMAService.Stub() { if (caller == query && appConfig.excludeTargetInstallationSource) return 0 try { - val uid = Utils.getPackageUidCompat(pms, query, 0L, 0) - logD(TAG, "@shouldHideInstallationSource UID for $caller -> $query: $uid") + val uid = Utils.getPackageUidCompat(pms, query, 0L, user.hashCode()) + logD(TAG, "@shouldHideInstallationSource UID for $caller (${user.hashCode()}) -> $query: $uid") if (uid < 0) return 0 // invalid package installation source request } catch (e: Throwable) { - logD(TAG, "@shouldHideInstallationSource UID error", e) + logD(TAG, "@shouldHideInstallationSource UID error for $caller (${user.hashCode()})", e) return 0 } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt index 49b2402..b04c5fb 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTargetBase.kt @@ -34,15 +34,16 @@ abstract class PmsHookTargetBase(protected val service: HMAService) : IFramework findMethodOrNull(service.pms::class.java, findSuper = true) { name == "getInstallSourceInfo" }?.hookBefore { param -> - val targetApp = param.args[0] as String? + val query = param.args[0] as String? + val user = Binder.getCallingUserHandle() val callingUid = Binder.getCallingUid() if (callingUid == Constants.UID_SYSTEM) return@hookBefore val callingApps = Utils.binderLocalScope { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - when (service.shouldHideInstallationSource(caller, targetApp)) { + when (service.shouldHideInstallationSource(caller, query, user)) { 1 -> param.result = fakeUserPackageInstallInfo 2 -> param.result = fakeSystemPackageInstallInfo else -> continue @@ -59,15 +60,16 @@ abstract class PmsHookTargetBase(protected val service: HMAService) : IFramework hooks += findMethod(service.pms::class.java, findSuper = true) { name == "getInstallerPackageName" }.hookBefore { param -> - val targetApp = param.args[0] as String? + val query = param.args[0] as String? + val user = Binder.getCallingUserHandle() val callingUid = Binder.getCallingUid() if (callingUid == Constants.UID_SYSTEM) return@hookBefore val callingApps = Utils.binderLocalScope { service.pms.getPackagesForUid(callingUid) } ?: return@hookBefore for (caller in callingApps) { - when (service.shouldHideInstallationSource(caller, targetApp)) { + when (service.shouldHideInstallationSource(caller, query, user)) { 1 -> param.result = VENDING_PACKAGE_NAME 2 -> param.result = null else -> continue @@ -83,4 +85,4 @@ abstract class PmsHookTargetBase(protected val service: HMAService) : IFramework hooks.forEach(XC_MethodHook.Unhook::unhook) hooks.clear() } -} \ No newline at end of file +} From 2302c77782054c64e4116d23d5f4731aec1fe3a5 Mon Sep 17 00:00:00 2001 From: idyll Date: Tue, 9 Sep 2025 12:42:29 +0800 Subject: [PATCH 18/28] Update Chinese translation (#5) Chinese translation --- app/src/main/res/values-zh-rCN/strings.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0428265..b662ed1 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -77,8 +77,18 @@ 排除系统应用 仅在必需时关闭此选项。禁用它很可能会导致崩溃 已启用 %d 个模板 + 使用 %d 预置 + 使用 %d 设置预置 %d 个额外可见的应用 %d 个额外不可见的应用 + 欺骗 + 欺骗安装源 + 用户的所有应用程序都会被伪装成已在 Play Store 上安装了此应用程序 + 欺骗系统应用程序 + 所有系统应用程序都会被伪装成已安装,而非此应用程序 + 排除目标应用 + 如果 Play Store 中没有此应用程序,您可以启用它 + 保存配置后强制停止目标应用程序 保存日志 清除日志 @@ -111,6 +121,8 @@ 深色主题 纯黑主题 当深色主题启用时使用纯黑主题 + 绕过风险软件包警告 + 请注意,对于启用此功能之前或之后出现的与风险软件包相关的问题,开发人员概不负责 服务 停止系统服务 需要重启设备才能再次启动系统服务 From add8a2392c68304df2c747c9a75aaf0c7bdee0ae Mon Sep 17 00:00:00 2001 From: Neebe3289 Date: Wed, 10 Sep 2025 00:18:19 +0700 Subject: [PATCH 19/28] Reflect indonesian translation changes (#7) Change-Id: I9b00f45213e37169188aa25be8145840afcd5769 --- .../strings.xml | 33 ++++--------------- 1 file changed, 7 insertions(+), 26 deletions(-) rename app/src/main/res/{values-id-rID => values-in-rID}/strings.xml (89%) mode change 100755 => 100644 diff --git a/app/src/main/res/values-id-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml old mode 100755 new mode 100644 similarity index 89% rename from app/src/main/res/values-id-rID/strings.xml rename to app/src/main/res/values-in-rID/strings.xml index 2712e48..a67aa14 --- a/app/src/main/res/values-id-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -28,20 +28,19 @@ Tidak Cari Sistem - Mengikuti sistem - + Ikut sistem Modul Diaktifkan [%s] Modul Tidak Diaktifkan Layanan sistem sedang berjalan [%d] Layanan sistem tidak berjalan - Modul diperbarui, perlu di-boot ulang + Modul diperbarui, perlu mulai ulang HMA-OSS telah memfilter total %d permintaan Kelola Uji deteksi Unduh aplikasi uji Kami telah mengembangkan aplikasi uji deteksi individual dan memigrasikan uji deteksi ke dalamnya. Ingin mengunduhnya sekarang? - Cadangan & Pemulihan + Cadangkan & Pulihkan Konfigurasi cadangan Konfigurasi pemulihan Impor berhasil @@ -53,7 +52,6 @@ Konfigurasi yang dicadangkan Pembaruan baru tersedia: %s Memperbarui: %s - Tampilkan aplikasi sistem Urutkan @@ -62,7 +60,6 @@ Nama paket Waktu instalasi Waktu pembaruan - Buat templat untuk aplikasi \"restless\", guna mengontrol akses daftar aplikasi.\n\nBlacklist (disarankan): aplikasi yang dipilih dalam templat akan tersembunyi dari aplikasi yang menerapkan templat tersebut.\nWhitelist: aplikasi yang tidak dipilih dalam templat akan tersembunyi oleh aplikasi yang menerapkan templat tersebut. Buat templat blacklist @@ -75,7 +72,6 @@ Diterapkan ke %d aplikasi %d apl terlihat %d apl tidak terlihat - Aktifkan penyembunyian Konfigurasi templat @@ -98,22 +94,18 @@ Kecualikan aplikasi target Anda dapat mengaktifkannya jika aplikasi ini tidak tersedia di Play Store Jangan lupa untuk menghentikan paksa aplikasi target setelah menyimpan konfigurasi - Modul LSPosed/Xposed Manajer root/Aplikasi root Aplikasi ROM kustom - Aksesibilitas Opsi pengembang - Simpan log Hapus log Tidak ada log tersimpan Log disimpan - Modul Isolasi data @@ -134,18 +126,15 @@ Anda masih dapat membuka aplikasi di manajer Xposed Lewati peringatan paket berisiko Perlu diketahui bahwa pengembang tidak bertanggung jawab atas masalah terkait paket berisiko sebelum atau setelah anda mengaktifkan fitur ini - Bahasa Berpartisipasi dalam penerjemahan Bantu kami menerjemahkan %s ke bahasa anda - Tema Warna tema sistem Warna tema Tema gelap Tema gelap hitam murni Gunakan tema hitam murni jika tema gelap diaktifkan - Layanan Hentikan layanan sistem Perlu reboot untuk memulai kembali layanan @@ -154,30 +143,23 @@ Paksa bersihkan lingkungan runtime (root) Hanya jika layanan sistem gagal untuk memulai, jika tidak, Anda harus mengklik opsi di atas. Lingkungan runtime dibersihkan - Pembaruan Nonaktifkan pemberitahuan pembaruan Terima pembaruan beta Versi beta mungkin tidak stabil - - - Meskipun tidak tepat untuk mendeteksi instalasi aplikasi tertentu, tidak semua aplikasi yang menggunakan root mendukung nama paket acak. Dalam kasus ini, aplikasi terdeteksi yang menggunakan root (seperti Lokasi Palsu dan Isolasi Penyimpanan) dianggap sama dengan root itu sendiri.\n\nPada saat yang sama, beberapa aplikasi cerdas memanfaatkan celah untuk mendapatkan daftar aplikasi anda, sehingga mereka bisa membangun profil tentang anda.\n\nModul ini menyediakan beberapa metode untuk menguji apakah anda telah menyembunyikan daftar aplikasi dengan baik. Selain itu, dapat berfungsi sebagai modul Xposed untuk menyembunyikan aplikasi tertentu atau menolak permintaan daftar aplikasi guna melindungi privasi anda. + Meskipun tidak tepat untuk mendeteksi instalasi aplikasi tertentu, tidak semua aplikasi yang menggunakan root mendukung nama paket acak. Dalam kasus ini, aplikasi terdeteksi yang menggunakan root (seperti Lokasi Palsu dan Isolasi Penyimpanan) dianggap sama dengan root itu sendiri.\n\nPada saat yang sama, beberapa aplikasi cerdas memanfaatkan celah untuk mendapatkan daftar aplikasi anda, sehingga mereka bisa membangun profil tentang anda.\n\nModul ini menyediakan beberapa metode untuk menguji apakah anda telah menyembunyikan daftar aplikasi dengan baik. Selain itu, dapat berfungsi sebagai modul Xposed untuk menyembunyikan aplikasi tertentu atau menolak permintaan daftar aplikasi guna melindungi privasi anda. - - Proyek HMA asli telah menjadi sumber tertutup dan kode terbaru mereka tidak memuat beberapa perubahan terbaru, jadi saya membuat percabangan ini untuk melanjutkannya sebagai sumber terbuka lagi. + Proyek HMA asli telah menjadi sumber tertutup dan kode terbaru mereka tidak memuat beberapa perubahan terbaru, jadi saya membuat percabangan ini untuk melanjutkannya sebagai sumber terbuka lagi. Cara menggunakan modul ini - - Anda dapat membuat template di \"Kelola templat\".\nKemudian terapkan templat ke aplikasi di \"Kelola aplikasi\". (Anda juga dapat memilih aplikasi tambahan untuk target.)\nAnda harus dan HANYA memeriksa \"Kerangka Sistem\" dalam scope modul Xposed / whitelist. + Anda dapat membuat template di \"Kelola templat\".\nKemudian terapkan templat ke aplikasi di \"Kelola aplikasi\". (Anda juga dapat memilih aplikasi tambahan untuk target.)\nAnda harus dan HANYA memeriksa \"Kerangka Sistem\" dalam scope modul Xposed / whitelist. - - Modifikasi konfigurasi efektif secara real time. + Modifikasi konfigurasi efektif secara real time. Pengembang Dukungan dan umpan balik Lisensi sumber terbuka - Sakura Merah @@ -198,7 +180,6 @@ Oranye tua Cokelat Biru abu - Tema gelap Selalu mati From 0b5935328e33ae464c8b7e99bd53879c13a45ee9 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Wed, 10 Sep 2025 06:03:56 +0300 Subject: [PATCH 20/28] Fix crash after editing uninstalled app config, update translations --- .../icu/nullptr/hidemyapplist/ui/view/AppItemView.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt index 48e2af7..742dcc5 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt @@ -35,7 +35,12 @@ class AppItemView @JvmOverloads constructor( fun load(packageName: String) { binding.packageName.text = packageName - binding.label.text = PackageHelper.loadAppLabel(packageName) - binding.icon.setImageBitmap(PackageHelper.loadAppIcon(packageName)) + try { + binding.label.text = PackageHelper.loadAppLabel(packageName) + binding.icon.setImageBitmap(PackageHelper.loadAppIcon(packageName)) + } catch (e: Throwable) { + binding.label.text = packageName + binding.icon.setImageResource(android.R.drawable.sym_def_app_icon) + } } } From 11fc2fc2063f9b1a6fb0b534e465ab0b14792de3 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Wed, 10 Sep 2025 07:13:08 +0300 Subject: [PATCH 21/28] Prevent adding HMA-OSS to the scope, show info text in list the when app/scope list is empty, add working mode indicator to template settings --- .../ui/adapter/AppSelectAdapter.kt | 7 +++- .../ui/fragment/AppSelectFragment.kt | 38 +++++++++++++++++++ .../ui/fragment/TemplateSettingsFragment.kt | 1 + .../main/res/layout/fragment_app_select.xml | 25 ++++++++++++ .../res/layout/fragment_template_settings.xml | 22 +++++++++++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 93 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppSelectAdapter.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppSelectAdapter.kt index 3474bc5..ebd5746 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppSelectAdapter.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppSelectAdapter.kt @@ -8,6 +8,7 @@ import icu.nullptr.hidemyapplist.ui.view.AppItemView import icu.nullptr.hidemyapplist.util.PackageHelper import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking +import org.frknkrc44.hma_oss.BuildConfig abstract class AppSelectAdapter( private val firstFilter: ((String) -> Boolean)? = null @@ -24,9 +25,11 @@ abstract class AppSelectAdapter( val filteredList = PackageHelper.appList.first().filter { if (firstFilter?.invoke(it) == false) return@filter false if (!PrefManager.appFilter_showSystem && PackageHelper.isSystem(it)) return@filter false + if (it == BuildConfig.APPLICATION_ID && + (this@AppSelectAdapter.javaClass == AppManageAdapter::class.java || + (this@AppSelectAdapter.javaClass == AppScopeAdapter::class.java && firstFilter != null))) return@filter false val label = PackageHelper.loadAppLabel(it) - val packageInfo = PackageHelper.loadPackageInfo(it) - label.lowercase().contains(constraintLowered) || packageInfo.packageName.lowercase().contains(constraintLowered) + label.lowercase().contains(constraintLowered) || it.lowercase().contains(constraintLowered) } FilterResults().also { it.values = filteredList } diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt index 965a3d1..4f3845d 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt @@ -4,13 +4,16 @@ import android.os.Build import android.os.Bundle import android.view.MenuItem import android.view.View +import android.view.ViewGroup import android.view.WindowInsets +import android.widget.TextView import androidx.activity.addCallback import androidx.appcompat.widget.SearchView import androidx.fragment.app.Fragment import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import by.kirich1409.viewbindingdelegate.viewBinding import icu.nullptr.hidemyapplist.service.PrefManager import icu.nullptr.hidemyapplist.ui.adapter.AppSelectAdapter @@ -113,6 +116,13 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { PackageHelper.invalidateCache() } + adapter.registerAdapterDataObserver( + EmptyDataObserver( + binding.list, + binding.listEmptyContainer + ) + ) + lifecycleScope.launch { PackageHelper.isRefreshing .flowWithLifecycle(lifecycle) @@ -145,4 +155,32 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { insets } } + + // Credit: https://medium.com/nerd-for-tech/empty-dataset-in-recyclerview-ad86833dd5c6 + inner class EmptyDataObserver( + private val recyclerView: RecyclerView, + private val emptyView: View + ): RecyclerView.AdapterDataObserver() { + private val isScopeFragment = this@AppSelectFragment.javaClass == ScopeFragment::class.java + + private fun checkIfEmpty() { + val emptyViewVisible = recyclerView.adapter!!.itemCount < if (isScopeFragment) 1 else 2 + emptyView.visibility = if (emptyViewVisible) View.VISIBLE else View.GONE + if (emptyViewVisible) { + emptyView.findViewById(R.id.list_empty_text).text = getString( + if (isScopeFragment) { + R.string.list_empty_no_enabled + } else { + R.string.list_empty_no_apps + } + ) + } + (recyclerView.parent as View).visibility = if (emptyViewVisible) View.GONE else View.VISIBLE + } + + override fun onChanged() { + super.onChanged() + checkIfEmpty() + } + } } diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt index 3e43580..1735ce6 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt @@ -80,6 +80,7 @@ class TemplateSettingsFragment : Fragment(R.layout.fragment_template_settings) { ) binding.templateName.setText(viewModel.name) + binding.workMode.setText(if (viewModel.isWhiteList) R.string.whitelist else R.string.blacklist) binding.templateName.addTextChangedListener { viewModel.name = it.toString() } binding.targetApps.setOnClickListener { setFragmentResultListener("app_select") { _, bundle -> diff --git a/app/src/main/res/layout/fragment_app_select.xml b/app/src/main/res/layout/fragment_app_select.xml index 75b2aa2..66696a6 100644 --- a/app/src/main/res/layout/fragment_app_select.xml +++ b/app/src/main/res/layout/fragment_app_select.xml @@ -37,5 +37,30 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> + + + + + + + diff --git a/app/src/main/res/layout/fragment_template_settings.xml b/app/src/main/res/layout/fragment_template_settings.xml index 8be7422..729eed5 100644 --- a/app/src/main/res/layout/fragment_template_settings.xml +++ b/app/src/main/res/layout/fragment_template_settings.xml @@ -39,6 +39,28 @@ android:layout_height="wrap_content" /> + + + + + + + By package name By install time By update time + Try enabling hiding for apps with this template\'s work mode and apps will appear here + No applications found, maybe you didn\'t allow this app to query all packages Establish templates for \"restless\" apps, controlling applist they can obtain.\n\nBlacklist (recommended): the apps selected in the template will be invisible to the apps applying the template.\nWhitelist: the apps not selected in the template will be invisible to the apps applying the template. From b51a3f695eb35934725b5b17695914c7e862df9c Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Thu, 11 Sep 2025 03:46:37 +0300 Subject: [PATCH 22/28] Add "Show presets" option, fix backup/restore config buttons, update translations --- .../hidemyapplist/service/ConfigManager.kt | 1 + .../hidemyapplist/service/ServiceClient.kt | 3 + .../ui/fragment/AppSelectFragment.kt | 28 ++++--- .../ui/fragment/TemplateManageFragment.kt | 4 +- .../hidemyapplist/util/PackageHelper.kt | 36 ++++++--- .../hma_oss/ui/adapter/AppPresetAdapter.kt | 58 ++++++++++++++ .../ui/adapter/AppPresetListAdapter.kt | 75 +++++++++++++++++++ .../hma_oss/ui/fragment/AppPresetFragment.kt | 50 +++++++++++++ .../hma_oss/ui/fragment/HomeFragment.kt | 8 ++ .../ui/fragment/PresetManageFragment.kt | 73 ++++++++++++++++++ app/src/main/res/layout/fragment_home.xml | 8 ++ .../res/layout/fragment_preset_manage.xml | 32 ++++++++ .../main/res/navigation/home_nav_graph.xml | 14 ++++ app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/strings.xml | 4 +- .../hidemyapplist/common/IHMAService.aidl | 2 + .../common/app_presets/BasePreset.kt | 2 + gradle/libs.versions.toml | 3 +- .../hidemyapplist/xposed/HMAService.kt | 3 + .../hidemyapplist/xposed/XposedEntry.kt | 3 - .../xposed/hook/PmsHookTarget28.kt | 4 - .../xposed/hook/PmsHookTarget30.kt | 1 - .../xposed/hook/PmsHookTarget33.kt | 5 -- .../xposed/hook/PmsHookTarget34.kt | 1 - 24 files changed, 380 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt create mode 100644 app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt create mode 100644 app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt create mode 100644 app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt create mode 100644 app/src/main/res/layout/fragment_preset_manage.xml diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/service/ConfigManager.kt b/app/src/main/java/icu/nullptr/hidemyapplist/service/ConfigManager.kt index e3ebdb1..76021b4 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/service/ConfigManager.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/service/ConfigManager.kt @@ -12,6 +12,7 @@ import java.io.File object ConfigManager { data class TemplateInfo(val name: String?, val isWhiteList: Boolean) + data class PresetInfo(val name: String, val translation: String) private const val TAG = "ConfigManager" private lateinit var config: JsonConfig diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/service/ServiceClient.kt b/app/src/main/java/icu/nullptr/hidemyapplist/service/ServiceClient.kt index 18e735e..6061701 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/service/ServiceClient.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/service/ServiceClient.kt @@ -88,6 +88,9 @@ object ServiceClient : IHMAService, IBinder.DeathRecipient { getServiceLegacy()?.handlePackageEvent(eventType, packageName) } + override fun getPackagesForPreset(presetName: String) = + getServiceLegacy()?.getPackagesForPreset(presetName) + override fun syncConfig(json: String) { getServiceLegacy()?.syncConfig(json) } diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt index 4f3845d..45627d4 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt @@ -4,7 +4,6 @@ import android.os.Build import android.os.Bundle import android.view.MenuItem import android.view.View -import android.view.ViewGroup import android.view.WindowInsets import android.widget.TextView import androidx.activity.addCallback @@ -23,6 +22,7 @@ import icu.nullptr.hidemyapplist.util.PackageHelper import kotlinx.coroutines.launch import org.frknkrc44.hma_oss.R import org.frknkrc44.hma_oss.databinding.FragmentAppSelectBinding +import org.frknkrc44.hma_oss.ui.fragment.AppPresetFragment abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { @@ -37,11 +37,11 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { navController.navigateUp() } - private fun applyFilter() { + protected fun applyFilter() { adapter.filter.filter(search) } - private fun sortList() { + protected open fun sortList() { lifecycleScope.launch { PackageHelper.sortList(firstComparator) applyFilter() @@ -78,11 +78,13 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { sortList() } + open fun getFragmentTitle() = getString(R.string.title_app_select) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { onBack() } setupToolbar( toolbar = binding.toolbar, - title = getString(R.string.title_app_select), + title = getFragmentTitle(), navigationIcon = R.drawable.baseline_arrow_back_24, navigationOnClick = { onBack() }, menuRes = R.menu.menu_app_list, @@ -161,17 +163,23 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { private val recyclerView: RecyclerView, private val emptyView: View ): RecyclerView.AdapterDataObserver() { - private val isScopeFragment = this@AppSelectFragment.javaClass == ScopeFragment::class.java + private val fragmentType by lazy { + when(this@AppSelectFragment.javaClass) { + ScopeFragment::class.java -> 0 + AppPresetFragment::class.java -> 1 + else -> 2 + } + } private fun checkIfEmpty() { - val emptyViewVisible = recyclerView.adapter!!.itemCount < if (isScopeFragment) 1 else 2 + val emptyViewVisible = recyclerView.adapter!!.itemCount < if (fragmentType < 2) 1 else 2 emptyView.visibility = if (emptyViewVisible) View.VISIBLE else View.GONE if (emptyViewVisible) { emptyView.findViewById(R.id.list_empty_text).text = getString( - if (isScopeFragment) { - R.string.list_empty_no_enabled - } else { - R.string.list_empty_no_apps + when (fragmentType) { + 0 -> R.string.list_empty_no_enabled + 1 -> R.string.list_empty_preset + else -> R.string.list_empty_no_apps } ) } diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt index 649cb7b..2537a3c 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt @@ -1,6 +1,5 @@ package icu.nullptr.hidemyapplist.ui.fragment -import android.graphics.Color import android.os.Build import android.os.Bundle import android.view.View @@ -12,7 +11,6 @@ import androidx.fragment.app.setFragmentResultListener import androidx.navigation.fragment.FragmentNavigatorExtras import androidx.recyclerview.widget.LinearLayoutManager import by.kirich1409.viewbindingdelegate.viewBinding -import com.google.android.material.transition.MaterialContainerTransform import icu.nullptr.hidemyapplist.common.JsonConfig import icu.nullptr.hidemyapplist.service.ConfigManager import icu.nullptr.hidemyapplist.ui.adapter.TemplateAdapter @@ -28,10 +26,12 @@ class TemplateManageFragment : Fragment(R.layout.fragment_template_manage) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + /* sharedElementEnterTransition = MaterialContainerTransform().apply { drawingViewId = R.id.nav_host_fragment scrimColor = Color.TRANSPARENT } + */ } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/util/PackageHelper.kt b/app/src/main/java/icu/nullptr/hidemyapplist/util/PackageHelper.kt index d360147..950fbb2 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/util/PackageHelper.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/util/PackageHelper.kt @@ -26,11 +26,15 @@ object PackageHelper { val icon: Bitmap ) - private object Comparators { + object Comparators { val byLabel = Comparator { o1, o2 -> - val n1 = loadAppLabel(o1).lowercase(Locale.getDefault()) - val n2 = loadAppLabel(o2).lowercase(Locale.getDefault()) - Collator.getInstance(Locale.getDefault()).compare(n1, n2) + try { + val n1 = loadAppLabel(o1).lowercase(Locale.getDefault()) + val n2 = loadAppLabel(o2).lowercase(Locale.getDefault()) + Collator.getInstance(Locale.getDefault()).compare(n1, n2) + } catch (_: Throwable) { + byPackageName.compare(o1, o2) + } } val byPackageName = Comparator { o1, o2 -> val n1 = o1.lowercase(Locale.getDefault()) @@ -38,14 +42,22 @@ object PackageHelper { Collator.getInstance(Locale.getDefault()).compare(n1, n2) } val byInstallTime = Comparator { o1, o2 -> - val n1 = loadPackageInfo(o1).firstInstallTime - val n2 = loadPackageInfo(o2).firstInstallTime - n2.compareTo(n1) + try { + val n1 = loadPackageInfo(o1).firstInstallTime + val n2 = loadPackageInfo(o2).firstInstallTime + n2.compareTo(n1) + } catch (_: Throwable) { + byPackageName.compare(o1, o2) + } } val byUpdateTime = Comparator { o1, o2 -> - val n1 = loadPackageInfo(o1).lastUpdateTime - val n2 = loadPackageInfo(o2).lastUpdateTime - n2.compareTo(n1) + try { + val n1 = loadPackageInfo(o1).lastUpdateTime + val n2 = loadPackageInfo(o2).lastUpdateTime + n2.compareTo(n1) + } catch (_: Throwable) { + byPackageName.compare(o1, o2) + } } } @@ -99,6 +111,10 @@ object PackageHelper { mAppList.emit(list) } + fun exists(packageName: String) = runBlocking { + packageCache.first().contains(packageName) + } + fun loadPackageInfo(packageName: String): PackageInfo = runBlocking { packageCache.first()[packageName]!!.info } diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt new file mode 100644 index 0000000..89381ad --- /dev/null +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt @@ -0,0 +1,58 @@ +package org.frknkrc44.hma_oss.ui.adapter + +import android.view.ViewGroup +import android.widget.Filter +import icu.nullptr.hidemyapplist.service.ServiceClient +import icu.nullptr.hidemyapplist.ui.adapter.AppSelectAdapter +import icu.nullptr.hidemyapplist.ui.view.AppItemView +import icu.nullptr.hidemyapplist.util.PackageHelper +import kotlinx.coroutines.runBlocking + +class AppPresetAdapter( + private val presetName: String +) : AppSelectAdapter() { + val packages by lazy { ServiceClient.getPackagesForPreset(presetName)?.toMutableList() ?: mutableListOf() } + + inner class ViewHolder(view: AppItemView) : AppSelectAdapter.ViewHolder(view) { + override fun bind(packageName: String) { + (itemView as AppItemView).let { + it.load(packageName) + it.alpha = if (!PackageHelper.exists(packageName)) 0.5f else 1.0f + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = AppItemView(parent.context, false) + view.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + return ViewHolder(view) + } + + private inner class PresetFilter : Filter() { + override fun performFiltering(constraint: CharSequence): FilterResults { + return runBlocking { + val constraintLowered = constraint.toString().lowercase() + val filteredList = packages.filter { + if (constraintLowered.isEmpty()) return@filter true + val label = PackageHelper.loadAppLabel(it) + label.lowercase().contains(constraintLowered) || it.lowercase().contains(constraintLowered) + } + + FilterResults().also { it.values = filteredList } + } + } + + @Suppress("UNCHECKED_CAST", "NotifyDataSetChanged") + override fun publishResults(constraint: CharSequence, results: FilterResults) { + filteredList = results.values as List + notifyDataSetChanged() + } + } + + private val mFilter = PresetFilter() + + override fun getFilter(): Filter = mFilter +} diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt new file mode 100644 index 0000000..b27062b --- /dev/null +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt @@ -0,0 +1,75 @@ +package org.frknkrc44.hma_oss.ui.adapter + +import android.annotation.SuppressLint +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import icu.nullptr.hidemyapplist.common.AppPresets +import icu.nullptr.hidemyapplist.hmaApp +import icu.nullptr.hidemyapplist.service.ConfigManager +import icu.nullptr.hidemyapplist.ui.view.ListItemView +import org.frknkrc44.hma_oss.BuildConfig +import org.frknkrc44.hma_oss.R + +class AppPresetListAdapter( + private val onClickListener: ((ConfigManager.PresetInfo) -> Unit)? +) : RecyclerView.Adapter() { + + private lateinit var list: List + + init { + updateList() + } + + inner class ViewHolder(view: ListItemView) : RecyclerView.ViewHolder(view) { + init { + view.setOnClickListener { + onClickListener?.invoke(list[absoluteAdapterPosition]) + } + } + + fun bind(presetName: String) { + with(itemView as ListItemView) { + setIcon(R.drawable.baseline_assignment_24) + text = presetName + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = ListItemView(parent.context) + view.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + return ViewHolder(view) + } + + override fun getItemCount() = list.size + + override fun getItemId(position: Int) = list[position].name.hashCode().toLong() + + override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(list[position].translation) + + @SuppressLint("NotifyDataSetChanged") + fun updateList() { + val presetNames = AppPresets.instance.getAllPresetNames() + val presetTranslations = presetNames.map { name -> + try { + val id = hmaApp.resources.getIdentifier( + "preset_${name}", + "string", + BuildConfig.APPLICATION_ID + ) + + return@map if (id != 0) { hmaApp.resources.getString(id) } else { name } + } catch (_: Throwable) {} + + name + } + + list = presetNames + .map { ConfigManager.PresetInfo(it, presetTranslations[presetNames.indexOf(it)]) } + .sortedWith { a, b -> a.translation.lowercase().compareTo(b.translation.lowercase()) } + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt new file mode 100644 index 0000000..43225a3 --- /dev/null +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt @@ -0,0 +1,50 @@ +package org.frknkrc44.hma_oss.ui.fragment + +import android.os.Bundle +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.navArgs +import icu.nullptr.hidemyapplist.service.PrefManager +import icu.nullptr.hidemyapplist.ui.fragment.AppSelectFragment +import icu.nullptr.hidemyapplist.util.PackageHelper +import icu.nullptr.hidemyapplist.util.PackageHelper.Comparators +import kotlinx.coroutines.launch +import org.frknkrc44.hma_oss.ui.adapter.AppPresetAdapter + +class AppPresetFragment() : AppSelectFragment() { + + override val firstComparator = Comparator.comparing(PackageHelper::exists).reversed() + + override val adapter by lazy { + val args by navArgs() + AppPresetAdapter(args.presetName) + } + + override fun getFragmentTitle(): String { + val args by navArgs() + return args.presetTitle + } + + override fun sortList() { + lifecycleScope.launch { + sortPresetList() + applyFilter() + } + } + + fun sortPresetList() { + var comparator = when (PrefManager.appFilter_sortMethod) { + PrefManager.SortMethod.BY_LABEL -> Comparators.byLabel + PrefManager.SortMethod.BY_PACKAGE_NAME -> Comparators.byPackageName + PrefManager.SortMethod.BY_INSTALL_TIME -> Comparators.byInstallTime + PrefManager.SortMethod.BY_UPDATE_TIME -> Comparators.byUpdateTime + } + if (PrefManager.appFilter_reverseOrder) comparator = comparator.reversed() + adapter.packages.sortWith(firstComparator.then(comparator)) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + // enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true) + // returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt index 62fc204..68b0a8c 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/HomeFragment.kt @@ -267,6 +267,14 @@ class HomeFragment : Fragment(R.layout.fragment_home) { } } + with(binding.managePresets) { + text1.text = getString(R.string.title_preset_manage) + icon.setImageResource(R.drawable.baseline_my_location_24) + root.setOnClickListener { + navigate(R.id.nav_presets) + } + } + with(binding.navLogs) { text1.text = getString(R.string.title_logs) icon.setImageResource(R.drawable.outline_assignment_24) diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt new file mode 100644 index 0000000..d57c65b --- /dev/null +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt @@ -0,0 +1,73 @@ +package org.frknkrc44.hma_oss.ui.fragment + +import android.os.Build +import android.os.Bundle +import android.view.View +import android.view.WindowInsets +import androidx.core.view.doOnPreDraw +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import by.kirich1409.viewbindingdelegate.viewBinding +import icu.nullptr.hidemyapplist.service.ConfigManager +import icu.nullptr.hidemyapplist.ui.util.navController +import icu.nullptr.hidemyapplist.ui.util.setupToolbar +import org.frknkrc44.hma_oss.R +import org.frknkrc44.hma_oss.databinding.FragmentPresetManageBinding +import org.frknkrc44.hma_oss.ui.adapter.AppPresetListAdapter + +class PresetManageFragment : Fragment(R.layout.fragment_preset_manage) { + + private val binding by viewBinding() + private val adapter = AppPresetListAdapter(this::navigateToPreset) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + /* + sharedElementEnterTransition = MaterialContainerTransform().apply { + drawingViewId = R.id.nav_host_fragment + scrimColor = Color.TRANSPARENT + } + */ + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + setupToolbar( + toolbar = binding.toolbar, + title = getString(R.string.title_preset_manage), + navigationIcon = R.drawable.baseline_arrow_back_24, + navigationOnClick = { navController.navigateUp() } + ) + postponeEnterTransition() + view.doOnPreDraw { startPostponedEnterTransition() } + + binding.presetList.layoutManager = LinearLayoutManager(context) + binding.presetList.adapter = adapter + + binding.root.setOnApplyWindowInsetsListener { v, insets -> + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val barInsets = insets.getInsets(WindowInsets.Type.systemBars()) + binding.root.setPadding( + barInsets.left, + barInsets.top, + barInsets.right, + barInsets.bottom, + ) + } else { + @Suppress("deprecation") + binding.root.setPadding( + insets.systemWindowInsetLeft, + insets.systemWindowInsetTop, + insets.systemWindowInsetRight, + insets.systemWindowInsetBottom, + ) + } + + insets + } + } + + private fun navigateToPreset(presetInfo: ConfigManager.PresetInfo) { + val args = AppPresetFragmentArgs(presetInfo.name, presetInfo.translation) + navController.navigate(R.id.nav_preset_inner_manage, args.toBundle()) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 798f570..5f03305 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -54,6 +54,10 @@ android:id="@+id/manage_templates" layout="@layout/view_home_item" /> + + @@ -75,6 +79,8 @@ android:id="@+id/backup_config" app:icon="@drawable/outline_backup_24" android:text="@string/home_backup_config" + android:maxLines="1" + android:ellipsize="end" android:layout_marginRight="8dp" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -84,6 +90,8 @@ android:id="@+id/restore_config" app:icon="@drawable/outline_settings_backup_restore_24" android:text="@string/home_restore_config" + android:maxLines="1" + android:ellipsize="end" android:layout_marginLeft="8dp" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/fragment_preset_manage.xml b/app/src/main/res/layout/fragment_preset_manage.xml new file mode 100644 index 0000000..2544f26 --- /dev/null +++ b/app/src/main/res/layout/fragment_preset_manage.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/navigation/home_nav_graph.xml b/app/src/main/res/navigation/home_nav_graph.xml index 914c535..3f8d60e 100644 --- a/app/src/main/res/navigation/home_nav_graph.xml +++ b/app/src/main/res/navigation/home_nav_graph.xml @@ -22,6 +22,10 @@ android:id="@+id/nav_template_manage" android:name="icu.nullptr.hidemyapplist.ui.fragment.TemplateManageFragment" android:label="@string/title_template_manage" /> + + + + + 6dp 1dp + 16dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0cc8451..8e0c3bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -67,6 +67,7 @@ By update time Try enabling hiding for apps with this template\'s work mode and apps will appear here No applications found, maybe you didn\'t allow this app to query all packages + No applications added in this preset Establish templates for \"restless\" apps, controlling applist they can obtain.\n\nBlacklist (recommended): the apps selected in the template will be invisible to the apps applying the template.\nWhitelist: the apps not selected in the template will be invisible to the apps applying the template. @@ -106,7 +107,8 @@ You can enable it if this app is not available at Play Store Don\'t forget to force stop the target app after saving the configuration - + + Show presets LSPosed/Xposed modules Root managers/Rooted apps Custom ROM apps diff --git a/common/src/main/aidl/icu/nullptr/hidemyapplist/common/IHMAService.aidl b/common/src/main/aidl/icu/nullptr/hidemyapplist/common/IHMAService.aidl index 42a8607..12c19cb 100644 --- a/common/src/main/aidl/icu/nullptr/hidemyapplist/common/IHMAService.aidl +++ b/common/src/main/aidl/icu/nullptr/hidemyapplist/common/IHMAService.aidl @@ -15,4 +15,6 @@ interface IHMAService { void clearLogs() = 5; void handlePackageEvent(String eventType, String packageName) = 6; + + String[] getPackagesForPreset(String presetName) = 7; } diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/BasePreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/BasePreset.kt index d317c34..43782d7 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/BasePreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/BasePreset.kt @@ -12,6 +12,8 @@ abstract class BasePreset(val name: String) { fun containsPackage(packageName: String) = exactPackageNames.contains(packageName) || packageNames.contains(packageName) + val packages get() = packageNames + exactPackageNames + fun addPackageInfoPreset(appInfo: ApplicationInfo): Boolean { val packageName = appInfo.packageName if (!exactPackageNames.contains(packageName) && canBeAddedIntoPreset(appInfo)) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5889b09..13c7777 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.12.1" +agp = "8.13.0" kotlin = "2.1.10" material = "1.13.0-rc01" rxhttp = "3.3.1" @@ -13,7 +13,6 @@ kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", versi ksp = { id = "com.google.devtools.ksp", version = "2.1.10-1.0.31" } nav-safeargs-kotlin = { id = "androidx.navigation.safeargs.kotlin", version = "2.8.8" } autoresconfig = { id = "dev.rikka.tools.autoresconfig", version = "1.2.2" } -materialthemebuilder = { id = "dev.rikka.tools.materialthemebuilder", version = "1.5.1" } refine = { id = "dev.rikka.tools.refine", version = "4.4.0" } [libraries] diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt index 9777bf0..4d0d17e 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt @@ -277,4 +277,7 @@ class HMAService(val pms: IPackageManager) : IHMAService.Stub() { Intent.ACTION_PACKAGE_REMOVED -> AppPresets.instance.handlePackageRemoved(packageName) } } + + override fun getPackagesForPreset(presetName: String) = + AppPresets.instance.getPresetByName(presetName)?.packages?.toTypedArray() } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt index f691005..0764690 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt @@ -3,14 +3,11 @@ package icu.nullptr.hidemyapplist.xposed import android.content.pm.IPackageManager import com.github.kyuubiran.ezxhelper.init.EzXHelperInit import com.github.kyuubiran.ezxhelper.utils.findMethod -import com.github.kyuubiran.ezxhelper.utils.getFieldByDesc -import com.github.kyuubiran.ezxhelper.utils.hookAllConstructorAfter import com.github.kyuubiran.ezxhelper.utils.hookBefore import de.robv.android.xposed.IXposedHookLoadPackage import de.robv.android.xposed.IXposedHookZygoteInit import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.callbacks.XC_LoadPackage -import icu.nullptr.hidemyapplist.common.Constants import kotlin.concurrent.thread private const val TAG = "HMA-XposedEntry" diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt index 873947a..12ab1bb 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt @@ -1,20 +1,16 @@ package icu.nullptr.hidemyapplist.xposed.hook import android.content.pm.ResolveInfo -import android.os.Binder import com.github.kyuubiran.ezxhelper.utils.findMethod 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.Constants.VENDING_PACKAGE_NAME import icu.nullptr.hidemyapplist.common.Utils import icu.nullptr.hidemyapplist.xposed.HMAService import icu.nullptr.hidemyapplist.xposed.Utils4Xposed import icu.nullptr.hidemyapplist.xposed.logD import icu.nullptr.hidemyapplist.xposed.logE import icu.nullptr.hidemyapplist.xposed.logI -import java.util.concurrent.atomic.AtomicReference class PmsHookTarget28(service: HMAService) : PmsHookTargetBase(service) { diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt index e33585b..7de7691 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget30.kt @@ -1,6 +1,5 @@ package icu.nullptr.hidemyapplist.xposed.hook -import android.content.pm.PackageManager import android.os.Build import androidx.annotation.RequiresApi import com.github.kyuubiran.ezxhelper.utils.findConstructor diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt index a5688a7..71fe3f9 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget33.kt @@ -1,16 +1,12 @@ package icu.nullptr.hidemyapplist.xposed.hook import android.content.pm.PackageInstaller -import android.content.pm.PackageManager -import android.os.Binder import android.os.Build import androidx.annotation.RequiresApi import com.github.kyuubiran.ezxhelper.utils.findConstructor import com.github.kyuubiran.ezxhelper.utils.findMethod -import com.github.kyuubiran.ezxhelper.utils.findMethodOrNull import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.github.kyuubiran.ezxhelper.utils.paramCount -import de.robv.android.xposed.XC_MethodHook import icu.nullptr.hidemyapplist.common.Constants import icu.nullptr.hidemyapplist.common.Constants.VENDING_PACKAGE_NAME import icu.nullptr.hidemyapplist.common.Utils @@ -19,7 +15,6 @@ import icu.nullptr.hidemyapplist.xposed.Utils4Xposed import icu.nullptr.hidemyapplist.xposed.logD import icu.nullptr.hidemyapplist.xposed.logE import icu.nullptr.hidemyapplist.xposed.logI -import java.util.concurrent.atomic.AtomicReference @RequiresApi(Build.VERSION_CODES.TIRAMISU) class PmsHookTarget33(service: HMAService) : PmsHookTargetBase(service) { diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt index 5e67c86..5b8de07 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget34.kt @@ -1,7 +1,6 @@ package icu.nullptr.hidemyapplist.xposed.hook import android.content.pm.PackageInstaller -import android.content.pm.PackageManager import android.os.Binder import android.os.Build import androidx.annotation.RequiresApi From 7d743b085e949455fdacf88c796a6db91aa01b9d Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Thu, 11 Sep 2025 21:57:12 +0300 Subject: [PATCH 23/28] Fix "Show presets" display language, fix freezing when loading preset details, update translations --- .../ui/fragment/AppSelectFragment.kt | 10 ++- .../ui/fragment/TemplateManageFragment.kt | 10 --- .../ui/fragment/TemplateSettingsFragment.kt | 10 --- .../hma_oss/ui/adapter/AppPresetAdapter.kt | 9 ++- .../ui/adapter/AppPresetListAdapter.kt | 13 ++-- .../hma_oss/ui/fragment/AppPresetFragment.kt | 41 ++++++++++--- .../ui/fragment/PresetManageFragment.kt | 14 ++--- .../main/res/layout/fragment_app_select.xml | 61 +++++++++++-------- .../hidemyapplist/common/AppPresets.kt | 11 +--- .../hidemyapplist/common/SettingsPresets.kt | 11 +--- 10 files changed, 95 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt index 45627d4..b7be401 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt @@ -26,7 +26,7 @@ import org.frknkrc44.hma_oss.ui.fragment.AppPresetFragment abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { - private val binding by viewBinding() + protected val binding by viewBinding() protected abstract val firstComparator: Comparator protected abstract val adapter: AppSelectAdapter @@ -48,6 +48,10 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { } } + open fun invalidateCache() { + PackageHelper.invalidateCache() + } + private fun onMenuOptionSelected(item: MenuItem) { when (item.itemId) { R.id.menu_show_system -> { @@ -115,7 +119,7 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { binding.list.layoutManager = LinearLayoutManager(context) binding.list.adapter = adapter binding.swipeRefresh.setOnRefreshListener { - PackageHelper.invalidateCache() + invalidateCache() } adapter.registerAdapterDataObserver( @@ -183,7 +187,7 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { } ) } - (recyclerView.parent as View).visibility = if (emptyViewVisible) View.GONE else View.VISIBLE + recyclerView.visibility = if (emptyViewVisible) View.GONE else View.VISIBLE } override fun onChanged() { diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt index 2537a3c..4bb088b 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateManageFragment.kt @@ -24,16 +24,6 @@ class TemplateManageFragment : Fragment(R.layout.fragment_template_manage) { private val binding by viewBinding() private val adapter = TemplateAdapter(this::navigateToSettings) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - /* - sharedElementEnterTransition = MaterialContainerTransform().apply { - drawingViewId = R.id.nav_host_fragment - scrimColor = Color.TRANSPARENT - } - */ - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { setupToolbar( toolbar = binding.toolbar, diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt index 1735ce6..8898ab6 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/TemplateSettingsFragment.kt @@ -56,16 +56,6 @@ class TemplateSettingsFragment : Fragment(R.layout.fragment_template_settings) { navController.navigateUp() } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - /* - sharedElementEnterTransition = MaterialContainerTransform().apply { - drawingViewId = R.id.nav_host_fragment - scrimColor = Color.TRANSPARENT - } - */ - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { onBack(false) } setupToolbar( diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt index 89381ad..985c61c 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt @@ -7,11 +7,17 @@ import icu.nullptr.hidemyapplist.ui.adapter.AppSelectAdapter import icu.nullptr.hidemyapplist.ui.view.AppItemView import icu.nullptr.hidemyapplist.util.PackageHelper import kotlinx.coroutines.runBlocking +import kotlin.lazy class AppPresetAdapter( private val presetName: String ) : AppSelectAdapter() { - val packages by lazy { ServiceClient.getPackagesForPreset(presetName)?.toMutableList() ?: mutableListOf() } + var packages = mutableListOf() + + fun updateList() { + packages.clear() + packages += ServiceClient.getPackagesForPreset(presetName)?.toList() ?: listOf() + } inner class ViewHolder(view: AppItemView) : AppSelectAdapter.ViewHolder(view) { override fun bind(packageName: String) { @@ -32,6 +38,7 @@ class AppPresetAdapter( } private inner class PresetFilter : Filter() { + override fun performFiltering(constraint: CharSequence): FilterResults { return runBlocking { val constraintLowered = constraint.toString().lowercase() diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt index b27062b..d5445b1 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetListAdapter.kt @@ -1,23 +1,24 @@ package org.frknkrc44.hma_oss.ui.adapter import android.annotation.SuppressLint +import android.content.Context import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import icu.nullptr.hidemyapplist.common.AppPresets -import icu.nullptr.hidemyapplist.hmaApp import icu.nullptr.hidemyapplist.service.ConfigManager import icu.nullptr.hidemyapplist.ui.view.ListItemView import org.frknkrc44.hma_oss.BuildConfig import org.frknkrc44.hma_oss.R class AppPresetListAdapter( + context: Context, private val onClickListener: ((ConfigManager.PresetInfo) -> Unit)? ) : RecyclerView.Adapter() { private lateinit var list: List init { - updateList() + updateList(context) } inner class ViewHolder(view: ListItemView) : RecyclerView.ViewHolder(view) { @@ -50,18 +51,18 @@ class AppPresetListAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(list[position].translation) - @SuppressLint("NotifyDataSetChanged") - fun updateList() { + @SuppressLint("NotifyDataSetChanged", "DiscouragedApi") + private fun updateList(context: Context) { val presetNames = AppPresets.instance.getAllPresetNames() val presetTranslations = presetNames.map { name -> try { - val id = hmaApp.resources.getIdentifier( + val id = context.resources.getIdentifier( "preset_${name}", "string", BuildConfig.APPLICATION_ID ) - return@map if (id != 0) { hmaApp.resources.getString(id) } else { name } + return@map if (id != 0) { context.resources.getString(id) } else { name } } catch (_: Throwable) {} name diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt index 43225a3..d97e261 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt @@ -1,18 +1,25 @@ package org.frknkrc44.hma_oss.ui.fragment import android.os.Bundle +import android.view.View import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.navArgs +import icu.nullptr.hidemyapplist.hmaApp import icu.nullptr.hidemyapplist.service.PrefManager import icu.nullptr.hidemyapplist.ui.fragment.AppSelectFragment import icu.nullptr.hidemyapplist.util.PackageHelper import icu.nullptr.hidemyapplist.util.PackageHelper.Comparators +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.frknkrc44.hma_oss.ui.adapter.AppPresetAdapter +import kotlin.coroutines.suspendCoroutine class AppPresetFragment() : AppSelectFragment() { - override val firstComparator = Comparator.comparing(PackageHelper::exists).reversed() + override val firstComparator: Comparator = Comparator.comparing(PackageHelper::exists).reversed() override val adapter by lazy { val args by navArgs() @@ -25,9 +32,12 @@ class AppPresetFragment() : AppSelectFragment() { } override fun sortList() { - lifecycleScope.launch { + hmaApp.globalScope.launch { sortPresetList() - applyFilter() + + lifecycleScope.launch { + applyFilter() + } } } @@ -39,12 +49,27 @@ class AppPresetFragment() : AppSelectFragment() { PrefManager.SortMethod.BY_UPDATE_TIME -> Comparators.byUpdateTime } if (PrefManager.appFilter_reverseOrder) comparator = comparator.reversed() - adapter.packages.sortWith(firstComparator.then(comparator)) + + val packages = adapter.packages.sortedWith(firstComparator.then(comparator)) + + lifecycleScope.launch { + adapter.packages.clear() + adapter.packages += packages + } } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - // enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true) - // returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false) + override fun invalidateCache() { + super.invalidateCache() + adapter.updateList() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + lifecycleScope.launch { + binding.swipeRefresh.isRefreshing = true + adapter.updateList() + sortList() + } } } \ No newline at end of file diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt index d57c65b..2607c28 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt @@ -6,11 +6,13 @@ import android.view.View import android.view.WindowInsets import androidx.core.view.doOnPreDraw import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import by.kirich1409.viewbindingdelegate.viewBinding import icu.nullptr.hidemyapplist.service.ConfigManager import icu.nullptr.hidemyapplist.ui.util.navController import icu.nullptr.hidemyapplist.ui.util.setupToolbar +import kotlinx.coroutines.launch import org.frknkrc44.hma_oss.R import org.frknkrc44.hma_oss.databinding.FragmentPresetManageBinding import org.frknkrc44.hma_oss.ui.adapter.AppPresetListAdapter @@ -18,16 +20,8 @@ import org.frknkrc44.hma_oss.ui.adapter.AppPresetListAdapter class PresetManageFragment : Fragment(R.layout.fragment_preset_manage) { private val binding by viewBinding() - private val adapter = AppPresetListAdapter(this::navigateToPreset) - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - /* - sharedElementEnterTransition = MaterialContainerTransform().apply { - drawingViewId = R.id.nav_host_fragment - scrimColor = Color.TRANSPARENT - } - */ + private val adapter by lazy { + AppPresetListAdapter(requireContext(), this::navigateToPreset) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/res/layout/fragment_app_select.xml b/app/src/main/res/layout/fragment_app_select.xml index 66696a6..696c165 100644 --- a/app/src/main/res/layout/fragment_app_select.xml +++ b/app/src/main/res/layout/fragment_app_select.xml @@ -32,35 +32,42 @@ android:clipToPadding="false" android:scrollbars="vertical"> - + android:layout_height="match_parent"> + + + + + + + + + + + - - - - - - diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt index 73851b7..437710a 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/AppPresets.kt @@ -16,16 +16,7 @@ class AppPresets private constructor() { var loggerFunction: ((String) -> Unit)? = null companion object { - private var hiddenInstance: AppPresets? = null - - val instance: AppPresets - get() { - if (hiddenInstance == null) { - hiddenInstance = AppPresets() - } - - return hiddenInstance!! - } + val instance by lazy { AppPresets() } } fun getAllPresetNames() = presetList.map { it.name }.toTypedArray() diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/SettingsPresets.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/SettingsPresets.kt index 42b8529..85d5be9 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/SettingsPresets.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/SettingsPresets.kt @@ -8,16 +8,7 @@ class SettingsPresets private constructor() { private val presetList = mutableListOf() companion object { - private var hiddenInstance: SettingsPresets? = null - - val instance: SettingsPresets - get() { - if (hiddenInstance == null) { - hiddenInstance = SettingsPresets() - } - - return hiddenInstance!! - } + val instance by lazy { SettingsPresets() } } fun getAllPresetNames() = presetList.map { it.name }.toTypedArray() From d9a8e0d5a944ccdfc6080b2c0f73de1e7376b117 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Thu, 11 Sep 2025 23:09:09 +0300 Subject: [PATCH 24/28] Optimize imports, try to add GitHub release support This is not a code change release, so you can continue to use the previous version. --- .../org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt | 1 - .../org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt | 5 ----- .../frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt | 2 -- 3 files changed, 8 deletions(-) diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt index 985c61c..2d49326 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt @@ -7,7 +7,6 @@ import icu.nullptr.hidemyapplist.ui.adapter.AppSelectAdapter import icu.nullptr.hidemyapplist.ui.view.AppItemView import icu.nullptr.hidemyapplist.util.PackageHelper import kotlinx.coroutines.runBlocking -import kotlin.lazy class AppPresetAdapter( private val presetName: String diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt index d97e261..3ada7a2 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/AppPresetFragment.kt @@ -9,13 +9,8 @@ import icu.nullptr.hidemyapplist.service.PrefManager import icu.nullptr.hidemyapplist.ui.fragment.AppSelectFragment import icu.nullptr.hidemyapplist.util.PackageHelper import icu.nullptr.hidemyapplist.util.PackageHelper.Comparators -import kotlinx.coroutines.CoroutineStart -import kotlinx.coroutines.async -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.frknkrc44.hma_oss.ui.adapter.AppPresetAdapter -import kotlin.coroutines.suspendCoroutine class AppPresetFragment() : AppSelectFragment() { diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt index 2607c28..6849c61 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/fragment/PresetManageFragment.kt @@ -6,13 +6,11 @@ import android.view.View import android.view.WindowInsets import androidx.core.view.doOnPreDraw import androidx.fragment.app.Fragment -import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import by.kirich1409.viewbindingdelegate.viewBinding import icu.nullptr.hidemyapplist.service.ConfigManager import icu.nullptr.hidemyapplist.ui.util.navController import icu.nullptr.hidemyapplist.ui.util.setupToolbar -import kotlinx.coroutines.launch import org.frknkrc44.hma_oss.R import org.frknkrc44.hma_oss.databinding.FragmentPresetManageBinding import org.frknkrc44.hma_oss.ui.adapter.AppPresetListAdapter From 4942a02337ac9ddfcf327592818aa34e0bc1b18d Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Fri, 12 Sep 2025 17:30:44 +0300 Subject: [PATCH 25/28] Fix a few crashes on search functions, remove useless permissions, update translations --- app/src/main/AndroidManifest.xml | 2 -- .../ui/adapter/AppSelectAdapter.kt | 9 ++++++--- .../ui/fragment/AppSelectFragment.kt | 8 +++++++- .../hma_oss/ui/adapter/AppPresetAdapter.kt | 20 ++++++++++++++----- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3a9950a..6ddd65a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,8 +6,6 @@ android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="PackageVisibilityPolicy,QueryAllPackagesPermission" /> - - - notifyDataSetChanged() + val values = results.values + if (values != null) { + filteredList = values as List + notifyDataSetChanged() + } } } diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt index b7be401..066b962 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/AppSelectFragment.kt @@ -175,8 +175,14 @@ abstract class AppSelectFragment : Fragment(R.layout.fragment_app_select) { } } + val atLeastEntryCount: Int get() { + if (!search.isBlank()) return 0 + + return if (fragmentType < 2) 1 else 2 + } + private fun checkIfEmpty() { - val emptyViewVisible = recyclerView.adapter!!.itemCount < if (fragmentType < 2) 1 else 2 + val emptyViewVisible = recyclerView.adapter!!.itemCount < atLeastEntryCount emptyView.visibility = if (emptyViewVisible) View.VISIBLE else View.GONE if (emptyViewVisible) { emptyView.findViewById(R.id.list_empty_text).text = getString( diff --git a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt index 2d49326..6185b3b 100644 --- a/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt +++ b/app/src/main/java/org/frknkrc44/hma_oss/ui/adapter/AppPresetAdapter.kt @@ -40,11 +40,18 @@ class AppPresetAdapter( override fun performFiltering(constraint: CharSequence): FilterResults { return runBlocking { - val constraintLowered = constraint.toString().lowercase() + val constraintLowered = constraint.toString().trim().lowercase() val filteredList = packages.filter { if (constraintLowered.isEmpty()) return@filter true - val label = PackageHelper.loadAppLabel(it) - label.lowercase().contains(constraintLowered) || it.lowercase().contains(constraintLowered) + + if (it.lowercase().contains(constraintLowered)) return@filter true + + try { + val label = PackageHelper.loadAppLabel(it) + return@filter label.lowercase().contains(constraintLowered) + } catch (e: Throwable) { + return@filter false + } } FilterResults().also { it.values = filteredList } @@ -53,8 +60,11 @@ class AppPresetAdapter( @Suppress("UNCHECKED_CAST", "NotifyDataSetChanged") override fun publishResults(constraint: CharSequence, results: FilterResults) { - filteredList = results.values as List - notifyDataSetChanged() + val values = results.values + if (values != null) { + filteredList = values as List + notifyDataSetChanged() + } } } From 3b1fb478caaa51bc0694ab993b0a9090febf4c3e Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Mon, 1 Sep 2025 20:32:26 +0300 Subject: [PATCH 26/28] Add risky package warning with bypass switch --- .../hidemyapplist/service/PrefManager.kt | 5 +++++ .../ui/adapter/AppManageAdapter.kt | 19 +++++++++++++++++++ .../ui/fragment/SettingsFragment.kt | 7 +++++++ .../hidemyapplist/ui/view/AppItemView.kt | 2 +- app/src/main/res/values/strings.xml | 4 ++++ app/src/main/res/xml/settings.xml | 5 +++++ 6 files changed, 41 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/service/PrefManager.kt b/app/src/main/java/icu/nullptr/hidemyapplist/service/PrefManager.kt index 022a034..eef3c8e 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/service/PrefManager.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/service/PrefManager.kt @@ -19,6 +19,7 @@ object PrefManager { private const val PREF_THEME_COLOR = "theme_color" private const val PREF_HIDE_ICON = "hide_icon" + private const val PREF_BYPASS_RISKY_PACKAGE_WARNING = "bypass_risky_package_warning" private const val PREF_APP_FILTER_SHOW_SYSTEM = "app_filter_show_system" private const val PREF_APP_FILTER_SORT_METHOD = "app_filter_sort_method" @@ -67,6 +68,10 @@ object PrefManager { hmaApp.packageManager.setComponentEnabledSetting(component, status, PackageManager.DONT_KILL_APP) } + var bypassRiskyPackageWarning: Boolean + get() = pref.getBoolean(PREF_BYPASS_RISKY_PACKAGE_WARNING, false) + set(value) = pref.edit().putBoolean(PREF_BYPASS_RISKY_PACKAGE_WARNING, value).apply() + var appFilter_showSystem: Boolean get() = pref.getBoolean(PREF_APP_FILTER_SHOW_SYSTEM, false) set(value) = pref.edit().putBoolean(PREF_APP_FILTER_SHOW_SYSTEM, value).apply() diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppManageAdapter.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppManageAdapter.kt index 75f1713..e50c71d 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppManageAdapter.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/adapter/AppManageAdapter.kt @@ -1,16 +1,35 @@ package icu.nullptr.hidemyapplist.ui.adapter import android.view.ViewGroup +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import icu.nullptr.hidemyapplist.common.Constants.GMS_PACKAGE_NAME +import icu.nullptr.hidemyapplist.common.Constants.GSF_PACKAGE_NAME import icu.nullptr.hidemyapplist.service.ConfigManager +import icu.nullptr.hidemyapplist.service.PrefManager import icu.nullptr.hidemyapplist.ui.view.AppItemView +import org.frknkrc44.hma_oss.R class AppManageAdapter( private val onItemClickListener: (String) -> Unit ) : AppSelectAdapter() { + private val riskyPackages = arrayOf(GMS_PACKAGE_NAME, GSF_PACKAGE_NAME) inner class ViewHolder(view: AppItemView) : AppSelectAdapter.ViewHolder(view) { init { view.setOnClickListener { + if (!PrefManager.bypassRiskyPackageWarning && riskyPackages.contains(view.binding.packageName.text)) { + MaterialAlertDialogBuilder(view.context) + .setTitle(R.string.app_warning_risky_package_title) + .setMessage(R.string.app_warning_risky_package_desc) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(android.R.string.ok) { _, _ -> + onItemClickListener.invoke(filteredList[absoluteAdapterPosition]) + } + .show() + + return@setOnClickListener + } + onItemClickListener.invoke(filteredList[absoluteAdapterPosition]) } } diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/SettingsFragment.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/SettingsFragment.kt index 6a86d59..05b8ecf 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/fragment/SettingsFragment.kt @@ -97,6 +97,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen "blackDarkTheme" -> PrefManager.blackDarkTheme "detailLog" -> ConfigManager.detailLog "hideIcon" -> PrefManager.hideIcon + "bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning "appDataIsolation" -> CommonUtils.isAppDataIsolationEnabled "voldAppDataIsolation" -> CommonUtils.isVoldAppDataIsolationEnabled "forceMountData" -> ConfigManager.forceMountData @@ -121,6 +122,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen "detailLog" -> ConfigManager.detailLog = value "forceMountData" -> ConfigManager.forceMountData = value "hideIcon" -> PrefManager.hideIcon = value + "bypassRiskyPackageWarning" -> PrefManager.bypassRiskyPackageWarning = value "appDataIsolation" -> Unit "voldAppDataIsolation" -> Unit else -> throw IllegalArgumentException("Invalid key: $key") @@ -267,6 +269,11 @@ class SettingsFragment : Fragment(R.layout.fragment_settings), PreferenceFragmen configureDataIsolation() + findPreference("bypassRiskyPackageWarning")?.setOnPreferenceChangeListener { _, newValue -> + activity?.recreate() + true + } + findPreference("stopSystemService")?.setOnPreferenceClickListener { if (ServiceClient.serviceVersion != 0) { MaterialAlertDialogBuilder(requireContext()) diff --git a/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt b/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt index 742dcc5..1589e39 100644 --- a/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt +++ b/app/src/main/java/icu/nullptr/hidemyapplist/ui/view/AppItemView.kt @@ -15,7 +15,7 @@ class AppItemView @JvmOverloads constructor( defStyleRes: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr, defStyleRes) { - private val binding by viewBinding(createMethod = CreateMethod.INFLATE) + val binding by viewBinding(createMethod = CreateMethod.INFLATE) var showEnabled: Boolean get() = binding.enabled.visibility == VISIBLE diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8e0c3bb..d7df6d9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ Using %d settings presets %d additional apps visible %d additional apps invisible + Risky package + This package is marked as risky and you can cause issues on hidden apps. Do you want to continue? Risky package @@ -142,6 +144,8 @@ Logger buffer sizes Hide module icon in launcher You can still open the app in Xposed manager + Bypass risky package warning + Note that the devs are not responsible for risky package related issues before or after you enabled this feature Language Participate in translation diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index b67f301..421ab63 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -33,6 +33,11 @@ + Date: Tue, 16 Sep 2025 23:44:00 +0700 Subject: [PATCH 27/28] fix: strings.xml: duplicate strings Signed-off-by: Cuynu --- app/src/main/res/values/strings.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d7df6d9..e61bbb2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,9 +97,6 @@ Risky package This package is marked as risky and you can cause issues on hidden apps. Do you want to continue? - - Risky package - This package is marked as risky and you can cause issues on hidden apps. Do you want to continue? Spoofing Spoof installation sources All of user apps will be spoofed as installed over Play Store for this application From 94fbc8babedfcd29918b13f874ce14b31859aa61 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Mon, 15 Sep 2025 16:42:49 +0300 Subject: [PATCH 28/28] Fix Xposed module detection, add more packages to presets (thanks to ShirkNeko) This version also contains translation updates --- .../hidemyapplist/common/app_presets/CustomROMPreset.kt | 4 ++++ .../hidemyapplist/common/app_presets/RootAppsPreset.kt | 9 ++++++++- .../common/app_presets/XposedModulesPreset.kt | 9 +++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt index 96e6c4d..9e62392 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/CustomROMPreset.kt @@ -11,6 +11,10 @@ class CustomROMPreset() : BasePreset("custom_rom") { override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean { val packageName = appInfo.packageName + if (containsPackage(packageName)) { + return false + } + // LineageOS overlays if (appInfo.sourceDir.contains("_lineage_")) { return true diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/RootAppsPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/RootAppsPreset.kt index f2764f0..920ece3 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/RootAppsPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/RootAppsPreset.kt @@ -1,6 +1,7 @@ package icu.nullptr.hidemyapplist.common.app_presets import android.content.pm.ApplicationInfo +import icu.nullptr.hidemyapplist.common.Utils import java.util.zip.ZipFile class RootAppsPreset() : BasePreset("root_apps") { @@ -9,7 +10,6 @@ class RootAppsPreset() : BasePreset("root_apps") { "io.github.a13e300.ksuwebui", "io.github.muntashirakon.AppManager", "com.fox2code.mmm", - "xzr.hkf", "com.speedsoftware.rootexplorer", "id.kuato.diskhealth", "com.sunilpaulmathew.debloater", @@ -34,6 +34,8 @@ class RootAppsPreset() : BasePreset("root_apps") { "ru.nsu.bobrofon.easysshfs", "x1125io.initdlight", "com.lonelycatgames.Xplore", + "com.byyoung.setting", + "web1n.stopapp", // kernel managers "flar2.exkernelmanager", @@ -50,6 +52,11 @@ class RootAppsPreset() : BasePreset("root_apps") { return false } + // All libxzr apps (konabess, hkf, ...) + if (Utils.startsWithMultiple(packageName, "xzr.", "moe.xzr.")) { + return true + } + // FX File Manager if (packageName.startsWith("nextapp.fx")) { return true diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/XposedModulesPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/XposedModulesPreset.kt index 665d707..65042db 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/XposedModulesPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/app_presets/XposedModulesPreset.kt @@ -6,6 +6,11 @@ import java.util.zip.ZipFile class XposedModulesPreset() : BasePreset("xposed") { override val exactPackageNames = setOf() + companion object { + private const val XPOSED_PROP1 = "\u0000x\u0000p\u0000o\u0000s\u0000e\u0000d\u0000m\u0000o\u0000d\u0000u\u0000l\u0000e" + private const val XPOSED_PROP2 = "\u0000x\u0000p\u0000o\u0000s\u0000e\u0000d\u0000s\u0000c\u0000o\u0000p\u0000e" + } + override fun canBeAddedIntoPreset(appInfo: ApplicationInfo): Boolean { ZipFile(appInfo.sourceDir).use { zipFile -> val manifestFile = zipFile.getInputStream( @@ -14,9 +19,9 @@ class XposedModulesPreset() : BasePreset("xposed") { 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")) { + if (manifestStr.contains(XPOSED_PROP1) || manifestStr.contains(XPOSED_PROP2)) { return true - } else if (zipFile.getEntry("META-INF/xposed")?.isDirectory ?: false) { + } else if (zipFile.getEntry("META-INF/xposed/module.prop") != null) { return true } }