From 796b260f7a0d62e3bd8c8646238dcc1033b81a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Wed, 1 Jan 2025 21:59:24 +0800 Subject: [PATCH 01/43] adj: remove mediaeditor some old func --- .../hyperceiler/module/app/MediaEditor.java | 2 - .../hook/mediaeditor/FilterManagerAll.kt | 55 ------------------- .../mediaeditor/UnlockCustomPhotoFrames.kt | 7 +-- .../app/systemui/SystemUIOtherSettings.java | 6 +- app/src/main/res/values-ar-rSA/strings.xml | 1 - app/src/main/res/values-es-rES/strings.xml | 1 - app/src/main/res/values-in-rID/strings.xml | 1 - app/src/main/res/values-it-rIT/strings.xml | 1 - app/src/main/res/values-ja-rJP/strings.xml | 1 - app/src/main/res/values-pl-rPL/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-ru-rRU/strings.xml | 1 - app/src/main/res/values-tr-rTR/strings.xml | 1 - app/src/main/res/values-vi-rVN/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - app/src/main/res/xml/mediaeditor.xml | 9 +-- 19 files changed, 9 insertions(+), 85 deletions(-) delete mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java index b00695ce6..e4bcce5ee 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java @@ -21,7 +21,6 @@ import com.hchen.database.HookBase; import com.sevtinge.hyperceiler.module.base.BaseModule; import com.sevtinge.hyperceiler.module.hook.mediaeditor.CustomWatermark; -import com.sevtinge.hyperceiler.module.hook.mediaeditor.FilterManagerAll; import com.sevtinge.hyperceiler.module.hook.mediaeditor.UnlockAigc; import com.sevtinge.hyperceiler.module.hook.mediaeditor.UnlockCustomPhotoFrames; import com.sevtinge.hyperceiler.module.hook.mediaeditor.UnlockDisney; @@ -37,7 +36,6 @@ public class MediaEditor extends BaseModule { public void handleLoadPackage() { // 基础 initHook(UnlockMinimumCropLimit2.INSTANCE, mPrefsMap.getBoolean("mediaeditor_unlock_minimum_crop_limit")); - initHook(FilterManagerAll.INSTANCE, mPrefsMap.getBoolean("mediaeditor_filter_manager")); initHook(UnlockLeicaFilter.INSTANCE, mPrefsMap.getBoolean("mediaeditor_unlock_leica_filter")); initHook(CustomWatermark.INSTANCE, !Objects.equals(mPrefsMap.getString("mediaeditor_custom_watermark", ""), "")); // AI 创作 diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt deleted file mode 100644 index 512df4451..000000000 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This file is part of HyperCeiler. - - * HyperCeiler is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - - * Copyright (C) 2023-2025 HyperCeiler Contributions -*/ -package com.sevtinge.hyperceiler.module.hook.mediaeditor - -import android.os.* -import com.github.kyuubiran.ezxhelper.ClassUtils.setStaticObject -import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook -import com.sevtinge.hyperceiler.module.base.* -import com.sevtinge.hyperceiler.module.base.dexkit.* -import com.sevtinge.hyperceiler.utils.api.LazyClass.AndroidBuildCls -import java.lang.reflect.* - - -object FilterManagerAll : BaseHook() { - private lateinit var device: String - private val methodResult by lazy { - DexKit.findMember("FilterManagerAll") { dexkit -> - dexkit.findMethod { - matcher { - addUsingString("wayne") - } - }.filter { it.isMethod }.toTypedArray().firstOrNull() - } - } - - override fun init() { - methodResult.createHook { - before { - if (!this@FilterManagerAll::device.isInitialized) { - device = Build.DEVICE - } - setStaticObject(AndroidBuildCls, "DEVICE", "wayne") - } - after { - setStaticObject(AndroidBuildCls, "DEVICE", device) - } - } - } -} diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index 92132c9d0..c5c4f840a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -28,9 +28,6 @@ object UnlockCustomPhotoFrames : BaseHook() { private val frames by lazy { mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) } - private val isOpenSpring by lazy { - mPrefsMap.getBoolean("mediaeditor_unlock_spring") - } private val isNewMediaeditor by lazy { // 以 1.7.5.0.4 为新旧版本分界线 getPackageVersionCode(lpparam) >= 4658180 @@ -116,13 +113,13 @@ object UnlockCustomPhotoFrames : BaseHook() { other(method) } - if (isOpenSpring && publicC.isNotEmpty()) { + /*if (isOpenSpring && publicC.isNotEmpty()) { publicC.forEach { method -> other(method) // 1.6.0.5.2 新增限时新春定制画框 // 后续版本已移除,其实可以删掉的,但还是留着吧,兴许后面可能还有用 } - } + }*/ } private fun xiaomi(name: Method) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java index c43821ace..674e55b74 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java @@ -34,6 +34,8 @@ import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.ui.fragment.dashboard.DashboardFragment; +import java.util.Objects; + import fan.preference.DropDownPreference; public class SystemUIOtherSettings extends DashboardFragment { @@ -88,7 +90,7 @@ public void initPrefs() { (preference, o) -> { ComponentName componentName = new ComponentName("miui.systemui.plugin", "miui.systemui.volume.VolumeDialogPlugin"); - PackageManager packageManager = getContext().getPackageManager(); + PackageManager packageManager = requireContext().getPackageManager(); if ((boolean) o) { packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, @@ -107,7 +109,7 @@ public void initPrefs() { public boolean onPreferenceChange(@NonNull Preference preference, Object o) { ComponentName componentName = new ComponentName("miui.systemui.plugin", "miui.systemui.globalactions.GlobalActionsPlugin"); - PackageManager packageManager = getContext().getPackageManager(); + PackageManager packageManager = requireContext().getPackageManager(); if ((boolean) o) { packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index c1a6fbd92..538b39bb2 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -1493,7 +1493,6 @@ تخصيص نوع الإطار فتح فلتر لايكا يتم دعم بعض الإصدارات فقط - فتح مدير الفلاتر فتح AIGC مشاركة شاومي diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index a124215bc..00befcdba 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1283,7 +1283,6 @@ aplicaciones del sistema Personalizar el tipo de marco Desbloquear filtros de Leica Solo en algunas versiones se funciona - Desbloquear filtros de maestro Mi Share No se permite el cierre automático de Mi Share diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index 962546dc1..ad3a3b73c 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -1279,7 +1279,6 @@ Sesuaikan jenis bingkai Buka kunci filter Leica Hanya beberapa versi yang didukung - Buka kunci manajer filter Mi Share Nonaktifkan penutupan otomatis Mi Share diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 4313a783b..f5e6f3695 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -1249,7 +1249,6 @@ Personalizza il tipo di cornice Sblocca il filtro Leica Sono supportate solo alcune versioni - Sblocca la gestione filtri Mi Share Disabilita la chiusura automatica di Mi Share diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 5cdd7ca82..5ddb68063 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1454,7 +1454,6 @@ フレームの種類をカスタマイズ Leica フィルターをアンロック 一部のバージョンにのみ対応しています - フィルターマネージャーをアンロック AIGC をアンロック Mi シェア diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 44ad11800..7887f89ce 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -1494,7 +1494,6 @@ Dostosuj typ ramki Odblokuj filtr Leica Obsługiwane są tylko niektóre wersje - Odblokuj menedżera filtrów Odblokuj AIGC Mi Share diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 1bd366bd9..ee95e9300 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1494,7 +1494,6 @@ Personalizar tipo de moldura Desbloquear filtro Leica Apenas algumas versões são suportadas - Desbloquear gerenciador de filtros Desbloquear AIGC Xiaomi Share diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index f697b5e9c..88087cec9 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -1494,7 +1494,6 @@ Изменить тип фрейма Разблокировать фильтр Leica Поддерживаются только некоторые версии - Менеджер фильтров Разблокировать AIGC Mi Share diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index f05bce6fd..779be0a79 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -1269,7 +1269,6 @@ Çerçeve türünü özelleştirin Leica filtresinin kilidini açın Sadece bazı sürümler destekleniyor - Filtre yöneticisinin kilidini açın Mi Paylaşım Mi Paylaşımının otomatik kapanmasını devre dışı bırak diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index b1db16cd8..6ddd35777 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -1500,7 +1500,6 @@ Chức năng này là chức năng thử nghiệm có độ ổn định caoTùy chỉnh loại khung hình Mở khóa bộ lọc Leica Chỉ hỗ trợ một số phiên bản - Mở khóa bộ lọc chính Mở khóa AIGC Mi Share diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 50d90cfb2..06c0df74a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1587,7 +1587,6 @@ 定制画框类型 解锁 Leica 滤镜 仅支持部分版本 - 解锁大师滤镜 解锁 AIGC 小米互传 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index e191ae7a5..13a2d8ec6 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1356,7 +1356,7 @@ 訂製画框類型 解鎖 Leica 濾鏡 僅支援部分版本 - 解鎖大師濾鏡 + 解鎖 AIGC 小米互傳 禁用自動關閉小米互傳 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6533ac952..f3f50d706 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1494,7 +1494,6 @@ 訂製畫框類型 解鎖 Leica 濾鏡 僅支援部分版本 - 解鎖大師濾鏡 解鎖 AIGC 小米互傳 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3155c5c1b..aa2c7a6f7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1574,7 +1574,6 @@ Customize the frame type Unlock the Leica filter Only some versions are supported - Unlock the filter manager Unlock AIGC Xiaomi Share diff --git a/app/src/main/res/xml/mediaeditor.xml b/app/src/main/res/xml/mediaeditor.xml index 415883458..b134ce255 100644 --- a/app/src/main/res/xml/mediaeditor.xml +++ b/app/src/main/res/xml/mediaeditor.xml @@ -37,11 +37,6 @@ android:summary="@string/mediaeditor_unlock_leica_filter_desc" android:title="@string/mediaeditor_unlock_leica_filter_title" /> - - - + android:title="@string/mediaeditor_unlock_spring_title" />--> Date: Wed, 1 Jan 2025 23:05:00 +0800 Subject: [PATCH 02/43] [skp]fix: isSwapWiFiAndMobileNetwork (hy1) --- .../statusbar/icon/all/StatusBarIconPositionAdjust.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/all/StatusBarIconPositionAdjust.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/all/StatusBarIconPositionAdjust.java index 2ed9ea9f7..34ba9b540 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/all/StatusBarIconPositionAdjust.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/all/StatusBarIconPositionAdjust.java @@ -18,6 +18,8 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui.statusbar.icon.all; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; + import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; @@ -58,7 +60,11 @@ public class StatusBarIconPositionAdjust extends BaseHook { @Override public void init() { - mStatusBarIconList = findClassIfExists("com.android.systemui.statusbar.phone.ui.StatusBarIconList"); + if (isMoreHyperOSVersion(2f)) { + mStatusBarIconList = findClassIfExists("com.android.systemui.statusbar.phone.ui.StatusBarIconList"); + } else { + mStatusBarIconList = findClassIfExists("com.android.systemui.statusbar.phone.StatusBarIconList"); + } mSystemUIApplication = findClassIfExists("com.android.systemui.SystemUIApplication"); mMiuiDripLeftStatusBarIconControllerImpl = findClassIfExists("com.android.systemui.statusbar.phone.MiuiDripLeftStatusBarIconControllerImpl"); From f8515c97330d983b636dc6e9064c983f5f8a0a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Thu, 9 Jan 2025 16:11:37 +0800 Subject: [PATCH 03/43] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E7=9B=B8=E5=86=8C=E7=BC=96=E8=BE=91=E9=83=A8=E5=88=86?= =?UTF-8?q?=20hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 21 +-- .../hyperceiler/module/app/MediaEditor.java | 14 +- .../mediaeditor/UnlockCustomPhotoFrames.kt | 142 +++++++++++------- .../module/hook/mediaeditor/UnlockDisney.kt | 55 ++++++- .../ui/fragment/app/MediaeditorFragment.java | 66 ++++++++ app/src/main/res/values-zh-rCN/strings.xml | 9 +- app/src/main/res/values/arrays.xml | 20 ++- app/src/main/res/values/strings.xml | 7 + app/src/main/res/xml/mediaeditor.xml | 106 +++++++++++-- app/src/main/res/xml/prefs_main.xml | 4 +- 10 files changed, 342 insertions(+), 102 deletions(-) create mode 100644 app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MediaeditorFragment.java diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c9c2b0627..0b4f8748b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -99,8 +99,9 @@ android { versionCode = 155 versionName = "2.5.155" - val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") - sdf.timeZone = TimeZone.getTimeZone("Asia/Shanghai") + val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").apply { + timeZone = TimeZone.getTimeZone("Asia/Shanghai") + } val buildTime = sdf.format(Date()) val osName = System.getProperty("os.name") // val osArch = System.getProperty("os.arch") @@ -126,18 +127,12 @@ android { } androidResources { - additionalParameters += "--allow-reserved-package-id" - additionalParameters += "--package-id" - additionalParameters += "0x36" + additionalParameters += listOf("--allow-reserved-package-id", "--package-id", "0x36") } packaging { resources { - excludes += "/META-INF/**" - excludes += "/kotlin/**" - excludes += "/*.txt" - excludes += "/*.bin" - excludes += "/*.json" + excludes += listOf("/META-INF/**", "/kotlin/**", "/*.txt", "/*.bin", "/*.json") } dex { useLegacyPackaging = true @@ -188,8 +183,7 @@ android { "proguard-rules.pro", "proguard-log.pro" ) - versionNameSuffix = - "_${DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now())}" + versionNameSuffix = "_${DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now())}" buildConfigField("String", "GIT_HASH", "\"$gitHash\"") buildConfigField("String", "GIT_CODE", "\"$gitCode\"") signingConfig = if (properties != null) { @@ -204,8 +198,7 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) - versionNameSuffix = - "_${DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now())}" + versionNameSuffix = "_${DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now())}" buildConfigField("String", "GIT_HASH", "\"${getGitHashLong()}\"") buildConfigField("String", "GIT_CODE", "\"$gitCode\"") signingConfig = if (properties != null) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java index e4bcce5ee..4a23b93a0 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/MediaEditor.java @@ -34,14 +34,20 @@ public class MediaEditor extends BaseModule { @Override public void handleLoadPackage() { + // AI + initHook(new UnlockAigc(), mPrefsMap.getBoolean("mediaeditor_unlock_aigc")); // 基础 initHook(UnlockMinimumCropLimit2.INSTANCE, mPrefsMap.getBoolean("mediaeditor_unlock_minimum_crop_limit")); initHook(UnlockLeicaFilter.INSTANCE, mPrefsMap.getBoolean("mediaeditor_unlock_leica_filter")); initHook(CustomWatermark.INSTANCE, !Objects.equals(mPrefsMap.getString("mediaeditor_custom_watermark", ""), "")); - // AI 创作 - initHook(UnlockCustomPhotoFrames.INSTANCE, mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) != 0); - initHook(UnlockDisney.INSTANCE, mPrefsMap.getStringAsInt("mediaeditor_unlock_disney_some_func", 0) != 0); - initHook(new UnlockAigc(), mPrefsMap.getBoolean("mediaeditor_unlock_aigc")); + // 创作 + if (mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) == 1) { + initHook(UnlockCustomPhotoFrames.INSTANCE, mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) != 0); + initHook(UnlockDisney.INSTANCE, mPrefsMap.getStringAsInt("mediaeditor_unlock_disney_some_func", 0) != 0); + } else if (mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) == 2) { + initHook(UnlockCustomPhotoFrames.INSTANCE, mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_v2")); + initHook(UnlockDisney.INSTANCE, mPrefsMap.getBoolean("mediaeditor_unlock_disney_some_func_v2")); + } } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index c5c4f840a..8f74ad674 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -19,106 +19,132 @@ package com.sevtinge.hyperceiler.module.hook.mediaeditor import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook +import com.github.kyuubiran.ezxhelper.MemberExtensions.paramCount +import com.github.kyuubiran.ezxhelper.ObjectHelper.Companion.objectHelper import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* -import com.sevtinge.hyperceiler.module.base.tool.OtherTool.* +import com.sevtinge.hyperceiler.utils.* +import com.sevtinge.hyperceiler.utils.api.* +import com.sevtinge.hyperceiler.utils.log.* import java.lang.reflect.* object UnlockCustomPhotoFrames : BaseHook() { private val frames by lazy { mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) } - private val isNewMediaeditor by lazy { - // 以 1.7.5.0.4 为新旧版本分界线 - getPackageVersionCode(lpparam) >= 4658180 + private val isHookType by lazy { + mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) == 2 + } + private val isOpenSpring by lazy { + mPrefsMap.getBoolean("mediaeditor_unlock_spring") + } + private val isLeica by lazy { + if (!isHookType) { + frames == 1 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_leica") + } + } + private val isRedmi by lazy { + if (!isHookType) { + frames == 2 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_redmi") + } + } + private val isPOCO by lazy { + if (!isHookType) { + frames == 3 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_poco") + } } - private val isLeica by lazy { frames == 1 } - private val isRedmi by lazy { frames == 2 } - private val isPOCO by lazy { frames == 3 } - private val publicA by lazy> { - DexKit.findMemberList("PA") { bridge -> + private val methodA by lazy> { + DexKit.findMemberList("MA") { bridge -> bridge.findMethod { matcher { - // 真是妹想到啊,1.5 和 1.6 版本还以为不会套回去了 - // 现在这个查找方式直接兼容 1.4 - 1.9 - // 1.6.5.10.2 迪斯尼定制画框解锁的地方和现在的不一样 - // 1.7.5.0.4 之后,类名迁移,内部文件改动较大,此为临时解决方案 - if (isNewMediaeditor) { + // 改动日志: + // 现在这个查找方式直接兼容 1.5 - 1.9 + // 1.6.5.10.2 之后迪斯尼定制画框解锁的地方和现在的不一样 + // 1.7.5.0.4 之后,类名迁移,内部文件改动较大 + // 合并缓存,现在只需查询一次即可获取全部 6 个需要 Hook 的方法,且不会出现多余的方法 (2025.1.8) + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - modifiers = Modifier.FINAL or Modifier.STATIC + addUsingField { + // 如果后面有改的话请释放这个注释 + // modifiers = Modifier.STATIC or Modifier.FINAL + type = "java.util.List" + } returnType = "boolean" - paramCount = 0 - // 1.6.5.10.2 以上方法查找完剩下 a() c() e() } } } } - // 公共解锁特定机型定制画框使用限制 - private val publicB by lazy> { - DexKit.findMemberList("PB") { dexkit -> - dexkit.findMethod { + private val springA by lazy { + DexKit.findMember("SA") { bridge -> + bridge.findField { matcher { - if (isNewMediaeditor) { + // 改动日志: + // 这里是新春定制画框的解锁,仅在部分版本中存在 + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - // modifiers = Modifier.STATIC // 1.6.5.10.2 改成 STATIC,原来是 FINAL - returnType = "boolean" - paramCount = 1 - addUsingField { - modifiers = Modifier.STATIC or Modifier.FINAL - } + modifiers = Modifier.STATIC + type = "boolean" } - } + }.single() } } - override fun init() { - val publicC = DexKit.findMemberList("PC") { - it.findMethod { + private val redmiB by lazy { + DexKit.findMember("RB") { bridge -> + bridge.findField { matcher { - publicA.forEach { a -> - name = a.name - } - usingFields { - add { - type = "boolean" - } + // 改动日志: + // 这里是红米定制联名画框的解锁 + // 从 1.6.5.10.2 版本开始,解锁此画框的难度较高 + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { + declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") + } else { + declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } + modifiers = Modifier.STATIC or Modifier.FINAL } - } + }.last() } + } - val actions = if (isNewMediaeditor) { - listOf<(Method) -> Unit>(::xiaomi, ::redmi, ::poco, ::other) - } else { - listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi, ::other) - } - val differentItems = publicA.subtract(publicC.toSet()) + override fun init() { var index = 0 + val actions = listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi) - differentItems.forEach { method -> - val action = actions.getOrElse(index) { ::other } - action(method) - index = (index + 1) % actions.size + methodA.forEach { method -> + if (method.paramCount == 1) { + // 公共解锁特定机型定制画框使用限制 + other(method) + } else { + val action = actions[index] + action(method) + index = (index + 1) % actions.size + } } - publicB.forEach { method -> - other(method) + if (isOpenSpring && springA != null) { + springA.setBoolean(null, true) } - /*if (isOpenSpring && publicC.isNotEmpty()) { - publicC.forEach { method -> - other(method) - // 1.6.0.5.2 新增限时新春定制画框 - // 后续版本已移除,其实可以删掉的,但还是留着吧,兴许后面可能还有用 - } + /*if (isRedmi && redmiB != null) { + }*/ } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt index 7ed215c06..ce2dadc0f 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt @@ -54,20 +54,59 @@ object UnlockDisney : BaseHook() { } } + private val princess by lazy { + DexKit.findMember("UnlockDisneyPrincess") { + it.findField { + matcher { + declaredClass = mickey.declaringClass.name + modifiers = Modifier.STATIC or Modifier.FINAL + } + }.last().readers.single() + } + } + + private val isHookType by lazy { + mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) + } private val isType by lazy { mPrefsMap.getStringAsInt("mediaeditor_unlock_disney_some_func", 0) } + private val isMickey by lazy { + mPrefsMap.getBoolean("mediaeditor_unlock_mickey_some_func") + } + private val isBear by lazy { + mPrefsMap.getBoolean("mediaeditor_unlock_bear_some_func") + } + private val isPrincess by lazy { + mPrefsMap.getBoolean("mediaeditor_unlock_princess_some_func") + } + override fun init() { - when (isType) { - 1 -> { - isHook(mickey, true) - isHook(bear, false) - } - 2 -> { - isHook(mickey, false) - isHook(bear, true) + if (isHookType == 1) { + when (isType) { + 1 -> { + isHook(mickey, true) + isHook(bear, false) + isHook(princess, false) + } + + 2 -> { + isHook(mickey, false) + isHook(bear, true) + isHook(princess, false) + } + + 3 -> { + isHook(mickey, false) + isHook(bear, false) + isHook(princess, true) + } } + } else if (isHookType == 2) { + isHook(mickey, isMickey) + isHook(bear, isBear) + isHook(princess, isPrincess) } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MediaeditorFragment.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MediaeditorFragment.java new file mode 100644 index 000000000..4f2f85f67 --- /dev/null +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MediaeditorFragment.java @@ -0,0 +1,66 @@ +package com.sevtinge.hyperceiler.ui.fragment.app; + +import androidx.annotation.NonNull; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; + +import com.sevtinge.hyperceiler.R; +import com.sevtinge.hyperceiler.ui.fragment.dashboard.DashboardFragment; +import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; + +import fan.preference.DropDownPreference; + +public class MediaeditorFragment extends DashboardFragment + implements Preference.OnPreferenceChangeListener { + + DropDownPreference mMediaHook; + PreferenceCategory mAuthoringV1; + PreferenceCategory mAuthoringV2; + PreferenceCategory mCustomPhoto; + PreferenceCategory mCustomDisney; + + @Override + public int getPreferenceScreenResId() { + return R.xml.mediaeditor; + } + + @Override + public void initPrefs() { + int mMediaHookMode = Integer.parseInt(PrefsUtils.getSharedStringPrefs(getContext(), "prefs_key_mediaeditor_hook_type", "0")); + mMediaHook = findPreference("prefs_key_mediaeditor_hook_type"); + mAuthoringV1 = findPreference("prefs_key_mediaeditor_custom_photo_frames_v1"); + mAuthoringV2 = findPreference("prefs_key_mediaeditor_custom_photo_frames_v2"); + mCustomPhoto = findPreference("prefs_key_mediaeditor_custom_photo_frames_v2_photo"); + mCustomDisney = findPreference("prefs_key_mediaeditor_custom_photo_frames_v2_disney"); + + setMediaHookMode(mMediaHookMode); + mMediaHook.setOnPreferenceChangeListener(this); + } + + @Override + public boolean onPreferenceChange(@NonNull Preference preference, Object o) { + if (preference == mMediaHook) { + setMediaHookMode(Integer.parseInt((String) o)); + } + return true; + } + + private void setMediaHookMode(int mode) { + if (mode == 0) { + mAuthoringV1.setVisible(false); + mAuthoringV2.setVisible(false); + mCustomPhoto.setVisible(false); + mCustomDisney.setVisible(false); + } else if (mode == 1) { + mAuthoringV1.setVisible(true); + mAuthoringV2.setVisible(false); + mCustomPhoto.setVisible(false); + mCustomDisney.setVisible(false); + } else if (mode == 2) { + mAuthoringV1.setVisible(false); + mAuthoringV2.setVisible(true); + mCustomPhoto.setVisible(PrefsUtils.getSharedBoolPrefs(getContext(), "prefs_key_mediaeditor_unlock_custom_photo_frames_v2", false)); + mCustomDisney.setVisible(PrefsUtils.getSharedBoolPrefs(getContext(), "prefs_key_mediaeditor_unlock_disney_some_func_v2", false)); + } + } +} diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 06c0df74a..a339f5567 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -447,6 +447,7 @@ 米老鼠 草莓熊 + 迪士尼公主 Google Play 服务 传送门 @@ -1577,13 +1578,19 @@ 请确认正确填写了 IMEI ,错误的 IMEI 可能会造成 eSIM 不可用或异常,由此产生的后果概不负责 小米相册-编辑 + 使用说明:\n- 1.7.5.0.4 及之后的版本请使用 v2 hook,低于 1.7.5.0.4 的版本请使用 v1 hook + 相册编辑 hook 模式 基础 + 创作 AI 创作 + 定制画框 + 联名功能 解锁 Disney 定制功能 解锁包括以下功能:\n- 定制画框-Disney 定制画框(与其他定制画框冲突)\n- 背景虚化-米奇虚化\n- 贴纸-Disney 贴纸 解锁新春定制画框 - 永久添加新春定制画框,前置条件是需要有 Leica 定制画框或 Redmi 定制画框 + 永久添加新春定制画框,前置条件是需要有 Leica 定制画框或 Redmi 定制画框,仅支持部分版本 移除最小裁切图片限制 + 解锁定制画框 定制画框类型 解锁 Leica 滤镜 仅支持部分版本 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index a66f91afd..824e7e978 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -976,15 +976,27 @@ 2 - + + @string/array_close + v1 + v2 + + + + 0 + 1 + 2 + + + @string/array_default Leica Redmi POCO - Disney + @string/array_close - + 0 1 2 @@ -996,12 +1008,14 @@ @string/array_default @string/mediaeditor_mickey @string/mediaeditor_strawberry_bear + @string/mediaeditor_disney_princess 0 1 2 + 3 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa2c7a6f7..7ea6e31be 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -463,6 +463,7 @@ Two-line display\n\nNotification shade mini clock on top\nStatus bar clock on bottom Mickey Mouse Strawberry Bear + Disney Princess Google Play Service S-Leo mode Taplus @@ -1564,13 +1565,19 @@ Optimize app launch delay Gallery Editor + Instructions for use:\n- Please use v2 hook for versions 1.7.5.0.4 and later, and please use v1 hook for versions lower than 1.7.5.0.4 + Gallery editor hook type Foundation + Authoring AI authoring + Customize the frame + Joint function Unlock Disney customization features Unlocks include the following features:\n• Custom frames - Disney custom frames (in conflict with other custom frames)\n• Bokeh background - Mickey Mokeh\n• Stickers - Disney stickers Unlock Chinese New Year custom picture frames To permanently add a Chinese New Year custom picture frame, the prerequisite is that you need a Leica custom picture frame or a Redmi custom picture frame. Remove the minimum crop image limit + Unlock customize the frame Customize the frame type Unlock the Leica filter Only some versions are supported diff --git a/app/src/main/res/xml/mediaeditor.xml b/app/src/main/res/xml/mediaeditor.xml index b134ce255..3de924fd5 100644 --- a/app/src/main/res/xml/mediaeditor.xml +++ b/app/src/main/res/xml/mediaeditor.xml @@ -20,17 +20,33 @@ xmlns:app="http://schemas.android.com/apk/res-auto" app:myLocation="@string/mediaeditor" app:quick_restart="com.miui.mediaeditor"> - - + + + + + + + + + + + android:title="@string/camera_custom_watermark" /> + + + + + + + + + - - + android:title="@string/mediaeditor_unlock_spring_title" /> + app:entries="@array/customize_frame_type_v1" + app:entryValues="@array/customize_frame_type_v1_value" /> + \ No newline at end of file diff --git a/app/src/main/res/xml/prefs_main.xml b/app/src/main/res/xml/prefs_main.xml index 9fa595f57..0f8607f56 100644 --- a/app/src/main/res/xml/prefs_main.xml +++ b/app/src/main/res/xml/prefs_main.xml @@ -294,11 +294,11 @@ app:inflatedXml="@xml/huanji"/> + android:title="@string/mediaeditor" /> Date: Thu, 9 Jan 2025 16:05:51 +0800 Subject: [PATCH 04/43] sevtinge commits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 绀漓丨Sevtinge <89193494+sevtinge@users.noreply.github.com> --- .../hyperceiler/module/app/ScreenShot.java | 4 +- .../hyperceiler/module/app/SimActivate.java | 32 ++++ .../module/app/SystemUI/Pad/SystemUiU.java | 5 - .../module/app/SystemUI/Pad/SystemUiV.java | 2 - .../module/app/SystemUI/Phone/SystemUiU.java | 5 - .../module/app/SystemUI/Phone/SystemUiV.java | 1 - .../simactivate/RoamingActivateHelper.java | 175 ++++++++++++++++++ .../hook/systemframework/DisableCleaner.kt | 7 + .../hook/systemframework/FlagSecure.java | 69 ++----- .../sevtinge/hyperceiler/safe/CrashHook.java | 63 ++----- .../hyperceiler/utils/TelephonyUtils.java | 150 +++++++++++++++ .../utils/search/SearchHelper.java | 1 + .../main/res/layout/layout_version_card.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 7 +- app/src/main/res/values/arrays.xml | 1 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/xml/prefs_main.xml | 7 + .../res/xml/prefs_set_homepage_entrance.xml | 8 + app/src/main/res/xml/simactivate.xml | 38 ++++ 19 files changed, 470 insertions(+), 112 deletions(-) create mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/app/SimActivate.java create mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/simactivate/RoamingActivateHelper.java create mode 100644 app/src/main/java/com/sevtinge/hyperceiler/utils/TelephonyUtils.java create mode 100644 app/src/main/res/xml/simactivate.xml diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/ScreenShot.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/ScreenShot.java index fc50543c4..de77b7f26 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/ScreenShot.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/ScreenShot.java @@ -18,6 +18,8 @@ */ package com.sevtinge.hyperceiler.module.app; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isAndroidVersion; + import android.text.TextUtils; import com.hchen.database.HookBase; @@ -40,6 +42,6 @@ public void handleLoadPackage() { initHook(UnlockPrivacyMarking.INSTANCE, mPrefsMap.getBoolean("screenshot_unlock_privacy_marking")); // 超级剪切板 initHook(UnlockSuperClipboard.INSTANCE, mPrefsMap.getStringAsInt("various_super_clipboard_e", 0) != 0); - initHook(new FlagSecure(), mPrefsMap.getBoolean("system_other_flag_secure")); + initHook(new FlagSecure(), mPrefsMap.getBoolean("system_other_flag_secure") && isAndroidVersion(33)); } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SimActivate.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SimActivate.java new file mode 100644 index 000000000..f932d6299 --- /dev/null +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SimActivate.java @@ -0,0 +1,32 @@ +/* + * This file is part of HyperCeiler. + * + * HyperCeiler is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Copyright (C) 2023-2025 HyperCeiler Contributions + */ + +package com.sevtinge.hyperceiler.module.app; + +import com.hchen.database.HookBase; +import com.sevtinge.hyperceiler.module.base.BaseModule; +import com.sevtinge.hyperceiler.module.hook.simactivate.RoamingActivateHelper; + +@HookBase(targetPackage = "com.xiaomi.simactivate.service") +public class SimActivate extends BaseModule { + @Override + public void handleLoadPackage() { + initHook(new RoamingActivateHelper(), mPrefsMap.getBoolean("sim_activation_service_disable_activate_when_roaming")); + } +} diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiU.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiU.java index 6d85a88cb..c2e2bdbf1 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiU.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiU.java @@ -159,14 +159,9 @@ public void handleLoadPackage() { // 小窗 initHook(new NotificationFreeform(), mPrefsMap.getBoolean("system_ui_notification_freeform")); - // 禁用蓝牙临时关闭 - initHook(new BluetoothRestrict(), mPrefsMap.getBoolean("system_ui_disable_bluetooth_restrict")); - // Monet initHook(new MonetThemeOverlay(), mPrefsMap.getBoolean("system_ui_monet_overlay_custom")); - initHook(new FlagSecure(), mPrefsMap.getBoolean("system_other_flag_secure")); - // 状态栏图标 boolean isHideSim = (mPrefsMap.getBoolean("system_ui_status_bar_icon_mobile_network_hide_card_1") || mPrefsMap.getBoolean("system_ui_status_bar_icon_mobile_network_hide_card_2")) && diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiV.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiV.java index a973d9a9a..a84ae7e57 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiV.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Pad/SystemUiV.java @@ -134,9 +134,7 @@ public void handleLoadPackage() { /*initHook(new NewPluginHelper()); initHook(FocusNotifLyricPluginHelper.INSTANCE, mPrefsMap.getBoolean("system_ui_statusbar_music_switch"));*/ // initHook(Island.INSTANCE, true); // 灵动岛 - initHook(new ChargeAnimationStyle(), mPrefsMap.getStringAsInt("system_ui_charge_animation_style", 0) > 0); // initHook(DisableChargeAnimation.INSTANCE); - initHook(new FlagSecure(), mPrefsMap.getBoolean("system_other_flag_secure")); // 小窗 initHook(new NotificationFreeform(), mPrefsMap.getBoolean("system_ui_notification_freeform")); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiU.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiU.java index 4a0097b94..a4ff84267 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiU.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiU.java @@ -156,14 +156,9 @@ public void handleLoadPackage() { // 小窗 initHook(new NotificationFreeform(), mPrefsMap.getBoolean("system_ui_notification_freeform")); - // 禁用蓝牙临时关闭 - initHook(new BluetoothRestrict(), mPrefsMap.getBoolean("system_ui_disable_bluetooth_restrict")); - // Monet initHook(new MonetThemeOverlay(), mPrefsMap.getBoolean("system_ui_monet_overlay_custom")); - initHook(new FlagSecure(), mPrefsMap.getBoolean("system_other_flag_secure")); - // 状态栏图标 boolean isHideSim = (mPrefsMap.getBoolean("system_ui_status_bar_icon_mobile_network_hide_card_1") || mPrefsMap.getBoolean("system_ui_status_bar_icon_mobile_network_hide_card_2")) && diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiV.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiV.java index 845bd7a0d..1a6a5d19c 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiV.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI/Phone/SystemUiV.java @@ -138,7 +138,6 @@ public void handleLoadPackage() { // PluginHelper initHook(NewPluginHelperKt.INSTANCE); // initHook(Island.INSTANCE, true); // 灵动岛 - initHook(new FlagSecure(), mPrefsMap.getBoolean("system_other_flag_secure")); // 小窗 initHook(new NotificationFreeform(), mPrefsMap.getBoolean("system_ui_notification_freeform")); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/simactivate/RoamingActivateHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/simactivate/RoamingActivateHelper.java new file mode 100644 index 000000000..ad6ee1728 --- /dev/null +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/simactivate/RoamingActivateHelper.java @@ -0,0 +1,175 @@ +/* + * This file is part of HyperCeiler. + * + * HyperCeiler is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Copyright (C) 2023-2025 HyperCeiler Contributions + */ + +package com.sevtinge.hyperceiler.module.hook.simactivate; + +import static com.sevtinge.hyperceiler.utils.TelephonyUtils.isRoaming; +import static de.robv.android.xposed.XposedHelpers.callMethod; +import static de.robv.android.xposed.XposedHelpers.callStaticMethod; +import static de.robv.android.xposed.XposedHelpers.findMethodBestMatch; +import static de.robv.android.xposed.XposedHelpers.getObjectField; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; + +import androidx.annotation.RequiresPermission; + +import com.sevtinge.hyperceiler.module.base.BaseHook; +import com.sevtinge.hyperceiler.module.base.dexkit.DexKit; +import com.sevtinge.hyperceiler.module.base.dexkit.IDexKit; +import com.sevtinge.hyperceiler.utils.log.XposedLogUtils; + +import org.luckypray.dexkit.DexKitBridge; +import org.luckypray.dexkit.query.FindField; +import org.luckypray.dexkit.query.FindMethod; +import org.luckypray.dexkit.query.matchers.ClassMatcher; +import org.luckypray.dexkit.query.matchers.FieldMatcher; +import org.luckypray.dexkit.query.matchers.MethodMatcher; +import org.luckypray.dexkit.result.FieldData; +import org.luckypray.dexkit.result.MethodData; +import org.luckypray.dexkit.result.base.BaseData; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.List; + +public class RoamingActivateHelper extends BaseHook { + private final List mChinaIccidStartsWithList = List.of("8986"); + private final List mChinaTeleZoneCodeList = List.of("+86", "86", "0086"); + private final int slotId = 1; + private final boolean isRadical = mPrefsMap.getBoolean("sim_activation_service_disable_activate_when_roaming_radical"); + + + @Override + public void init() throws NoSuchMethodException { + Method method = DexKit.findMember("StartActivateSim", new IDexKit() { + @Override + public BaseData dexkit(DexKitBridge bridge) throws ReflectiveOperationException { + MethodData methodData = bridge.findMethod(FindMethod.create() + .matcher(MethodMatcher.create() + .usingStrings("cloud control not allow this mccmnc activate with method ") + )).singleOrNull(); + return methodData; + } + }); + + Method method2 = DexKit.findMember("CustomGetter", new IDexKit() { + @Override + public BaseData dexkit(DexKitBridge bridge) throws ReflectiveOperationException { + MethodData methodData = bridge.findMethod(FindMethod.create() + .matcher(MethodMatcher.create() + .declaredClass(ClassMatcher.create() + .usingStrings("ActivateExternal", "set exception handler failed") + ) + .addCaller(MethodMatcher.create() + .declaredClass(findClassIfExists("com.xiaomi.activate.ActivateService")) + .name("onHandleIntent")) + )).singleOrNull(); + return methodData; + } + }); + + Method method3 = DexKit.findMember("SlotIdGetter", new IDexKit() { + @Override + public BaseData dexkit(DexKitBridge bridge) throws ReflectiveOperationException { + MethodData methodData = bridge.findMethod(FindMethod.create() + .matcher(MethodMatcher.create() + .usingStrings("MiuiSysImpl", "Illegal slotId ") + )).singleOrNull(); + return methodData; + } + }); + + Field field = DexKit.findMember("ActivateSimSubId", new IDexKit() { + @Override + public BaseData dexkit(DexKitBridge bridge) throws ReflectiveOperationException { + FieldData fieldData = bridge.findField(FindField.create() + .matcher(FieldMatcher.create() + .declaredClass(ClassMatcher.create() + .usingStrings("cloud control not allow this mccmnc activate with method ") + ) + .type(int.class) + .modifiers(Modifier.PUBLIC) + )).singleOrNull(); + return fieldData; + } + }); + + Field field2 = DexKit.findMember("ActivateSimContext", new IDexKit() { + @Override + public BaseData dexkit(DexKitBridge bridge) throws ReflectiveOperationException { + FieldData fieldData = bridge.findField(FindField.create() + .matcher(FieldMatcher.create() + .declaredClass(ClassMatcher.create() + .usingStrings("cloud control not allow this mccmnc activate with method ") + ) + .type(Context.class) + .modifiers(Modifier.PROTECTED) + )).singleOrNull(); + return fieldData; + } + }); + + hookMethod(method, new MethodHook(){ + @RequiresPermission(allOf = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_PHONE_NUMBERS, Manifest.permission.ACCESS_COARSE_LOCATION, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) + @Override + protected void before(MethodHookParam param) throws Throwable { + int subId = (int) getObjectField(param.thisObject, field.getName()); + Object contextGetter = callStaticMethod(method2.getDeclaringClass(), method2.getName()); + Object originSlotId = findMethodBestMatch(method3.getDeclaringClass(), method3.getName(), subId).invoke(contextGetter, subId); + int slotId = (int) originSlotId; + Context context = (Context) getObjectField(param.thisObject, field2.getName()); + if (isRoaming(context, slotId, mChinaTeleZoneCodeList, mChinaIccidStartsWithList, isRadical)) { + XposedLogUtils.logD(TAG, lpparam.packageName, "Roaming SIM, skip activate."); + param.setResult(null); + } + } + }); + + findAndHookMethod("com.xiaomi.activate.ActivationSmsReceiver", "onReceive", Context.class, Intent.class, new MethodHook(){ + @RequiresPermission(allOf = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_PHONE_NUMBERS, Manifest.permission.ACCESS_COARSE_LOCATION, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) + @Override + protected void before(MethodHookParam param) throws Throwable { + int slotId = ((Intent) param.args[1]).getIntExtra("extra_sim_index", -1); + if (isRoaming((Context) param.args[0], slotId, mChinaTeleZoneCodeList, mChinaIccidStartsWithList, isRadical)) param.setResult(null); + } + }); + + findAndHookMethod("com.xiaomi.accountsdk.activate.ActivateStatusReceiver", "onReceive", Context.class, Intent.class, new MethodHook(){ + @RequiresPermission(allOf = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_PHONE_NUMBERS, Manifest.permission.ACCESS_COARSE_LOCATION, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) + @Override + protected void before(MethodHookParam param) throws Throwable { + int slotId = ((Intent) param.args[1]).getIntExtra("extra_sim_index", -1); + if (isRoaming((Context) param.args[0], slotId, mChinaTeleZoneCodeList, mChinaIccidStartsWithList, isRadical)) param.setResult(null); + } + }); + + findAndHookMethod("com.xiaomi.activate.SimStateReceiver", "onReceive", Context.class, Intent.class, new MethodHook(){ + @RequiresPermission(allOf = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_PHONE_NUMBERS, Manifest.permission.ACCESS_COARSE_LOCATION, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) + @Override + protected void before(MethodHookParam param) throws Throwable { + int slotId = ((Intent) param.args[1]).getIntExtra("slot_id", -1); + if (isRoaming((Context) param.args[0], slotId, mChinaTeleZoneCodeList, mChinaIccidStartsWithList, isRadical)) param.setResult(null); + } + }); + + } +} diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/DisableCleaner.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/DisableCleaner.kt index 05ab2ae03..9823082c9 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/DisableCleaner.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/DisableCleaner.kt @@ -92,5 +92,12 @@ object DisableCleaner : BaseHook() { } } ) + hookAllMethods("com.miui.cameraopt.booster.CameraBooster", "notifyActivityChanged", + object : MethodHook() { + override fun before(param: MethodHookParam) { + param.result = null + } + } + ) } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/FlagSecure.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/FlagSecure.java index cc54d501b..2b9efe531 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/FlagSecure.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/FlagSecure.java @@ -275,62 +275,31 @@ protected void before(MethodHookParam param) throws Throwable { } else if (lpparam.packageName.equals("com.android.systemui") || lpparam.packageName.equals("com.miui.screenshot")) { try { var screenCaptureClazz = SurfaceControl.class; - var captureArgsClazz = XposedHelpers.findClass(Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE ? - "android.window.ScreenCapture$CaptureArgs" : - "android.view.SurfaceControl$CaptureArgs", lpparam.classLoader); - var displayCaptureArgsClazz = XposedHelpers.findClass("android.window.ScreenCapture$DisplayCaptureArgs", lpparam.classLoader); - var layerCaptureArgsClazz = XposedHelpers.findClass("android.window.ScreenCapture$LayerCaptureArgs", lpparam.classLoader); + var captureArgsClazz = XposedHelpers.findClass("android.view.SurfaceControl$CaptureArgs", lpparam.classLoader); captureSecureLayersField = captureArgsClazz.getDeclaredField("mCaptureSecureLayers"); captureSecureLayersField.setAccessible(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - XposedHelpers.findAndHookMethod("android.window.ScreenCapture", lpparam.classLoader, "nativeCaptureDisplay", - displayCaptureArgsClazz, long.class, - new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - try { - captureSecureLayersField.set(param.args[0], true); - } catch (IllegalAccessException t) { - logE(TAG, "other", "ScreenCaptureHooker failed", t); - } - } - }); - XposedHelpers.findAndHookMethod("android.window.ScreenCapture", lpparam.classLoader, "nativeCaptureLayers", - layerCaptureArgsClazz, long.class, boolean.class, - new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - try { - captureSecureLayersField.set(param.args[0], true); - } catch (IllegalAccessException t) { - logE(TAG, "other", "ScreenCaptureHooker failed", t); - } - } - }); - } else { - XposedHelpers.findAndHookMethod(screenCaptureClazz, "nativeCaptureDisplay", - new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - try { - captureSecureLayersField.set(param.args[0], true); - } catch (IllegalAccessException t) { - logE(TAG, "other", "ScreenCaptureHooker failed", t); - } + XposedHelpers.findAndHookMethod(screenCaptureClazz, "nativeCaptureDisplay", + new MethodHook() { + @Override + protected void before(MethodHookParam param) throws Throwable { + try { + captureSecureLayersField.set(param.args[0], true); + } catch (IllegalAccessException t) { + logE(TAG, "other", "ScreenCaptureHooker failed", t); } - }); - XposedHelpers.findAndHookMethod(screenCaptureClazz, "nativeCaptureLayers", new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - try { - captureSecureLayersField.set(param.args[0], true); - } catch (IllegalAccessException t) { - logE(TAG, "other", "ScreenCaptureHooker failed", t); } + }); + XposedHelpers.findAndHookMethod(screenCaptureClazz, "nativeCaptureLayers", new MethodHook() { + @Override + protected void before(MethodHookParam param) throws Throwable { + try { + captureSecureLayersField.set(param.args[0], true); + } catch (IllegalAccessException t) { + logE(TAG, "other", "ScreenCaptureHooker failed", t); } - }); - } + } + }); } catch (Throwable t) { logE(TAG, this.lpparam.packageName, "hook ScreenCapture failed", t); } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/safe/CrashHook.java b/app/src/main/java/com/sevtinge/hyperceiler/safe/CrashHook.java index 86ae2d2b3..48ddbc2fd 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/safe/CrashHook.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/safe/CrashHook.java @@ -24,21 +24,12 @@ import android.app.ApplicationErrorReport; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.provider.Settings; -import android.widget.Toast; - -import androidx.annotation.NonNull; import com.sevtinge.hyperceiler.callback.ITAG; -import com.sevtinge.hyperceiler.data.AppCrashInfo; -import com.sevtinge.hyperceiler.data.AppErrorsData; -import com.sevtinge.hyperceiler.data.ProcessInfo; import com.sevtinge.hyperceiler.module.base.tool.HookTool; -import com.sevtinge.hyperceiler.receiver.CrashReceiver; import com.sevtinge.hyperceiler.utils.api.ProjectApi; -import com.sevtinge.hyperceiler.utils.log.AndroidLogUtils; import com.sevtinge.hyperceiler.utils.shell.ShellInit; import org.json.JSONObject; @@ -100,18 +91,9 @@ protected void after(MethodHookParam param) { logE("CrashHook", "context: " + mContext + " pkg: " + mContext.getPackageName() + " proc: " + proc + " crash: " + crashInfo + " short: " + shortMsg + " long: " + longMsg + " stack: " + stackTrace + " time: " + timeMillis + " pid: " + callingPid + " uid: " + callingUid); recordCrash(mContext, proc, crashInfo, shortMsg, longMsg, stackTrace, timeMillis, callingPid, callingUid); - - //XposedBridge.log(crashInfo.throwClassName + " :" + crashInfo.exceptionMessage); } } ); -/* - findAndHookMethod("com.android.server.wm.BackgroundActivityStartController", "checkCrossUidActivitySwitchFromBelow", "com.android.server.wm.ActivityRecord", int.class, "com.android.server.wm.BackgroundActivityStartController$BlockActivityStart", new MethodHook(){ - @Override - protected void before(MethodHookParam param) throws Throwable { - param.setResult(param.args[2]); - } - });*/ } private void backgroundActivity(ClassLoader classLoader) { @@ -142,24 +124,14 @@ protected void before(MethodHookParam param) { @Override protected void before(MethodHookParam param) { String pkg = (String) param.args[2]; - AndroidLogUtils.logI("jzskjizdfblkjnxdfboknxffb", pkg); if (pkg == null) return; if (ProjectApi.mAppModulePkg.equals(pkg)) { - findAndHookMethod("com.android.server.wm.BackgroundActivityStartController$BalVerdict", classLoader, "allows", new MethodHook() { - @Override - protected void before(MethodHookParam param) { - AndroidLogUtils.logI("jzskjizdfblkjnxdfboknxffb", "1"); - param.setResult(true); - } - } - ); - /*Object balAllowDefault = XposedHelpers.getStaticObjectField( + Object balAllowDefault = XposedHelpers.getStaticObjectField( XposedHelpers.findClass("com.android.server.wm.BackgroundActivityStartController$BalVerdict", lpparam.classLoader), "BAL_ALLOW_DEFAULT" ); - AndroidLogUtils.logI("jzskjizdfblkjnxdfboknxffb", "2"); - param.setResult(balAllowDefault);*/ + param.setResult(balAllowDefault); } } } @@ -314,28 +286,27 @@ private void reportCrashByIntent(ArrayList report) { ShellInit.init(); ShellInit.getShell().run("setprop persist.hyperceiler.crash.report " + "\"" + stringBuilder + "\"").sync(); - Intent intent1 = getIntent(abbr); - intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent1); + Intent intent = getIntent(abbr); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(intent); /*Intent intent = getIntent(abbr, stringBuilder); mContext.startService(intent);*/ } private Intent getIntent(String abbr) { - Intent intent1 = new Intent(); - intent1.setPackage("com.sevtinge.hyperceiler"); - intent1.setClassName("com.sevtinge.hyperceiler", "com.sevtinge.hyperceiler.safe.CrashActivity"); - intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); - intent1.putExtra("key_longMsg", longMsg); - intent1.putExtra("key_stackTrace", stackTrace); - intent1.putExtra("key_throwClassName", throwClassName); - intent1.putExtra("key_throwFileName", throwFileName); - intent1.putExtra("key_throwLineNumber", throwLineNumber); - intent1.putExtra("key_throwMethodName", throwMethodName); - intent1.putExtra("key_pkg", abbr); - AndroidLogUtils.logI("iafjnsdkjnsdlvkzdv", "3"); - return intent1; + Intent intent = new Intent(); + intent.setPackage("com.sevtinge.hyperceiler"); + intent.setClassName("com.sevtinge.hyperceiler", "com.sevtinge.hyperceiler.safe.CrashActivity"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra("key_longMsg", longMsg); + intent.putExtra("key_stackTrace", stackTrace); + intent.putExtra("key_throwClassName", throwClassName); + intent.putExtra("key_throwFileName", throwFileName); + intent.putExtra("key_throwLineNumber", throwLineNumber); + intent.putExtra("key_throwMethodName", throwMethodName); + intent.putExtra("key_pkg", abbr); + return intent; } private ArrayList getReportCrash() { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/TelephonyUtils.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/TelephonyUtils.java new file mode 100644 index 000000000..9ae4ffa52 --- /dev/null +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/TelephonyUtils.java @@ -0,0 +1,150 @@ +/* + * This file is part of HyperCeiler. + * + * HyperCeiler is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Copyright (C) 2023-2025 HyperCeiler Contributions + */ + +package com.sevtinge.hyperceiler.utils; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.Context; +import android.telephony.PhoneNumberUtils; +import android.telephony.ServiceState; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.text.TextUtils; + +import androidx.annotation.RequiresPermission; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Locale; + +public class TelephonyUtils { + private static TelephonyManager mTelephonyManager; + + public static TelephonyManager getTelephonyManager() { + return mTelephonyManager; + } + + @RequiresPermission(allOf = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_PHONE_NUMBERS, Manifest.permission.ACCESS_COARSE_LOCATION, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) + public static boolean isRoaming(Context context, int slotId, List teleZoneCodeList, List iccidStartsWithList, boolean isRadical) { + SubscriptionInfo subscriptionInfo = getSubscriptionInfo(context, slotId); + String simPhoneNumber = getSimPhoneNumber(context, subscriptionInfo); + boolean isNeededPhoneNumber = false; + if (!TextUtils.isEmpty(simPhoneNumber) || simPhoneNumber != null) { + for (String mTeleZoneCode : teleZoneCodeList) { + if (simPhoneNumber.startsWith(mTeleZoneCode)) { + isNeededPhoneNumber = true; + break; + } + } + return !isNeededPhoneNumber; + } + mTelephonyManager = (TelephonyManager) context.getSystemService(TelephonyManager.class); + assert subscriptionInfo != null; + mTelephonyManager = getTelephonyManager().createForSubscriptionId(subscriptionInfo.getSubscriptionId()); + ServiceState serviceState = getTelephonyManager().getServiceState(); + String iccidNumber = getIccidNumber(); + boolean isNeededIccid = false; + if (!TextUtils.isEmpty(iccidNumber) || iccidNumber != null) { + for (String mIccidStartsWith : iccidStartsWithList) { + if (iccidNumber.startsWith(mIccidStartsWith)) { + isNeededIccid = true; + break; + } + } + return !isNeededIccid; + } else if (isRadical) { + return true; + } + if (serviceState != null) { + return serviceState.getRoaming(); + } else { + return isRadical; + } + } + + @RequiresPermission(Manifest.permission.READ_PHONE_STATE) + public static SubscriptionInfo getSubscriptionInfo(Context context, int i) { + SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); + + List activeSubscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList(); + if (activeSubscriptionInfoList == null) { + return null; + } + for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfoList) { + if (subscriptionInfo.getSimSlotIndex() == i) { + return subscriptionInfo; + } + } + return null; + } + + @RequiresPermission(allOf = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_PHONE_NUMBERS}) + public static String getSimPhoneNumber(Context context, SubscriptionInfo subscriptionInfo) { + if (subscriptionInfo != null) { + return getFormattedPhoneNumber(context, subscriptionInfo); + } else { + return null; + } + } + + @RequiresPermission(anyOf = {Manifest.permission.READ_PHONE_NUMBERS, "carrier privileges", "android.permission.READ_PRIVILEGED_PHONE_STATE"}) + public static String getFormattedPhoneNumber(Context context, SubscriptionInfo subscriptionInfo) { + String str; + if (subscriptionInfo == null) { + return null; + } + + try { + SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(SubscriptionManager.class); + str = subscriptionManager.getPhoneNumber(subscriptionInfo.getSubscriptionId()); + } catch (IllegalStateException e) { + str = ""; + } + + if (TextUtils.isEmpty(str)) { + return null; + } + + try { + @SuppressLint("publicApi") Class mccTableClass = Class.forName("com.android.internal.telephony.MccTable"); + @SuppressLint({"BlockedpublicApi", "BlockedPrivateApi"}) Method countryCodeForMccMethod = mccTableClass.getDeclaredMethod("countryCodeForMcc", String.class); + countryCodeForMccMethod.setAccessible(true); + String countryCode = (String) countryCodeForMccMethod.invoke(null, subscriptionInfo.getMccString()); + return PhoneNumberUtils.formatNumber(str, countryCode.toUpperCase(Locale.ROOT)); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + @RequiresPermission(Manifest.permission.READ_PHONE_STATE) + public static SubscriptionInfo getPhoneSubscriptionInfo(Context context, int i) { + return SubscriptionManager.from(context).getActiveSubscriptionInfoForSimSlotIndex(i); + } + + @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") + public static String getIccidNumber() { + TelephonyManager telephonyManager = getTelephonyManager(); + @SuppressLint("HardwareIds") String simSerialNumber = telephonyManager.getSimSerialNumber(); + return simSerialNumber; + } + +} diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/search/SearchHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/search/SearchHelper.java index c8b4f7d17..c5384f094 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/search/SearchHelper.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/search/SearchHelper.java @@ -333,6 +333,7 @@ public static void getAllMods(Context context, boolean force) { parsePrefXmlForDashboardFragment(context, R.xml.misound); parsePrefXmlForDashboardFragment(context, R.xml.trustservice); parsePrefXmlForDashboardFragment(context, R.xml.calendar); + parsePrefXmlForDashboardFragment(context, R.xml.simactivate); parsePrefXml(context, SecurityAddFragment.class, R.xml.securityadd); parsePrefXmlForDashboardFragment(context, R.xml.community); diff --git a/app/src/main/res/layout/layout_version_card.xml b/app/src/main/res/layout/layout_version_card.xml index fd7b6ba44..5e530012c 100644 --- a/app/src/main/res/layout/layout_version_card.xml +++ b/app/src/main/res/layout/layout_version_card.xml @@ -89,7 +89,7 @@ android:fallbackLineSpacing="false" android:includeFontPadding="false" android:scrollbars="none" - android:textAlignment="viewStart" + android:textAlignment="center" android:textSize="14sp" /> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a339f5567..d5bb730ea 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -27,7 +27,7 @@ 欢迎使用 HyperCeiler,本应用依赖 Xposed 框架运行,你可以使用本应用劫持并修改其他受支持的应用以实现对系统的增强功能。在使用过程中,为了为您提供更多功能,我们可能会向您申请 Root/Su 权限。您可随时前往您的 Root/Su 管理器进行管理。 警告 - %1$s由于多次崩溃,已进入安全模式,HyperCeiler 对其的功能已停用。\n您可以解除对其的安全模式,或稍后进入 HyperCeiler 处理。 + %1$s 由于多次崩溃,已进入安全模式,HyperCeiler 对其的功能已停用。\n您可以解除对其的安全模式,或稍后进入 HyperCeiler 处理。 查看异常记录 解除 稍后处理 @@ -1880,6 +1880,11 @@ 允许在无网状态下录入语音唤醒词 设置唤醒词检测精度 更大的值意味着更难被检测到。对于 \"小爱同学\",其默认值是 0%。设置完毕后,需要重新录入唤醒词 + + 小米SIM卡激活服务 + 禁止卡 2 在漫游时激活服务 + 仅支持中国大陆 + 使用更激进的漫游过滤方法 其他 小米妙享中心 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 824e7e978..c6df90a95 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -81,6 +81,7 @@ com.iflytek.inputmethod.miui com.sohu.inputmethod.sogou.xiaomi com.miui.voicetrigger + com.xiaomi.simactivate.service diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7ea6e31be..a3c5054e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1843,6 +1843,11 @@ Sogou input method Remove the limit on the number of clipboards Add clear clipboard button + + Xiaomi SIM Activation Service + Disable activate SIM 2 when it is roaming + Only Chinese mainland is supported + Use a more aggressive roaming filtering approach Scanner AI Scanner diff --git a/app/src/main/res/xml/prefs_main.xml b/app/src/main/res/xml/prefs_main.xml index 0f8607f56..6babdcf03 100644 --- a/app/src/main/res/xml/prefs_main.xml +++ b/app/src/main/res/xml/prefs_main.xml @@ -454,6 +454,13 @@ android:title="@string/scanner" app:inflatedXml="@xml/scanner"/> + + + + + + + + + + + + + \ No newline at end of file From d7ab6e562a3b78859c5b7aa24ea6d6ec1837b1eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Thu, 9 Jan 2025 16:51:21 +0800 Subject: [PATCH 05/43] test commit --- .github/workflows/ci_build.yml | 2 +- .github/workflows/qiqi_build.yml | 120 +++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/qiqi_build.yml diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 944a7274c..52735d13a 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -39,7 +39,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '22' + java-version: '21' - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 diff --git a/.github/workflows/qiqi_build.yml b/.github/workflows/qiqi_build.yml new file mode 100644 index 000000000..c787e61c8 --- /dev/null +++ b/.github/workflows/qiqi_build.yml @@ -0,0 +1,120 @@ +name: CI Build For Qiqi + +on: + pull_request: + types: [opened, synchronize] + paths-ignore: + - ".github/**" + - "!.github/workflows/**" + - ".idea/" + - "doc/*" + - "*.md" + - "app/src/assets/**" + - ".github/workflows/crowdin.yml" + - "crowdin.yml" + push: + branches: [pull] + paths-ignore: + - ".github/**" + - "!.github/workflows/**" + - ".idea/" + - "doc/*" + - "*.md" + - "app/src/assets/**" + - "crowdin.yml" + workflow_dispatch: + +jobs: + build_app: + runs-on: macos-latest + name: Build App + steps: + - name: Checkout Git Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: true + + - name: Setup JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Create Sign File + if: github.event_name != 'pull_request' + run: | + touch signing.properties + echo storePassword=${{ secrets.KEY_STORE_PASSWORD }} >> signing.properties + echo keyAlias=${{ secrets.ALIAS }} >> signing.properties + echo keyPassword='${{ secrets.KEY_STORE_PASSWORD }}' >> signing.properties + echo storeFile=../key.jks >> signing.properties + echo ${{ secrets.SIGNING_KEY }} | base64 --decode > key.jks + + - name: Build with Gradle (Canary) + if: github.event_name != 'pull_request' + shell: bash + run: | + ./gradlew assembleCanary + echo "IS_DEBUG=false" >> $GITHUB_ENV + + - name: Find APKs + run: | + if [ ${{ env.IS_DEBUG }} = true ]; then + APK_FILE=$(find app/build/outputs/apk/debug -name '*.apk') + else + APK_FILE=$(find app/build/outputs/apk/canary -name '*.apk') + fi + echo "APK_FILE=$APK_FILE" >> $GITHUB_ENV + echo "APK_FILE_NAME=$(basename $APK_FILE .apk)" >> $GITHUB_ENV + + - name: Show APKs SHA256 + if: success() + run: | + echo "### Build Success" >> $GITHUB_STEP_SUMMARY + echo "|Artifact|SHA256|" >> $GITHUB_STEP_SUMMARY + echo "|:---:|:---|" >> $GITHUB_STEP_SUMMARY + APK_SHA256=($(shasum -a 256 ${{ env.APK_FILE }})) + echo "|Canary|$APK_SHA256" >> $GITHUB_STEP_SUMMARY + + - name: Upload APKs + uses: actions/upload-artifact@v4 + with: + name: ${{ env.APK_FILE_NAME }} + path: ${{ env.APK_FILE }} + compression-level: 9 + + push_to_canary: + if: github.event_name == 'push' && github.ref_type != 'tag' && !contains(github.event.head_commit.message, '[skp]') && !contains(github.event.head_commit.message, 's#') + runs-on: ubuntu-latest + name: Push to Canary + needs: build_app + steps: + - name: Download Artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Find Artifacts + run: | + echo "APK_FILE_CANARY=$(find artifacts -name '*.apk')" >> $GITHUB_ENV + + - name: Post to Canary + env: + GROUP_ID: ${{ secrets.GROUP_ID }} + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} + CANARY: ${{ env.APK_FILE_CANARY }} + COMMIT_MESSAGE: |+ + New push to GitHub + ``` + ${{ github.event.head_commit.message }} + ```by `${{ github.event.head_commit.author.name }}` + + Instructions before use: [here](https://t.me/cemiuiler_canary_feedback/95896) + run: | + ESCAPED=$(python3 -c 'import json,os,urllib.parse; print(urllib.parse.quote(json.dumps(os.environ["COMMIT_MESSAGE"])))') + cd ${{ github.workspace }} + curl -v "https://api.telegram.org/bot${BOT_TOKEN}/sendMediaGroup?chat_id=${GROUP_ID}&media=%5B%7B%22type%22:%22document%22,%20%22media%22:%22attach://canary%22,%22parse_mode%22:%22MarkdownV2%22,%22caption%22:${ESCAPED}%7D%5D" -F canary="@${CANARY}" \ No newline at end of file From cdfef14286a2e4d72e98fcc2287893c1111f8dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Fri, 10 Jan 2025 14:14:48 +0800 Subject: [PATCH 06/43] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E7=AE=A1=E5=AE=B6-=E5=85=A8=E5=B1=80=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F-=E9=9A=90=E8=97=8F=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=A0=8F=20=E5=8A=9F=E8=83=BD=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/base/tool/OtherTool.java | 6 ++- .../sidebar/AddSideBarExpandReceiver.java | 53 +++++++++++++++---- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java index e2e6eefd7..e7f9ae816 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java @@ -128,11 +128,12 @@ public static void setProp(String key, String val) { public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lpparam) { try { Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.newInstance(); + Object parser = parserCls.getDeclaredConstructor().newInstance(); File apkPath = new File(lpparam.appInfo.sourceDir); Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); return (String) XposedHelpers.getObjectField(pkg, "mVersionName"); } catch (Throwable e) { + logE("getPackageVersionCode", e); return ""; } } @@ -140,11 +141,12 @@ public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lppar public static int getPackageVersionCode(XC_LoadPackage.LoadPackageParam lpparam) { try { Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.newInstance(); + Object parser = parserCls.getDeclaredConstructor().newInstance(); File apkPath = new File(lpparam.appInfo.sourceDir); Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); return XposedHelpers.getIntField(pkg, "mVersionCode"); } catch (Throwable e) { + logE("getPackageVersionCode", e); return -1; } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index 5f2a9a2a4..11c7c7680 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -18,12 +18,16 @@ */ package com.sevtinge.hyperceiler.module.hook.securitycenter.sidebar; +import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Canvas; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -31,6 +35,8 @@ import android.view.MotionEvent; import android.view.View; +import androidx.core.content.ContextCompat; + import com.sevtinge.hyperceiler.module.base.BaseHook; import java.lang.reflect.Method; @@ -38,8 +44,17 @@ import de.robv.android.xposed.XposedHelpers; public class AddSideBarExpandReceiver extends BaseHook { + + boolean isNewVersion; + @Override public void init() { + try { + isNewVersion = (getPackageVersionCode(lpparam) >= 40001000 && !isPad()) || (getPackageVersionCode(lpparam) >= 40011000 && isPad()); + } catch (Throwable e) { + logE(TAG, lpparam.packageName, "Failed to get version code, " + e); + } + final boolean[] isHooked = {false, false}; boolean enableSideBar = mPrefsMap.getBoolean("security_center_leave_open"); if (!enableSideBar) { @@ -68,12 +83,12 @@ public void onReceive(Context context, Intent intent) { int pos = originDockLocation; if (bundle != null) { pos = bundle.getInt("inDirection", 0); - view.getContext().getSharedPreferences("sp_video_box", 0).edit().putInt("dock_line_location", pos).commit(); + view.getContext().getSharedPreferences("sp_video_box", 0).edit().putInt("dock_line_location", pos).apply(); } showSideBar(view, pos); } }; - view.getContext().registerReceiver(showReceiver, new IntentFilter(ACTION_PREFIX + "ShowSideBar")); + ContextCompat.registerReceiver(view.getContext(), showReceiver, new IntentFilter(ACTION_PREFIX + "ShowSideBar"), ContextCompat.RECEIVER_NOT_EXPORTED); XposedHelpers.setAdditionalInstanceField(param.thisObject, "showReceiver", showReceiver); if (!isHooked[1]) { @@ -96,14 +111,34 @@ protected void before(MethodHookParam param) throws Throwable { } }); } - Class bgDrawable = view.getBackground().getClass(); - findAndHookMethod(bgDrawable, "draw", Canvas.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - param.setResult(null); + if (isNewVersion) { + try { + // 10.0.0 及以上版本的手机/平板管家获取 drawable 的方式 + Class bgDrawable = XposedHelpers.callMethod(view, "getDrawable").getClass(); + findAndHookMethod(bgDrawable, "draw", Canvas.class, new MethodHook() { + @Override + protected void before(MethodHookParam param) { + param.setResult(null); + } + }); + XposedHelpers.callMethod(view, "setImageDrawable", (Drawable) null); + } catch (Throwable e) { + logE(TAG, lpparam.packageName, "Drawable is failed, " + e); } - }); - view.setBackground(null); + } else { + try { + Class bgDrawable = view.getBackground().getClass(); + findAndHookMethod(bgDrawable, "draw", Canvas.class, new MethodHook() { + @Override + protected void before(MethodHookParam param) { + param.setResult(null); + } + }); + view.setBackground(null); + } catch (Throwable e) { + logE(TAG, lpparam.packageName, "Drawable background is failed, " + e); + } + } } }; myhandler.postDelayed(removeBg, 150); From 891890c9cee3a23428a2cf45dbc97999343078c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Fri, 10 Jan 2025 15:47:51 +0800 Subject: [PATCH 07/43] opt: Tools --- app/proguard-rules.pro | 4 +- .../com/sevtinge/hyperceiler/XposedInit.java | 12 +- .../hyperceiler/module/base/BaseModule.java | 6 +- .../module/base/dexkit/DexKit.java | 4 +- .../base/tool/AppsTool.java} | 191 ++++++++---------- .../module/base/tool/OtherTool.java | 40 +--- .../module/hook/browser/DebugMode.java | 2 +- .../hook/browser/EnableDebugEnvironment.java | 2 +- .../module/hook/getapps/BypassRiskCheck.java | 2 +- .../module/hook/home/HomeBaseHook.kt | 2 +- .../drawer/AllAppsContainerViewSuperBlur.java | 4 +- .../hook/securitycenter/app/AppDisable.java | 5 +- .../sidebar/AddSideBarExpandReceiver.java | 2 +- .../securitycenter/sidebar/BlurSecurity.kt | 3 +- .../hook/systemframework/CleanOpenMenu.java | 24 +-- .../controlcenter/NotificationRowMenu.java | 4 +- .../hook/various/clipboard/ClipboardList.java | 2 +- .../provider/SharedPrefsProvider.java | 4 +- .../ui/activity/HyperCeilerTabActivity.java | 10 +- .../ui/activity/base/BaseActivity.java | 6 +- .../ui/activity/base/NaviBaseActivity.java | 9 +- .../DevelopmentDebugInfoFragment.java | 2 +- .../hyperceiler/utils/DialogHelper.java | 3 +- .../hyperceiler/utils/prefs/PrefsUtils.java | 6 +- gradle/libs.versions.toml | 4 +- 25 files changed, 142 insertions(+), 211 deletions(-) rename app/src/main/java/com/sevtinge/hyperceiler/{utils/Helpers.java => module/base/tool/AppsTool.java} (63%) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 459574d03..d277d9095 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -2,8 +2,8 @@ -keep class com.sevtinge.hyperceiler.module.skip.SystemFrameworkForCorePatch -keep class com.sevtinge.hyperceiler.ui.activity.LauncherActivity -keep class com.sevtinge.hyperceiler.utils.blur.* --keep class com.sevtinge.hyperceiler.utils.Helpers { boolean isModuleActive; } --keep class com.sevtinge.hyperceiler.utils.Helpers { int XposedVersion; } +-keep class com.sevtinge.hyperceiler.module.base.tool.AppsTool { boolean isModuleActive; } +-keep class com.sevtinge.hyperceiler.module.base.tool.AppsTool { int XposedVersion; } -keep class fan.**{ *; } -keep class androidx.preference.**{ *; } -keep class org.luckypray.dexkit.**{ *; } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java b/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java index 916292cf8..ce68f60b3 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java @@ -18,8 +18,8 @@ */ package com.sevtinge.hyperceiler; -import static com.sevtinge.hyperceiler.utils.Helpers.getPackageVersionCode; -import static com.sevtinge.hyperceiler.utils.Helpers.getPackageVersionName; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionName; import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.getAndroidVersion; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.getHyperOSVersion; @@ -188,7 +188,7 @@ private void invokeInit(XC_LoadPackage.LoadPackageParam lpparam) { return; } - dataMap.forEach(new BiConsumer() { + dataMap.forEach(new BiConsumer<>() { @Override public void accept(String s, DataBase dataBase) { if (!mPkgName.equals(dataBase.mTargetPackage)) @@ -251,10 +251,10 @@ private boolean isOtherRestrictions(String pkg) { } public void moduleActiveHook(XC_LoadPackage.LoadPackageParam lpparam) { - Class mHelpers = XposedHelpers.findClassIfExists(ProjectApi.mAppModulePkg + ".utils.Helpers", lpparam.classLoader); + Class AppsTool = XposedHelpers.findClassIfExists(ProjectApi.mAppModulePkg + ".module.base.tool.AppsTool", lpparam.classLoader); - XposedHelpers.setStaticBooleanField(mHelpers, "isModuleActive", true); - XposedHelpers.setStaticIntField(mHelpers, "XposedVersion", XposedBridge.getXposedVersion()); + XposedHelpers.setStaticBooleanField(AppsTool, "isModuleActive", true); + XposedHelpers.setStaticIntField(AppsTool, "XposedVersion", XposedBridge.getXposedVersion()); XposedBridge.log("[HyperCeiler][I]: Log level is " + logLevelDesc()); } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseModule.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseModule.java index 62d7b631f..592405f53 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseModule.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseModule.java @@ -24,7 +24,7 @@ import com.sevtinge.hyperceiler.module.base.dexkit.DexKit; import com.sevtinge.hyperceiler.safe.CrashData; import com.sevtinge.hyperceiler.utils.ContextUtils; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.api.ProjectApi; import com.sevtinge.hyperceiler.utils.log.XposedLogUtils; import com.sevtinge.hyperceiler.utils.prefs.PrefsMap; @@ -116,8 +116,8 @@ public void initHook(Object hook, boolean isInit, String versionName, int versio onCreate(hook); return; } - int code = Helpers.getPackageVersionCode(mLoadPackageParam); - String name = Helpers.getPackageVersionName(mLoadPackageParam); + int code = AppsTool.getPackageVersionCode(mLoadPackageParam); + String name = AppsTool.getPackageVersionName(mLoadPackageParam); if (code == versionCode) onCreate(hook); if (name.equals(versionName)) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.java index 11d9d8bb6..259583690 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.java @@ -18,8 +18,8 @@ */ package com.sevtinge.hyperceiler.module.base.dexkit; -import static com.sevtinge.hyperceiler.utils.Helpers.getPackageVersionCode; -import static com.sevtinge.hyperceiler.utils.Helpers.getPackageVersionName; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionName; import static com.sevtinge.hyperceiler.utils.shell.ShellUtils.rootExecCmd; import android.content.Context; diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/Helpers.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/AppsTool.java similarity index 63% rename from app/src/main/java/com/sevtinge/hyperceiler/utils/Helpers.java rename to app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/AppsTool.java index 90eb4aa0d..4eeab8a07 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/Helpers.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/AppsTool.java @@ -16,13 +16,12 @@ * Copyright (C) 2023-2025 HyperCeiler Contributions */ -package com.sevtinge.hyperceiler.utils; +package com.sevtinge.hyperceiler.module.base.tool; import static com.sevtinge.hyperceiler.utils.log.XposedLogUtils.logE; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.ActivityOptions; import android.app.backup.BackupManager; import android.content.Context; import android.content.Intent; @@ -42,6 +41,7 @@ import android.widget.TextView; import com.sevtinge.hyperceiler.R; +import com.sevtinge.hyperceiler.utils.DialogHelper; import com.sevtinge.hyperceiler.utils.api.ProjectApi; import com.sevtinge.hyperceiler.utils.log.AndroidLogUtils; import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; @@ -56,17 +56,13 @@ import de.robv.android.xposed.callbacks.XC_LoadPackage; import fan.appcompat.app.AlertDialog; -public class Helpers { +public class AppsTool { - private static final String TAG = "Helpers"; + private static final String TAG = "AppsTool"; public static boolean isModuleActive = false; public static int XposedVersion = 0; - public static final int REQUEST_PERMISSIONS_BACKUP = 1; - public static final int REQUEST_PERMISSIONS_RESTORE = 2; - - public static LruCache memoryCache = new LruCache<>((int) (Runtime.getRuntime().maxMemory() / 1024) / 2) { @Override protected int sizeOf(String key, Bitmap icon) { @@ -98,16 +94,6 @@ public static synchronized Resources getModuleRes(Context context) throws Throwa return (config == null ? moduleContext.getResources() : moduleContext.createConfigurationContext(config).getResources()); } - public static boolean checkStorageReadable(Activity activity) { - String state = Environment.getExternalStorageState(); - if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY) || state.equals(Environment.MEDIA_MOUNTED)) { - return true; - } else { - DialogHelper.showDialog(activity, "警告!", "无法访问任何合适的存储空间"); - return false; - } - } - public static class MimeType { public static int IMAGE = 1; public static int AUDIO = 2; @@ -180,7 +166,7 @@ public static void registerFileObserver(Context context) { FileObserver mFileObserver = new FileObserver(new File(PrefsUtils.getSharedPrefsPath()), FileObserver.CLOSE_WRITE) { @Override public void onEvent(int event, String path) { - Helpers.fixPermissionsAsync(context); + AppsTool.fixPermissionsAsync(context); } }; mFileObserver.startWatching(); @@ -201,29 +187,6 @@ private static String getCallerMethod() { return stackTrace[4].getMethodName(); } - public static ActivityOptions makeFreeformActivityOptions(Context context, String str) { - - /*ActivityOptions activityOptions; - try { - activityOptions = ReflectUtils.callStaticObjectMethod(Class.forName("android.util.MiuiMultiWindowUtils"), ActivityOptions.class, "getActivityOptions", new Class[]{Context.class, String.class, Boolean.TYPE, Boolean.TYPE}, context, str, true, false); - } catch (Exception e) { - logD(TAG, "MiuiMultiWindowUtils getActivityOptions error", e); - activityOptions = null; - } - - if (activityOptions != null) { - return activityOptions; - } - - - ActivityOptions makeBasic = ActivityOptions.makeBasic(); - ReflectUtils.callObjectMethod("android.app.ActivityOptions", "setLaunchWindowingMode", new Class[]{int.class}, 5); - Rect rect = (Rect) ReflectUtils.callObjectMethod("android.util.MiuiMultiWindowUtils", "getFreeformRect", new Class[]{Context.class}, new Object[]{context}); - makeBasic.setLaunchBounds(rect); - return makeBasic;*/ - return null; - } - public static void openAppInfo(Context context, String pkg, int user) { try { Intent intent = new Intent("miui.intent.action.APP_MANAGER_APPLICATION_DETAIL"); @@ -249,13 +212,12 @@ public static void openAppInfo(Context context, String pkg, int user) { public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lpparam) { try { Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.newInstance(); + Object parser = parserCls.getDeclaredConstructor().newInstance(); File apkPath = new File(lpparam.appInfo.sourceDir); Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - // XposedLogUtils.logI("getPackageVersionName", lpparam.packageName + " versionName is " + versionName); return (String) XposedHelpers.getObjectField(pkg, "mVersionName"); } catch (Throwable e) { - // XposedLogUtils.logW("getPackageVersionName", e); + logE("getPackageVersionCode", e); return "null"; } } @@ -263,13 +225,12 @@ public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lppar public static int getPackageVersionCode(XC_LoadPackage.LoadPackageParam lpparam) { try { Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.newInstance(); + Object parser = parserCls.getDeclaredConstructor().newInstance(); File apkPath = new File(lpparam.appInfo.sourceDir); Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - // XposedLogUtils.logI("getPackageVersionCode", lpparam.packageName + " versionCode is " + versionCode); return XposedHelpers.getIntField(pkg, "mVersionCode"); } catch (Throwable e) { - // XposedLogUtils.logW("getPackageVersionCode", e); + logE("getPackageVersionCode", e); return -1; } } @@ -279,76 +240,88 @@ public static void checkXposedActivateState(Context context) { } public static void doRestart(Context context, String[] packageName, boolean isRestartSystem) { - boolean result = false; + boolean result; boolean pid = true; + if (isRestartSystem) { result = ShellInit.getShell().run("reboot").sync().isResult(); } else { - if (packageName != null) { - for (String packageGet : packageName) { - if (packageGet == null) { - continue; - } - // String test = "XX"; - // ShellUtils.CommandResult commandResult = ShellUtils.execCommand("{ [[ $(pgrep -f '" + packageGet + - // "' | grep -v $$) != \"\" ]] && { pkill -l 9 -f \"" + packageGet + - // "\"; }; } || { echo \"kill error\"; }", true, true); - - boolean getResult = - ShellInit.getShell().add("pid=$(pgrep -f \"" + packageGet + "\" | grep -v $$)") - .add("if [[ $pid == \"\" ]]; then") - .add(" pids=\"\"") - .add(" pid=$(ps -A -o PID,ARGS=CMD | grep \"" + packageGet + "\" | grep -v \"grep\")") - .add(" for i in $pid; do") - .add(" if [[ $(echo $i | grep '[0-9]' 2>/dev/null) != \"\" ]]; then") - .add(" if [[ $pids == \"\" ]]; then") - .add(" pids=$i") - .add(" else") - .add(" pids=\"$pids $i\"") - .add(" fi") - .add(" fi") - .add(" done") - .add("fi") - .add("if [[ $pids != \"\" ]]; then") - .add(" pid=$pids") - .add("fi") - .add("if [[ $pid != \"\" ]]; then") - .add(" for i in $pid; do") - .add(" kill -s 15 $i &>/dev/null") - .add(" done") - .add("else") - .add(" echo \"No Find Pid!\"") - .add("fi").over().sync().isResult(); - ArrayList outPut = ShellInit.getShell().getOutPut(); - ArrayList error = ShellInit.getShell().getError(); - - if (getResult) { - if (!outPut.isEmpty()) { - if (outPut.get(0).equals("No Find Pid!")) { - pid = false; - } else { - result = true; - } - } else result = true; - } else - AndroidLogUtils.logE("doRestart: ", "result: " + ShellInit.getShell().getResult() + - " errorMsg: " + error + " package: " + packageGet); + result = handlePackages(packageName); + pid = result; + } + + if (!result) { + showAlertDialog(context, isRestartSystem, pid); + } + } + + private static boolean handlePackages(String[] packageName) { + if (packageName == null) { + AndroidLogUtils.logE("doRestart: ", "packageName is null"); + return false; + } + boolean result = false; + for (String packageGet : packageName) { + if (packageGet == null) continue; + + boolean getResult = + ShellInit.getShell().add("pid=$(pgrep -f \"" + packageGet + "\" | grep -v $$)") + .add("if [[ $pid == \"\" ]]; then") + .add(" pids=\"\"") + .add(" pid=$(ps -A -o PID,ARGS=CMD | grep \"" + packageGet + "\" | grep -v \"grep\")") + .add(" for i in $pid; do") + .add(" if [[ $(echo $i | grep '[0-9]' 2>/dev/null) != \"\" ]]; then") + .add(" if [[ $pids == \"\" ]]; then") + .add(" pids=$i") + .add(" else") + .add(" pids=\"$pids $i\"") + .add(" fi") + .add(" fi") + .add(" done") + .add("fi") + .add("if [[ $pids != \"\" ]]; then") + .add(" pid=$pids") + .add("fi") + .add("if [[ $pid != \"\" ]]; then") + .add(" for i in $pid; do") + .add(" kill -s 15 $i &>/dev/null") + .add(" done") + .add("else") + .add(" echo \"No Find Pid!\"") + .add("fi").over().sync().isResult(); + + ArrayList outPut = ShellInit.getShell().getOutPut(); + ArrayList error = ShellInit.getShell().getError(); + + if (getResult) { + if (!outPut.isEmpty() && outPut.get(0).equals("No Find Pid!")) { + return false; + } else { + result = true; } } else { - AndroidLogUtils.logE("doRestart: ", "packageName is null"); + AndroidLogUtils.logE("doRestart: ", "result: " + ShellInit.getShell().getResult() + " errorMsg: " + error + " package: " + packageGet); } - // result = ShellUtils.getResultBoolean("pkill -l 9 -f " + packageName, true); } - if (!result) { - new AlertDialog.Builder(context) - .setCancelable(false) - .setTitle(R.string.tip) - .setMessage(isRestartSystem ? R.string.reboot_failed : - pid ? R.string.kill_failed : R.string.pid_failed) - .setHapticFeedbackEnabled(true) - .setPositiveButton(android.R.string.ok, null) - .show(); + return result; + } + + private static void showAlertDialog(Context context, boolean isRestartSystem, boolean pid) { + new AlertDialog.Builder(context) + .setCancelable(false) + .setTitle(R.string.tip) + .setMessage(getErrorMessage(isRestartSystem, pid)) + .setHapticFeedbackEnabled(true) + .setPositiveButton(android.R.string.ok, null) + .show(); + } + + private static int getErrorMessage(boolean isRestartSystem, boolean pid) { + if (isRestartSystem) { + return R.string.reboot_failed; + } else { + return pid ? R.string.kill_failed : R.string.pid_failed; } } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java index e7f9ae816..546065efe 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java @@ -39,13 +39,8 @@ import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.utils.ContextUtils; import com.sevtinge.hyperceiler.utils.blur.MiBlurUtils; -import com.sevtinge.hyperceiler.utils.blur.MiBlurUtilsKt; - -import java.io.File; -import java.lang.ref.WeakReference; import de.robv.android.xposed.XposedHelpers; -import de.robv.android.xposed.callbacks.XC_LoadPackage; public class OtherTool { // 尝试全部 @@ -58,8 +53,6 @@ public class OtherTool { @SuppressLint("StaticFieldLeak") public static TextView mPct = null; - // public Context mModuleContext = null; - public static Resources getModuleRes(Context context) throws PackageManager.NameNotFoundException { return ResourcesTool.loadModuleRes(context); @@ -69,14 +62,9 @@ public static Context findContext(@ContextUtils.Duration int flag) { Context context = null; try { switch (flag) { - case FLAG_ALL -> { - if ((context = currentApplication()) == null) - context = getSystemContext(); - } + case FLAG_ALL -> context = currentApplication() != null ? currentApplication() : getSystemContext(); case FLAG_CURRENT_APP -> context = currentApplication(); case FlAG_ONLY_ANDROID -> context = getSystemContext(); - default -> { - } } return context; } catch (Throwable ignore) { @@ -125,32 +113,6 @@ public static void setProp(String key, String val) { } } - public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lpparam) { - try { - Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.getDeclaredConstructor().newInstance(); - File apkPath = new File(lpparam.appInfo.sourceDir); - Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - return (String) XposedHelpers.getObjectField(pkg, "mVersionName"); - } catch (Throwable e) { - logE("getPackageVersionCode", e); - return ""; - } - } - - public static int getPackageVersionCode(XC_LoadPackage.LoadPackageParam lpparam) { - try { - Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.getDeclaredConstructor().newInstance(); - File apkPath = new File(lpparam.appInfo.sourceDir); - Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - return XposedHelpers.getIntField(pkg, "mVersionCode"); - } catch (Throwable e) { - logE("getPackageVersionCode", e); - return -1; - } - } - public static void initPct(ViewGroup container, int source) { Resources res = container.getContext().getResources(); if (mPct == null) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/DebugMode.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/DebugMode.java index a5d8e41be..0d54d75ea 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/DebugMode.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/DebugMode.java @@ -18,7 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.browser; -import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; import com.sevtinge.hyperceiler.module.base.BaseHook; import com.sevtinge.hyperceiler.module.base.dexkit.DexKit; diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/EnableDebugEnvironment.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/EnableDebugEnvironment.java index dddff8fc9..8b6f4aaf5 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/EnableDebugEnvironment.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/browser/EnableDebugEnvironment.java @@ -18,7 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.browser; -import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; import com.sevtinge.hyperceiler.module.base.BaseHook; import com.sevtinge.hyperceiler.module.base.dexkit.DexKit; diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/getapps/BypassRiskCheck.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/getapps/BypassRiskCheck.java index efc3679b6..307cdb8a9 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/getapps/BypassRiskCheck.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/getapps/BypassRiskCheck.java @@ -19,7 +19,7 @@ package com.sevtinge.hyperceiler.module.hook.getapps; -import static com.sevtinge.hyperceiler.utils.Helpers.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; import static de.robv.android.xposed.XposedHelpers.getStaticObjectField; import static de.robv.android.xposed.XposedHelpers.setObjectField; diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/HomeBaseHook.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/HomeBaseHook.kt index 9de4260c3..a1ef808d3 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/HomeBaseHook.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/HomeBaseHook.kt @@ -19,7 +19,7 @@ package com.sevtinge.hyperceiler.module.hook.home import com.sevtinge.hyperceiler.module.base.BaseHook -import com.sevtinge.hyperceiler.module.base.tool.OtherTool.* +import com.sevtinge.hyperceiler.module.base.tool.AppsTool.* import com.sevtinge.hyperceiler.utils.devicesdk.* abstract class HomeBaseHook : BaseHook() { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/drawer/AllAppsContainerViewSuperBlur.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/drawer/AllAppsContainerViewSuperBlur.java index 2d268ea6a..fb05ff283 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/drawer/AllAppsContainerViewSuperBlur.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/drawer/AllAppsContainerViewSuperBlur.java @@ -29,7 +29,7 @@ import android.widget.ViewSwitcher; import com.sevtinge.hyperceiler.module.base.BaseHook; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.blur.MiBlurUtils; import com.sevtinge.hyperceiler.utils.blur.MiBlurUtilsKt; @@ -57,7 +57,7 @@ protected void after(MethodHookParam param) throws Throwable { 200)); MiBlurUtils.clearMiBackgroundBlendColor(view); int a; - if (Helpers.isDarkMode(view.getContext())) a = 100; + if (AppsTool.isDarkMode(view.getContext())) a = 100; else a = 140; MiBlurUtils.addMiBackgroundBlendColor(view, Color.argb(a, 0, 0, 0), 103); MiBlurUtils.setMiViewBlurMode(view, 1); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/app/AppDisable.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/app/AppDisable.java index 38ecac01c..6f5d61b91 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/app/AppDisable.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/app/AppDisable.java @@ -19,6 +19,8 @@ package com.sevtinge.hyperceiler.module.hook.securitycenter.app; import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getModuleRes; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import android.annotation.SuppressLint; import android.app.Activity; @@ -36,7 +38,6 @@ import com.sevtinge.hyperceiler.module.base.BaseHook; import com.sevtinge.hyperceiler.module.base.dexkit.DexKit; import com.sevtinge.hyperceiler.module.base.dexkit.IDexKit; -import com.sevtinge.hyperceiler.utils.Helpers; import com.sevtinge.hyperceiler.utils.MiuiDialog; import org.luckypray.dexkit.DexKitBridge; @@ -60,7 +61,7 @@ public class AppDisable extends BaseHook { @Override public void init() { - boolean isNewSecurityCenter = Helpers.getPackageVersionCode(lpparam) >= 40001000; + boolean isNewSecurityCenter = (getPackageVersionCode(lpparam) >= 40001000 && !isPad()) || (getPackageVersionCode(lpparam) >= 40011000 && isPad()); String clazzName = !isNewSecurityCenter ? "com.miui.appmanager.ApplicationsDetailsActivity" : "com.miui.appmanager.fragment.ApplicationsDetailsFragment"; findAndHookMethod("com.miui.appmanager.ApplicationsDetailsActivity", "onCreateOptionsMenu", Menu.class, new MethodHook() { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index 11c7c7680..ecd4e9970 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -18,7 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.securitycenter.sidebar; -import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import android.content.BroadcastReceiver; diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/BlurSecurity.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/BlurSecurity.kt index 2ef2140da..76c63a09a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/BlurSecurity.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/BlurSecurity.kt @@ -28,6 +28,7 @@ import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createAfterHook import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* +import com.sevtinge.hyperceiler.module.base.tool.AppsTool.* import com.sevtinge.hyperceiler.utils.* import com.sevtinge.hyperceiler.utils.blur.BlurUtils.* import com.sevtinge.hyperceiler.utils.blur.MiBlurUtilsKt.addMiBackgroundBlendColor @@ -53,7 +54,7 @@ object BlurSecurity : BaseHook() { } private val shouldInvertColor = !ColorUtils.isDarkColor(backgroundColor) - private var appVersionCode = 40000727 + private val appVersionCode = getPackageVersionCode(lpparam) // 反色 同时保持红蓝色变化不大 private val invertColorRenderEffect = RenderEffect.createColorFilterEffect( diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/CleanOpenMenu.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/CleanOpenMenu.java index a0b312e17..35d23936f 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/CleanOpenMenu.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/CleanOpenMenu.java @@ -31,7 +31,7 @@ import android.view.View; import com.sevtinge.hyperceiler.module.base.BaseHook; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.prefs.PrefType; import com.sevtinge.hyperceiler.utils.prefs.PrefsChangeObserver; import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; @@ -142,11 +142,11 @@ private static Pair isRemoveApp(boolean dynamic, Context conte int mimeFlags0; int mimeFlags999; if (dynamic) { - mimeFlags0 = PrefsUtils.getSharedIntPrefs(context, "pref_key_" + key + "_" + pkgName + "|0", Helpers.MimeType.ALL); - mimeFlags999 = PrefsUtils.getSharedIntPrefs(context, "pref_key_" + key + "_" + pkgName + "|999", Helpers.MimeType.ALL); + mimeFlags0 = PrefsUtils.getSharedIntPrefs(context, "pref_key_" + key + "_" + pkgName + "|0", AppsTool.MimeType.ALL); + mimeFlags999 = PrefsUtils.getSharedIntPrefs(context, "pref_key_" + key + "_" + pkgName + "|999", AppsTool.MimeType.ALL); } else { - mimeFlags0 = mPrefsMap.getInt(key + "_" + pkgName + "|0", Helpers.MimeType.ALL); - mimeFlags999 = mPrefsMap.getInt(key + "_" + pkgName + "|999", Helpers.MimeType.ALL); + mimeFlags0 = mPrefsMap.getInt(key + "_" + pkgName + "|0", AppsTool.MimeType.ALL); + mimeFlags999 = mPrefsMap.getInt(key + "_" + pkgName + "|999", AppsTool.MimeType.ALL); } boolean removeOriginal = (selectedApps.contains(pkgName) || selectedApps.contains(pkgName + "|0")) && hideMimeType(mimeFlags0, mimeType); boolean removeDual = selectedApps.contains(pkgName + "|999") && hideMimeType(mimeFlags999, mimeType); @@ -166,17 +166,17 @@ private static String getContentType(Context context, Intent intent) { } private static boolean hideMimeType(int mimeFlags, String mimeType) { - int dataType = Helpers.MimeType.OTHERS; + int dataType = AppsTool.MimeType.OTHERS; if (mimeType != null) - if (mimeType.startsWith("image/")) dataType = Helpers.MimeType.IMAGE; - else if (mimeType.startsWith("audio/")) dataType = Helpers.MimeType.AUDIO; - else if (mimeType.startsWith("video/")) dataType = Helpers.MimeType.VIDEO; + if (mimeType.startsWith("image/")) dataType = AppsTool.MimeType.IMAGE; + else if (mimeType.startsWith("audio/")) dataType = AppsTool.MimeType.AUDIO; + else if (mimeType.startsWith("video/")) dataType = AppsTool.MimeType.VIDEO; else if (mimeType.startsWith("text/") || mimeType.startsWith("application/pdf") || mimeType.startsWith("application/msword") || mimeType.startsWith("application/vnd.ms-") || mimeType.startsWith("application/vnd.openxmlformats-")) - dataType = Helpers.MimeType.DOCUMENT; + dataType = AppsTool.MimeType.DOCUMENT; else if (mimeType.startsWith("application/vnd.android.package-archive") || mimeType.startsWith("application/zip") || mimeType.startsWith("application/x-zip") || @@ -190,8 +190,8 @@ else if (mimeType.startsWith("application/vnd.android.package-archive") || mimeType.startsWith("application/x-compress") || mimeType.startsWith("application/x-7z") || mimeType.startsWith("application/java-archive")) - dataType = Helpers.MimeType.ARCHIVE; - else if (mimeType.startsWith("link/")) dataType = Helpers.MimeType.LINK; + dataType = AppsTool.MimeType.ARCHIVE; + else if (mimeType.startsWith("link/")) dataType = AppsTool.MimeType.LINK; return (mimeFlags & dataType) == dataType; } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationRowMenu.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationRowMenu.java index 997f09b32..8f6d2c245 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationRowMenu.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationRowMenu.java @@ -31,7 +31,7 @@ import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.module.base.BaseHook; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import java.lang.reflect.Constructor; import java.util.ArrayList; @@ -97,7 +97,7 @@ protected void after(final MethodHookParam param) { } if (view == mInfoBtn) { - Helpers.openAppInfo(mContext, pkgName, user); + AppsTool.openAppInfo(mContext, pkgName, user); mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } else if (view == mForceCloseBtn) { ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/various/clipboard/ClipboardList.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/various/clipboard/ClipboardList.java index 8c87179e5..1054939aa 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/various/clipboard/ClipboardList.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/various/clipboard/ClipboardList.java @@ -19,7 +19,7 @@ package com.sevtinge.hyperceiler.module.hook.various.clipboard; import static com.hchen.hooktool.tool.CoreTool.getStaticField; -import static com.sevtinge.hyperceiler.utils.Helpers.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; import android.annotation.SuppressLint; import android.content.ClipData; diff --git a/app/src/main/java/com/sevtinge/hyperceiler/provider/SharedPrefsProvider.java b/app/src/main/java/com/sevtinge/hyperceiler/provider/SharedPrefsProvider.java index fcdaff557..9b9e1788c 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/provider/SharedPrefsProvider.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/provider/SharedPrefsProvider.java @@ -32,7 +32,7 @@ import androidx.annotation.NonNull; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; import java.io.File; @@ -121,7 +121,7 @@ public AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode) } return afd; } else if (uriMatcher.match(uri) == 6) { - Context context = Helpers.getProtectedContext(getContext()); + Context context = AppsTool.getProtectedContext(getContext()); File file = new File(context.getFilesDir() + "/shortcuts/" + parts.get(1) + "_shortcut.png"); if (!file.exists()) return null; return new AssetFileDescriptor(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY), 0, AssetFileDescriptor.UNKNOWN_LENGTH); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/HyperCeilerTabActivity.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/HyperCeilerTabActivity.java index 383cc67d7..614b99181 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/HyperCeilerTabActivity.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/HyperCeilerTabActivity.java @@ -2,7 +2,7 @@ import static com.sevtinge.hyperceiler.utils.PersistConfig.isLunarNewYearThemeView; import static com.sevtinge.hyperceiler.utils.PersistConfig.isNeedGrayView; -import static com.sevtinge.hyperceiler.utils.Helpers.isModuleActive; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.isModuleActive; import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; import static com.sevtinge.hyperceiler.utils.log.LogManager.IS_LOGGER_ALIVE; @@ -37,20 +37,16 @@ import com.sevtinge.hyperceiler.ui.fragment.main.DetailFragment; import com.sevtinge.hyperceiler.utils.BackupUtils; import com.sevtinge.hyperceiler.utils.DialogHelper; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.LanguageHelper; import com.sevtinge.hyperceiler.utils.PermissionUtils; import com.sevtinge.hyperceiler.utils.PropUtils; import com.sevtinge.hyperceiler.utils.ThreadPoolManager; import com.sevtinge.hyperceiler.utils.api.ProjectApi; -import com.sevtinge.hyperceiler.utils.log.AndroidLogUtils; import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; import com.sevtinge.hyperceiler.utils.search.SearchHelper; import com.sevtinge.hyperceiler.utils.shell.ShellInit; -import com.xhinliang.lunarcalendar.Lunar; -import com.xhinliang.lunarcalendar.LunarCalendar; -import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -101,7 +97,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); new Thread(() -> SearchHelper.getAllMods(context, savedInstanceState != null)).start(); - Helpers.checkXposedActivateState(this); + AppsTool.checkXposedActivateState(this); if (!IS_LOGGER_ALIVE && isModuleActive && BuildConfig.BUILD_TYPE != "release" && !mPrefs.getBoolean("prefs_key_development_close_log_alert_dialog", false)) { handler.post(() -> DialogHelper.showLogServiceWarnDialog(context)); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/BaseActivity.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/BaseActivity.java index d1d40b5f2..6c28df369 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/BaseActivity.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/BaseActivity.java @@ -28,7 +28,7 @@ import androidx.annotation.Nullable; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; import fan.appcompat.app.AppCompatActivity; @@ -54,7 +54,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { private void registerObserver() { PrefsUtils.registerOnSharedPreferenceChangeListener(getApplicationContext()); - Helpers.fixPermissionsAsync(getApplicationContext()); - Helpers.registerFileObserver(getApplicationContext()); + AppsTool.fixPermissionsAsync(getApplicationContext()); + AppsTool.registerFileObserver(getApplicationContext()); } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/NaviBaseActivity.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/NaviBaseActivity.java index d43599d7a..22874d038 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/NaviBaseActivity.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/activity/base/NaviBaseActivity.java @@ -2,15 +2,12 @@ import android.os.Bundle; import android.util.Log; -import android.view.View; -import android.widget.ImageView; -import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.ui.fragment.main.ContentFragment; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; import fan.appcompat.app.Fragment; @@ -42,8 +39,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { private void registerObserver() { PrefsUtils.registerOnSharedPreferenceChangeListener(getApplicationContext()); - Helpers.fixPermissionsAsync(getApplicationContext()); - Helpers.registerFileObserver(getApplicationContext()); + AppsTool.fixPermissionsAsync(getApplicationContext()); + AppsTool.registerFileObserver(getApplicationContext()); } @Override diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/main/settings/development/DevelopmentDebugInfoFragment.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/main/settings/development/DevelopmentDebugInfoFragment.java index 3bd8c28fd..41db38093 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/main/settings/development/DevelopmentDebugInfoFragment.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/main/settings/development/DevelopmentDebugInfoFragment.java @@ -20,7 +20,7 @@ import com.sevtinge.hyperceiler.expansion.utils.SignUtils; -import static com.sevtinge.hyperceiler.utils.Helpers.isModuleActive; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.isModuleActive; import static com.sevtinge.hyperceiler.utils.devicesdk.DeviceSDKKt.getBoard; import static com.sevtinge.hyperceiler.utils.devicesdk.DeviceSDKKt.getBrand; import static com.sevtinge.hyperceiler.utils.devicesdk.DeviceSDKKt.getCharacteristics; diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/DialogHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/DialogHelper.java index 8d1d28a30..74b78cf2a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/DialogHelper.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/DialogHelper.java @@ -26,6 +26,7 @@ import android.view.View; import com.sevtinge.hyperceiler.R; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.log.AndroidLogUtils; import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils; import com.sevtinge.hyperceiler.utils.shell.ShellExec; @@ -193,7 +194,7 @@ public static void showRestartDialog(Context context, boolean isRestartSystem, S .setMessage(isRestartSystem ? isSystem : isOther) .setHapticFeedbackEnabled(true) .setPositiveButton(android.R.string.ok, (dialog, which) -> - Helpers.doRestart(context, packageName, isRestartSystem) + AppsTool.doRestart(context, packageName, isRestartSystem) ) .setNegativeButton(android.R.string.cancel, null) .show(); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/prefs/PrefsUtils.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/prefs/PrefsUtils.java index e6a9578b7..c57c93bd1 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/prefs/PrefsUtils.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/prefs/PrefsUtils.java @@ -26,7 +26,7 @@ import android.util.Log; import com.sevtinge.hyperceiler.provider.SharedPrefsProvider; -import com.sevtinge.hyperceiler.utils.Helpers; +import com.sevtinge.hyperceiler.module.base.tool.AppsTool; import com.sevtinge.hyperceiler.utils.api.ProjectApi; import com.sevtinge.hyperceiler.utils.log.XposedLogUtils; import com.sevtinge.hyperceiler.utils.prefs.PrefsChangeObserver.PrefToUri; @@ -49,7 +49,7 @@ public class PrefsUtils { public static String mPrefsFile = mPrefsPath + "/" + mPrefsName + ".xml"; public static SharedPreferences getSharedPrefs(Context context, boolean multiProcess) { - context = Helpers.getProtectedContext(context); + context = AppsTool.getProtectedContext(context); try { return context.getSharedPreferences(mPrefsName, multiProcess ? Context.MODE_MULTI_PROCESS | Context.MODE_WORLD_READABLE : Context.MODE_WORLD_READABLE); } catch (Throwable t) { @@ -190,7 +190,7 @@ public static boolean getSharedBoolPrefs(Context context, String name, boolean d public static void registerOnSharedPreferenceChangeListener(Context context) { mSharedPreferences.registerOnSharedPreferenceChangeListener((sharedPreferences, key) -> { Log.i("prefs", "Changed: " + key); - Helpers.requestBackup(context); + AppsTool.requestBackup(context); Object val = sharedPreferences.getAll().get(key); String path = ""; if (val instanceof String) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ab3c9ad6f..70952d65a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,9 +20,9 @@ gson = "2.11.0" dexkit = "2.0.3" ezxhelper = "2.2.0" hiddenapibypass = "4.3" -hooktool = "v.1.1.4" +hooktool = "v.1.1.6.2" lyricGetterApi = "6.0.0" -mmkv = "2.0.1" +mmkv = "2.0.2" [libraries] annotation = { module = "androidx.annotation:annotation", version.ref = "annotation" } From a5b866de6f6adb2ad5c90b088fcbd08db2f153ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 13:39:13 +0800 Subject: [PATCH 08/43] adj: version code = github commit code --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0b4f8748b..3892069d7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -96,7 +96,7 @@ android { applicationId = namespace minSdk = 33 targetSdk = 35 - versionCode = 155 + versionCode = getVersionCode() versionName = "2.5.155" val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").apply { From 845dc945eb82bdf20b10ca2a7b750fbf2ea9c34c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 15:33:37 +0800 Subject: [PATCH 09/43] deps: update agp to 8.8.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 70952d65a..43d6eba7c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.7.3" +agp = "8.8.0" kotlin-android = "2.1.0" lsparanoid = "0.6.0" autoService = "1.1.1" From 53666341ec4e91b6585d7a516204fe639d470ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 16:57:49 +0800 Subject: [PATCH 10/43] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E7=95=8C?= =?UTF-8?q?=E9=9D=A2-=E7=8A=B6=E6=80=81=E6=A0=8F-=E5=9B=BE=E6=A0=87-?= =?UTF-8?q?=E9=97=B9=E9=92=9F-=E4=BB=85=E5=9C=A8=E9=97=B9=E9=92=9F?= =?UTF-8?q?=E5=93=8D=E9=93=83=E5=89=8D=E6=98=BE=E7=A4=BA=E9=97=B9=E9=92=9F?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=20=E8=AE=BE=E7=BD=AE=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88Miui14-HyperOS2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sidebar/AddSideBarExpandReceiver.java | 24 +++++++---- .../SelectiveHideIconForAlarmClock.java | 43 +++++++++++++------ 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index ecd4e9970..311a8895f 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -100,16 +100,22 @@ public void run() { myhandler.removeCallbacks(this); if (!enableSideBar) { Object li = XposedHelpers.getObjectField(view, "mListenerInfo"); - Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); - findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - MotionEvent me = (MotionEvent) param.args[1]; - if (me.getSource() != 9999) { - param.setResult(false); - } + if (li != null) { + try { + Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); + findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { + @Override + protected void before(MethodHookParam param) throws Throwable { + MotionEvent me = (MotionEvent) param.args[1]; + if (me.getSource() != 9999) { + param.setResult(false); + } + } + }); + } catch (Throwable e) { + logE(TAG, lpparam.packageName, "OnTouchListener is failed, " + e); } - }); + } } if (isNewVersion) { try { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/SelectiveHideIconForAlarmClock.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/SelectiveHideIconForAlarmClock.java index 42bea8160..b2bd6128d 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/SelectiveHideIconForAlarmClock.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/SelectiveHideIconForAlarmClock.java @@ -18,6 +18,12 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui.statusbar; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isAndroidVersion; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMiuiVersion; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreAndroidVersion; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreMiuiVersion; + import android.app.AlarmManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -45,17 +51,20 @@ public class SelectiveHideIconForAlarmClock extends BaseHook { private boolean lastState = false; Class mMiuiPhoneStatusBarPolicy; + Class mPhoneStatusBarPolicy; @Override public void init() { mMiuiPhoneStatusBarPolicy = findClassIfExists("com.android.systemui.statusbar.phone.MiuiPhoneStatusBarPolicy"); + mPhoneStatusBarPolicy = findClassIfExists("com.android.systemui.statusbar.phone.PhoneStatusBarPolicy$4"); + hookAllConstructors(mMiuiPhoneStatusBarPolicy, new MethodHook() { @Override protected void after(MethodHookParam param) { Context mContext = (Context) XposedHelpers.getObjectField(param.thisObject, "mContext"); XposedHelpers.setAdditionalInstanceField(param.thisObject, "mNextAlarmTime", getNextMIUIAlarmTime(mContext)); ContentResolver resolver = mContext.getContentResolver(); - ContentObserver alarmObserver = new ContentObserver(new Handler()) { + ContentObserver alarmObserver = new ContentObserver(new Handler(mContext.getMainLooper())) { @Override public void onChange(boolean selfChange) { if (selfChange) return; @@ -80,22 +89,26 @@ public void onReceive(Context context, Intent intent) { } }); - findAndHookMethod("com.android.systemui.statusbar.phone.PhoneStatusBarPolicy", "updateAlarm", new MethodHook() { + findAndHookMethod(mPhoneStatusBarPolicy, "onAlarmChanged", boolean.class, new MethodHook() { @Override protected void after(MethodHookParam param) throws Throwable { - lastState = (boolean) XposedHelpers.getObjectField(param.thisObject, "mHasAlarm"); - updateAlarmVisibility(param.thisObject, lastState); - } - }); - - findAndHookMethod(mMiuiPhoneStatusBarPolicy, "onMiuiAlarmChanged", new MethodHook() { - @Override - protected void before(MethodHookParam param) { - lastState = (boolean) XposedHelpers.getObjectField(param.thisObject, "mHasAlarm"); - updateAlarmVisibility(param.thisObject, lastState); + Object getThisObject = XposedHelpers.getObjectField(param.thisObject, "this$0"); + lastState = (boolean) XposedHelpers.getObjectField(getThisObject, "mHasAlarm"); + updateAlarmVisibility(getThisObject, lastState); param.setResult(null); } }); + + if (isAndroidVersion(33) && !isMoreHyperOSVersion(1f)) { + findAndHookMethod(mMiuiPhoneStatusBarPolicy, "onMiuiAlarmChanged", new MethodHook() { + @Override + protected void before(MethodHookParam param) { + lastState = (boolean) XposedHelpers.getObjectField(param.thisObject, "mHasAlarm"); + updateAlarmVisibility(param.thisObject, lastState); + param.setResult(null); + } + }); + } } private void updateAlarmVisibility(Object thisObject, boolean state) { @@ -121,8 +134,10 @@ private void updateAlarmVisibility(Object thisObject, boolean state) { float diffHours = (diffMSec - 59 * 1000) / (1000f * 60f * 60f); boolean vis = diffHours <= mPrefsMap.getInt("system_ui_status_bar_icon_alarm_clock_n", 0); XposedHelpers.callMethod(mIconController, "setIconVisibility", "alarm_clock", vis); - mIconController = XposedHelpers.getObjectField(thisObject, "miuiDripLeftStatusBarIconController"); - XposedHelpers.callMethod(mIconController, "setIconVisibility", "alarm_clock", vis); + if (!isMoreHyperOSVersion(1f)) { + mIconController = XposedHelpers.getObjectField(thisObject, "miuiDripLeftStatusBarIconController"); + XposedHelpers.callMethod(mIconController, "setIconVisibility", "alarm_clock", vis); + } logI(TAG, this.lpparam.packageName, "Now is " + diffHours + "min remain, show when " + vis + "min remain."); } catch (Throwable t) { logE(TAG, this.lpparam.packageName, "updateAlarmVisibility failed", t); From c3b8255b2acc71224f76e0916ec9e69b37a205ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 17:17:46 +0800 Subject: [PATCH 11/43] =?UTF-8?q?adj:=20=E5=AF=B9=20HyperOS2=20=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E9=80=9A=E7=9F=A5=E7=9C=81=E7=95=A5=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E6=95=B0=E9=87=8F=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../systemui/statusbar/IconManageNewSettings.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/statusbar/IconManageNewSettings.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/statusbar/IconManageNewSettings.java index 289779dfb..5a6f4ce8c 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/statusbar/IconManageNewSettings.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/statusbar/IconManageNewSettings.java @@ -18,6 +18,7 @@ */ package com.sevtinge.hyperceiler.ui.fragment.app.systemui.statusbar; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isHyperOSVersion; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreAndroidVersion; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; @@ -38,6 +39,7 @@ public class IconManageNewSettings extends DashboardFragment { SeekBarPreferenceCompat mNotificationIconColumns; SwitchPreference mBatteryNumber; SwitchPreference mBatteryPercentage; + SwitchPreference mNotificationIconColumnsEnabled; @Override public int getPreferenceScreenResId() { @@ -53,8 +55,14 @@ public void initPrefs() { mBatteryNumber = findPreference("prefs_key_system_ui_status_bar_battery_percent"); mBatteryPercentage = findPreference("prefs_key_system_ui_status_bar_battery_percent_mark"); mNotificationIconColumns = findPreference("prefs_key_system_ui_status_bar_notification_icon_maximum"); - - mNotificationIconColumns.setDefaultValue((isMoreHyperOSVersion(1f) && isMoreAndroidVersion(34)) ? 1 : 3); + mNotificationIconColumnsEnabled = findPreference("prefs_key_system_ui_status_bar_notification_dots_maximum_enable"); + + if (isMoreHyperOSVersion(2f)) { + mNotificationIconColumns.setVisible(false); + mNotificationIconColumnsEnabled.setVisible(false); + } else { + mNotificationIconColumns.setDefaultValue((isHyperOSVersion(1f) && isMoreAndroidVersion(34)) ? 1 : 3); + } mAlarmClockIconN.setVisible(Integer.parseInt(PrefsUtils.mSharedPreferences.getString("prefs_key_system_ui_status_bar_icon_alarm_clock", "0")) == 3); From 5da530791ac6fb4a43834b29cf6d2b9d04fef6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 20:46:19 +0800 Subject: [PATCH 12/43] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E7=95=8C?= =?UTF-8?q?=E9=9D=A2-=E9=80=9A=E7=9F=A5=E4=B8=8E=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E4=B8=AD=E5=BF=83-=E5=AA=92=E4=BD=93=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=8D=A1=E7=89=87-=E5=8A=A8=E4=BD=9C=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=88HyperOS1-HyperOS2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hook/systemui/controlcenter/MediaButton.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/MediaButton.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/MediaButton.java index bfaeb7758..fa3f20fcd 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/MediaButton.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/MediaButton.java @@ -18,6 +18,8 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui.controlcenter; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; + import android.widget.ImageButton; import android.content.Context; import android.graphics.Bitmap; @@ -35,19 +37,25 @@ import de.robv.android.xposed.XposedHelpers; public class MediaButton extends BaseHook { - private String pkg = null; + Class MediaControlPanel; + private final int type = mPrefsMap.getInt("system_ui_control_center_media_control_media_button", 140); private final int typeCustom = mPrefsMap.getInt("system_ui_control_center_media_control_media_button_custom", 140); @Override public void init() throws NoSuchMethodException { + if (isMoreHyperOSVersion(2f)) { + MediaControlPanel = findClassIfExists("com.android.systemui.media.controls.ui.controller.MediaControlPanel", lpparam.classLoader); + } else { + MediaControlPanel = findClassIfExists("com.android.systemui.media.controls.ui.MediaControlPanel", lpparam.classLoader); + } Class DrawableUtils = findClassIfExists("com.miui.utils.DrawableUtils", lpparam.classLoader); - hookAllMethods("com.android.systemui.media.controls.ui.controller.MediaControlPanel", - "bindButtonCommon", new MethodHook() { + + hookAllMethods(MediaControlPanel, "bindButtonCommon", new MethodHook() { @Override protected void before(MethodHookParam param) throws Throwable { - Object mediaAction = param.args[0]; + Object mediaAction = param.args[1]; String desc = (String) XposedHelpers.getObjectField(mediaAction, "contentDescription"); if ((typeCustom != 140) && !desc.contains("Play") && !desc.contains("Pause") && From f4070807117d1e519ead8240b708077b9322e40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 21:14:29 +0800 Subject: [PATCH 13/43] =?UTF-8?q?adj:=20=E7=A7=BB=E9=99=A4=E8=A7=A3?= =?UTF-8?q?=E9=94=81=20Xiaomi=20HyperMind=20=E5=8A=9F=E8=83=BD=20&&=20?= =?UTF-8?q?=E5=AF=B9=20Pad=20=E5=8F=96=E6=B6=88=E6=A8=AA=E5=B1=8F=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E9=80=9A=E7=9F=A5=E6=A0=8F=E5=A4=A9=E6=B0=94=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hyperceiler/module/app/MiLink.java | 2 - .../module/hook/milink/NewUnlockHMind.kt | 52 ------------------- .../controlcenter/NotificationWeather.kt | 2 +- .../ui/fragment/app/MiLinkFragment.java | 12 ----- app/src/main/res/values-ar-rSA/strings.xml | 1 - app/src/main/res/values-es-rES/strings.xml | 1 - app/src/main/res/values-in-rID/strings.xml | 1 - app/src/main/res/values-it-rIT/strings.xml | 1 - app/src/main/res/values-ja-rJP/strings.xml | 1 - app/src/main/res/values-pl-rPL/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-ru-rRU/strings.xml | 1 - app/src/main/res/values-tr-rTR/strings.xml | 1 - app/src/main/res/values-vi-rVN/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rME/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - app/src/main/res/xml/milink.xml | 5 -- 20 files changed, 1 insertion(+), 87 deletions(-) delete mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/milink/NewUnlockHMind.kt diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/MiLink.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/MiLink.java index fae82b01d..c75efd4ea 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/MiLink.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/MiLink.java @@ -22,7 +22,6 @@ import com.sevtinge.hyperceiler.module.base.BaseModule; import com.sevtinge.hyperceiler.module.hook.milink.AllowCameraDevices; import com.sevtinge.hyperceiler.module.hook.milink.FuckHpplay; -import com.sevtinge.hyperceiler.module.hook.milink.NewUnlockHMind; import com.sevtinge.hyperceiler.module.hook.milink.UnlockMiShare; @HookBase(targetPackage = "com.milink.service") @@ -31,7 +30,6 @@ public class MiLink extends BaseModule { @Override public void handleLoadPackage() { initHook(new UnlockMiShare(), mPrefsMap.getBoolean("milink_unlock_mishare")); - initHook(NewUnlockHMind.INSTANCE, mPrefsMap.getBoolean("milink_unlock_hmind")); initHook(new AllowCameraDevices(), mPrefsMap.getBoolean("milink_allow_camera_devices")); initHook(new FuckHpplay(), mPrefsMap.getBoolean("milink_fuck_hpplay")); } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/milink/NewUnlockHMind.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/milink/NewUnlockHMind.kt deleted file mode 100644 index 7d3371574..000000000 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/milink/NewUnlockHMind.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of HyperCeiler. - - * HyperCeiler is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - - * Copyright (C) 2023-2025 HyperCeiler Contributions -*/ -package com.sevtinge.hyperceiler.module.hook.milink - -import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook -import com.sevtinge.hyperceiler.module.base.* -import com.sevtinge.hyperceiler.module.base.dexkit.* -import java.lang.reflect.* - -object NewUnlockHMind : BaseHook() { - private val unlockHMind by lazy { - // 解锁 Xiaomi HyperMind - // 适配 15.x.x.x ~ 16.x.x.x - // 这要是坏了,除非动了 cetus 字符串,否则不可能会炸 - // 哦对了,我说怎么平板不配,原来 TMD 把横屏适配删了,米米你啥时候加回来 QAQ! - DexKit.findMember("NewHMindManager") { dexkit -> - dexkit.findMethod { - matcher { - addCaller { - declaredClass = "com.miui.circulate.world.CirculateWorldActivity" - usingStrings("cetus") - } - declaredClass = "com.milink.hmindlib.HMindManager" - returnType = "boolean" - modifiers = Modifier.FINAL - } - }.single() - } - } - - override fun init() { - unlockHMind.createHook { - returnConstant(true) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt index 407da30e1..d81765a2f 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt @@ -54,7 +54,7 @@ object NotificationWeather : BaseHook() { val viewGroup = it.thisObject as ViewGroup val mOrientation = viewGroup.getObjectField("mOrientation") as Int - mWeatherView?.visibility = if (mOrientation == 1) { + mWeatherView?.visibility = if (mOrientation == 1 || isPad()) { View.VISIBLE } else { View.GONE diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MiLinkFragment.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MiLinkFragment.java index 27a9d8898..4a8567c53 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MiLinkFragment.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/MiLinkFragment.java @@ -22,16 +22,12 @@ import android.view.View; -import androidx.preference.SwitchPreference; - import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.ui.activity.base.BaseSettingsActivity; import com.sevtinge.hyperceiler.ui.fragment.dashboard.DashboardFragment; public class MiLinkFragment extends DashboardFragment { - SwitchPreference mUnlockHMind; - @Override public int getPreferenceScreenResId() { return R.xml.milink; @@ -44,12 +40,4 @@ public View.OnClickListener addRestartListener() { "com.milink.service" ); } - - @Override - public void initPrefs() { - mUnlockHMind = findPreference("prefs_key_milink_unlock_hmind"); - if (mUnlockHMind != null) { - mUnlockHMind.setVisible(isMoreHyperOSVersion(1f)); - } - } } diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 538b39bb2..95cc635ad 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -1145,7 +1145,6 @@ الإرسال خدمات الاتصال البيني فتح الاتصال بالجهاز - فتح Xiaomi HyperMind دعم إجبارى لبث الكاميرا منع إنشاء مجلدات hpplay diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 00befcdba..bf4530680 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -972,7 +972,6 @@ aplicaciones del sistema Proyectar la pantalla Servicios de interconexión Desbloquear interconexión de dispositivo - Desactivar HyperMind/MiLink Forzar el soporte para la transmisión de cámara Bloquear la creación de carpetas de hpplay diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index ad3a3b73c..2b92d7434 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -964,7 +964,6 @@ Pemeran Layanan Interkonektivitas Buka kunci interkoneksi Perangkat - Buka kunci Xiaomi HyperMind Dukungan paksa untuk streaming kamera Blokir pembuatan folder hpplay diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index f5e6f3695..b76fbd17a 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -942,7 +942,6 @@ Trasmetti Servizi di interconnettività Sblocca l\'interconnessione dei dispositivi - Sblocca Xiaomi HyperMind Supporto forzato per lo streaming della fotocamera Blocca la creazione di cartelle hpplay diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 5ddb68063..69740d4ef 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1115,7 +1115,6 @@ キャスト 相互接続サービス デバイスの相互接続をアンロック - Xiaomi HyperMind をアンロック カメラストリーミングの強制サポート hpplay フォルダの作成をブロック diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 7887f89ce..15a32181a 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -1146,7 +1146,6 @@ Prześlij ekran Usługi łączności Odblokuj połączenie urządzeń - Odblokuj Xiaomi HyperMind Wymuszone wsparcie dla strumieniowania aparatu Blokuj tworzenie folderów hpplay diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ee95e9300..17e1a8879 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1146,7 +1146,6 @@ Transmitir Serviços de interconectividade Desbloquear Interconexão do dispositivo - Desbloquear Xiaomi HyperMind Suporte forçado para streaming de câmera Bloquear a criação de pastas hpplay diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 88087cec9..16d1df421 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -1146,7 +1146,6 @@ Cast Сервисы подключения Разблокировать подключение устройства - Разблокировать Xiaomi HyperMind Принудительная поддержка вещания камеры Блокировка создания папок hpplay diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 779be0a79..9a64fc721 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -972,7 +972,6 @@ Yayınla Cihaz ara bağlantısının kilidini aç - Xiaomi HyperMind kilidini aç Kamera akışı desteğini zorla Hpplay klasörlerinin oluşturulmasını engelleme diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 6ddd35777..22bd48990 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -1152,7 +1152,6 @@ Chức năng này là chức năng thử nghiệm có độ ổn định caoTruyền Dịch vụ kết nối Mở khóa Kết nối thiết bị - Mở khóa Xiaomi HyperMind Hỗ trợ bắt buộc cho việc truyền phát camera Chặn tạo thư mục hpplay diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d5bb730ea..b61276f23 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1231,7 +1231,6 @@ 投屏 互联互通服务 解锁小米妙享 - 解锁 Xiaomi HyperMind 强制支持摄像头流转 阻止生成乐播投屏相关文件 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 13a2d8ec6..49c5f18a5 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1026,7 +1026,6 @@ 投影 互聯互通服務 解鎖小米妙享 - 解鎖 Xiaomi HyperMind 強制支援攝影機串流媒體 阻止建立 hpplay 資料夾 diff --git a/app/src/main/res/values-zh-rME/strings.xml b/app/src/main/res/values-zh-rME/strings.xml index bb62a77a0..afa33dae6 100644 --- a/app/src/main/res/values-zh-rME/strings.xml +++ b/app/src/main/res/values-zh-rME/strings.xml @@ -695,7 +695,6 @@ “打开自动更新”已ban - 一键解锁小南梁 烧屏小功能 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f3f50d706..3d65c803d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1146,7 +1146,6 @@ 投影 互聯互通服務 解鎖小米妙享 - 解鎖 Xiaomi HyperMind 強制支援裝置流轉 阻止建立 hpplay 資料夾 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3c5054e0..655da1250 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1223,7 +1223,6 @@ Cast Interconnectivity services Unlock Device interconnection - Unlock Xiaomi HyperMind Forced support for camera streaming Block creation of hpplay folders diff --git a/app/src/main/res/xml/milink.xml b/app/src/main/res/xml/milink.xml index 53561deb0..8eff497df 100644 --- a/app/src/main/res/xml/milink.xml +++ b/app/src/main/res/xml/milink.xml @@ -27,11 +27,6 @@ android:key="prefs_key_milink_unlock_mishare" android:defaultValue="false" /> - - Date: Sat, 11 Jan 2025 23:09:58 +0800 Subject: [PATCH 14/43] =?UTF-8?q?#=E5=B0=9D=E8=AF=95=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=99=AE=E9=80=9A=E7=A3=81=E8=B4=B4=E5=9C=86=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controlcenter/CCGridForHyperOSKt.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt index a2d709191..d6bcd6dc0 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt @@ -18,6 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui.controlcenter +import android.content.* import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import com.sevtinge.hyperceiler.utils.prefs.* @@ -74,5 +75,29 @@ object CCGridForHyperOSKt { param.args[0] = drawable } }) + //OS1可能会有的圆角设置 + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", + classLoader, + "setCornerRadius", + Float::javaClass, + object : XC_MethodHook(){ + override fun beforeHookedMethod(param: MethodHookParam?) { + super.beforeHookedMethod(param) + param?.args?.set(0, radius) + + } + + } + ) + //OS2加载磁贴时的圆角 + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", + classLoader, + "getCornerRadius", object : XC_MethodReplacement() { + + override fun replaceHookedMethod(param: MethodHookParam?): Any { + val pluginContext: Context = XposedHelpers.getObjectField(param?.thisObject, "pluginContext") as Context + return radius + } + }) } } \ No newline at end of file From a2ae5099906030eae6043ae9c7a8013482899a26 Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sun, 12 Jan 2025 03:50:03 +0800 Subject: [PATCH 15/43] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E7=A3=81=E8=B4=B4?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=94=B6=E8=B5=B7=E5=9C=A8OS2=E4=B8=8A?= =?UTF-8?q?=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/hook/systemui/AutoCollapse.java | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java index 5ac504c1d..28d40ba71 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java @@ -18,6 +18,10 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isHyperOSVersion; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreAndroidVersion; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; + import android.view.View; import com.sevtinge.hyperceiler.module.base.BaseHook; @@ -27,19 +31,38 @@ public class AutoCollapse extends BaseHook { @Override public void init() { - findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, new MethodHook() { - @Override - protected void after(MethodHookParam param) { - Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); - int state = XposedHelpers.getIntField(mState, "state"); - if (state != 0) { - String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); - if (!"edit".equals(tileSpec)) { - Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); - XposedHelpers.callMethod(mHost, "collapsePanels"); + if (isHyperOSVersion(2f)) { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click","com.android.systemui.animation.Expandable", new MethodHook() { + @Override + protected void after(MethodHookParam param) { + Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); + int state = XposedHelpers.getIntField(mState, "state"); + if (state != 0) { + String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); + if (!"edit".equals(tileSpec)) { + Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); + XposedHelpers.callMethod(mHost, "collapsePanels"); + } } } - } - }); + }); + + }else { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, new MethodHook() { + @Override + protected void after(MethodHookParam param) { + Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); + int state = XposedHelpers.getIntField(mState, "state"); + if (state != 0) { + String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); + if (!"edit".equals(tileSpec)) { + Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); + XposedHelpers.callMethod(mHost, "collapsePanels"); + } + } + } + }); + + } } } From c9da8d7633f62dd33e75d176a3b3e5c2dd16cfa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Wed, 1 Jan 2025 21:59:24 +0800 Subject: [PATCH 16/43] adj: remove mediaeditor some old func --- .../mediaeditor/UnlockCustomPhotoFrames.kt | 142 +++++++----------- app/src/main/res/xml/mediaeditor.xml | 106 ++----------- 2 files changed, 70 insertions(+), 178 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index 8f74ad674..c5c4f840a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -19,132 +19,106 @@ package com.sevtinge.hyperceiler.module.hook.mediaeditor import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook -import com.github.kyuubiran.ezxhelper.MemberExtensions.paramCount -import com.github.kyuubiran.ezxhelper.ObjectHelper.Companion.objectHelper import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* -import com.sevtinge.hyperceiler.utils.* -import com.sevtinge.hyperceiler.utils.api.* -import com.sevtinge.hyperceiler.utils.log.* +import com.sevtinge.hyperceiler.module.base.tool.OtherTool.* import java.lang.reflect.* object UnlockCustomPhotoFrames : BaseHook() { private val frames by lazy { mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) } - private val isHookType by lazy { - mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) == 2 - } - private val isOpenSpring by lazy { - mPrefsMap.getBoolean("mediaeditor_unlock_spring") - } - private val isLeica by lazy { - if (!isHookType) { - frames == 1 - } else { - mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_leica") - } - } - private val isRedmi by lazy { - if (!isHookType) { - frames == 2 - } else { - mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_redmi") - } - } - private val isPOCO by lazy { - if (!isHookType) { - frames == 3 - } else { - mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_poco") - } + private val isNewMediaeditor by lazy { + // 以 1.7.5.0.4 为新旧版本分界线 + getPackageVersionCode(lpparam) >= 4658180 } + private val isLeica by lazy { frames == 1 } + private val isRedmi by lazy { frames == 2 } + private val isPOCO by lazy { frames == 3 } - private val methodA by lazy> { - DexKit.findMemberList("MA") { bridge -> + private val publicA by lazy> { + DexKit.findMemberList("PA") { bridge -> bridge.findMethod { matcher { - // 改动日志: - // 现在这个查找方式直接兼容 1.5 - 1.9 - // 1.6.5.10.2 之后迪斯尼定制画框解锁的地方和现在的不一样 - // 1.7.5.0.4 之后,类名迁移,内部文件改动较大 - // 合并缓存,现在只需查询一次即可获取全部 6 个需要 Hook 的方法,且不会出现多余的方法 (2025.1.8) - // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 - if (isHookType) { + // 真是妹想到啊,1.5 和 1.6 版本还以为不会套回去了 + // 现在这个查找方式直接兼容 1.4 - 1.9 + // 1.6.5.10.2 迪斯尼定制画框解锁的地方和现在的不一样 + // 1.7.5.0.4 之后,类名迁移,内部文件改动较大,此为临时解决方案 + if (isNewMediaeditor) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - addUsingField { - // 如果后面有改的话请释放这个注释 - // modifiers = Modifier.STATIC or Modifier.FINAL - type = "java.util.List" - } + modifiers = Modifier.FINAL or Modifier.STATIC returnType = "boolean" + paramCount = 0 + // 1.6.5.10.2 以上方法查找完剩下 a() c() e() } } } } - private val springA by lazy { - DexKit.findMember("SA") { bridge -> - bridge.findField { + // 公共解锁特定机型定制画框使用限制 + private val publicB by lazy> { + DexKit.findMemberList("PB") { dexkit -> + dexkit.findMethod { matcher { - // 改动日志: - // 这里是新春定制画框的解锁,仅在部分版本中存在 - // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 - if (isHookType) { + if (isNewMediaeditor) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - modifiers = Modifier.STATIC - type = "boolean" + // modifiers = Modifier.STATIC // 1.6.5.10.2 改成 STATIC,原来是 FINAL + returnType = "boolean" + paramCount = 1 + addUsingField { + modifiers = Modifier.STATIC or Modifier.FINAL + } } - }.single() + } } } - private val redmiB by lazy { - DexKit.findMember("RB") { bridge -> - bridge.findField { + override fun init() { + val publicC = DexKit.findMemberList("PC") { + it.findMethod { matcher { - // 改动日志: - // 这里是红米定制联名画框的解锁 - // 从 1.6.5.10.2 版本开始,解锁此画框的难度较高 - // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 - if (isHookType) { - declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") - } else { - declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") + publicA.forEach { a -> + name = a.name + } + usingFields { + add { + type = "boolean" + } } - modifiers = Modifier.STATIC or Modifier.FINAL } - }.last() + } } - } - override fun init() { + val actions = if (isNewMediaeditor) { + listOf<(Method) -> Unit>(::xiaomi, ::redmi, ::poco, ::other) + } else { + listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi, ::other) + } + val differentItems = publicA.subtract(publicC.toSet()) var index = 0 - val actions = listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi) - methodA.forEach { method -> - if (method.paramCount == 1) { - // 公共解锁特定机型定制画框使用限制 - other(method) - } else { - val action = actions[index] - action(method) - index = (index + 1) % actions.size - } + differentItems.forEach { method -> + val action = actions.getOrElse(index) { ::other } + action(method) + index = (index + 1) % actions.size } - if (isOpenSpring && springA != null) { - springA.setBoolean(null, true) + publicB.forEach { method -> + other(method) } - /*if (isRedmi && redmiB != null) { - + /*if (isOpenSpring && publicC.isNotEmpty()) { + publicC.forEach { method -> + other(method) + // 1.6.0.5.2 新增限时新春定制画框 + // 后续版本已移除,其实可以删掉的,但还是留着吧,兴许后面可能还有用 + } }*/ } diff --git a/app/src/main/res/xml/mediaeditor.xml b/app/src/main/res/xml/mediaeditor.xml index 3de924fd5..b134ce255 100644 --- a/app/src/main/res/xml/mediaeditor.xml +++ b/app/src/main/res/xml/mediaeditor.xml @@ -20,33 +20,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto" app:myLocation="@string/mediaeditor" app:quick_restart="com.miui.mediaeditor"> - - - - - - - - - - + + - - - - - - - - - + android:defaultValue="" /> - - - - - - - - - - - - - - - - - - - - + + app:entries="@array/customize_frame_type" + app:entryValues="@array/customize_frame_type_value" /> - \ No newline at end of file From a00123963668bce52bb803168abafb3b21658bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Thu, 9 Jan 2025 16:11:37 +0800 Subject: [PATCH 17/43] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E7=9B=B8=E5=86=8C=E7=BC=96=E8=BE=91=E9=83=A8=E5=88=86?= =?UTF-8?q?=20hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mediaeditor/UnlockCustomPhotoFrames.kt | 142 +++++++++++------- app/src/main/res/xml/mediaeditor.xml | 106 +++++++++++-- 2 files changed, 178 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index c5c4f840a..8f74ad674 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -19,106 +19,132 @@ package com.sevtinge.hyperceiler.module.hook.mediaeditor import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook +import com.github.kyuubiran.ezxhelper.MemberExtensions.paramCount +import com.github.kyuubiran.ezxhelper.ObjectHelper.Companion.objectHelper import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* -import com.sevtinge.hyperceiler.module.base.tool.OtherTool.* +import com.sevtinge.hyperceiler.utils.* +import com.sevtinge.hyperceiler.utils.api.* +import com.sevtinge.hyperceiler.utils.log.* import java.lang.reflect.* object UnlockCustomPhotoFrames : BaseHook() { private val frames by lazy { mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) } - private val isNewMediaeditor by lazy { - // 以 1.7.5.0.4 为新旧版本分界线 - getPackageVersionCode(lpparam) >= 4658180 + private val isHookType by lazy { + mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) == 2 + } + private val isOpenSpring by lazy { + mPrefsMap.getBoolean("mediaeditor_unlock_spring") + } + private val isLeica by lazy { + if (!isHookType) { + frames == 1 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_leica") + } + } + private val isRedmi by lazy { + if (!isHookType) { + frames == 2 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_redmi") + } + } + private val isPOCO by lazy { + if (!isHookType) { + frames == 3 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_poco") + } } - private val isLeica by lazy { frames == 1 } - private val isRedmi by lazy { frames == 2 } - private val isPOCO by lazy { frames == 3 } - private val publicA by lazy> { - DexKit.findMemberList("PA") { bridge -> + private val methodA by lazy> { + DexKit.findMemberList("MA") { bridge -> bridge.findMethod { matcher { - // 真是妹想到啊,1.5 和 1.6 版本还以为不会套回去了 - // 现在这个查找方式直接兼容 1.4 - 1.9 - // 1.6.5.10.2 迪斯尼定制画框解锁的地方和现在的不一样 - // 1.7.5.0.4 之后,类名迁移,内部文件改动较大,此为临时解决方案 - if (isNewMediaeditor) { + // 改动日志: + // 现在这个查找方式直接兼容 1.5 - 1.9 + // 1.6.5.10.2 之后迪斯尼定制画框解锁的地方和现在的不一样 + // 1.7.5.0.4 之后,类名迁移,内部文件改动较大 + // 合并缓存,现在只需查询一次即可获取全部 6 个需要 Hook 的方法,且不会出现多余的方法 (2025.1.8) + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - modifiers = Modifier.FINAL or Modifier.STATIC + addUsingField { + // 如果后面有改的话请释放这个注释 + // modifiers = Modifier.STATIC or Modifier.FINAL + type = "java.util.List" + } returnType = "boolean" - paramCount = 0 - // 1.6.5.10.2 以上方法查找完剩下 a() c() e() } } } } - // 公共解锁特定机型定制画框使用限制 - private val publicB by lazy> { - DexKit.findMemberList("PB") { dexkit -> - dexkit.findMethod { + private val springA by lazy { + DexKit.findMember("SA") { bridge -> + bridge.findField { matcher { - if (isNewMediaeditor) { + // 改动日志: + // 这里是新春定制画框的解锁,仅在部分版本中存在 + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - // modifiers = Modifier.STATIC // 1.6.5.10.2 改成 STATIC,原来是 FINAL - returnType = "boolean" - paramCount = 1 - addUsingField { - modifiers = Modifier.STATIC or Modifier.FINAL - } + modifiers = Modifier.STATIC + type = "boolean" } - } + }.single() } } - override fun init() { - val publicC = DexKit.findMemberList("PC") { - it.findMethod { + private val redmiB by lazy { + DexKit.findMember("RB") { bridge -> + bridge.findField { matcher { - publicA.forEach { a -> - name = a.name - } - usingFields { - add { - type = "boolean" - } + // 改动日志: + // 这里是红米定制联名画框的解锁 + // 从 1.6.5.10.2 版本开始,解锁此画框的难度较高 + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { + declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") + } else { + declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } + modifiers = Modifier.STATIC or Modifier.FINAL } - } + }.last() } + } - val actions = if (isNewMediaeditor) { - listOf<(Method) -> Unit>(::xiaomi, ::redmi, ::poco, ::other) - } else { - listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi, ::other) - } - val differentItems = publicA.subtract(publicC.toSet()) + override fun init() { var index = 0 + val actions = listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi) - differentItems.forEach { method -> - val action = actions.getOrElse(index) { ::other } - action(method) - index = (index + 1) % actions.size + methodA.forEach { method -> + if (method.paramCount == 1) { + // 公共解锁特定机型定制画框使用限制 + other(method) + } else { + val action = actions[index] + action(method) + index = (index + 1) % actions.size + } } - publicB.forEach { method -> - other(method) + if (isOpenSpring && springA != null) { + springA.setBoolean(null, true) } - /*if (isOpenSpring && publicC.isNotEmpty()) { - publicC.forEach { method -> - other(method) - // 1.6.0.5.2 新增限时新春定制画框 - // 后续版本已移除,其实可以删掉的,但还是留着吧,兴许后面可能还有用 - } + /*if (isRedmi && redmiB != null) { + }*/ } diff --git a/app/src/main/res/xml/mediaeditor.xml b/app/src/main/res/xml/mediaeditor.xml index b134ce255..3de924fd5 100644 --- a/app/src/main/res/xml/mediaeditor.xml +++ b/app/src/main/res/xml/mediaeditor.xml @@ -20,17 +20,33 @@ xmlns:app="http://schemas.android.com/apk/res-auto" app:myLocation="@string/mediaeditor" app:quick_restart="com.miui.mediaeditor"> - - + + + + + + + + + + + android:title="@string/camera_custom_watermark" /> + + + + + + + + + - - + android:title="@string/mediaeditor_unlock_spring_title" /> + app:entries="@array/customize_frame_type_v1" + app:entryValues="@array/customize_frame_type_v1_value" /> + \ No newline at end of file From 0c4884d9500fe9c0fc1b83a462fa4306135206b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Fri, 10 Jan 2025 14:14:48 +0800 Subject: [PATCH 18/43] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E7=AE=A1=E5=AE=B6-=E5=85=A8=E5=B1=80=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F-=E9=9A=90=E8=97=8F=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=A0=8F=20=E5=8A=9F=E8=83=BD=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/base/tool/OtherTool.java | 40 ++++++++++++++++++- .../sidebar/AddSideBarExpandReceiver.java | 26 +++++------- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java index 546065efe..e7f9ae816 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java @@ -39,8 +39,13 @@ import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.utils.ContextUtils; import com.sevtinge.hyperceiler.utils.blur.MiBlurUtils; +import com.sevtinge.hyperceiler.utils.blur.MiBlurUtilsKt; + +import java.io.File; +import java.lang.ref.WeakReference; import de.robv.android.xposed.XposedHelpers; +import de.robv.android.xposed.callbacks.XC_LoadPackage; public class OtherTool { // 尝试全部 @@ -53,6 +58,8 @@ public class OtherTool { @SuppressLint("StaticFieldLeak") public static TextView mPct = null; + // public Context mModuleContext = null; + public static Resources getModuleRes(Context context) throws PackageManager.NameNotFoundException { return ResourcesTool.loadModuleRes(context); @@ -62,9 +69,14 @@ public static Context findContext(@ContextUtils.Duration int flag) { Context context = null; try { switch (flag) { - case FLAG_ALL -> context = currentApplication() != null ? currentApplication() : getSystemContext(); + case FLAG_ALL -> { + if ((context = currentApplication()) == null) + context = getSystemContext(); + } case FLAG_CURRENT_APP -> context = currentApplication(); case FlAG_ONLY_ANDROID -> context = getSystemContext(); + default -> { + } } return context; } catch (Throwable ignore) { @@ -113,6 +125,32 @@ public static void setProp(String key, String val) { } } + public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lpparam) { + try { + Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); + Object parser = parserCls.getDeclaredConstructor().newInstance(); + File apkPath = new File(lpparam.appInfo.sourceDir); + Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); + return (String) XposedHelpers.getObjectField(pkg, "mVersionName"); + } catch (Throwable e) { + logE("getPackageVersionCode", e); + return ""; + } + } + + public static int getPackageVersionCode(XC_LoadPackage.LoadPackageParam lpparam) { + try { + Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); + Object parser = parserCls.getDeclaredConstructor().newInstance(); + File apkPath = new File(lpparam.appInfo.sourceDir); + Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); + return XposedHelpers.getIntField(pkg, "mVersionCode"); + } catch (Throwable e) { + logE("getPackageVersionCode", e); + return -1; + } + } + public static void initPct(ViewGroup container, int source) { Resources res = container.getContext().getResources(); if (mPct == null) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index 311a8895f..11c7c7680 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -18,7 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.securitycenter.sidebar; -import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import android.content.BroadcastReceiver; @@ -100,22 +100,16 @@ public void run() { myhandler.removeCallbacks(this); if (!enableSideBar) { Object li = XposedHelpers.getObjectField(view, "mListenerInfo"); - if (li != null) { - try { - Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); - findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - MotionEvent me = (MotionEvent) param.args[1]; - if (me.getSource() != 9999) { - param.setResult(false); - } - } - }); - } catch (Throwable e) { - logE(TAG, lpparam.packageName, "OnTouchListener is failed, " + e); + Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); + findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { + @Override + protected void before(MethodHookParam param) throws Throwable { + MotionEvent me = (MotionEvent) param.args[1]; + if (me.getSource() != 9999) { + param.setResult(false); + } } - } + }); } if (isNewVersion) { try { From 8384fd6d406631aad837b3321f4764e7a3755ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Fri, 10 Jan 2025 15:47:51 +0800 Subject: [PATCH 19/43] opt: Tools --- .../module/base/tool/OtherTool.java | 40 +------------------ .../sidebar/AddSideBarExpandReceiver.java | 2 +- 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java index e7f9ae816..546065efe 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java @@ -39,13 +39,8 @@ import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.utils.ContextUtils; import com.sevtinge.hyperceiler.utils.blur.MiBlurUtils; -import com.sevtinge.hyperceiler.utils.blur.MiBlurUtilsKt; - -import java.io.File; -import java.lang.ref.WeakReference; import de.robv.android.xposed.XposedHelpers; -import de.robv.android.xposed.callbacks.XC_LoadPackage; public class OtherTool { // 尝试全部 @@ -58,8 +53,6 @@ public class OtherTool { @SuppressLint("StaticFieldLeak") public static TextView mPct = null; - // public Context mModuleContext = null; - public static Resources getModuleRes(Context context) throws PackageManager.NameNotFoundException { return ResourcesTool.loadModuleRes(context); @@ -69,14 +62,9 @@ public static Context findContext(@ContextUtils.Duration int flag) { Context context = null; try { switch (flag) { - case FLAG_ALL -> { - if ((context = currentApplication()) == null) - context = getSystemContext(); - } + case FLAG_ALL -> context = currentApplication() != null ? currentApplication() : getSystemContext(); case FLAG_CURRENT_APP -> context = currentApplication(); case FlAG_ONLY_ANDROID -> context = getSystemContext(); - default -> { - } } return context; } catch (Throwable ignore) { @@ -125,32 +113,6 @@ public static void setProp(String key, String val) { } } - public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lpparam) { - try { - Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.getDeclaredConstructor().newInstance(); - File apkPath = new File(lpparam.appInfo.sourceDir); - Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - return (String) XposedHelpers.getObjectField(pkg, "mVersionName"); - } catch (Throwable e) { - logE("getPackageVersionCode", e); - return ""; - } - } - - public static int getPackageVersionCode(XC_LoadPackage.LoadPackageParam lpparam) { - try { - Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.getDeclaredConstructor().newInstance(); - File apkPath = new File(lpparam.appInfo.sourceDir); - Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - return XposedHelpers.getIntField(pkg, "mVersionCode"); - } catch (Throwable e) { - logE("getPackageVersionCode", e); - return -1; - } - } - public static void initPct(ViewGroup container, int source) { Resources res = container.getContext().getResources(); if (mPct == null) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index 11c7c7680..ecd4e9970 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -18,7 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.securitycenter.sidebar; -import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import android.content.BroadcastReceiver; From 2e045d72c11eca0df26e7e7289b8e13131a9515d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 16:57:49 +0800 Subject: [PATCH 20/43] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E7=95=8C?= =?UTF-8?q?=E9=9D=A2-=E7=8A=B6=E6=80=81=E6=A0=8F-=E5=9B=BE=E6=A0=87-?= =?UTF-8?q?=E9=97=B9=E9=92=9F-=E4=BB=85=E5=9C=A8=E9=97=B9=E9=92=9F?= =?UTF-8?q?=E5=93=8D=E9=93=83=E5=89=8D=E6=98=BE=E7=A4=BA=E9=97=B9=E9=92=9F?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=20=E8=AE=BE=E7=BD=AE=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88Miui14-HyperOS2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sidebar/AddSideBarExpandReceiver.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index ecd4e9970..311a8895f 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -100,16 +100,22 @@ public void run() { myhandler.removeCallbacks(this); if (!enableSideBar) { Object li = XposedHelpers.getObjectField(view, "mListenerInfo"); - Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); - findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - MotionEvent me = (MotionEvent) param.args[1]; - if (me.getSource() != 9999) { - param.setResult(false); - } + if (li != null) { + try { + Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); + findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { + @Override + protected void before(MethodHookParam param) throws Throwable { + MotionEvent me = (MotionEvent) param.args[1]; + if (me.getSource() != 9999) { + param.setResult(false); + } + } + }); + } catch (Throwable e) { + logE(TAG, lpparam.packageName, "OnTouchListener is failed, " + e); } - }); + } } if (isNewVersion) { try { From dc4fa364c2d7a92614b9aa8b02be680e9098f05e Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sat, 11 Jan 2025 23:09:58 +0800 Subject: [PATCH 21/43] =?UTF-8?q?opt:=20=E6=99=AE=E9=80=9A=E7=A3=81?= =?UTF-8?q?=E8=B4=B4=E5=9C=86=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controlcenter/CCGridForHyperOSKt.kt | 23 +++++++------------ .../hook/systemui/plugin/NewPluginHelperKt.kt | 6 +++-- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt index d6bcd6dc0..ca6a26ce9 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt @@ -18,7 +18,6 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui.controlcenter -import android.content.* import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import com.sevtinge.hyperceiler.utils.prefs.* @@ -59,43 +58,37 @@ object CCGridForHyperOSKt { } } })*/ + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", classLoader, "setDisabledBg", Drawable::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { - super.beforeHookedMethod(param) val drawable = param?.args?.get(0) as Drawable if (drawable is GradientDrawable) drawable.cornerRadius = radius param.args[0] = drawable } }) + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", classLoader, "setEnabledBg", Drawable::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { - super.beforeHookedMethod(param) val drawable = param?.args?.get(0) as Drawable if (drawable is GradientDrawable) drawable.cornerRadius = radius param.args[0] = drawable } }) - //OS1可能会有的圆角设置 + + // OS1 可能会有的圆角设置 XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", - classLoader, - "setCornerRadius", - Float::javaClass, + classLoader, "setCornerRadius", Float::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { - super.beforeHookedMethod(param) param?.args?.set(0, radius) - } - } ) - //OS2加载磁贴时的圆角 - XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", - classLoader, - "getCornerRadius", object : XC_MethodReplacement() { + // OS2 加载磁贴时的圆角 + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", + classLoader, "getCornerRadius", object : XC_MethodReplacement() { override fun replaceHookedMethod(param: MethodHookParam?): Any { - val pluginContext: Context = XposedHelpers.getObjectField(param?.thisObject, "pluginContext") as Context return radius } }) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt index 5ca0663f4..f6cfc925a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt @@ -27,7 +27,8 @@ import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.* import com.sevtinge.hyperceiler.module.hook.systemui.other.* import com.sevtinge.hyperceiler.module.hook.systemui.statusbar.icon.v.* -import com.sevtinge.hyperceiler.utils.api.PluginFactory +import com.sevtinge.hyperceiler.utils.api.* +import com.sevtinge.hyperceiler.utils.log.LogManager.* import java.lang.ref.* object NewPluginHelperKt : BaseHook() { @@ -199,8 +200,9 @@ object NewPluginHelperKt : BaseHook() { if (prefKey) { loader(classLoader) } + if (logLevel >= 3) logI(TAG, lpparam.packageName, "$name is loaded success.") }.onFailure { - logE(TAG, lpparam.packageName, "[$tag] $name is fail loaded, log: $it") + if (logLevel >= 1) logE(TAG, lpparam.packageName, "[$tag] $name is fail loaded, log: $it") } } } From 8daede59dffa0cfbf76fbc33422cbe1b363b36e0 Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sun, 12 Jan 2025 03:50:03 +0800 Subject: [PATCH 22/43] =?UTF-8?q?fix:=20=E7=A3=81=E8=B4=B4=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=94=B6=E8=B5=B7=E5=9C=A8=20OS2=20=E4=B8=8A=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/hook/systemui/AutoCollapse.java | 47 +++++++------------ 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java index 28d40ba71..4158bd193 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java @@ -18,8 +18,6 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui; -import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isHyperOSVersion; -import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreAndroidVersion; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; import android.view.View; @@ -31,38 +29,25 @@ public class AutoCollapse extends BaseHook { @Override public void init() { - if (isHyperOSVersion(2f)) { - findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click","com.android.systemui.animation.Expandable", new MethodHook() { - @Override - protected void after(MethodHookParam param) { - Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); - int state = XposedHelpers.getIntField(mState, "state"); - if (state != 0) { - String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); - if (!"edit".equals(tileSpec)) { - Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); - XposedHelpers.callMethod(mHost, "collapsePanels"); - } + MethodHook method = new MethodHook() { + @Override + protected void after(MethodHookParam param) { + Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); + int state = XposedHelpers.getIntField(mState, "state"); + if (state != 0) { + String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); + if (!"edit".equals(tileSpec)) { + Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); + XposedHelpers.callMethod(mHost, "collapsePanels"); } } - }); - - }else { - findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, new MethodHook() { - @Override - protected void after(MethodHookParam param) { - Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); - int state = XposedHelpers.getIntField(mState, "state"); - if (state != 0) { - String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); - if (!"edit".equals(tileSpec)) { - Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); - XposedHelpers.callMethod(mHost, "collapsePanels"); - } - } - } - }); + } + }; + if (isMoreHyperOSVersion(2f)) { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click","com.android.systemui.animation.Expandable", method); + } else { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, method); } } } From bafd7efb409869ad3889691b080de33f899306fe Mon Sep 17 00:00:00 2001 From: xzakota <51871051+xzakota@users.noreply.github.com> Date: Sun, 12 Jan 2025 11:19:50 +0800 Subject: [PATCH 23/43] =?UTF-8?q?opt:=20=E9=80=9A=E7=9F=A5=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E5=9C=A8=E6=A8=AA=E5=B1=8F=E7=8A=B6=E6=80=81=E4=B8=8B?= =?UTF-8?q?=E4=B8=8D=E9=9A=90=E8=97=8F=E5=A4=A9=E6=B0=94=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=20(#2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 铃柒柒 --- .../mediaeditor/UnlockCustomPhotoFrames.kt | 43 +-- .../controlcenter/NotificationWeather.kt | 326 +++++++++++------- 2 files changed, 217 insertions(+), 152 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index 8f74ad674..d698239dc 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -18,14 +18,12 @@ */ package com.sevtinge.hyperceiler.module.hook.mediaeditor +import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.github.kyuubiran.ezxhelper.MemberExtensions.paramCount -import com.github.kyuubiran.ezxhelper.ObjectHelper.Companion.objectHelper +import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* -import com.sevtinge.hyperceiler.utils.* -import com.sevtinge.hyperceiler.utils.api.* -import com.sevtinge.hyperceiler.utils.log.* import java.lang.reflect.* object UnlockCustomPhotoFrames : BaseHook() { @@ -105,25 +103,6 @@ object UnlockCustomPhotoFrames : BaseHook() { } } - private val redmiB by lazy { - DexKit.findMember("RB") { bridge -> - bridge.findField { - matcher { - // 改动日志: - // 这里是红米定制联名画框的解锁 - // 从 1.6.5.10.2 版本开始,解锁此画框的难度较高 - // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 - if (isHookType) { - declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") - } else { - declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") - } - modifiers = Modifier.STATIC or Modifier.FINAL - } - }.last() - } - } - override fun init() { var index = 0 val actions = listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi) @@ -143,9 +122,21 @@ object UnlockCustomPhotoFrames : BaseHook() { springA.setBoolean(null, true) } - /*if (isRedmi && redmiB != null) { - - }*/ + if (isRedmi) { + runCatching { + loadClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils\$isVictoriaDeviceSupport\$2") + .methodFinder().filterByName("invoke").single() + .createHook { + returnConstant(true) + } + }.onFailure { + loadClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils\$isVictoriaDeviceSupport\$2") + .methodFinder().filterByName("invoke").single() + .createHook { + returnConstant(true) + } + } + } } private fun xiaomi(name: Method) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt index d81765a2f..bc671b6da 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt @@ -20,8 +20,11 @@ package com.sevtinge.hyperceiler.module.hook.systemui.controlcenter import android.annotation.* import android.content.* +import android.content.res.Configuration.ORIENTATION_LANDSCAPE +import android.content.res.Configuration.ORIENTATION_PORTRAIT import android.view.* import android.widget.* +import androidx.annotation.IntDef import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder @@ -34,12 +37,52 @@ import com.sevtinge.hyperceiler.view.* @SuppressLint("DiscouragedApi", "ServiceCast", "StaticFieldLeak") object NotificationWeather : BaseHook() { - private var mWeatherView : TextView? = null - private var mWeatherViewFolme : Any? = null + // 横屏状态下的天气组件 + private var hWeatherView: TextView? = null + // 及动画 + private var hWeatherViewFolme: Any? = null + + // 竖屏状态下的天气组件 + private var vWeatherView: TextView? = null + // 及动画 + private var vWeatherViewFolme: Any? = null + + // 天气组件点击事件 + private val weatherViewClickListener = View.OnClickListener { + val intent = Intent().apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + component = ComponentName( + "com.miui.weather2", + "com.miui.weather2.ActivityWeatherMain" + ) + } + + val clz = findClass(InterfacesImplManager.I_ACTIVITY_STARTER) + if (isMoreHyperOSVersion(2f)) { + InterfacesImplManager.sClassContainer[clz] + } else { + Dependency.get(clz) + }?.callMethod("startActivity", intent, true) + } + + // 是否显示城市 private val isDisplayCity by lazy { mPrefsMap.getBoolean("system_ui_control_center_show_weather_city") } + private val combinedHeaderController by lazy { + loadClass("com.android.systemui.controlcenter.shade.CombinedHeaderController") + } + private val notificationHeaderExpandController by lazy { + loadClass("com.android.systemui.controlcenter.shade.NotificationHeaderExpandController") + } + private val miuiNotificationHeaderView by lazy { + loadClass("com.android.systemui.qs.MiuiNotificationHeaderView") + } + private val folme by lazy { + loadClass("miuix.animation.Folme") + } + override fun init() { if (isMoreHyperOSVersion(2f)) { newNotificationWeather() @@ -47,187 +90,218 @@ object NotificationWeather : BaseHook() { oldNotificationWeather() } - loadClass("com.android.systemui.qs.MiuiNotificationHeaderView").methodFinder() - .filterByName("updateLayout") + // 更新资源 + miuiNotificationHeaderView.methodFinder() + .filterByName("updateHeaderResources") .single().createHook { - after { - val viewGroup = it.thisObject as ViewGroup - val mOrientation = viewGroup.getObjectField("mOrientation") as Int - - mWeatherView?.visibility = if (mOrientation == 1 || isPad()) { - View.VISIBLE - } else { - View.GONE + after { param -> + val viewGroup = param.thisObject as ViewGroup + val orientation = viewGroup.getObjectFieldAs("mOrientation") + if (orientation == -1) { + return@after } + + val dateView = viewGroup.getObjectFieldAs("mDateView") + val landClock = viewGroup.getObjectFieldAs("mLandClock") + + vWeatherView?.setTextSize(0, dateView.textSize) + vWeatherView?.setTypeface(dateView.typeface) + + hWeatherView?.setTextSize(0, landClock.textSize) + hWeatherView?.setTypeface(landClock.typeface) } } + + // 更新布局 + miuiNotificationHeaderView.methodFinder().filterByName("updateLayout").single().createHook { + before { + val viewGroup = it.thisObject as ViewGroup + val context = viewGroup.context + val configuration = context.resources.configuration + val orientation = viewGroup.getObjectFieldAs("mOrientation") + val screenLayout = viewGroup.getObjectFieldAs("mScreenLayout") + + if (orientation == configuration.orientation && + screenLayout == configuration.screenLayout + ) { + return@before + } + + val isVerticalMode = if (isMoreHyperOSVersion(2f)) { + val miuiConfigs = loadClass("com.miui.utils.configs.MiuiConfigs") + miuiConfigs.callStaticMethodAs("isVerticalMode", context) + } else { + val commonUtil = loadClass("com.miui.systemui.util.CommonUtil") + val isTabletUI = commonUtil.callStaticMethodAs("isTabletUI", context) + orientation != ORIENTATION_PORTRAIT || isTabletUI + } + + if (isVerticalMode) { + hWeatherView?.visibility = View.GONE + vWeatherView?.visibility = View.VISIBLE + } else { + hWeatherView?.visibility = View.VISIBLE + vWeatherView?.visibility = View.GONE + } + } + } } private fun newNotificationWeather() { - loadClass("com.android.systemui.controlcenter.shade.CombinedHeaderController").constructors - .single().createHook { - after { param -> - val headerController = param.thisObject - val notificationDateTime = headerController.getObjectFieldAs("notificationDateTime") - val context = notificationDateTime.context + combinedHeaderController.constructors.single().createHook { + after { param -> + val controller = param.thisObject + val dateView = controller.getObjectFieldAs("notificationDateTime") + val landClock = controller.getObjectFieldAs("notificationHorizontalTime") - addWeatherViewAfterOf(notificationDateTime) - setWeatherViewOnClinkListener(context) + addWeatherViewAfterOf(dateView, ORIENTATION_PORTRAIT) + addWeatherViewAfterOf(landClock, ORIENTATION_LANDSCAPE) - mWeatherView?.let { - mWeatherViewFolme = loadClass("miuix.animation.Folme") - .callStaticMethod("useAt", arrayOf(it)) - } + // 创建动画 + hWeatherView?.let { + hWeatherViewFolme = folme.callStaticMethod("useAt", arrayOf(it)) + } + vWeatherView?.let { + vWeatherViewFolme = folme.callStaticMethod("useAt", arrayOf(it)) } } + } - loadClass("com.android.systemui.controlcenter.shade.CombinedHeaderController").methodFinder() + combinedHeaderController.methodFinder() .filterByName("onSwitchProgressChanged") .filterByParamTypes(Float::class.java) .first().createHook { after { param -> - val headerController = param.thisObject - val dateTime = headerController.getObjectFieldAs("notificationDateTime") - mWeatherView?.translationX = dateTime.translationX - mWeatherView?.translationY = dateTime.translationY + val controller = param.thisObject + val dateView = controller.getObjectFieldAs("notificationDateTime") + val landClock = controller.getObjectFieldAs("notificationHorizontalTime") + + vWeatherView?.translationX = dateView.translationX + vWeatherView?.translationY = dateView.translationY + + hWeatherView?.translationX = landClock.translationX + hWeatherView?.translationY = landClock.translationY } } - val expandControllerClz = loadClass( - "com.android.systemui.controlcenter.shade.NotificationHeaderExpandController" - ) - expandControllerClz.constructors - .single().createHook { - after { param -> - val expandController = param.thisObject - expandController.getObjectFieldAs("notificationCallback")::class.java - .methodFinder() - .filterByName("onExpansionChanged") - .first() - .createHook { - after { - val dateTime = expandController.getObjectFieldAs("headerController") - .callMethodAs("get") - .getObjectFieldAs("notificationDateTime") - - mWeatherView?.translationX = dateTime.translationX - mWeatherView?.translationY = dateTime.translationY - } - } - } + notificationHeaderExpandController.constructors.single().createHook { + after { param -> + val expandController = param.thisObject + val callback = expandController.getObjectFieldAs("notificationCallback") + + hookNotificationCallback(expandController, callback::class.java) } - expandControllerClz.methodFinder() - .filterByName("access\$startFolmeAnimationAlpha") - .filterByParamCount(5) - .single().createHook { - before { param -> - val view = param.args[1] as View - val context = view.context - val dateTimeId = context.resources.getIdentifier("date_time", "id", context.packageName) - if (view.id == dateTimeId) { - expandControllerClz.callStaticMethod( - "access\$startFolmeAnimationAlpha", - param.args[0], - mWeatherView, - mWeatherViewFolme, - param.args[3], - param.args[4], - ) - } + } + } + + private fun hookNotificationCallback(expandController: Any, clazz: Class<*>) { + clazz.methodFinder().filterByName("onAppearanceChanged").first().createHook { + after { + val newAppearance = it.args[0] as Boolean + val animate = it.args[1] as Boolean + + val startFolmeAnimationAlpha = { view: View?, folme: Any? -> + notificationHeaderExpandController.callStaticMethod( + "access\$startFolmeAnimationAlpha", + expandController, + view, + folme, + if (newAppearance) 1F else 0F, + animate, + ) } + + startFolmeAnimationAlpha(hWeatherView, hWeatherViewFolme) + startFolmeAnimationAlpha(vWeatherView, vWeatherViewFolme) } + } - expandControllerClz.methodFinder() - .filterByName("access\$startFolmeAnimationTranslationX") - .single().createHook { - before { param -> - val view = param.args[1] as View - val context = view.context - val dateTimeId = context.resources.getIdentifier("date_time", "id", context.packageName) - if (view.id == dateTimeId) { - expandControllerClz.callStaticMethod( - "access\$startFolmeAnimationTranslationX", - param.args[0], - mWeatherView, - mWeatherViewFolme, - param.args[3], - param.args[4], - ) - } + clazz.methodFinder().filterByName("onExpansionChanged").first().createHook { + after { + val headerController = expandController.getObjectFieldAs("headerController") + .callMethodAs("get") + + headerController.getObjectFieldAs("notificationDateTime").let { + vWeatherView?.translationX = it.translationX + vWeatherView?.translationY = it.translationY + } + + headerController.getObjectFieldAs("notificationHorizontalTime").let { + hWeatherView?.translationX = it.translationX + hWeatherView?.translationY = it.translationY } } + } } private fun oldNotificationWeather() { - loadClass("com.android.systemui.qs.MiuiNotificationHeaderView").methodFinder() + miuiNotificationHeaderView.methodFinder() .filterByName("onFinishInflate") .single().createHook { after { param -> val viewGroup = param.thisObject as ViewGroup val context = viewGroup.context - val dateTime = viewGroup.findViewById( + val dateView = viewGroup.findViewById( context.resources.getIdentifier( "date_time", "id", context.packageName ) ) + val landClock = viewGroup.findViewById( + context.resources.getIdentifier( + "horizontal_time", + "id", + context.packageName + ) + ) - addWeatherViewAfterOf(dateTime) - setWeatherViewOnClinkListener(context) + addWeatherViewAfterOf(dateView, ORIENTATION_PORTRAIT) + addWeatherViewAfterOf(landClock, ORIENTATION_LANDSCAPE) } } } - private fun addWeatherViewAfterOf(dateTimeView : View) { - mWeatherView = WeatherView(dateTimeView.context, isDisplayCity).apply { - setTextAppearance( - context.resources.getIdentifier( - "TextAppearance.QSControl.Date", - "style", - context.packageName - ) - ) + private fun addWeatherViewAfterOf(view: View, @Orientation key: Int) { + val weatherView = WeatherView(view.context, isDisplayCity).apply { + var appearance = "TextAppearance." + when (key) { + ORIENTATION_PORTRAIT -> { + vWeatherView = this + appearance += "QSControl.Date" + } + + ORIENTATION_LANDSCAPE -> { + hWeatherView = this + appearance += "NSNotification.Clock" + } + } + + val resources = context.resources + setTextAppearance(resources.getIdentifier(appearance, "style", context.packageName)) layoutParams = LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ).apply { - gravity = Gravity.BOTTOM - marginStart = context.resources.getDimensionPixelSize( - context.resources.getIdentifier( + gravity = Gravity.CENTER_VERTICAL + marginStart = resources.getDimensionPixelSize( + resources.getIdentifier( "notification_panel_time_date_space", "dimen", context.packageName ) ) + dp2px(5f) } + + setOnClickListener(weatherViewClickListener) } - val dateTimeParent = dateTimeView.parent as ViewGroup - dateTimeParent.addView(mWeatherView) + val viewParent = view.parent as ViewGroup + viewParent.addView(weatherView, viewParent.indexOfChild(view) + 1) } - private fun setWeatherViewOnClinkListener(context : Context) { - mWeatherView?.setOnClickListener { - try { - val intent = Intent().apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - component = ComponentName( - "com.miui.weather2", - "com.miui.weather2.ActivityWeatherMain" - ) - } - - val clz = findClass(InterfacesImplManager.I_ACTIVITY_STARTER) - if (isMoreHyperOSVersion(2f)) { - InterfacesImplManager.sClassContainer[clz] - } else { - Dependency.get(clz) - }?.callMethod("startActivity", intent, true) - } catch (e : Exception) { - Toast.makeText(context, e.message, Toast.LENGTH_LONG).show() - } - } - } + @IntDef(value = [ORIENTATION_PORTRAIT, ORIENTATION_LANDSCAPE]) + @Retention(AnnotationRetention.SOURCE) + annotation class Orientation } From f291038c2d3e59499d97b498305c78263d6d38e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sun, 12 Jan 2025 21:06:27 +0800 Subject: [PATCH 24/43] opt: codes --- NO_BUG_CHARM.png | Bin 261047 -> 0 bytes NO_BUG_CHARM.webp | Bin 0 -> 94970 bytes .../com/sevtinge/hyperceiler/XposedInit.java | 50 ++++++++------ .../SystemFramework/Pad/SystemFrameworkT.java | 2 + .../Phone/SystemFrameworkT.java | 2 + .../network/FlightModeHotSpot.java | 64 ++++++++---------- .../plugin/FocusNotifLyricPluginHelper.kt | 35 ---------- 7 files changed, 62 insertions(+), 91 deletions(-) delete mode 100644 NO_BUG_CHARM.png create mode 100644 NO_BUG_CHARM.webp delete mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/FocusNotifLyricPluginHelper.kt diff --git a/NO_BUG_CHARM.png b/NO_BUG_CHARM.png deleted file mode 100644 index f4e6d9e3486f9cd11bd1ca3e05c9a215205d3217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261047 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� 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%0DQe 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

6Ph?`IlaJ!v$)Q>uVk5LxrVVB1U>UsQp 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

aV}NY#*=lH#&hNqMET7BY)`bh={J=vi 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 diff --git a/NO_BUG_CHARM.webp b/NO_BUG_CHARM.webp new file mode 100644 index 0000000000000000000000000000000000000000..af0764ab77ae1b816824c07da899c1ab9d447df7 GIT binary patch literal 94970 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 BtXlv8 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java b/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java index ce68f60b3..1386d46f6 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java @@ -48,7 +48,6 @@ import com.sevtinge.hyperceiler.module.hook.systemframework.ScreenRotation; import com.sevtinge.hyperceiler.module.hook.systemframework.ToastBlur; import com.sevtinge.hyperceiler.module.hook.systemframework.UnlockAlwaysOnDisplay; -import com.sevtinge.hyperceiler.module.hook.systemframework.network.FlightModeHotSpot; import com.sevtinge.hyperceiler.module.hook.systemsettings.VolumeSeparateControlForSettings; import com.sevtinge.hyperceiler.module.skip.SystemFrameworkForCorePatch; import com.sevtinge.hyperceiler.safe.CrashHook; @@ -72,7 +71,6 @@ public class XposedInit implements IXposedHookZygoteInit, IXposedHookLoadPackage { private static final String TAG = "HyperCeiler"; - public static boolean isSafeModeOn = false; public static String mModulePath = null; public static ResourcesTool mResHook; @@ -81,14 +79,17 @@ public class XposedInit implements IXposedHookZygoteInit, IXposedHookLoadPackage @Override public void initZygote(StartupParam startupParam) throws Throwable { + // load ResourcesTool mResHook = new ResourcesTool(startupParam.modulePath); mModulePath = startupParam.modulePath; // mXmlTool = new XmlTool(startupParam); - setXSharedPrefs(); + // load EzXHelper and set log tag EzXHelper.initZygote(startupParam); EzXHelper.setLogTag(TAG); EzXHelper.setToastTag(TAG); + + // load HCInit HCInit.initBasicData(new HCInit.BasicData() .setModulePackageName(BuildConfig.APPLICATION_ID) .setLogLevel(LogManager.getLogLevel()) @@ -96,6 +97,30 @@ public void initZygote(StartupParam startupParam) throws Throwable { ); HCInit.initStartupParam(startupParam); + // load New XSPrefs + setXSharedPrefs(); + // load CorePatch + new SystemFrameworkForCorePatch().initZygote(startupParam); + // load ZygoteHook + loadZygoteHook(startupParam); + } + + @Override + public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { + if (isInSafeMode(lpparam.packageName)) return; + + // load EzXHelper and set log tag + EzXHelper.initHandleLoadPackage(lpparam); + EzXHelper.setLogTag(TAG); + EzXHelper.setToastTag(TAG); + + // load CorePatch + new SystemFrameworkForCorePatch().handleLoadPackage(lpparam); + // load Module hook apps + init(lpparam); + } + + private static void loadZygoteHook(StartupParam startupParam) throws Throwable { if (mPrefsMap.getBoolean("system_framework_screen_all_rotations")) ScreenRotation.initRes(); if (mPrefsMap.getBoolean("system_framework_clean_share_menu")) CleanShareMenu.initRes(); if (mPrefsMap.getBoolean("system_framework_clean_open_menu")) CleanOpenMenu.initRes(); @@ -104,7 +129,6 @@ public void initZygote(StartupParam startupParam) throws Throwable { if (startupParam != null) { new BackgroundBlurDrawable().initZygote(startupParam); - new SystemFrameworkForCorePatch().initZygote(startupParam); if (mPrefsMap.getBoolean("system_framework_allow_uninstall")) new AllowUninstall().initZygote(startupParam); @@ -115,22 +139,6 @@ public void initZygote(StartupParam startupParam) throws Throwable { if (mPrefsMap.getBoolean("aod_unlock_always_on_display_hyper")) new UnlockAlwaysOnDisplay().initZygote(startupParam); } - - } - - @Override - public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { - if (isInSafeMode(lpparam.packageName)) return; - EzXHelper.initHandleLoadPackage(lpparam); - EzXHelper.setLogTag(TAG); - EzXHelper.setToastTag(TAG); - // load CorePatch - new SystemFrameworkForCorePatch().handleLoadPackage(lpparam); - - // load Module hook apps - init(lpparam); - if (mPrefsMap.getBoolean("system_framework_network_flightmode_hotspot")) - new FlightModeHotSpot().handleLoadPackage(lpparam); } private void setXSharedPrefs() { @@ -201,7 +209,7 @@ public void accept(String s, DataBase dataBase) { return; try { - Class clazz = getClass().getClassLoader().loadClass(s); + Class clazz = Objects.requireNonNull(getClass().getClassLoader()).loadClass(s); BaseModule module = (BaseModule) clazz.getDeclaredConstructor().newInstance(); module.init(lpparam); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Pad/SystemFrameworkT.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Pad/SystemFrameworkT.java index 3eb88992a..2bf97ffa5 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Pad/SystemFrameworkT.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Pad/SystemFrameworkT.java @@ -79,6 +79,7 @@ import com.sevtinge.hyperceiler.module.hook.systemframework.mipad.SetGestureNeedFingerNum; import com.sevtinge.hyperceiler.module.hook.systemframework.network.DualNRSupport; import com.sevtinge.hyperceiler.module.hook.systemframework.network.DualSASupport; +import com.sevtinge.hyperceiler.module.hook.systemframework.network.FlightModeHotSpot; import com.sevtinge.hyperceiler.module.hook.systemframework.network.N1Band; import com.sevtinge.hyperceiler.module.hook.systemframework.network.N28Band; import com.sevtinge.hyperceiler.module.hook.systemframework.network.N5N8Band; @@ -161,6 +162,7 @@ public void handleLoadPackage() { initHook(N1Band.INSTANCE, mPrefsMap.getBoolean("phone_n1")); initHook(N5N8Band.INSTANCE, mPrefsMap.getBoolean("phone_n5_n8")); initHook(N28Band.INSTANCE, mPrefsMap.getBoolean("phone_n28")); + initHook(new FlightModeHotSpot(), mPrefsMap.getBoolean("system_framework_network_flightmode_hotspot")); // Other initHook(new PackagePermissions(), true); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Phone/SystemFrameworkT.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Phone/SystemFrameworkT.java index 573fd1cc6..1531f6647 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Phone/SystemFrameworkT.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework/Phone/SystemFrameworkT.java @@ -74,6 +74,7 @@ import com.sevtinge.hyperceiler.module.hook.systemframework.freeform.UnForegroundPin; import com.sevtinge.hyperceiler.module.hook.systemframework.network.DualNRSupport; import com.sevtinge.hyperceiler.module.hook.systemframework.network.DualSASupport; +import com.sevtinge.hyperceiler.module.hook.systemframework.network.FlightModeHotSpot; import com.sevtinge.hyperceiler.module.hook.systemframework.network.N1Band; import com.sevtinge.hyperceiler.module.hook.systemframework.network.N28Band; import com.sevtinge.hyperceiler.module.hook.systemframework.network.N5N8Band; @@ -150,6 +151,7 @@ public void handleLoadPackage() { initHook(N1Band.INSTANCE, mPrefsMap.getBoolean("phone_n1")); initHook(N5N8Band.INSTANCE, mPrefsMap.getBoolean("phone_n5_n8")); initHook(N28Band.INSTANCE, mPrefsMap.getBoolean("phone_n28")); + initHook(new FlightModeHotSpot(), mPrefsMap.getBoolean("system_framework_network_flightmode_hotspot")); // Other initHook(new PackagePermissions(), true); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/network/FlightModeHotSpot.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/network/FlightModeHotSpot.java index 36fb4531f..7ed4fd894 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/network/FlightModeHotSpot.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/network/FlightModeHotSpot.java @@ -19,53 +19,47 @@ package com.sevtinge.hyperceiler.module.hook.systemframework.network; +import com.sevtinge.hyperceiler.module.base.BaseHook; + import java.util.Arrays; import java.util.Objects; -import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; -import de.robv.android.xposed.callbacks.XC_LoadPackage; - -public class FlightModeHotSpot implements IXposedHookLoadPackage { +public class FlightModeHotSpot extends BaseHook { XC_MethodHook.Unhook clHook; @Override - public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { - if (lpparam.packageName.equals("android")) { - try { - clHook = XposedHelpers.findAndHookMethod("com.android.server.SystemServiceManager", lpparam.classLoader, - "loadClassFromLoader", String.class, ClassLoader.class, new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - try { - String clzName = (String) param.args[0]; - ClassLoader cl = (ClassLoader) param.args[1]; - if (clzName.equals("com.android.server.wifi.WifiService")) { - Class cls = XposedHelpers.findClass("com.android.server.wifi.WifiServiceImpl.SoftApCallbackInternal", cl); - XposedHelpers.findAndHookMethod("com.android.server.wifi.sap.MiuiWifiApManager", cl, "resetSoftApStateIfNeeded", - cls, int.class, boolean.class, boolean.class, - new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - param.setResult(false); - } - }); - clHook.unhook(); - } - } catch (Throwable t) { - XposedBridge.log("[FlightModeHotSpot]:Hook MiuiWifiApManager Failed, the reason is=" + Objects.requireNonNull(t.getCause()) + - " stackTrace=" + Arrays.toString(t.getStackTrace())); + public void init() { + try { + clHook = XposedHelpers.findAndHookMethod("com.android.server.SystemServiceManager", lpparam.classLoader, + "loadClassFromLoader", String.class, ClassLoader.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + try { + String clzName = (String) param.args[0]; + ClassLoader cl = (ClassLoader) param.args[1]; + if (clzName.equals("com.android.server.wifi.WifiService")) { + Class cls = XposedHelpers.findClass("com.android.server.wifi.WifiServiceImpl$SoftApCallbackInternal", cl); + XposedHelpers.findAndHookMethod("com.android.server.wifi.sap.MiuiWifiApManager", cl, "resetSoftApStateIfNeeded", + cls, int.class, boolean.class, boolean.class, + new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + param.setResult(false); + } + }); + clHook.unhook(); } + } catch (Throwable t) { + logE(TAG, lpparam.packageName, "Hook MiuiWifiApManager Failed, " + t); } - }); - } catch (Throwable t) { - XposedBridge.log("[FlightModeHotSpot]:Hook classloader defined by MIUI failed, the reason is=" + Objects.requireNonNull(t.getCause()) + - " stackTrace=" + Arrays.toString(t.getStackTrace())); - } + } + }); + } catch (Throwable t) { + logE(TAG, lpparam.packageName, "Hook classloader defined by MIUI failed, " + t); } } - } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/FocusNotifLyricPluginHelper.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/FocusNotifLyricPluginHelper.kt deleted file mode 100644 index 980896a69..000000000 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/FocusNotifLyricPluginHelper.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is part of HyperCeiler. - * - * HyperCeiler is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - * Copyright (C) 2023-2025 HyperCeiler Contributions - */ -package com.sevtinge.hyperceiler.module.hook.systemui.plugin - -import com.sevtinge.hyperceiler.module.base.* -import com.sevtinge.hyperceiler.module.hook.systemui.statusbar.icon.v.* -import de.robv.android.xposed.* - -object FocusNotifLyricPluginHelper : BaseHook() { - override fun init() { - hookAllConstructors("com.android.systemui.shared.plugins.PluginActionManager\$PluginContextWrapper", object : MethodHook(){ - override fun after(param: MethodHookParam) { - val thisObj = param.thisObject - val pathClassLoader = XposedHelpers.getObjectField(thisObj,"mClassLoader") as ClassLoader - FocusNotifLyric.initLoader(pathClassLoader) - } - }) - } -} From 1d1ab544fb58dbea25ba1db840c5d37574482422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Mon, 13 Jan 2025 14:29:02 +0800 Subject: [PATCH 25/43] =?UTF-8?q?opt:=20MobileTypeSingle2Hook=20=EF=BC=88?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91=E4=B8=BA=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=97=B6=EF=BC=89=E7=9A=84=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BypassUnknownSourcesRestrictions.java | 41 +++++++++---------- .../statusbar/icon/v/HideFakeStatusBar.kt | 8 ++-- .../statusbar/model/MobileTypeSingle2Hook.kt | 39 +++++++----------- 3 files changed, 38 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/BypassUnknownSourcesRestrictions.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/BypassUnknownSourcesRestrictions.java index 7aab08285..669ac9bee 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/BypassUnknownSourcesRestrictions.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/BypassUnknownSourcesRestrictions.java @@ -28,45 +28,44 @@ public class BypassUnknownSourcesRestrictions extends BaseHook { public void init() throws NoSuchMethodException { String packageName = lpparam.packageName; ClassLoader classLoader = lpparam.classLoader; - //注意:com.miui.packageinstaller是com.android.packageinstaller的改包名安装器,不是MIUI原版安装器 - //缘由:MIUI原版安装器上传应用信息并协同小米账号到反诈中心等,并且用其他安装器不认,故将原生的安装器直接改包名并使用核破解覆盖com.miui.packageinstaller + // 注意:com.miui.packageinstaller 是 com.android.packageinstaller 的改包名安装器,不是 MIUI 原版安装器 + // 缘由:MIUI 原版安装器上传应用信息并协同小米账号到反诈中心等,并且用其他安装器不认,故将原生的安装器直接改包名并使用核破解覆盖 com.miui.packageinstaller /*if (packageName.equals("com.miui.packageinstaller") || packageName.equals("com.android.packageinstaller")){ XposedHelpers.findAndHookMethod("com.android.packageinstaller.PackageInstallerActivity", classLoader, "onCreate", android.os.Bundle.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); - //很简单,只需要在onCreate方法执行前把mAllowUnknownSources字段设置为true即可 + //很简单,只需要在 onCreate 方法执行前把 mAllowUnknownSources 字段设置为 true 即可 XposedHelpers.setBooleanField(param.thisObject,"mAllowUnknownSources",true); Context context; } }); }*/ - if (packageName.equals("android")) { - //Hook掉未知来源权限检查,一律返回有 - findAndHookMethod("com.android.server.appop.AppOpsService", classLoader, "noteOperation", int.class, int.class, java.lang.String.class, java.lang.String.class, boolean.class, java.lang.String.class, boolean.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - super.before(param); + + // Hook 掉未知来源权限检查,一律返回有 + findAndHookMethod("com.android.server.appop.AppOpsService", classLoader, "noteOperation", int.class, int.class, java.lang.String.class, java.lang.String.class, boolean.class, java.lang.String.class, boolean.class, new MethodHook() { + @Override + protected void after(MethodHookParam param) throws Throwable { + if ((Integer) param.args[0] == 66) { + // AppOpsManager.permissionToOpCode("android.permission.REQUEST_INSTALL_PACKAGES") == 66 + // XposedBridge.log("com.android.server.appop.AppOpsService.noteOperation("+Arrays.toString(param.args)+") return:"+param.getResult()); + setIntField(param.getResult(), "mOpMode", 0); } + } + }); + + // 以免智障程序自己检查是否有这个权限,然后跑来申请 + try { + findAndHookMethod("com.android.server.pm.IPackageManagerBase", classLoader, "canRequestPackageInstalls", java.lang.String.class, int.class, new MethodHook() { @Override protected void after(MethodHookParam param) throws Throwable { - super.after(param); - if ((Integer) param.args[0] == 66){//AppOpsManager.permissionToOpCode("android.permission.REQUEST_INSTALL_PACKAGES") == 66 - //XposedBridge.log("com.android.server.appop.AppOpsService.noteOperation("+Arrays.toString(param.args)+") return:"+param.getResult()); - setIntField(param.getResult(),"mOpMode",0); - } + param.setResult(true); } }); - //以免智障程序自己检查是否有这个权限,然后跑来申请 + } catch (Throwable t) { findAndHookMethod("com.android.server.pm.PackageManagerService", classLoader, "canRequestPackageInstalls", java.lang.String.class, int.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - super.before(param); - } - @Override protected void after(MethodHookParam param) throws Throwable { - super.after(param); param.setResult(true); } }); diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt index 331a6ec1e..60d29e328 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt @@ -152,9 +152,9 @@ object HideFakeStatusBar : MusicBaseHook() { if (isShowingFocusedLyric) { // 在显示歌词的时候固定通知栏顶部时间和日期的位置和缩放 val notificationHeaderExpandController = - it.thisObject.getObjectFieldOrNull("this\$0") ?: return@after + it.thisObject.getObjectField("this\$0") val combinedHeaderController = - notificationHeaderExpandController.getObjectFieldOrNull("headerController")!! + notificationHeaderExpandController?.getObjectFieldOrNull("headerController")!! .callMethod("get") val notificationBigTime = combinedHeaderController!!.getObjectFieldAs("notificationBigTime") @@ -188,9 +188,9 @@ object HideFakeStatusBar : MusicBaseHook() { if (isShowingFocusedLyric) { // 显示歌词的时候手动调用动画,防止大时钟突然出现 val notificationHeaderExpandController = - it.thisObject.getObjectFieldOrNull("this\$0") ?: return@after + it.thisObject.getObjectField("this\$0") val combinedHeaderController = - notificationHeaderExpandController.getObjectField("headerController")!! + notificationHeaderExpandController?.getObjectField("headerController")!! .callMethod("get") loadClass("com.android.systemui.controlcenter.shade.NotificationHeaderExpandController") .callStaticMethod( diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/model/MobileTypeSingle2Hook.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/model/MobileTypeSingle2Hook.kt index 535faa1dc..f2f6dea6a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/model/MobileTypeSingle2Hook.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/model/MobileTypeSingle2Hook.kt @@ -65,13 +65,8 @@ object MobileTypeSingle2Hook : BaseHook() { private val simDataConnected = booleanArrayOf(false, false) override fun init() { - if (mobileNetworkType != 0) { - hookMobileView() - } - - if (!showMobileType) { - return - } + hookMobileView() + if (!showMobileType) return try { method = DarkIconDispatcherClass.getMethod( @@ -79,25 +74,18 @@ object MobileTypeSingle2Hook : BaseHook() { MutableCollection::class.java, View::class.java ) - - try { - method2 = DarkIconDispatcherClass.getMethod( - "getTint", - MutableCollection::class.java, - View::class.java, - Integer.TYPE - ) - } catch (unused: Throwable) { - logE(TAG, lpparam.packageName, "DarkIconDispatcher.isInArea not found") - if (method != null) { - return - } - return - } - } catch (unused2: Throwable) { + method2 = DarkIconDispatcherClass.getMethod( + "getTint", + MutableCollection::class.java, + View::class.java, + Integer.TYPE + ) + } catch (unused: Throwable) { + logE(TAG, lpparam.packageName, "DarkIconDispatcher methods not found") method = null + method2 = null } - if (method == null || method2 == null) { + if (method == null && method2 == null) { return } @@ -167,7 +155,8 @@ object MobileTypeSingle2Hook : BaseHook() { // 添加大 5G 并设置样式 if (showMobileType) { - val mobileType = containerLeft.findViewByIdName("mobile_type") as? ImageView? + val mobileType = + containerLeft.findViewByIdName("mobile_type") as? ImageView? val textView = mobileGroup.findViewByIdName("mobile_type_single") as TextView if (!getLocation) { From 345b845cf2e127dda3aece601329516d201b6417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Mon, 13 Jan 2025 15:02:16 +0800 Subject: [PATCH 26/43] =?UTF-8?q?adj:=20=E7=A7=BB=E9=99=A4=E8=A7=A3?= =?UTF-8?q?=E9=94=81=E8=B6=85=E5=A4=A7=E9=9F=B3=E9=87=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hook/systemui/plugin/NewPluginHelperKt.kt | 5 --- .../hook/systemui/plugin/NewShowVolumePct.kt | 2 +- .../hook/systemui/plugin/NewSuperVolume.kt | 39 ------------------- .../hook/systemui/plugin/PluginHelper.java | 2 - app/src/main/res/values-ar-rSA/strings.xml | 2 - app/src/main/res/values-es-rES/strings.xml | 2 - app/src/main/res/values-in-rID/strings.xml | 2 - app/src/main/res/values-it-rIT/strings.xml | 2 - app/src/main/res/values-ja-rJP/strings.xml | 2 - app/src/main/res/values-pl-rPL/strings.xml | 2 - app/src/main/res/values-pt-rBR/strings.xml | 2 - app/src/main/res/values-ru-rRU/strings.xml | 2 - app/src/main/res/values-tr-rTR/strings.xml | 2 - app/src/main/res/values-vi-rVN/strings.xml | 2 - app/src/main/res/values-zh-rCN/strings.xml | 2 - app/src/main/res/values-zh-rHK/strings.xml | 2 - app/src/main/res/values-zh-rME/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 2 - app/src/main/res/values/strings.xml | 2 - app/src/main/res/xml/system_ui_other.xml | 6 --- 20 files changed, 1 insertion(+), 82 deletions(-) delete mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewSuperVolume.kt diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt index f6cfc925a..139da58c3 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt @@ -75,11 +75,6 @@ object NewPluginHelperKt : BaseHook() { mPrefsMap.getBoolean("system_cc_volume_showpct_title"), NewShowVolumePct::initLoader ), - Triple( - "NewSuperVolume", - mPrefsMap.getBoolean("system_ui_unlock_super_volume"), - NewSuperVolume::initSuperVolume - ), Triple( "EnableVolumeBlur", mPrefsMap.getBoolean("system_ui_plugin_enable_volume_blur"), diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewShowVolumePct.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewShowVolumePct.kt index 520dd0821..aa9d2ea50 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewShowVolumePct.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewShowVolumePct.kt @@ -144,7 +144,7 @@ object NewShowVolumePct { currentLevel = if (currentLevel == max) maxLevel else (currentLevel * i3 / max) + 1 } - mPct.text = if (((currentLevel * 100) / maxLevel) == 100 && (HookTool.mPrefsMap.getBoolean("system_ui_unlock_super_volume") || mSupportSV)) { + mPct.text = if (((currentLevel * 100) / maxLevel) == 100 && mSupportSV) { "200%" } else { ((currentLevel * 100) / maxLevel).toString() + "%" diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewSuperVolume.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewSuperVolume.kt deleted file mode 100644 index 8573ac95a..000000000 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewSuperVolume.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.sevtinge.hyperceiler.module.hook.systemui.plugin - -import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass -import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook -import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder - -object NewSuperVolume { - - - @JvmStatic - fun initSuperVolume(classLoader: ClassLoader) { - // 注:只显示 UI ,没提示,要提示等后续有缘人解决( - val newVolumeClazz by lazy { - loadClass("miui.systemui.util.VolumeUtils", classLoader) - } - val oldVolumeClazz by lazy { - loadClass("miui.systemui.util.CommonUtils", classLoader) - } - - try { - newVolumeClazz.methodFinder().filterByName("getSUPER_VOLUME_PERCENT").first().createHook { - returnConstant(200) - } - newVolumeClazz.methodFinder().filterByName("getSUPER_VOLUME_SUPPORTED").first().createHook { - returnConstant(true) - } - newVolumeClazz.methodFinder().filterByName("getSUPER_VOLUME_VOICE_CALL_SUPPORTED").first().createHook { - returnConstant(true) - } - } catch (t: Throwable) { - oldVolumeClazz.methodFinder().filterByName("supportSuperVolume").first().createHook { - returnConstant(true) - } - oldVolumeClazz.methodFinder().filterByName("voiceSupportSuperVolume").first().createHook { - returnConstant(true) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/PluginHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/PluginHelper.java index 1a2912671..538a3f326 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/PluginHelper.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/PluginHelper.java @@ -89,8 +89,6 @@ public void setClassLoader(ClassLoader classLoader) { CCGridForHyperOS.initCCGridForHyperOS(classLoader); if (mPrefsMap.getBoolean("system_cc_volume_showpct_title")) NewShowVolumePct.initLoader(classLoader); // 声音百分比 - if (mPrefsMap.getBoolean("system_ui_unlock_super_volume")) - NewSuperVolume.initSuperVolume(classLoader); if ((mPrefsMap.getInt("system_control_center_cc_rows", 4) > 4 || mPrefsMap.getInt("system_control_center_cc_columns", 4) > 4 || mPrefsMap.getBoolean("system_ui_control_center_rounded_rect") || diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 95cc635ad..8fd7fa64e 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -984,8 +984,6 @@ نقل بلاطة البلوتوث بالقرب من بلاطة الشبكة قائمة إشعارات موسعة فتح معلومات التطبيق، إغلاق التطبيق بالقوة وفتح في نافذة عائمة من قائمة الإشعارات (اسحب الإشعار لليسار لفتحه) - فتح مستوى الصوت الفائق - ميزة تجريبية. الميزات الفعلية يجب أن تدعمها الشيفرة الأساسية. مركز التحكم الجديد مركز التحكم القديم فتح أنماط مركز التحكم diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index bf4530680..48dd1179d 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -843,8 +843,6 @@ aplicaciones del sistema Mover la pegatina de Bluetooth a cerca de la de red Menú de notificaciones extendido Abrir información de la aplicación, cerrarla y abrirla en ventana flotante desde el menú de notificación (deslizar la notificación a la izquierda para abrirla) - Desbloquear supervolumen - Características experimentales, cuyos resultados reales dependen del código subyacente Centro de control nuevo Centro de control clásico Desbloquear estilos del centro de control diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index 2b92d7434..66df2ec69 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -821,8 +821,6 @@ Pindahkan ubin bluetooth di dekat ubin jaringan Menu notifikasi yang diperluas Buka info aplikasi, tutup paksa aplikasi dan buka di jendela mengambang dari menu notifikasi (geser notifikasi ke kiri untuk membukanya) - Buka Kunci Volume Super - Fitur eksperimental, fitur sebenarnya perlu didukung oleh kode yang mendasarinya Pusat kendali baru Pusat kendali warisan Buka kunci gaya pusat kendali diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index b76fbd17a..7d4d72dfa 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -815,8 +815,6 @@ Sposta il riquadro Bluetooth vicino al riquadro della rete Menu di notifica esteso Apri informazioni sull\'app, forza la chiusura dell\'app e aprila in una finestra mobile dal menu di notifica (scorri la notifica verso sinistra per aprirla) - Sblocca Super Volume - Funzionalità sperimentali , le funzionalità effettive devono essere supportate dal codice sottostante Nuovo centro di controllo Centro di controllo legacy Sblocca gli stili del centro di controllo diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 69740d4ef..b6fc39bf4 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -962,8 +962,6 @@ Bluetooth タイルをネットワークタイルの近くに移動する 拡張通知メニュー アプリ情報を開く、強制停止、フローティングウィンドウで開く機能を通知メニューに追加します (通知を左にスワイプすると開けます) - スーパーボリュームをアンロック - 実験的な機能です。実際の機能は基礎となるコードでサポートされている必要があります 新しいコントロールセンター 従来のコントロールセンター コントロールセンターのスタイルをアンロック diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 15a32181a..bae7d4ebc 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -985,8 +985,6 @@ Przesuń kafelek Bluetooth w pobliżu kafelka sieci Rozszerzone menu powiadomień Otwórz informacje o aplikacji, wymuś zamknięcie aplikacji i otwórz ją w oknie pływającym z menu powiadomień (przesuń powiadomienie w lewo, aby je otworzyć) - Odblokuj super głośność - Funkcja eksperymentalna. Rzeczywiste funkcje muszą być obsługiwane przez podstawowy kod. Nowe centrum kontroli Starsze centrum kontroli Odblokuj style centrum kontroli diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 17e1a8879..e8c0bf983 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -985,8 +985,6 @@ Mova o ícone do Bluetooth para perto do ícone de rede Menu de notificação estendido Abra as informações do app, force a parada do app e abra em uma janela flutuante no menu de notificação (deslize a notificação para a esquerda para abri-la) - Desbloquear Super volume - Recurso experimental. Recursos reais precisam ser suportados pelo código subjacente. Novo centro de controle Centro de controle antigo Desbloquear estilos do centro de controle diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 16d1df421..480fe964f 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -985,8 +985,6 @@ Переместить Bluetooth-плитку рядом с сетевой плиткой Расширенное меню уведомлений Добавляет новые действия в меню уведомления (открывается по свайпу влево) - открыть информацию о приложении и принудительно закрыть приложение - Разблокировать супер громкость - Экспериментальные функции, фактические функции должны поддерживаться базовым кодом Новый центр управления Старый центр управления Разблокировать стиль центра управления diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index 9a64fc721..697b91f9d 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -834,8 +834,6 @@ Bluetooth döşeme stili Genişletilmiş bildirim menüsü Uygulama bilgilerini açın, uygulamayı kapatmaya zorlayın ve bildirim menüsünden kayan pencerede açın (açmak için bildirimi sola kaydırın) - Süper ses seviyesini açın - Deneysel özellik. Gerçek özelliklerin altta yatan kod tarafından desteklenmesi gerekir. Yeni kontrol merkezi Eski kontrol merkezi Kontrol merkezi stillerinin kilidini aç diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index 22bd48990..bf249ed30 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -987,8 +987,6 @@ Chức năng này là chức năng thử nghiệm có độ ổn định caoÔ Bluetooth được di chuyển đến khu vực ô mạng Menu thông báo mở rộng Mở thông tin ứng dụng, buộc đóng ứng dụng và mở trong cửa sổ nổi từ menu thông báo (vuốt thông báo sang trái để mở) - Mở khóa siêu âm lượng - Chức năng thử nghiệm, chức năng thực tế yêu cầu hỗ trợ mã cơ bản Trung tâm điều khiển kiểu mới Trung tâm điều khiển kiểu cũ Mở khóa các kiểu trung tâm điều khiển diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b61276f23..2dc5c66e7 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1061,8 +1061,6 @@ 蓝牙磁贴移至网络磁贴区域 扩展通知菜单 从通知菜单打开应用信息、强制关闭应用和浮窗打开 - 解锁超大音量 - 实验性功能,实际功能需要底层代码支持 解除通知背景模糊限制 仅对三方主题移除没有高级材质背景模糊的限制 移除通知数量限制 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 49c5f18a5..2bcce0668 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -875,8 +875,6 @@ 藍牙磁貼移至網絡磁貼區域 擴展通知選單 從通知選單中打開應用程式信息、強制關閉應用程式和視窗打開 - 解鎖超大音量 - 實驗性功能,實際功能需要底層代碼支持 新控制中心 經典控制中心 解鎖控制中心樣式 diff --git a/app/src/main/res/values-zh-rME/strings.xml b/app/src/main/res/values-zh-rME/strings.xml index afa33dae6..ada07039f 100644 --- a/app/src/main/res/values-zh-rME/strings.xml +++ b/app/src/main/res/values-zh-rME/strings.xml @@ -658,7 +658,6 @@ 启用5G开关,好让运营商多赚点钱。 人家的里面不好看吗... X 光半径 - 聋的传人 加了 没加 还想... 看更多吗❤️ diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 3d65c803d..0a7aed6e1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -985,8 +985,6 @@ 調整藍牙磁貼位置至網路磁貼旁 擴展通知選單 從通知選單打開應用程式資訊、強制關閉應用程式和小窗打開 - 解鎖超大音量 - 實驗性功能,實際功能需要底層代碼支援 新控制中心 經典控制中心 解鎖控制中心樣式 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 655da1250..1d2865020 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1056,8 +1056,6 @@ Move the Bluetooth tile near the network tile Extended notification menu Open app info, force close app and open in floating window from notification menu (swipe notification to the left to open it) - Unlock Super volume - Experimental feature. Actual features need to be supported by the underlying code. New control center Legacy control center Unlock control center styles diff --git a/app/src/main/res/xml/system_ui_other.xml b/app/src/main/res/xml/system_ui_other.xml index 1ef9cc615..85df8bb02 100644 --- a/app/src/main/res/xml/system_ui_other.xml +++ b/app/src/main/res/xml/system_ui_other.xml @@ -141,12 +141,6 @@ android:summary="@string/system_ui_unlock_clipboard_desc" android:title="@string/system_ui_unlock_clipboard" /> - - Date: Mon, 13 Jan 2025 19:42:39 +0800 Subject: [PATCH 27/43] =?UTF-8?q?feat:=20=E7=A7=BB=E6=A4=8D=20=E6=8C=89?= =?UTF-8?q?=E5=8E=8B=E5=B1=95=E5=BC=80=E4=BA=8C=E7=BA=A7=E9=9F=B3=E9=87=8F?= =?UTF-8?q?=E6=9D=A1=20=EF=BC=86=20=E9=9A=90=E8=97=8F=E9=9D=99=E9=9F=B3?= =?UTF-8?q?=E5=92=8C=E5=8B=BF=E6=89=B0=E6=8C=89=E9=92=AE=20|=20opt:=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8A=9F=E8=83=BD=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + README_en-US.md | 1 + README_pt-BR.md | 1 + .../plugin/HideCollpasedFootButton.kt | 92 ++++++++++++ .../hook/systemui/plugin/NewPluginHelperKt.kt | 15 ++ .../plugin/StartCollpasedColumnPress.kt | 140 ++++++++++++++++++ .../app/systemui/SystemUIOtherSettings.java | 8 +- app/src/main/res/values-zh-rCN/strings.xml | 8 +- app/src/main/res/values/strings.xml | 8 +- app/src/main/res/xml/system_ui_other.xml | 52 ++++--- .../res/xml/system_ui_status_bar_music.xml | 9 +- 11 files changed, 306 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/HideCollpasedFootButton.kt create mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/StartCollpasedColumnPress.kt diff --git a/README.md b/README.md index e588d49fa..03b12057c 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,7 @@ HyperCeiler 已停止维护 Android 11-13 的 MIUI ROM,如需使用请停留[ - [「Hyper Helper」 by HowieHChen](https://github.com/HowieHChen/XiaomiHelper) - [「HideMiuiClipboardDialog」 by zerorooot](https://github.com/zerorooot/HideMiuiClipboardDialog) - [「HyperSmartCharge」 by buffcow](https://github.com/buffcow/HyperSmartCharge) +- [「HyperStar」 by YunZiA](https://github.com/YunZiA/HyperStar) - [「Kotlin」 by JetBrains](https://github.com/JetBrains/kotlin) - [「Lyric-Getter」 by xiaowine](https://github.com/xiaowine/Lyric-Getter) - [「MaxFreeForm」 by YifePlayte](https://github.com/YifePlayte/MaxFreeForm) diff --git a/README_en-US.md b/README_en-US.md index ecf8b611b..cfe945ae7 100644 --- a/README_en-US.md +++ b/README_en-US.md @@ -145,6 +145,7 @@ You can provide translations for the HyperCeiler project [here](https://crwd.in/ - [「Hyper Helper」 by HowieHChen](https://github.com/HowieHChen/XiaomiHelper) - [「HideMiuiClipboardDialog」 by zerorooot](https://github.com/zerorooot/HideMiuiClipboardDialog) - [「HyperSmartCharge」 by buffcow](https://github.com/buffcow/HyperSmartCharge) +- [「HyperStar」 by YunZiA](https://github.com/YunZiA/HyperStar) - [「Kotlin」 by JetBrains](https://github.com/JetBrains/kotlin) - [「Lyric-Getter」 by xiaowine](https://github.com/xiaowine/Lyric-Getter) - [「MaxFreeForm」 by YifePlayte](https://github.com/YifePlayte/MaxFreeForm) diff --git a/README_pt-BR.md b/README_pt-BR.md index cb8c1173d..5c7e8d5d8 100644 --- a/README_pt-BR.md +++ b/README_pt-BR.md @@ -145,6 +145,7 @@ Você pode fornecer traduções para o projeto [aqui](https://crwd.in/cemiuiler) - [「Hyper Helper」 por HowieHChen](https://github.com/HowieHChen/XiaomiHelper) - [「HideMiuiClipboardDialog」 por zerorooot](https://github.com/zerorooot/HideMiuiClipboardDialog) - [「HyperSmartCharge」 por buffcow](https://github.com/buffcow/HyperSmartCharge) +- [「HyperStar」 by YunZiA](https://github.com/YunZiA/HyperStar) - [「Kotlin」 por JetBrains](https://github.com/JetBrains/kotlin) - [「Lyric-Getter」 por xiaowine](https://github.com/xiaowine/Lyric-Getter) - [「MaxFreeForm」 por YifePlayte](https://github.com/YifePlayte/MaxFreeForm) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/HideCollpasedFootButton.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/HideCollpasedFootButton.kt new file mode 100644 index 000000000..5ce5def96 --- /dev/null +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/HideCollpasedFootButton.kt @@ -0,0 +1,92 @@ +package com.sevtinge.hyperceiler.module.hook.systemui.plugin + +import android.view.* +import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass +import com.sevtinge.hyperceiler.utils.devicesdk.* +import de.robv.android.xposed.* + +object HideCollpasedFootButton { + fun initLoaderHook(classLoader: ClassLoader) { + val mRingerButtonHelper by lazy { + loadClass("com.android.systemui.miui.volume.MiuiRingerModeLayout\$RingerButtonHelper", classLoader) + } + val mTimerItem by lazy { + loadClass("com.android.systemui.miui.volume.TimerItem", classLoader) + } + + XposedHelpers.findAndHookMethod( + mRingerButtonHelper, "updateState", + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val thisObj = param?.thisObject + val mIcon = XposedHelpers.getObjectField(thisObj, "mIcon") as View + val mStandardView = + XposedHelpers.getObjectField(thisObj, "mStandardView") as View + val mExpanded = XposedHelpers.getBooleanField(thisObj, "mExpanded") + if (mExpanded) { + mIcon.visibility = View.VISIBLE + mStandardView.visibility = View.VISIBLE + } else { + mIcon.visibility = View.GONE + mStandardView.visibility = View.GONE + + } + + } + }) + + + if (isMoreHyperOSVersion(2f)) { + XposedHelpers.findAndHookMethod( + mRingerButtonHelper, "onExpanded", Boolean::class.java, Boolean::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val thisObj = param?.thisObject + val z1 = param?.args?.get(0) as Boolean + val z2 = param.args?.get(1) as Boolean + + val mStandardView = + XposedHelpers.getObjectField(thisObj, "mStandardView") as View + val mExpanded = XposedHelpers.getBooleanField(thisObj, "mExpanded") + + if (mExpanded != z1 || z2) { + mStandardView.visibility = View.GONE + } else { + mStandardView.visibility = View.VISIBLE + } + + } + }) + } else { + XposedHelpers.findAndHookMethod( + mRingerButtonHelper, "onExpanded", Boolean::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val thisObj = param?.thisObject + val z1 = param?.args?.get(0) as Boolean + val mStandardView = + XposedHelpers.getObjectField(thisObj, "mStandardView") as View + val mExpanded = XposedHelpers.getBooleanField(thisObj, "mExpanded") + + if (mExpanded != z1) { + mStandardView.visibility = View.GONE + } else { + mStandardView.visibility = View.VISIBLE + } + } + }) + } + + XposedHelpers.findAndHookMethod( + mTimerItem, "updateExpanded", Boolean::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val thisObj = param?.thisObject + val mCountDownProgressBar = + XposedHelpers.getObjectField(thisObj, "mCountDownProgressBar") as View + + mCountDownProgressBar.visibility = View.GONE + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt index 139da58c3..1b25b77b8 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/NewPluginHelperKt.kt @@ -70,6 +70,11 @@ object NewPluginHelperKt : BaseHook() { logD(TAG, lpparam.packageName, "Plugin for sysui volume loaded.") val loaders = listOf( + Triple( + "VolumeTimerValuesHook", + mPrefsMap.getBoolean("system_ui_volume_timer"), + VolumeTimerValuesHook::initVolumeTimerValuesHook + ), Triple( "NewShowVolumePct", mPrefsMap.getBoolean("system_cc_volume_showpct_title"), @@ -80,6 +85,16 @@ object NewPluginHelperKt : BaseHook() { mPrefsMap.getBoolean("system_ui_plugin_enable_volume_blur"), EnableVolumeBlur::initEnableVolumeBlur ), + Triple( + "StartCollpasedColumnPress", + mPrefsMap.getBoolean("system_ui_volume_collpased_column_press"), + StartCollpasedColumnPress::initLoaderHook + ), + Triple( + "StartCollpasedFootButton", + mPrefsMap.getBoolean("system_ui_volume_hide_foot_button"), + HideCollpasedFootButton::initLoaderHook + ), Triple( "DefaultPluginTheme", mPrefsMap.getBoolean("system_ui_other_default_plugin_theme"), diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/StartCollpasedColumnPress.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/StartCollpasedColumnPress.kt new file mode 100644 index 000000000..91353d427 --- /dev/null +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/plugin/StartCollpasedColumnPress.kt @@ -0,0 +1,140 @@ +package com.sevtinge.hyperceiler.module.hook.systemui.plugin + +import android.animation.* +import android.os.* +import android.view.* +import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass +import com.sevtinge.hyperceiler.utils.log.XposedLogUtils.* +import de.robv.android.xposed.* + +object StartCollpasedColumnPress { + fun initLoaderHook(classLoader: ClassLoader) { + val miuiVolumeDialogView by lazy { + loadClass("com.android.systemui.miui.volume.MiuiVolumeDialogView", classLoader) + } + val miuiVolumeDialogMotion by lazy { + loadClass("com.android.systemui.miui.volume.MiuiVolumeDialogMotion", classLoader) + } + val miuiVolumeSeekBar by lazy { + loadClass("com.android.systemui.miui.volume.MiuiVolumeSeekBar", classLoader) + } + + XposedHelpers.findAndHookMethod( + miuiVolumeDialogView, "onFinishInflate", + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val thisObj = param?.thisObject + val mExpandButton = + XposedHelpers.getObjectField(thisObj, "mExpandButton") as View + mExpandButton.setOnClickListener(null) + mExpandButton.alpha = 0f + mExpandButton.isClickable = false + mExpandButton.visibility = View.GONE + } + }) + + XposedHelpers.findAndHookMethod( + miuiVolumeDialogView, "notifyAccessibilityChanged", Boolean::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val thisObj = param?.thisObject + val mExpandButton = + XposedHelpers.getObjectField(thisObj, "mExpandButton") as View + + mExpandButton.setOnClickListener(null) + mExpandButton.isClickable = false + mExpandButton.visibility = View.GONE + } + }) + + XposedBridge.hookAllConstructors(miuiVolumeDialogMotion, object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + val thisObj = param?.thisObject + val mExpandButton = XposedHelpers.getObjectField(thisObj, "mExpandButton") as View + + mExpandButton.setOnTouchListener(null) + } + }) + + + var longClick = false + XposedHelpers.findAndHookMethod( + miuiVolumeDialogMotion, "lambda\$processExpandTouch\$1", + object : XC_MethodReplacement() { + override fun replaceHookedMethod(param: MethodHookParam?): Any? { + val thisObj = param?.thisObject + if (XposedHelpers.getBooleanField(thisObj, "mExpanded") || !longClick) return null + val mVolumeView = XposedHelpers.getObjectField(thisObj, "mVolumeView") as View + + logD("StartCollpasedColumnPress", "miui.systemui.plugin", "processExpandTouch") + + with(AnimatorSet()) { + playTogether( + ObjectAnimator.ofFloat(mVolumeView, "scaleX", 0.95f), + ObjectAnimator.ofFloat(mVolumeView, "scaleY", 0.95f) + ) + duration = 100L + addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + mVolumeView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + val mVolumeExpandCollapsedAnimator = + XposedHelpers.getObjectField(thisObj, "mVolumeExpandCollapsedAnimator") + val mCallback = XposedHelpers.getObjectField(thisObj, "mCallback") + XposedHelpers.callMethod(mVolumeExpandCollapsedAnimator, "calculateFromViewValues", true) + XposedHelpers.callMethod(mCallback, "onExpandClicked") + + mVolumeView.scaleX = 1f + mVolumeView.scaleY = 1f + } + }) + start() + } + return null + } + + }) + + XposedHelpers.findAndHookMethod( + miuiVolumeSeekBar, "onTouchEvent", MotionEvent::class.java, + object : XC_MethodHook() { + override fun afterHookedMethod(param: MethodHookParam?) { + super.afterHookedMethod(param) + val thisObj = param?.thisObject + val mSeekBarOnclickListener = + XposedHelpers.getObjectField(thisObj, "mSeekBarOnclickListener") + + val handler = Handler(Looper.getMainLooper()) + val mLongPressRunnable = Runnable { + val mMoveY = XposedHelpers.getFloatField(thisObj, "mMoveY") + if (longClick) { + thisObj as View + XposedHelpers.callMethod(mSeekBarOnclickListener, "onClick") + } + } + + if (mSeekBarOnclickListener != null) { + val motionEvent = param?.args?.get(0) as MotionEvent + + val action = motionEvent.action + when (action) { + 0 -> { + longClick = true + XposedHelpers.setLongField(thisObj, "mCurrentMS", 0L) + handler.postDelayed(mLongPressRunnable, 300L) + } + + 1 -> { + longClick = false + XposedHelpers.setLongField(thisObj, "mCurrentMS", 0L) + } + + 2 -> { + longClick = false + } + } + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java index 674e55b74..118a76388 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/app/systemui/SystemUIOtherSettings.java @@ -52,6 +52,8 @@ public class SystemUIOtherSettings extends DashboardFragment { SwitchPreference mPctUseBlur; SwitchPreference mFuckSG; SwitchPreference mTimer; + SwitchPreference mHideFootButton; + SwitchPreference mCollpasedColumnPress; SwitchPreference mPluginThemeBlur; @Override @@ -73,17 +75,21 @@ public void initPrefs() { mPctUseBlur = findPreference("prefs_key_system_showpct_use_blur"); mFuckSG = findPreference("prefs_key_system_ui_move_log_to_miui"); mTimer = findPreference("prefs_key_system_ui_volume_timer"); + mHideFootButton = findPreference("prefs_key_system_ui_volume_hide_foot_button"); + mCollpasedColumnPress = findPreference("prefs_key_system_ui_volume_collpased_column_press"); mPluginThemeBlur = findPreference("prefs_key_system_ui_other_default_plugin_theme"); mChargeAnimationTitle.setVisible(!isMoreHyperOSVersion(1f)); mDisableBluetoothRestrict.setVisible(isMiuiVersion(14f) && !isMoreHyperOSVersion(1f)); mMiuiMultiWinSwitch.setVisible(isMoreHyperOSVersion(1f) && isMoreAndroidVersion(34)); - mMiuiMultiWinSwitchRemove.setVisible(isMoreHyperOSVersion(1f) && isMoreAndroidVersion(34) && isPad()); + mMiuiMultiWinSwitchRemove.setVisible(isMoreHyperOSVersion(1f) && isMoreAndroidVersion(34)); mDisableInfinitymodeGesture.setVisible(isMoreHyperOSVersion(1f) && isMoreAndroidVersion(34) && isPad()); mBottomBar.setVisible(isMoreHyperOSVersion(1f) && isMoreAndroidVersion(34)); mPctUseBlur.setVisible(isMoreHyperOSVersion(1f)); mFuckSG.setVisible(isMoreHyperOSVersion(2f)); mTimer.setVisible(!isMoreAndroidVersion(35)); + mHideFootButton.setVisible(isMoreHyperOSVersion(1f)); + mCollpasedColumnPress.setVisible(isMoreHyperOSVersion(2f)); mPluginThemeBlur.setVisible(isMoreHyperOSVersion(1f)); mVolume.setOnPreferenceChangeListener( diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 2dc5c66e7..11f94d1d3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1114,14 +1114,18 @@ 自定义主题色 自定义主题颜色,而不是从壁纸中提取颜色 选择主题色 - 扩展计时器 快捷开关标签 通知 禁用通知白名单 解除高级材质模糊限制 解除系统界面组件对第三方主题默认禁用的高级材质模糊 + 音量条 + 按压展开二级音量条 + 启用此功能后,会关闭展开按钮 + 隐藏静音和勿扰按钮 + 扩展计时器 音量条模糊 - 仅供 Android 12 及以上的 MTK 机型使用,可能存在 GPU 负载较高的情况 + 可能存在 GPU 负载较高的情况 将 statusbar_gestures.dat 移动到 MIUI 目录 设置 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1d2865020..065c90a98 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1108,15 +1108,19 @@ Customize theme color Customize theme colors instead of pulling colors from system wallpaper Choose theme color - Extended timer Quick switch tab Notification Disable notification whitelist Remove blur restrictions from Advanced textures Unlock the blur of Advanced textures, which is disabled by default for third-party themes in the System UI Plug-in. + Volume bar + Press to expand the secondary volume bar + When this feature is enabled, the expand button is turned off + Hide mute and do not disturb buttons + Extended timer Enable volume bar blur Move statusbar_gestures.dat to MIUI dir - Only for Android12+ MTK models. There may be high GPU load. + There may be high GPU load. Manage calls Allow call forwarding via MMI code diff --git a/app/src/main/res/xml/system_ui_other.xml b/app/src/main/res/xml/system_ui_other.xml index 85df8bb02..e82432848 100644 --- a/app/src/main/res/xml/system_ui_other.xml +++ b/app/src/main/res/xml/system_ui_other.xml @@ -21,8 +21,8 @@ app:myLocation="@string/system_ui_other_title" app:quick_restart="com.android.systemui"> + android:key="prefs_key_system_ui_statusbar_charge_animation_title" + android:title="@string/system_ui_charge_animation_title"> - + + + + + + + + + + + + @@ -118,6 +143,9 @@ android:key="prefs_key_system_ui_disable_bottombar" android:title="@string/system_ui_disable_bottombar" /> + + + - - - - + android:title="@string/system_ui_move_log_to_miui" /> - From a8be9394cf1c4a14d5a0e307bdabed22ce569d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Mon, 13 Jan 2025 20:55:47 +0800 Subject: [PATCH 28/43] opt: add isLargeUI() --- .../controlcenter/NotificationWeather.kt | 12 ++++----- .../statusbar/icon/v/HideFakeStatusBar.kt | 3 ++- .../hyperceiler/utils/api/loadClassByLazy.kt | 4 +++ .../utils/devicesdk/MiDeviceAppUtils.kt | 27 ++++++++++++++++--- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt index bc671b6da..4c22870c0 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt @@ -31,6 +31,7 @@ import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinde import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.hook.systemui.* import com.sevtinge.hyperceiler.utils.* +import com.sevtinge.hyperceiler.utils.api.LazyClass.miuiConfigs import com.sevtinge.hyperceiler.utils.devicesdk.* import com.sevtinge.hyperceiler.utils.devicesdk.DisplayUtils.* import com.sevtinge.hyperceiler.view.* @@ -105,10 +106,10 @@ object NotificationWeather : BaseHook() { val landClock = viewGroup.getObjectFieldAs("mLandClock") vWeatherView?.setTextSize(0, dateView.textSize) - vWeatherView?.setTypeface(dateView.typeface) + vWeatherView?.typeface = dateView.typeface hWeatherView?.setTextSize(0, landClock.textSize) - hWeatherView?.setTypeface(landClock.typeface) + hWeatherView?.typeface = landClock.typeface } } @@ -128,12 +129,9 @@ object NotificationWeather : BaseHook() { } val isVerticalMode = if (isMoreHyperOSVersion(2f)) { - val miuiConfigs = loadClass("com.miui.utils.configs.MiuiConfigs") - miuiConfigs.callStaticMethodAs("isVerticalMode", context) + miuiConfigs.callStaticMethodAs("isVerticalMode", context) } else { - val commonUtil = loadClass("com.miui.systemui.util.CommonUtil") - val isTabletUI = commonUtil.callStaticMethodAs("isTabletUI", context) - orientation != ORIENTATION_PORTRAIT || isTabletUI + orientation != ORIENTATION_PORTRAIT || isLargeUI() } if (isVerticalMode) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt index 60d29e328..cd2a696ba 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/statusbar/icon/v/HideFakeStatusBar.kt @@ -37,6 +37,7 @@ import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinde import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.MusicBaseHook.Companion.CHANNEL_ID import com.sevtinge.hyperceiler.utils.* +import com.sevtinge.hyperceiler.utils.api.LazyClass.miuiConfigs import de.robv.android.xposed.* import kotlinx.coroutines.flow.* @@ -138,7 +139,7 @@ object HideFakeStatusBar : MusicBaseHook() { loadClass("com.android.systemui.controlcenter.shade.NotificationHeaderExpandController\$notificationCallback\$1").methodFinder() .filterByName("onExpansionChanged").first().createHook { before { - unhook0 = loadClass("com.miui.utils.configs.MiuiConfigs").methodFinder() + unhook0 = miuiConfigs.methodFinder() .filterByName("isVerticalMode").first().replaceMethod { if (isShowingFocusedLyric) { // 如果在显示歌词,就伪装成横屏,用来取消假时钟动画 diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/api/loadClassByLazy.kt b/app/src/main/java/com/sevtinge/hyperceiler/utils/api/loadClassByLazy.kt index be62a7fff..e802a390a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/api/loadClassByLazy.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/api/loadClassByLazy.kt @@ -47,6 +47,10 @@ object LazyClass { loadClass("miui.os.Build") } + val miuiConfigs by lazy { + loadClass("com.miui.utils.configs.MiuiConfigs") + } + val SettingsFeaturesCls by lazy { loadClass("com.android.settings.utils.SettingsFeatures") } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/devicesdk/MiDeviceAppUtils.kt b/app/src/main/java/com/sevtinge/hyperceiler/utils/devicesdk/MiDeviceAppUtils.kt index 7f40877cb..ac7f46f7c 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/devicesdk/MiDeviceAppUtils.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/devicesdk/MiDeviceAppUtils.kt @@ -18,25 +18,44 @@ */ package com.sevtinge.hyperceiler.utils.devicesdk +import android.content.res.* import com.github.kyuubiran.ezxhelper.ClassUtils.getStaticObjectOrNullAs import com.sevtinge.hyperceiler.utils.api.LazyClass.clazzMiuiBuild val IS_TABLET by lazy { getStaticObjectOrNullAs(clazzMiuiBuild, "IS_TABLET") ?: false } +val IS_PAD by lazy { + getStaticObjectOrNullAs(clazzMiuiBuild, "IS_PAD") ?: false +} +val IS_FOLD by lazy { + getStaticObjectOrNullAs(clazzMiuiBuild, "IS_FOLD") ?: false +} val IS_INTERNATIONAL_BUILD by lazy { getStaticObjectOrNullAs(clazzMiuiBuild, "IS_INTERNATIONAL_BUILD") ?: false } +/** + * 函数调用,适用于其他一些需要更高精度判断大屏设备的情况,仅支持小米设备的判断 + * @return 一个 Boolean 值,true 代表是大屏设备,false 代表不是大屏设备 + */ +fun isLargeUI(): Boolean { + return runCatching { + !(!IS_PAD && (!IS_FOLD || !isTablet())) + }.getOrElse { + isPad() + } +} + /** * 函数调用,适用于其他一些需要判断的情况,仅支持小米设备的判断 * 2025-04-20 更新对非小米设备的判断方式,仅防止闪退 * @return 一个 Boolean 值,true 代表是平板,false 代表不是平板 */ fun isPad(): Boolean { - return try { + return runCatching { IS_TABLET - } catch(_: Throwable) { + }.getOrElse { isPadDevice() } } @@ -46,9 +65,9 @@ fun isPad(): Boolean { * @return 一个 Boolean 值,true 代表是国际版系统,false 代表不是国际版系统 */ fun isInternational(): Boolean { - return try { + return runCatching { IS_INTERNATIONAL_BUILD - } catch(_: Throwable) { + }.getOrElse { false } } From f9fd8ec9f05fb56c6df65bde673d45da2a7cf3a0 Mon Sep 17 00:00:00 2001 From: xzakota <51871051+xzakota@users.noreply.github.com> Date: Mon, 13 Jan 2025 22:08:06 +0800 Subject: [PATCH 29/43] =?UTF-8?q?opt:=20=E6=A8=AA=E5=B1=8F=E6=88=96?= =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E6=98=BE=E7=A4=BA=E5=A4=A9=E6=B0=94=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=9B=B4=E5=A4=9A=20OS1=20=E8=AE=BE=E5=A4=87=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controlcenter/NotificationWeather.kt | 214 +++++++++--------- 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt index 4c22870c0..fb6d4d7e9 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/NotificationWeather.kt @@ -26,7 +26,8 @@ import android.view.* import android.widget.* import androidx.annotation.IntDef import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass -import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook +import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createAfterHook +import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createBeforeHook import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.hook.systemui.* @@ -35,6 +36,7 @@ import com.sevtinge.hyperceiler.utils.api.LazyClass.miuiConfigs import com.sevtinge.hyperceiler.utils.devicesdk.* import com.sevtinge.hyperceiler.utils.devicesdk.DisplayUtils.* import com.sevtinge.hyperceiler.view.* +import de.robv.android.xposed.XposedHelpers.findMethodExactIfExists @SuppressLint("DiscouragedApi", "ServiceCast", "StaticFieldLeak") object NotificationWeather : BaseHook() { @@ -92,46 +94,57 @@ object NotificationWeather : BaseHook() { } // 更新资源 - miuiNotificationHeaderView.methodFinder() - .filterByName("updateHeaderResources") - .single().createHook { - after { param -> - val viewGroup = param.thisObject as ViewGroup - val orientation = viewGroup.getObjectFieldAs("mOrientation") - if (orientation == -1) { - return@after - } - - val dateView = viewGroup.getObjectFieldAs("mDateView") - val landClock = viewGroup.getObjectFieldAs("mLandClock") - - vWeatherView?.setTextSize(0, dateView.textSize) - vWeatherView?.typeface = dateView.typeface - - hWeatherView?.setTextSize(0, landClock.textSize) - hWeatherView?.typeface = landClock.typeface - } + updateResources() + // 更新布局 + updateLayout() + } + + private fun updateResources() { + var method = findMethodExactIfExists(miuiNotificationHeaderView, "updateHeaderResources") + if (method == null) { + method = findMethodExactIfExists(miuiNotificationHeaderView, "updateResources") + } + + method?.createAfterHook { param -> + val viewGroup = param.thisObject as ViewGroup + val orientation = viewGroup.getObjectFieldAs("mOrientation") + if (orientation == -1) { + return@createAfterHook } - // 更新布局 - miuiNotificationHeaderView.methodFinder().filterByName("updateLayout").single().createHook { - before { + val dateView = viewGroup.getObjectFieldAs("mDateView") + val landClock = viewGroup.getObjectFieldAs("mLandClock") + + vWeatherView?.setTextSize(0, dateView.textSize) + vWeatherView?.typeface = dateView.typeface + + hWeatherView?.setTextSize(0, landClock.textSize) + hWeatherView?.typeface = landClock.typeface + } + } + + private fun updateLayout() { + miuiNotificationHeaderView.methodFinder() + .filterByName("updateLayout") + .single().createBeforeHook { val viewGroup = it.thisObject as ViewGroup val context = viewGroup.context val configuration = context.resources.configuration - val orientation = viewGroup.getObjectFieldAs("mOrientation") + var orientation = viewGroup.getObjectFieldAs("mOrientation") val screenLayout = viewGroup.getObjectFieldAs("mScreenLayout") if (orientation == configuration.orientation && screenLayout == configuration.screenLayout ) { - return@before + return@createBeforeHook } + orientation = configuration.orientation + val isVerticalMode = if (isMoreHyperOSVersion(2f)) { miuiConfigs.callStaticMethodAs("isVerticalMode", context) } else { - orientation != ORIENTATION_PORTRAIT || isLargeUI() + orientation == ORIENTATION_PORTRAIT || isLargeUI() } if (isVerticalMode) { @@ -142,92 +155,81 @@ object NotificationWeather : BaseHook() { vWeatherView?.visibility = View.GONE } } - } } private fun newNotificationWeather() { - combinedHeaderController.constructors.single().createHook { - after { param -> - val controller = param.thisObject - val dateView = controller.getObjectFieldAs("notificationDateTime") - val landClock = controller.getObjectFieldAs("notificationHorizontalTime") + combinedHeaderController.constructors.single().createAfterHook { param -> + val controller = param.thisObject + val dateView = controller.getObjectFieldAs("notificationDateTime") + val landClock = controller.getObjectFieldAs("notificationHorizontalTime") - addWeatherViewAfterOf(dateView, ORIENTATION_PORTRAIT) - addWeatherViewAfterOf(landClock, ORIENTATION_LANDSCAPE) + addWeatherViewAfterOf(dateView, ORIENTATION_PORTRAIT) + addWeatherViewAfterOf(landClock, ORIENTATION_LANDSCAPE) - // 创建动画 - hWeatherView?.let { - hWeatherViewFolme = folme.callStaticMethod("useAt", arrayOf(it)) - } - vWeatherView?.let { - vWeatherViewFolme = folme.callStaticMethod("useAt", arrayOf(it)) - } + // 创建动画 + hWeatherView?.let { + hWeatherViewFolme = folme.callStaticMethod("useAt", arrayOf(it)) + } + vWeatherView?.let { + vWeatherViewFolme = folme.callStaticMethod("useAt", arrayOf(it)) } } combinedHeaderController.methodFinder() .filterByName("onSwitchProgressChanged") .filterByParamTypes(Float::class.java) - .first().createHook { - after { param -> - val controller = param.thisObject - val dateView = controller.getObjectFieldAs("notificationDateTime") - val landClock = controller.getObjectFieldAs("notificationHorizontalTime") + .first().createAfterHook { param -> + val controller = param.thisObject + val dateView = controller.getObjectFieldAs("notificationDateTime") + val landClock = controller.getObjectFieldAs("notificationHorizontalTime") - vWeatherView?.translationX = dateView.translationX - vWeatherView?.translationY = dateView.translationY + vWeatherView?.translationX = dateView.translationX + vWeatherView?.translationY = dateView.translationY - hWeatherView?.translationX = landClock.translationX - hWeatherView?.translationY = landClock.translationY - } + hWeatherView?.translationX = landClock.translationX + hWeatherView?.translationY = landClock.translationY } - notificationHeaderExpandController.constructors.single().createHook { - after { param -> - val expandController = param.thisObject - val callback = expandController.getObjectFieldAs("notificationCallback") + notificationHeaderExpandController.constructors.single().createAfterHook { param -> + val expandController = param.thisObject + val callback = expandController.getObjectFieldAs("notificationCallback") - hookNotificationCallback(expandController, callback::class.java) - } + hookNotificationCallback(expandController, callback::class.java) } } private fun hookNotificationCallback(expandController: Any, clazz: Class<*>) { - clazz.methodFinder().filterByName("onAppearanceChanged").first().createHook { - after { - val newAppearance = it.args[0] as Boolean - val animate = it.args[1] as Boolean - - val startFolmeAnimationAlpha = { view: View?, folme: Any? -> - notificationHeaderExpandController.callStaticMethod( - "access\$startFolmeAnimationAlpha", - expandController, - view, - folme, - if (newAppearance) 1F else 0F, - animate, - ) - } - - startFolmeAnimationAlpha(hWeatherView, hWeatherViewFolme) - startFolmeAnimationAlpha(vWeatherView, vWeatherViewFolme) + clazz.methodFinder().filterByName("onAppearanceChanged").first().createAfterHook { + val newAppearance = it.args[0] as Boolean + val animate = it.args[1] as Boolean + + val startFolmeAnimationAlpha = { view: View?, folme: Any? -> + notificationHeaderExpandController.callStaticMethod( + "access\$startFolmeAnimationAlpha", + expandController, + view, + folme, + if (newAppearance) 1F else 0F, + animate, + ) } + + startFolmeAnimationAlpha(hWeatherView, hWeatherViewFolme) + startFolmeAnimationAlpha(vWeatherView, vWeatherViewFolme) } - clazz.methodFinder().filterByName("onExpansionChanged").first().createHook { - after { - val headerController = expandController.getObjectFieldAs("headerController") - .callMethodAs("get") + clazz.methodFinder().filterByName("onExpansionChanged").first().createAfterHook { + val headerController = expandController.getObjectFieldAs("headerController") + .callMethodAs("get") - headerController.getObjectFieldAs("notificationDateTime").let { - vWeatherView?.translationX = it.translationX - vWeatherView?.translationY = it.translationY - } + headerController.getObjectFieldAs("notificationDateTime").let { + vWeatherView?.translationX = it.translationX + vWeatherView?.translationY = it.translationY + } - headerController.getObjectFieldAs("notificationHorizontalTime").let { - hWeatherView?.translationX = it.translationX - hWeatherView?.translationY = it.translationY - } + headerController.getObjectFieldAs("notificationHorizontalTime").let { + hWeatherView?.translationX = it.translationX + hWeatherView?.translationY = it.translationY } } } @@ -235,29 +237,27 @@ object NotificationWeather : BaseHook() { private fun oldNotificationWeather() { miuiNotificationHeaderView.methodFinder() .filterByName("onFinishInflate") - .single().createHook { - after { param -> - val viewGroup = param.thisObject as ViewGroup - val context = viewGroup.context - - val dateView = viewGroup.findViewById( - context.resources.getIdentifier( - "date_time", - "id", - context.packageName - ) + .single().createAfterHook { param -> + val viewGroup = param.thisObject as ViewGroup + val context = viewGroup.context + + val dateView = viewGroup.findViewById( + context.resources.getIdentifier( + "date_time", + "id", + context.packageName ) - val landClock = viewGroup.findViewById( - context.resources.getIdentifier( - "horizontal_time", - "id", - context.packageName - ) + ) + val landClock = viewGroup.findViewById( + context.resources.getIdentifier( + "horizontal_time", + "id", + context.packageName ) + ) - addWeatherViewAfterOf(dateView, ORIENTATION_PORTRAIT) - addWeatherViewAfterOf(landClock, ORIENTATION_LANDSCAPE) - } + addWeatherViewAfterOf(dateView, ORIENTATION_PORTRAIT) + addWeatherViewAfterOf(landClock, ORIENTATION_LANDSCAPE) } } From ba46d7b042e2617571408f9d1b14252a65764453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Mon, 13 Jan 2025 22:16:04 +0800 Subject: [PATCH 30/43] =?UTF-8?q?app=EF=BC=9Aupdate=20version=20to=202.5.1?= =?UTF-8?q?56?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3892069d7..331c96504 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -97,7 +97,7 @@ android { minSdk = 33 targetSdk = 35 versionCode = getVersionCode() - versionName = "2.5.155" + versionName = "2.5.156" val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").apply { timeZone = TimeZone.getTimeZone("Asia/Shanghai") From 696ce6f27c16990bd6fd60139925186492f54db2 Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sat, 18 Jan 2025 09:23:08 +0800 Subject: [PATCH 31/43] =?UTF-8?q?fix:=E5=88=9D=E6=AC=A1=E8=BF=9B=E5=85=A5a?= =?UTF-8?q?pp=E6=97=B6=EF=BC=8C=E7=B3=BB=E7=BB=9F=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=BAen=5FUS=E4=BC=9A=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sevtinge/hyperceiler/utils/LanguageHelper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java index 8bd91a3d0..411c0aa1a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.util.Log; import java.util.Locale; @@ -139,10 +140,14 @@ public static String newLanguage(String language, String country) { public static int resultIndex(String[] languages, String value) { int index = -1; + Log.d("ggc", "resultIndex: "+value); for (String l : languages) { index = index + 1; if (l.equals(value)) { return index; + }else if (value.split("_")[0].equals(l.split("_")[0])){ + return index; + } } return -1; From 5dc8d2d3415748eb603e9a555995cdaf99cf751a Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sat, 18 Jan 2025 09:47:32 +0800 Subject: [PATCH 32/43] =?UTF-8?q?--=E5=88=9D=E6=AC=A1=E8=BF=9B=E5=85=A5app?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E7=B3=BB=E7=BB=9F=E8=AF=AD=E8=A8=80=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=BAen=5FUS=E4=BC=9A=E5=AF=BC=E8=87=B4=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hyperceiler/utils/LanguageHelper.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java index 8bd91a3d0..3baf4a123 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java @@ -138,11 +138,19 @@ public static String newLanguage(String language, String country) { } public static int resultIndex(String[] languages, String value) { - int index = -1; - for (String l : languages) { - index = index + 1; - if (l.equals(value)) { - return index; + + String valueLanguage = value.split("_")[0]; + for (int i = 0; i < languages.length; i++) { + String currentLang = languages[i]; + if (currentLang == null) continue; + + if (currentLang.equals(value)) { + return i; + } + + String currentLanguage = currentLang.split("_")[0]; + if (valueLanguage.equals(currentLanguage)) { + return i;// language匹配成功 } } return -1; From f5ded232072378947bfa2069519ed0d721cbfe07 Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sat, 11 Jan 2025 23:09:58 +0800 Subject: [PATCH 33/43] =?UTF-8?q?#=E5=B0=9D=E8=AF=95=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=99=AE=E9=80=9A=E7=A3=81=E8=B4=B4=E5=9C=86=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controlcenter/CCGridForHyperOSKt.kt | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt index ca6a26ce9..d6bcd6dc0 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt @@ -18,6 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui.controlcenter +import android.content.* import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import com.sevtinge.hyperceiler.utils.prefs.* @@ -58,37 +59,43 @@ object CCGridForHyperOSKt { } } })*/ - XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", classLoader, "setDisabledBg", Drawable::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { + super.beforeHookedMethod(param) val drawable = param?.args?.get(0) as Drawable if (drawable is GradientDrawable) drawable.cornerRadius = radius param.args[0] = drawable } }) - XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", classLoader, "setEnabledBg", Drawable::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { + super.beforeHookedMethod(param) val drawable = param?.args?.get(0) as Drawable if (drawable is GradientDrawable) drawable.cornerRadius = radius param.args[0] = drawable } }) - - // OS1 可能会有的圆角设置 + //OS1可能会有的圆角设置 XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", - classLoader, "setCornerRadius", Float::class.java, + classLoader, + "setCornerRadius", + Float::javaClass, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { + super.beforeHookedMethod(param) param?.args?.set(0, radius) + } + } ) - - // OS2 加载磁贴时的圆角 + //OS2加载磁贴时的圆角 XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", - classLoader, "getCornerRadius", object : XC_MethodReplacement() { + classLoader, + "getCornerRadius", object : XC_MethodReplacement() { + override fun replaceHookedMethod(param: MethodHookParam?): Any { + val pluginContext: Context = XposedHelpers.getObjectField(param?.thisObject, "pluginContext") as Context return radius } }) From 921b4396abec9ddd20b182c70662c8bcc71df5b2 Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sun, 12 Jan 2025 03:50:03 +0800 Subject: [PATCH 34/43] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E7=A3=81=E8=B4=B4?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=94=B6=E8=B5=B7=E5=9C=A8OS2=E4=B8=8A?= =?UTF-8?q?=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/hook/systemui/AutoCollapse.java | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java index 4158bd193..28d40ba71 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java @@ -18,6 +18,8 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isHyperOSVersion; +import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreAndroidVersion; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; import android.view.View; @@ -29,25 +31,38 @@ public class AutoCollapse extends BaseHook { @Override public void init() { - MethodHook method = new MethodHook() { - @Override - protected void after(MethodHookParam param) { - Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); - int state = XposedHelpers.getIntField(mState, "state"); - if (state != 0) { - String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); - if (!"edit".equals(tileSpec)) { - Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); - XposedHelpers.callMethod(mHost, "collapsePanels"); + if (isHyperOSVersion(2f)) { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click","com.android.systemui.animation.Expandable", new MethodHook() { + @Override + protected void after(MethodHookParam param) { + Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); + int state = XposedHelpers.getIntField(mState, "state"); + if (state != 0) { + String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); + if (!"edit".equals(tileSpec)) { + Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); + XposedHelpers.callMethod(mHost, "collapsePanels"); + } } } - } - }; + }); + + }else { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, new MethodHook() { + @Override + protected void after(MethodHookParam param) { + Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); + int state = XposedHelpers.getIntField(mState, "state"); + if (state != 0) { + String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); + if (!"edit".equals(tileSpec)) { + Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); + XposedHelpers.callMethod(mHost, "collapsePanels"); + } + } + } + }); - if (isMoreHyperOSVersion(2f)) { - findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click","com.android.systemui.animation.Expandable", method); - } else { - findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, method); } } } From 3624dc763817593bd7f350c71c9e38ceb41bfd6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Wed, 1 Jan 2025 21:59:24 +0800 Subject: [PATCH 35/43] adj: remove mediaeditor some old func --- .../mediaeditor/UnlockCustomPhotoFrames.kt | 141 ++++++++---------- app/src/main/res/xml/mediaeditor.xml | 106 ++----------- 2 files changed, 74 insertions(+), 173 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index d698239dc..c5c4f840a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -18,125 +18,108 @@ */ package com.sevtinge.hyperceiler.module.hook.mediaeditor -import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook -import com.github.kyuubiran.ezxhelper.MemberExtensions.paramCount -import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* +import com.sevtinge.hyperceiler.module.base.tool.OtherTool.* import java.lang.reflect.* object UnlockCustomPhotoFrames : BaseHook() { private val frames by lazy { mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) } - private val isHookType by lazy { - mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) == 2 - } - private val isOpenSpring by lazy { - mPrefsMap.getBoolean("mediaeditor_unlock_spring") - } - private val isLeica by lazy { - if (!isHookType) { - frames == 1 - } else { - mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_leica") - } - } - private val isRedmi by lazy { - if (!isHookType) { - frames == 2 - } else { - mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_redmi") - } - } - private val isPOCO by lazy { - if (!isHookType) { - frames == 3 - } else { - mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_poco") - } + private val isNewMediaeditor by lazy { + // 以 1.7.5.0.4 为新旧版本分界线 + getPackageVersionCode(lpparam) >= 4658180 } + private val isLeica by lazy { frames == 1 } + private val isRedmi by lazy { frames == 2 } + private val isPOCO by lazy { frames == 3 } - private val methodA by lazy> { - DexKit.findMemberList("MA") { bridge -> + private val publicA by lazy> { + DexKit.findMemberList("PA") { bridge -> bridge.findMethod { matcher { - // 改动日志: - // 现在这个查找方式直接兼容 1.5 - 1.9 - // 1.6.5.10.2 之后迪斯尼定制画框解锁的地方和现在的不一样 - // 1.7.5.0.4 之后,类名迁移,内部文件改动较大 - // 合并缓存,现在只需查询一次即可获取全部 6 个需要 Hook 的方法,且不会出现多余的方法 (2025.1.8) - // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 - if (isHookType) { + // 真是妹想到啊,1.5 和 1.6 版本还以为不会套回去了 + // 现在这个查找方式直接兼容 1.4 - 1.9 + // 1.6.5.10.2 迪斯尼定制画框解锁的地方和现在的不一样 + // 1.7.5.0.4 之后,类名迁移,内部文件改动较大,此为临时解决方案 + if (isNewMediaeditor) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - addUsingField { - // 如果后面有改的话请释放这个注释 - // modifiers = Modifier.STATIC or Modifier.FINAL - type = "java.util.List" - } + modifiers = Modifier.FINAL or Modifier.STATIC returnType = "boolean" + paramCount = 0 + // 1.6.5.10.2 以上方法查找完剩下 a() c() e() } } } } - private val springA by lazy { - DexKit.findMember("SA") { bridge -> - bridge.findField { + // 公共解锁特定机型定制画框使用限制 + private val publicB by lazy> { + DexKit.findMemberList("PB") { dexkit -> + dexkit.findMethod { matcher { - // 改动日志: - // 这里是新春定制画框的解锁,仅在部分版本中存在 - // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 - if (isHookType) { + if (isNewMediaeditor) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - modifiers = Modifier.STATIC - type = "boolean" + // modifiers = Modifier.STATIC // 1.6.5.10.2 改成 STATIC,原来是 FINAL + returnType = "boolean" + paramCount = 1 + addUsingField { + modifiers = Modifier.STATIC or Modifier.FINAL + } } - }.single() + } } } override fun init() { + val publicC = DexKit.findMemberList("PC") { + it.findMethod { + matcher { + publicA.forEach { a -> + name = a.name + } + usingFields { + add { + type = "boolean" + } + } + } + } + } + + val actions = if (isNewMediaeditor) { + listOf<(Method) -> Unit>(::xiaomi, ::redmi, ::poco, ::other) + } else { + listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi, ::other) + } + val differentItems = publicA.subtract(publicC.toSet()) var index = 0 - val actions = listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi) - methodA.forEach { method -> - if (method.paramCount == 1) { - // 公共解锁特定机型定制画框使用限制 - other(method) - } else { - val action = actions[index] - action(method) - index = (index + 1) % actions.size - } + differentItems.forEach { method -> + val action = actions.getOrElse(index) { ::other } + action(method) + index = (index + 1) % actions.size } - if (isOpenSpring && springA != null) { - springA.setBoolean(null, true) + publicB.forEach { method -> + other(method) } - if (isRedmi) { - runCatching { - loadClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils\$isVictoriaDeviceSupport\$2") - .methodFinder().filterByName("invoke").single() - .createHook { - returnConstant(true) - } - }.onFailure { - loadClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils\$isVictoriaDeviceSupport\$2") - .methodFinder().filterByName("invoke").single() - .createHook { - returnConstant(true) - } + /*if (isOpenSpring && publicC.isNotEmpty()) { + publicC.forEach { method -> + other(method) + // 1.6.0.5.2 新增限时新春定制画框 + // 后续版本已移除,其实可以删掉的,但还是留着吧,兴许后面可能还有用 } - } + }*/ } private fun xiaomi(name: Method) { diff --git a/app/src/main/res/xml/mediaeditor.xml b/app/src/main/res/xml/mediaeditor.xml index 3de924fd5..b134ce255 100644 --- a/app/src/main/res/xml/mediaeditor.xml +++ b/app/src/main/res/xml/mediaeditor.xml @@ -20,33 +20,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto" app:myLocation="@string/mediaeditor" app:quick_restart="com.miui.mediaeditor"> - - - - - - - - - - + + - - - - - - - - - + android:defaultValue="" /> - - - - - - - - - - - - - - - - - - - - + + app:entries="@array/customize_frame_type" + app:entryValues="@array/customize_frame_type_value" /> - \ No newline at end of file From 6825683230d4ceb043b8e01edb005926a0bd0a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Thu, 9 Jan 2025 16:11:37 +0800 Subject: [PATCH 36/43] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E7=9B=B8=E5=86=8C=E7=BC=96=E8=BE=91=E9=83=A8=E5=88=86?= =?UTF-8?q?=20hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mediaeditor/UnlockCustomPhotoFrames.kt | 142 +++++++++++------- app/src/main/res/xml/mediaeditor.xml | 106 +++++++++++-- 2 files changed, 178 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index c5c4f840a..8f74ad674 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -19,106 +19,132 @@ package com.sevtinge.hyperceiler.module.hook.mediaeditor import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook +import com.github.kyuubiran.ezxhelper.MemberExtensions.paramCount +import com.github.kyuubiran.ezxhelper.ObjectHelper.Companion.objectHelper import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* -import com.sevtinge.hyperceiler.module.base.tool.OtherTool.* +import com.sevtinge.hyperceiler.utils.* +import com.sevtinge.hyperceiler.utils.api.* +import com.sevtinge.hyperceiler.utils.log.* import java.lang.reflect.* object UnlockCustomPhotoFrames : BaseHook() { private val frames by lazy { mPrefsMap.getStringAsInt("mediaeditor_unlock_custom_photo_frames", 0) } - private val isNewMediaeditor by lazy { - // 以 1.7.5.0.4 为新旧版本分界线 - getPackageVersionCode(lpparam) >= 4658180 + private val isHookType by lazy { + mPrefsMap.getStringAsInt("mediaeditor_hook_type", 0) == 2 + } + private val isOpenSpring by lazy { + mPrefsMap.getBoolean("mediaeditor_unlock_spring") + } + private val isLeica by lazy { + if (!isHookType) { + frames == 1 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_leica") + } + } + private val isRedmi by lazy { + if (!isHookType) { + frames == 2 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_redmi") + } + } + private val isPOCO by lazy { + if (!isHookType) { + frames == 3 + } else { + mPrefsMap.getBoolean("mediaeditor_unlock_custom_photo_frames_poco") + } } - private val isLeica by lazy { frames == 1 } - private val isRedmi by lazy { frames == 2 } - private val isPOCO by lazy { frames == 3 } - private val publicA by lazy> { - DexKit.findMemberList("PA") { bridge -> + private val methodA by lazy> { + DexKit.findMemberList("MA") { bridge -> bridge.findMethod { matcher { - // 真是妹想到啊,1.5 和 1.6 版本还以为不会套回去了 - // 现在这个查找方式直接兼容 1.4 - 1.9 - // 1.6.5.10.2 迪斯尼定制画框解锁的地方和现在的不一样 - // 1.7.5.0.4 之后,类名迁移,内部文件改动较大,此为临时解决方案 - if (isNewMediaeditor) { + // 改动日志: + // 现在这个查找方式直接兼容 1.5 - 1.9 + // 1.6.5.10.2 之后迪斯尼定制画框解锁的地方和现在的不一样 + // 1.7.5.0.4 之后,类名迁移,内部文件改动较大 + // 合并缓存,现在只需查询一次即可获取全部 6 个需要 Hook 的方法,且不会出现多余的方法 (2025.1.8) + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - modifiers = Modifier.FINAL or Modifier.STATIC + addUsingField { + // 如果后面有改的话请释放这个注释 + // modifiers = Modifier.STATIC or Modifier.FINAL + type = "java.util.List" + } returnType = "boolean" - paramCount = 0 - // 1.6.5.10.2 以上方法查找完剩下 a() c() e() } } } } - // 公共解锁特定机型定制画框使用限制 - private val publicB by lazy> { - DexKit.findMemberList("PB") { dexkit -> - dexkit.findMethod { + private val springA by lazy { + DexKit.findMember("SA") { bridge -> + bridge.findField { matcher { - if (isNewMediaeditor) { + // 改动日志: + // 这里是新春定制画框的解锁,仅在部分版本中存在 + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") } else { declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } - // modifiers = Modifier.STATIC // 1.6.5.10.2 改成 STATIC,原来是 FINAL - returnType = "boolean" - paramCount = 1 - addUsingField { - modifiers = Modifier.STATIC or Modifier.FINAL - } + modifiers = Modifier.STATIC + type = "boolean" } - } + }.single() } } - override fun init() { - val publicC = DexKit.findMemberList("PC") { - it.findMethod { + private val redmiB by lazy { + DexKit.findMember("RB") { bridge -> + bridge.findField { matcher { - publicA.forEach { a -> - name = a.name - } - usingFields { - add { - type = "boolean" - } + // 改动日志: + // 这里是红米定制联名画框的解锁 + // 从 1.6.5.10.2 版本开始,解锁此画框的难度较高 + // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 + if (isHookType) { + declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") + } else { + declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") } + modifiers = Modifier.STATIC or Modifier.FINAL } - } + }.last() } + } - val actions = if (isNewMediaeditor) { - listOf<(Method) -> Unit>(::xiaomi, ::redmi, ::poco, ::other) - } else { - listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi, ::other) - } - val differentItems = publicA.subtract(publicC.toSet()) + override fun init() { var index = 0 + val actions = listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi) - differentItems.forEach { method -> - val action = actions.getOrElse(index) { ::other } - action(method) - index = (index + 1) % actions.size + methodA.forEach { method -> + if (method.paramCount == 1) { + // 公共解锁特定机型定制画框使用限制 + other(method) + } else { + val action = actions[index] + action(method) + index = (index + 1) % actions.size + } } - publicB.forEach { method -> - other(method) + if (isOpenSpring && springA != null) { + springA.setBoolean(null, true) } - /*if (isOpenSpring && publicC.isNotEmpty()) { - publicC.forEach { method -> - other(method) - // 1.6.0.5.2 新增限时新春定制画框 - // 后续版本已移除,其实可以删掉的,但还是留着吧,兴许后面可能还有用 - } + /*if (isRedmi && redmiB != null) { + }*/ } diff --git a/app/src/main/res/xml/mediaeditor.xml b/app/src/main/res/xml/mediaeditor.xml index b134ce255..3de924fd5 100644 --- a/app/src/main/res/xml/mediaeditor.xml +++ b/app/src/main/res/xml/mediaeditor.xml @@ -20,17 +20,33 @@ xmlns:app="http://schemas.android.com/apk/res-auto" app:myLocation="@string/mediaeditor" app:quick_restart="com.miui.mediaeditor"> - - + + + + + + + + + + + android:title="@string/camera_custom_watermark" /> + + + + + + + + + - - + android:title="@string/mediaeditor_unlock_spring_title" /> + app:entries="@array/customize_frame_type_v1" + app:entryValues="@array/customize_frame_type_v1_value" /> + \ No newline at end of file From 2b8c045e7c301c153dd0cc5f3f854f89ef2e77a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Fri, 10 Jan 2025 14:14:48 +0800 Subject: [PATCH 37/43] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E7=AE=A1=E5=AE=B6-=E5=85=A8=E5=B1=80=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F-=E9=9A=90=E8=97=8F=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=A0=8F=20=E5=8A=9F=E8=83=BD=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/base/tool/OtherTool.java | 40 ++++++++++++++++++- .../sidebar/AddSideBarExpandReceiver.java | 26 +++++------- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java index 546065efe..e7f9ae816 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java @@ -39,8 +39,13 @@ import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.utils.ContextUtils; import com.sevtinge.hyperceiler.utils.blur.MiBlurUtils; +import com.sevtinge.hyperceiler.utils.blur.MiBlurUtilsKt; + +import java.io.File; +import java.lang.ref.WeakReference; import de.robv.android.xposed.XposedHelpers; +import de.robv.android.xposed.callbacks.XC_LoadPackage; public class OtherTool { // 尝试全部 @@ -53,6 +58,8 @@ public class OtherTool { @SuppressLint("StaticFieldLeak") public static TextView mPct = null; + // public Context mModuleContext = null; + public static Resources getModuleRes(Context context) throws PackageManager.NameNotFoundException { return ResourcesTool.loadModuleRes(context); @@ -62,9 +69,14 @@ public static Context findContext(@ContextUtils.Duration int flag) { Context context = null; try { switch (flag) { - case FLAG_ALL -> context = currentApplication() != null ? currentApplication() : getSystemContext(); + case FLAG_ALL -> { + if ((context = currentApplication()) == null) + context = getSystemContext(); + } case FLAG_CURRENT_APP -> context = currentApplication(); case FlAG_ONLY_ANDROID -> context = getSystemContext(); + default -> { + } } return context; } catch (Throwable ignore) { @@ -113,6 +125,32 @@ public static void setProp(String key, String val) { } } + public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lpparam) { + try { + Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); + Object parser = parserCls.getDeclaredConstructor().newInstance(); + File apkPath = new File(lpparam.appInfo.sourceDir); + Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); + return (String) XposedHelpers.getObjectField(pkg, "mVersionName"); + } catch (Throwable e) { + logE("getPackageVersionCode", e); + return ""; + } + } + + public static int getPackageVersionCode(XC_LoadPackage.LoadPackageParam lpparam) { + try { + Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); + Object parser = parserCls.getDeclaredConstructor().newInstance(); + File apkPath = new File(lpparam.appInfo.sourceDir); + Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); + return XposedHelpers.getIntField(pkg, "mVersionCode"); + } catch (Throwable e) { + logE("getPackageVersionCode", e); + return -1; + } + } + public static void initPct(ViewGroup container, int source) { Resources res = container.getContext().getResources(); if (mPct == null) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index 311a8895f..11c7c7680 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -18,7 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.securitycenter.sidebar; -import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import android.content.BroadcastReceiver; @@ -100,22 +100,16 @@ public void run() { myhandler.removeCallbacks(this); if (!enableSideBar) { Object li = XposedHelpers.getObjectField(view, "mListenerInfo"); - if (li != null) { - try { - Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); - findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - MotionEvent me = (MotionEvent) param.args[1]; - if (me.getSource() != 9999) { - param.setResult(false); - } - } - }); - } catch (Throwable e) { - logE(TAG, lpparam.packageName, "OnTouchListener is failed, " + e); + Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); + findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { + @Override + protected void before(MethodHookParam param) throws Throwable { + MotionEvent me = (MotionEvent) param.args[1]; + if (me.getSource() != 9999) { + param.setResult(false); + } } - } + }); } if (isNewVersion) { try { From 494b86b89fbbe46cf5ae09df7679070b43400af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Fri, 10 Jan 2025 15:47:51 +0800 Subject: [PATCH 38/43] opt: Tools --- .../module/base/tool/OtherTool.java | 40 +------------------ .../sidebar/AddSideBarExpandReceiver.java | 2 +- 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java index e7f9ae816..546065efe 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/OtherTool.java @@ -39,13 +39,8 @@ import com.sevtinge.hyperceiler.R; import com.sevtinge.hyperceiler.utils.ContextUtils; import com.sevtinge.hyperceiler.utils.blur.MiBlurUtils; -import com.sevtinge.hyperceiler.utils.blur.MiBlurUtilsKt; - -import java.io.File; -import java.lang.ref.WeakReference; import de.robv.android.xposed.XposedHelpers; -import de.robv.android.xposed.callbacks.XC_LoadPackage; public class OtherTool { // 尝试全部 @@ -58,8 +53,6 @@ public class OtherTool { @SuppressLint("StaticFieldLeak") public static TextView mPct = null; - // public Context mModuleContext = null; - public static Resources getModuleRes(Context context) throws PackageManager.NameNotFoundException { return ResourcesTool.loadModuleRes(context); @@ -69,14 +62,9 @@ public static Context findContext(@ContextUtils.Duration int flag) { Context context = null; try { switch (flag) { - case FLAG_ALL -> { - if ((context = currentApplication()) == null) - context = getSystemContext(); - } + case FLAG_ALL -> context = currentApplication() != null ? currentApplication() : getSystemContext(); case FLAG_CURRENT_APP -> context = currentApplication(); case FlAG_ONLY_ANDROID -> context = getSystemContext(); - default -> { - } } return context; } catch (Throwable ignore) { @@ -125,32 +113,6 @@ public static void setProp(String key, String val) { } } - public static String getPackageVersionName(XC_LoadPackage.LoadPackageParam lpparam) { - try { - Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.getDeclaredConstructor().newInstance(); - File apkPath = new File(lpparam.appInfo.sourceDir); - Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - return (String) XposedHelpers.getObjectField(pkg, "mVersionName"); - } catch (Throwable e) { - logE("getPackageVersionCode", e); - return ""; - } - } - - public static int getPackageVersionCode(XC_LoadPackage.LoadPackageParam lpparam) { - try { - Class parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader); - Object parser = parserCls.getDeclaredConstructor().newInstance(); - File apkPath = new File(lpparam.appInfo.sourceDir); - Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0); - return XposedHelpers.getIntField(pkg, "mVersionCode"); - } catch (Throwable e) { - logE("getPackageVersionCode", e); - return -1; - } - } - public static void initPct(ViewGroup container, int source) { Resources res = container.getContext().getResources(); if (mPct == null) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index 11c7c7680..ecd4e9970 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -18,7 +18,7 @@ */ package com.sevtinge.hyperceiler.module.hook.securitycenter.sidebar; -import static com.sevtinge.hyperceiler.module.base.tool.OtherTool.getPackageVersionCode; +import static com.sevtinge.hyperceiler.module.base.tool.AppsTool.getPackageVersionCode; import static com.sevtinge.hyperceiler.utils.devicesdk.MiDeviceAppUtilsKt.isPad; import android.content.BroadcastReceiver; From 95dd168374cca7774536f0bfda499ad76f4acdc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=83=E6=9F=92=E6=9F=92?= Date: Sat, 11 Jan 2025 16:57:49 +0800 Subject: [PATCH 39/43] =?UTF-8?q?fix:=20=E7=B3=BB=E7=BB=9F=E7=95=8C?= =?UTF-8?q?=E9=9D=A2-=E7=8A=B6=E6=80=81=E6=A0=8F-=E5=9B=BE=E6=A0=87-?= =?UTF-8?q?=E9=97=B9=E9=92=9F-=E4=BB=85=E5=9C=A8=E9=97=B9=E9=92=9F?= =?UTF-8?q?=E5=93=8D=E9=93=83=E5=89=8D=E6=98=BE=E7=A4=BA=E9=97=B9=E9=92=9F?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=20=E8=AE=BE=E7=BD=AE=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88Miui14-HyperOS2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sidebar/AddSideBarExpandReceiver.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java index ecd4e9970..311a8895f 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/sidebar/AddSideBarExpandReceiver.java @@ -100,16 +100,22 @@ public void run() { myhandler.removeCallbacks(this); if (!enableSideBar) { Object li = XposedHelpers.getObjectField(view, "mListenerInfo"); - Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); - findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - MotionEvent me = (MotionEvent) param.args[1]; - if (me.getSource() != 9999) { - param.setResult(false); - } + if (li != null) { + try { + Object mOnTouchListener = XposedHelpers.getObjectField(li, "mOnTouchListener"); + findAndHookMethod(mOnTouchListener.getClass(), "onTouch", View.class, MotionEvent.class, new MethodHook() { + @Override + protected void before(MethodHookParam param) throws Throwable { + MotionEvent me = (MotionEvent) param.args[1]; + if (me.getSource() != 9999) { + param.setResult(false); + } + } + }); + } catch (Throwable e) { + logE(TAG, lpparam.packageName, "OnTouchListener is failed, " + e); } - }); + } } if (isNewVersion) { try { From 5c5647062a5580e87f7ea84b64b9c7817d13f477 Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sat, 11 Jan 2025 23:09:58 +0800 Subject: [PATCH 40/43] =?UTF-8?q?opt:=20=E6=99=AE=E9=80=9A=E7=A3=81?= =?UTF-8?q?=E8=B4=B4=E5=9C=86=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controlcenter/CCGridForHyperOSKt.kt | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt index d6bcd6dc0..ca6a26ce9 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGridForHyperOSKt.kt @@ -18,7 +18,6 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui.controlcenter -import android.content.* import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import com.sevtinge.hyperceiler.utils.prefs.* @@ -59,43 +58,37 @@ object CCGridForHyperOSKt { } } })*/ + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", classLoader, "setDisabledBg", Drawable::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { - super.beforeHookedMethod(param) val drawable = param?.args?.get(0) as Drawable if (drawable is GradientDrawable) drawable.cornerRadius = radius param.args[0] = drawable } }) + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", classLoader, "setEnabledBg", Drawable::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { - super.beforeHookedMethod(param) val drawable = param?.args?.get(0) as Drawable if (drawable is GradientDrawable) drawable.cornerRadius = radius param.args[0] = drawable } }) - //OS1可能会有的圆角设置 + + // OS1 可能会有的圆角设置 XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", - classLoader, - "setCornerRadius", - Float::javaClass, + classLoader, "setCornerRadius", Float::class.java, object : XC_MethodHook(){ override fun beforeHookedMethod(param: MethodHookParam?) { - super.beforeHookedMethod(param) param?.args?.set(0, radius) - } - } ) - //OS2加载磁贴时的圆角 - XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", - classLoader, - "getCornerRadius", object : XC_MethodReplacement() { + // OS2 加载磁贴时的圆角 + XposedHelpers.findAndHookMethod("miui.systemui.controlcenter.qs.tileview.QSTileItemIconView", + classLoader, "getCornerRadius", object : XC_MethodReplacement() { override fun replaceHookedMethod(param: MethodHookParam?): Any { - val pluginContext: Context = XposedHelpers.getObjectField(param?.thisObject, "pluginContext") as Context return radius } }) From f29c8569d2d190abe82e8f7385d3a98ee3d25c80 Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sun, 12 Jan 2025 03:50:03 +0800 Subject: [PATCH 41/43] =?UTF-8?q?fix:=20=E7=A3=81=E8=B4=B4=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=94=B6=E8=B5=B7=E5=9C=A8=20OS2=20=E4=B8=8A=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/hook/systemui/AutoCollapse.java | 47 +++++++------------ 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java index 28d40ba71..4158bd193 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/AutoCollapse.java @@ -18,8 +18,6 @@ */ package com.sevtinge.hyperceiler.module.hook.systemui; -import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isHyperOSVersion; -import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreAndroidVersion; import static com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt.isMoreHyperOSVersion; import android.view.View; @@ -31,38 +29,25 @@ public class AutoCollapse extends BaseHook { @Override public void init() { - if (isHyperOSVersion(2f)) { - findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click","com.android.systemui.animation.Expandable", new MethodHook() { - @Override - protected void after(MethodHookParam param) { - Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); - int state = XposedHelpers.getIntField(mState, "state"); - if (state != 0) { - String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); - if (!"edit".equals(tileSpec)) { - Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); - XposedHelpers.callMethod(mHost, "collapsePanels"); - } + MethodHook method = new MethodHook() { + @Override + protected void after(MethodHookParam param) { + Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); + int state = XposedHelpers.getIntField(mState, "state"); + if (state != 0) { + String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); + if (!"edit".equals(tileSpec)) { + Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); + XposedHelpers.callMethod(mHost, "collapsePanels"); } } - }); - - }else { - findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, new MethodHook() { - @Override - protected void after(MethodHookParam param) { - Object mState = XposedHelpers.callMethod(param.thisObject, "getState"); - int state = XposedHelpers.getIntField(mState, "state"); - if (state != 0) { - String tileSpec = (String) XposedHelpers.callMethod(param.thisObject, "getTileSpec"); - if (!"edit".equals(tileSpec)) { - Object mHost = XposedHelpers.getObjectField(param.thisObject, "mHost"); - XposedHelpers.callMethod(mHost, "collapsePanels"); - } - } - } - }); + } + }; + if (isMoreHyperOSVersion(2f)) { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click","com.android.systemui.animation.Expandable", method); + } else { + findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileImpl", lpparam.classLoader, "click", View.class, method); } } } From 9eeea272d662eb7a77ee30e6630f52b7a8061c7e Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sat, 18 Jan 2025 09:23:08 +0800 Subject: [PATCH 42/43] =?UTF-8?q?fix:=E5=88=9D=E6=AC=A1=E8=BF=9B=E5=85=A5a?= =?UTF-8?q?pp=E6=97=B6=EF=BC=8C=E7=B3=BB=E7=BB=9F=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=BAen=5FUS=E4=BC=9A=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hyperceiler/utils/LanguageHelper.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java index 3baf4a123..411c0aa1a 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.util.Log; import java.util.Locale; @@ -138,19 +139,15 @@ public static String newLanguage(String language, String country) { } public static int resultIndex(String[] languages, String value) { + int index = -1; + Log.d("ggc", "resultIndex: "+value); + for (String l : languages) { + index = index + 1; + if (l.equals(value)) { + return index; + }else if (value.split("_")[0].equals(l.split("_")[0])){ + return index; - String valueLanguage = value.split("_")[0]; - for (int i = 0; i < languages.length; i++) { - String currentLang = languages[i]; - if (currentLang == null) continue; - - if (currentLang.equals(value)) { - return i; - } - - String currentLanguage = currentLang.split("_")[0]; - if (valueLanguage.equals(currentLanguage)) { - return i;// language匹配成功 } } return -1; From 6e14640fec9c86184d531cc820f81e56b23f371c Mon Sep 17 00:00:00 2001 From: 25748 <2574822036@qq.com> Date: Sat, 18 Jan 2025 09:56:09 +0800 Subject: [PATCH 43/43] =?UTF-8?q?--=E5=88=9D=E6=AC=A1=E8=BF=9B=E5=85=A5app?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E7=B3=BB=E7=BB=9F=E8=AF=AD=E8=A8=80=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=BAen=5FUS=E4=BC=9A=E5=AF=BC=E8=87=B4=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mediaeditor/UnlockCustomPhotoFrames.kt | 43 ++++++++----------- .../hyperceiler/utils/LanguageHelper.java | 22 ++++++---- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt index 8f74ad674..d698239dc 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockCustomPhotoFrames.kt @@ -18,14 +18,12 @@ */ package com.sevtinge.hyperceiler.module.hook.mediaeditor +import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.github.kyuubiran.ezxhelper.MemberExtensions.paramCount -import com.github.kyuubiran.ezxhelper.ObjectHelper.Companion.objectHelper +import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder import com.sevtinge.hyperceiler.module.base.* import com.sevtinge.hyperceiler.module.base.dexkit.* -import com.sevtinge.hyperceiler.utils.* -import com.sevtinge.hyperceiler.utils.api.* -import com.sevtinge.hyperceiler.utils.log.* import java.lang.reflect.* object UnlockCustomPhotoFrames : BaseHook() { @@ -105,25 +103,6 @@ object UnlockCustomPhotoFrames : BaseHook() { } } - private val redmiB by lazy { - DexKit.findMember("RB") { bridge -> - bridge.findField { - matcher { - // 改动日志: - // 这里是红米定制联名画框的解锁 - // 从 1.6.5.10.2 版本开始,解锁此画框的难度较高 - // 这里的 declaredClass 不清楚米米还会不会混淆,混淆了非常麻烦,比如从 1.3 - 1.4 版本的混淆 - if (isHookType) { - declaredClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils") - } else { - declaredClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils") - } - modifiers = Modifier.STATIC or Modifier.FINAL - } - }.last() - } - } - override fun init() { var index = 0 val actions = listOf<(Method) -> Unit>(::xiaomi, ::poco, ::redmi) @@ -143,9 +122,21 @@ object UnlockCustomPhotoFrames : BaseHook() { springA.setBoolean(null, true) } - /*if (isRedmi && redmiB != null) { - - }*/ + if (isRedmi) { + runCatching { + loadClass("com.miui.mediaeditor.config.galleryframe.GalleryFrameAccessUtils\$isVictoriaDeviceSupport\$2") + .methodFinder().filterByName("invoke").single() + .createHook { + returnConstant(true) + } + }.onFailure { + loadClass("com.miui.mediaeditor.photo.config.galleryframe.GalleryFrameAccessUtils\$isVictoriaDeviceSupport\$2") + .methodFinder().filterByName("invoke").single() + .createHook { + returnConstant(true) + } + } + } } private fun xiaomi(name: Method) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java index 411c0aa1a..f6a7cbf4f 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java +++ b/app/src/main/java/com/sevtinge/hyperceiler/utils/LanguageHelper.java @@ -22,7 +22,6 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; -import android.util.Log; import java.util.Locale; @@ -139,15 +138,20 @@ public static String newLanguage(String language, String country) { } public static int resultIndex(String[] languages, String value) { - int index = -1; - Log.d("ggc", "resultIndex: "+value); - for (String l : languages) { - index = index + 1; - if (l.equals(value)) { - return index; - }else if (value.split("_")[0].equals(l.split("_")[0])){ - return index; + String targetLanguage = value.split("_")[0]; + + for (int i = 0; i < languages.length; i++) { + String currentLang = languages[i]; + if (currentLang == null) continue; + + if (currentLang.equals(value)) { + return i; + } + + String currentLanguage = currentLang.split("_")[0]; + if (targetLanguage.equals(currentLanguage)) { + return i; // Language匹配成功 } } return -1;