diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index 1e8e1500d2..fc7ef31afa 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -67,11 +67,6 @@ jobs:
name: HyperCeiler Canary
path: ${{ env.APK_FILE_CANARY }}
- - name: Commit
- run: |
- text="${{ github.event.sha }} ${{ github.event.head_commit.message }}"
- echo "commit=$(echo $text | sed 's/\([][\\`.*^$\/+?{}()=!|:-]\)/\\\1/g')" >> $GITHUB_ENV
-
- name: Post to Canary Channel
if: ${{ github.ref == 'refs/heads/main' && github.ref_type != 'tag' && contains(github.event.head_commit.message, '[skip post]') == false && contains(github.event.head_commit.message, 's#') == false }}
shell: bash
@@ -80,11 +75,10 @@ jobs:
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
CANARY: ${{ env.APK_FILE_CANARY }}
COMMIT_MESSAGE: |+
- **New push to github\!**
-
- `${{ env.commit }}`
-
- by ${{ github.event.head_commit.author.name }}
+ New push to GitHub
+ ```
+ ${{ github.event.head_commit.message }}
+ ```by `${{ github.event.head_commit.author.name }}`
See commit detail [here](${{ github.event.head_commit.url }})
run: |
ESCAPED=$(python3 -c 'import json,os,urllib.parse; print(urllib.parse.quote(json.dumps(os.environ["COMMIT_MESSAGE"])))')
diff --git a/.github/workflows/android_pr.yml b/.github/workflows/android_pr.yml
index 281dcdea0a..da91ca9123 100644
--- a/.github/workflows/android_pr.yml
+++ b/.github/workflows/android_pr.yml
@@ -56,9 +56,10 @@ jobs:
GROUP_DEBUG_ID: ${{ secrets.GROUP_DEBUG_ID }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
DEBUG: ${{ env.APK_FILE_DEBUG }}
- COMMIT_MESSAGE: |+
- **New PR to gitHub\!**
- by ${{ github.triggering_actor }}
+ COMMIT_MESSAGE: |+
+ New push to GitHub
+ by `${{ github.triggering_actor }}`
+ See commit detail [here](${{ github.event.head_commit.url }})
run: |
ESCAPED=$(python3 -c 'import json,os,urllib.parse; print(urllib.parse.quote(json.dumps(os.environ["COMMIT_MESSAGE"])))')
cd ${{ github.workspace }}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/Home.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/Home.java
index 15c7765531..6bb6582541 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/Home.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/Home.java
@@ -39,7 +39,9 @@
import com.sevtinge.hyperceiler.module.hook.home.dock.DockCustomNew;
import com.sevtinge.hyperceiler.module.hook.home.dock.FoldDeviceDock;
import com.sevtinge.hyperceiler.module.hook.home.dock.FoldDock;
+import com.sevtinge.hyperceiler.module.hook.home.dock.HideDock;
import com.sevtinge.hyperceiler.module.hook.home.dock.ShowDockIconTitle;
+import com.sevtinge.hyperceiler.module.hook.home.dock.SlideUpOnlyShowDock;
import com.sevtinge.hyperceiler.module.hook.home.drawer.AllAppsContainerViewBlur;
import com.sevtinge.hyperceiler.module.hook.home.drawer.AppDrawer;
import com.sevtinge.hyperceiler.module.hook.home.drawer.PinyinArrangement;
@@ -251,6 +253,8 @@ public void handleLoadPackage() {
initHook(ShowDockIconTitle.INSTANCE, mPrefsMap.getBoolean("home_dock_icon_title"));
initHook(new HideNavigationBar(), mPrefsMap.getBoolean("system_ui_hide_navigation_bar"));
initHook(DisableRecentsIcon.INSTANCE, mPrefsMap.getBoolean("home_dock_disable_recents_icon"));
+ initHook(SlideUpOnlyShowDock.INSTANCE, mPrefsMap.getBoolean("home_dock_slide_up_only_show_dock") && !mPrefsMap.getBoolean("home_dock_hide_dock"));
+ initHook(HideDock.INSTANCE, mPrefsMap.getBoolean("home_dock_hide_dock"));
// 其他
initHook(new LockApp(), mPrefsMap.getBoolean("system_framework_guided_access"));
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework.java
index 8d03214058..f3563c50ba 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemFramework.java
@@ -156,7 +156,7 @@ public void handleLoadPackage() {
// Other
initHook(new PackagePermissions());
- initHook(new RotationButton(), mPrefsMap.getBoolean("system_framework_other_rotation_button"));
+ initHook(new RotationButton(), mPrefsMap.getStringAsInt("system_framework_other_rotation_button_int", 0) == 2);
initHook(new GlobalActions(), mLoadPackageParam.processName.equals("android"));
initHook(new ThermalBrightness(), mPrefsMap.getBoolean("system_framework_other_thermal_brightness"));
initHook(DisableCleaner.INSTANCE, mPrefsMap.getBoolean("system_framework_other_disable_cleaner"));
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI.java b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI.java
index 485fcb6757..31ec3314c4 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI.java
@@ -32,13 +32,17 @@
import com.sevtinge.hyperceiler.module.hook.systemui.DisableBottomBar;
import com.sevtinge.hyperceiler.module.hook.systemui.DisableMiuiMultiWinSwitch;
import com.sevtinge.hyperceiler.module.hook.systemui.DisableTransparent;
+import com.sevtinge.hyperceiler.module.hook.systemui.MediaButton;
import com.sevtinge.hyperceiler.module.hook.systemui.MonetThemeOverlay;
import com.sevtinge.hyperceiler.module.hook.systemui.NotificationFix;
import com.sevtinge.hyperceiler.module.hook.systemui.NotificationFreeform;
import com.sevtinge.hyperceiler.module.hook.systemui.QSDetailBackGround;
+import com.sevtinge.hyperceiler.module.hook.systemui.SquigglyProgress;
import com.sevtinge.hyperceiler.module.hook.systemui.StatusBarActions;
import com.sevtinge.hyperceiler.module.hook.systemui.UiLockApp;
+import com.sevtinge.hyperceiler.module.hook.systemui.UnimportantNotification;
import com.sevtinge.hyperceiler.module.hook.systemui.UnlockClipboard;
+import com.sevtinge.hyperceiler.module.hook.systemui.UnlockCustomActions;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.AddBlurEffectToNotificationView;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.AllowAllThemesNotificationBlur;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.CCGrid;
@@ -52,6 +56,8 @@
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.GmsTile;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.HideDelimiter;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.MediaControlPanelBackgroundMix;
+import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.MediaControlPanelTimeViewTextSize;
+import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.MediaControlSeekbarCustom;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.MoreCardTiles;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.MuteVisibleNotifications;
import com.sevtinge.hyperceiler.module.hook.systemui.controlcenter.NotificationImportanceHyperOSFix;
@@ -132,7 +138,8 @@
public class SystemUI extends BaseModule {
@Override
public void handleLoadPackage() {
-
+ // PluginHelper
+ initHook(new PluginHelper());
// 充电动画
initHook(new ChargeAnimationStyle(), mPrefsMap.getStringAsInt("system_ui_charge_animation_style", 0) > 0);
// initHook(DisableChargeAnimation.INSTANCE);
@@ -153,6 +160,12 @@ public void handleLoadPackage() {
initHook(new StatusBarIcon());
initHook(new IconsFromSystemManager());
+ initHook(new UnlockCustomActions(), mPrefsMap.getBoolean("system_ui_control_center_media_control_unlock_custom_actions"));
+ initHook(new MediaButton(), mPrefsMap.getInt("system_ui_control_center_media_control_media_button", 140) != 140
+ || mPrefsMap.getInt("system_ui_control_center_media_control_media_button_custom", 140) != 140);
+ initHook(new SquigglyProgress(), mPrefsMap.getStringAsInt("system_ui_control_center_media_control_progress_mode", 0) == 1);
+ initHook(new MediaControlSeekbarCustom(), mPrefsMap.getStringAsInt("system_ui_control_center_media_control_progress_mode", 0) == 2);
+ initHook(new MediaControlPanelTimeViewTextSize(), mPrefsMap.getInt("system_ui_control_center_media_control_time_view_text_size", 13) != 13);
initHook(new BluetoothIcon(), mPrefsMap.getStringAsInt("system_ui_status_bar_icon_bluetooth", 0) != 0 && !isMoreHyperOSVersion(1f));
initHook(new WifiStandard(), mPrefsMap.getStringAsInt("system_ui_status_bar_icon_wifi_standard", 0) > 0);
initHook(new SelectiveHideIconForAlarmClock(), mPrefsMap.getStringAsInt("system_ui_status_bar_icon_alarm_clock", 0) == 3 && mPrefsMap.getInt("system_ui_status_bar_icon_alarm_clock_n", 0) > 0);
@@ -226,6 +239,8 @@ public void handleLoadPackage() {
initHook(new DisplayHardwareDetail(), mPrefsMap.getBoolean("system_ui_statusbar_battery_enable") ||
mPrefsMap.getBoolean("system_ui_statusbar_temp_enable"));
+ // initHook(new DisplayHardwareDetailForHyper(), true);
+
// 灵动提示
initHook(HideStrongToast.INSTANCE, mPrefsMap.getBoolean("system_ui_status_bar_strong_toast_hide"));
@@ -249,7 +264,7 @@ public void handleLoadPackage() {
initHook(HandleLineCustom.INSTANCE, mPrefsMap.getBoolean("system_ui_navigation_handle_custom"));
initHook(new NavigationCustom(), mPrefsMap.getBoolean("system_ui_navigation_custom"));
initHook(new HideNavigationBar(), mPrefsMap.getBoolean("system_ui_hide_navigation_bar"));
- initHook(new RotationButton(), true);
+ initHook(new RotationButton(), mPrefsMap.getStringAsInt("system_framework_other_rotation_button_int", 0) != 0);
// 状态栏布局
initHook(StatusBarLayout.INSTANCE, mPrefsMap.getBoolean("system_ui_statusbar_layout_compatibility_mode") ||
mPrefsMap.getStringAsInt("system_ui_statusbar_layout_mode", 0) != 0);
@@ -260,6 +275,7 @@ public void handleLoadPackage() {
// 控制中心
// initHook(new SmartHome(), false);
+ initHook(new UnimportantNotification(), mPrefsMap.getBoolean("system_ui_control_center_unimportant_notification"));
initHook(new BlurEnable(), mPrefsMap.getBoolean("system_ui_control_center_statusbar_blur"));
initHook(new ExpandNotification(), !mPrefsMap.getStringSet("system_ui_control_center_expand_notification").isEmpty());
initHook(new HideDelimiter(), mPrefsMap.getStringAsInt("system_ui_control_center_hide_operator", 0) != 0);
@@ -280,12 +296,16 @@ public void handleLoadPackage() {
initHook(NotificationWeatherOld.INSTANCE, mPrefsMap.getBoolean("system_ui_control_center_show_weather"));
initHook(NotificationWeatherNew.INSTANCE, mPrefsMap.getBoolean("system_ui_control_center_show_weather"));
initHook(CompactNotificationsHook.INSTANCE, mPrefsMap.getBoolean("system_ui_control_center_compact_notice"));
- initHook(CCGrid.INSTANCE, mPrefsMap.getInt("system_control_center_cc_rows", 4) > 4 ||
+ /*initHook(CCGridOld.INSTANCE, 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") && !isMoreHyperOSVersion(1f)) ||
- mPrefsMap.getBoolean("system_control_center_qs_tile_label"));
- initHook(new QSGrid(), mPrefsMap.getBoolean("system_control_center_old_enable"));
- initHook(new QQSGrid(), mPrefsMap.getBoolean("system_control_center_old_enable"));
+ mPrefsMap.getBoolean("system_control_center_qs_tile_label"));*/
+ initHook(new CCGrid(), (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") ||
+ mPrefsMap.getBoolean("system_control_center_qs_tile_label")) && !isMoreHyperOSVersion(1f));
+ initHook(new QSGrid(), mPrefsMap.getBoolean("system_control_center_old_enable"));
+ initHook(new QQSGrid(), mPrefsMap.getBoolean("system_control_center_old_enable"));
initHook(new MoreCardTiles(), mPrefsMap.getStringAsInt("system_ui_control_center_more_card_tiles", 0) != 0);
initHook(new AutoCollapse(), mPrefsMap.getBoolean("system_ui_control_auto_close"));
initHook(RedirectToNotificationChannelSetting.INSTANCE, mPrefsMap.getBoolean("system_ui_control_center_redirect_notice"));
@@ -332,7 +352,5 @@ public void handleLoadPackage() {
initHook(DoubleTapToSleep.INSTANCE, mPrefsMap.getBoolean("system_ui_status_bar_double_tap_to_sleep"));
initHook(new AllowManageAllNotifications(), mPrefsMap.getBoolean("system_framework_allow_manage_all_notifications"));
-
- initHook(new PluginHelper());
}
}
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 4227dfe55c..faeca5ec06 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
@@ -20,6 +20,7 @@
import com.github.kyuubiran.ezxhelper.EzXHelper;
import com.sevtinge.hyperceiler.XposedInit;
+import com.sevtinge.hyperceiler.module.base.dexkit.DexKit;
import com.sevtinge.hyperceiler.module.base.dexkit.InitDexKit;
import com.sevtinge.hyperceiler.utils.ContextUtils;
import com.sevtinge.hyperceiler.utils.api.ProjectApi;
@@ -32,17 +33,8 @@ public abstract class BaseModule implements IXposedHook {
public LoadPackageParam mLoadPackageParam = null;
public String TAG = getClass().getSimpleName();
- public static ILoadDexKit loadDexKit;
public final PrefsMap mPrefsMap = XposedInit.mPrefsMap;
- public interface ILoadDexKit {
- void createDexKit(LoadPackageParam lpparam, String TAG);
- }
-
- public static void setLoadDexKit(ILoadDexKit iLoadDexKit) {
- loadDexKit = iLoadDexKit;
- }
-
public void init(LoadPackageParam lpparam) {
EzXHelper.initHandleLoadPackage(lpparam);
EzXHelper.setLogTag(TAG);
@@ -53,6 +45,11 @@ public void init(LoadPackageParam lpparam) {
ContextUtils.getWaitContext(
context -> {
if (context != null) {
+ // try {
+ // Handler handler = new Handler(context.getMainLooper());
+ // BaseXposedInit.mResHook.putHandler(handler);
+ // } catch (Throwable e) {
+ // }
BaseXposedInit.mResHook.loadModuleRes(context);
// mResHook.loadModuleRes(context);
}
@@ -62,12 +59,11 @@ public void init(LoadPackageParam lpparam) {
XposedLogUtils.logE(TAG, "get context failed!" + e);
}
mLoadPackageParam = lpparam;
+ InitDexKit kit = new InitDexKit(lpparam, TAG);
+ DexKit.INSTANCE.setInitDexKit(kit);
initZygote();
- DexKitHelper helper = new DexKitHelper();
- InitDexKit kit = new InitDexKit();
- loadDexKit.createDexKit(mLoadPackageParam, TAG);
handleLoadPackage();
- if (helper.useDexKit) {
+ if (kit.isInit) {
try {
kit.closeHostDir();
// XposedLogUtils.logE(TAG, "close dexkit s: " + lpparam.packageName);
@@ -90,17 +86,4 @@ public void initHook(BaseHook baseHook, boolean isInit) {
baseHook.onCreate(mLoadPackageParam);
}
}
-
- private static class DexKitHelper implements InitDexKit.IUseDexKit {
- public boolean useDexKit = false;
-
- public DexKitHelper() {
- InitDexKit.setUseDexKit(this);
- }
-
- @Override
- public void useDexKit(boolean use) {
- useDexKit = use;
- }
- }
}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseXposedInit.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseXposedInit.java
index d3441231f5..df7b0aeab4 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseXposedInit.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/BaseXposedInit.java
@@ -162,7 +162,7 @@ public abstract class BaseXposedInit {
@CallSuper
public void initZygote(IXposedHookZygoteInit.StartupParam startupParam) throws Throwable {
setXSharedPrefs();
- mResHook = new ResourcesTool();
+ mResHook = new ResourcesTool(startupParam.modulePath);
mModulePath = startupParam.modulePath;
}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.kt
index f0f9f1782b..e98b902a5d 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.kt
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/DexKit.kt
@@ -18,34 +18,18 @@
*/
package com.sevtinge.hyperceiler.module.base.dexkit
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
-import org.luckypray.dexkit.DexKitBridge
-import org.luckypray.dexkit.query.enums.StringMatchType
-import org.luckypray.dexkit.query.matchers.ClassMatcher
-import org.luckypray.dexkit.query.matchers.MethodMatcher
+import org.luckypray.dexkit.*
+import org.luckypray.dexkit.query.enums.*
+import org.luckypray.dexkit.query.matchers.*
/**
* DexKit 工具
*/
object DexKit {
- var hostDir: String? = null
- var isInitialized = false
- val dexKitBridge: DexKitBridge by lazy {
- InitDexKit.init()
- }
+ var initDexKit: InitDexKit? = null
- /**
- * 初始化 DexKit 的 apk 完整路径
- */
- fun initDexKit(loadPackageParam: LoadPackageParam) {
- hostDir = loadPackageParam.appInfo.sourceDir
- }
-
- /**
- * 关闭 DexKit bridge
- */
- fun closeDexKit() {
- if (isInitialized) dexKitBridge.close()
+ val dexKitBridge: DexKitBridge by lazy {
+ initDexKit!!.init()
}
/**
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/InitDexKit.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/InitDexKit.java
index 716330a61f..3a9e98de39 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/InitDexKit.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/dexkit/InitDexKit.java
@@ -1,78 +1,63 @@
/*
- * This file is part of HyperCeiler.
+ * 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.
+ * 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.
+ * 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 .
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
- * Copyright (C) 2023-2024 HyperCeiler Contributions
-*/
+ * Copyright (C) 2023-2024 HyperCeiler Contributions
+ */
package com.sevtinge.hyperceiler.module.base.dexkit;
-import com.sevtinge.hyperceiler.module.base.BaseModule;
-
import org.luckypray.dexkit.DexKitBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
-public class InitDexKit implements BaseModule.ILoadDexKit {
- public static XC_LoadPackage.LoadPackageParam mLpparam;
- public static IUseDexKit iUseDexKit;
- public static String mTAG;
- private static String hostDir = null;
-
- public InitDexKit() {
- BaseModule.setLoadDexKit(this);
- }
-
- public interface IUseDexKit {
- void useDexKit(boolean use);
- }
+public class InitDexKit {
+ public String mTAG;
+ public XC_LoadPackage.LoadPackageParam mLpparam;
+ public DexKitBridge mDexKitBridge = null;
+ public boolean isInit = false;
+ private String hostDir = null;
- public static void setUseDexKit(IUseDexKit useDexKit) {
- iUseDexKit = useDexKit;
+ public InitDexKit(XC_LoadPackage.LoadPackageParam param, String tag) {
+ mLpparam = param;
+ mTAG = tag;
}
- public static DexKitBridge init() throws Exception {
- if (hostDir == null) {
- if (mLpparam == null) {
- throw new Exception(mTAG != null ? mTAG : "InitDexKit" + ": lpparam is null");
+ public DexKitBridge init() throws Exception {
+ if (mDexKitBridge == null) {
+ if (hostDir == null) {
+ if (mLpparam == null) {
+ throw new Exception(mTAG != null ? mTAG : "InitDexKit" + ": lpparam is null");
+ }
+ hostDir = mLpparam.appInfo.sourceDir;
}
- hostDir = mLpparam.appInfo.sourceDir;
+ System.loadLibrary("dexkit");
+ // XposedLogUtils.logE(mTAG, "dexkit: " + hostDir);
+ mDexKitBridge = DexKitBridge.create(hostDir);
}
- System.loadLibrary("dexkit");
- // XposedLogUtils.logE(mTAG, "dexkit: " + hostDir);
- DexKitBridge bridge = DexKitBridge.create(hostDir);
- DexKit.INSTANCE.setInitialized(true);
- setHostDir(hostDir);
- iUseDexKit.useDexKit(true);
- return bridge;
- }
-
- public static void setHostDir(String dir) {
- DexKit.INSTANCE.setHostDir(dir);
+ isInit = true;
+ return mDexKitBridge;
}
public void closeHostDir() throws Exception {
if (mLpparam != null) {
- DexKit.INSTANCE.closeDexKit();
+ mDexKitBridge.close();
+ mDexKitBridge = null;
+ // DexKit.INSTANCE.setDexKitBridge(null);
+ isInit = false;
} else {
throw new Exception(mTAG + ": lpparam is null");
}
}
-
- @Override
- public void createDexKit(XC_LoadPackage.LoadPackageParam lpparam, String TAG) {
- mLpparam = lpparam;
- mTAG = TAG;
- }
}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/HookTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/HookTool.java
index 5f8e6a6df0..b39912a864 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/HookTool.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/HookTool.java
@@ -226,7 +226,7 @@ public void findAndHookConstructor(Class> hookClass, Object... parameterTypesA
XposedHelpers.findAndHookConstructor(hookClass, parameterTypesAndCallback);
}
- public void findAndHookConstructor(String className, ClassLoader classLoader, Object... parameterTypesAndCallback) {
+ public static void findAndHookConstructor(String className, ClassLoader classLoader, Object... parameterTypesAndCallback) {
XposedHelpers.findAndHookConstructor(className, classLoader, parameterTypesAndCallback);
}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/ResourcesTool.java b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/ResourcesTool.java
index 66af9f29b9..afadfc6c68 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/ResourcesTool.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/ResourcesTool.java
@@ -29,12 +29,19 @@
import android.content.res.AssetManager;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.content.res.loader.ResourcesLoader;
+import android.content.res.loader.ResourcesProvider;
+import android.os.Build;
+import android.os.Handler;
+import android.os.ParcelFileDescriptor;
import android.util.Pair;
import com.sevtinge.hyperceiler.XposedInit;
import com.sevtinge.hyperceiler.utils.ContextUtils;
import com.sevtinge.hyperceiler.utils.log.XposedLogUtils;
+import java.io.File;
+import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -53,7 +60,9 @@ public class ResourcesTool {
private boolean hooksApplied = false;
private boolean isInit = false;
private boolean useModuleRes = true;
- // private Context mContext = null;
+ private final String mModulePath;
+ private Handler mHandler = null;
+ private ResourcesLoader resourcesLoader = null;
private final ConcurrentHashMap resMap = new ConcurrentHashMap<>();
private final ArrayList unhooks = new ArrayList<>();
@@ -65,7 +74,8 @@ protected enum ReplacementType {
private final ConcurrentHashMap> replacements = new ConcurrentHashMap<>();
- public ResourcesTool() {
+ public ResourcesTool(String modulePath) {
+ mModulePath = modulePath;
applyHooks();
isInit = true;
}
@@ -84,11 +94,11 @@ public static int getFakeResId(String resourceName) {
/**
* @noinspection JavaReflectionMemberAccess
*/
- private int loadRes(Context context) {
+ private boolean loadResBelowApi30(Context context) {
// String TAG = "addModuleRes";
try {
return (int) XposedHelpers.callMethod(context.getResources().getAssets(), "addAssetPath",
- XposedInit.mModulePath);
+ XposedInit.mModulePath) != 0;
} catch (Throwable e) {
XposedLogUtils.logE(TAG, "CallMethod addAssetPathInternal failed!" + e);
}
@@ -96,7 +106,7 @@ private int loadRes(Context context) {
@SuppressLint({"SoonBlockedPrivateApi", "DiscouragedPrivateApi"})
Method AssetPath = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);
AssetPath.setAccessible(true);
- return Integer.parseInt(String.valueOf(AssetPath.invoke(context.getResources().getAssets(), XposedInit.mModulePath)));
+ return Integer.parseInt(String.valueOf(AssetPath.invoke(context.getResources().getAssets(), XposedInit.mModulePath))) != 0;
} catch (NoSuchMethodException e) {
XposedLogUtils.logE(TAG, "Method addAssetPath is null: ", e);
} catch (InvocationTargetException e) {
@@ -106,19 +116,55 @@ private int loadRes(Context context) {
} catch (NumberFormatException e) {
XposedLogUtils.logE(TAG, "NumberFormatException: ", e);
}
- return 0;
+ return false;
+ }
+
+ /**
+ * 来自 QA 的方法
+ */
+ private boolean loadResAboveApi30(Context context) {
+ if (resourcesLoader == null) {
+ try (ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(mModulePath),
+ ParcelFileDescriptor.MODE_READ_ONLY)) {
+ ResourcesProvider provider = ResourcesProvider.loadFromApk(pfd);
+ ResourcesLoader loader = new ResourcesLoader();
+ loader.addProvider(provider);
+ resourcesLoader = loader;
+ } catch (IOException e) {
+ XposedLogUtils.logE(TAG, "Failed to add resource!: " + e);
+ return false;
+ }
+ }
+ // if (Looper.myLooper() == Looper.getMainLooper()) {
+ context.getResources().addLoaders(resourcesLoader);
+ // } else {
+ // if (mHandler != null) {
+ // mHandler.post(() -> context.getResources().addLoaders(resourcesLoader));
+ // } else {
+ // return false;
+ // }
+ // }
+ return true;
}
/**
* 获取添加后的 Res.
* 一般不需要,除非上面 loadModuleRes 加载后依然无效。
+ *
+ * @noinspection UnusedReturnValue
*/
public Resources loadModuleRes(Context context) {
+ boolean load;
if (context == null) {
XposedLogUtils.logE(TAG, "context can't is null!!");
return null;
}
- if (loadRes(context) == 0) {
+ if (Build.VERSION.SDK_INT >= 30) {
+ load = loadResAboveApi30(context);
+ } else {
+ load = loadResBelowApi30(context);
+ }
+ if (!load) {
XposedLogUtils.logW(TAG, "loadModuleRes return 0, It may have failed. Try the second method ...");
try {
Resources resources = getModuleRes(context);
@@ -131,6 +177,10 @@ public Resources loadModuleRes(Context context) {
return context.getResources();
}
+ public void putHandler(Handler handler) {
+ mHandler = handler;
+ }
+
public static Context getModuleContext(Context context)
throws PackageManager.NameNotFoundException {
return getModuleContext(context, null);
@@ -221,13 +271,12 @@ protected void before(MethodHookParam param) {
} catch (Resources.NotFoundException e) {
value = findRes(context, method, param.args);
}
-
if (Boolean.TRUE.equals(resMap.get((int) param.args[0]))) {
resMap.remove((int) param.args[0]);
}
+ if (value == null) return;
+ param.setResult(value);
}
- if (value == null) return;
- param.setResult(value);
}
}
};
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/externalstorage/DisableFolderCantUse.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/externalstorage/DisableFolderCantUse.java
index df8d18dc30..854f17f77c 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/externalstorage/DisableFolderCantUse.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/externalstorage/DisableFolderCantUse.java
@@ -18,16 +18,33 @@
*/
package com.sevtinge.hyperceiler.module.hook.externalstorage;
+import static com.sevtinge.hyperceiler.module.base.tool.HookTool.MethodHook.returnConstant;
+
import com.sevtinge.hyperceiler.module.base.BaseHook;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
public class DisableFolderCantUse extends BaseHook {
+
+ private final static List METHOD_NAME_LIST = Arrays.asList("shouldBlockFromTree", "shouldBlockDirectoryFromTree");
+
@Override
public void init() {
- findAndHookMethod("com.android.externalstorage.ExternalStorageProvider", "shouldBlockFromTree", String.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) {
- param.setResult(false);
- }
- });
+ Class> externalStorageProvider = findClass("com.android.externalstorage.ExternalStorageProvider");
+ List methodList = Arrays.stream(externalStorageProvider.getDeclaredMethods())
+ .filter(method -> METHOD_NAME_LIST.contains(method.getName()))
+ .filter(method -> method.getReturnType() == boolean.class).collect(Collectors.toList());
+
+ if (methodList.isEmpty()) {
+ logE(TAG, lpparam.packageName, new NoSuchMethodException("shouldBlockFromTree"));
+ return;
+ }
+
+ for (Method method : methodList) {
+ hookMethod(method, returnConstant(false));
+ }
}
}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/dock/HideDock.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/dock/HideDock.kt
new file mode 100644
index 0000000000..5b56aabda6
--- /dev/null
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/dock/HideDock.kt
@@ -0,0 +1,23 @@
+package com.sevtinge.hyperceiler.module.hook.home.dock
+
+import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass
+import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook
+import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder
+import com.sevtinge.hyperceiler.module.base.*
+
+
+object HideDock : BaseHook() {
+ override fun init() {
+ // 上滑时忽略dock,直接触发最近任务手势
+ loadClass("com.miui.home.recents.GestureTouchEventTracker").methodFinder()
+ .filterByName("isTouchCountAndHotSeatSupport").single().createHook {
+ returnConstant(false)
+ }
+
+ // 拦截dock出现动画
+ loadClass("com.miui.home.launcher.dock.DockStateMachine").methodFinder()
+ .filterByName("transitionToAppearingState\$default").single().createHook {
+ replace { }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/dock/SlideUpOnlyShowDock.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/dock/SlideUpOnlyShowDock.kt
new file mode 100644
index 0000000000..9409846483
--- /dev/null
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/dock/SlideUpOnlyShowDock.kt
@@ -0,0 +1,161 @@
+package com.sevtinge.hyperceiler.module.hook.home.dock
+
+import android.view.*
+import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass
+import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook
+import com.github.kyuubiran.ezxhelper.finders.MethodFinder.`-Static`.methodFinder
+import com.sevtinge.hyperceiler.module.base.*
+import com.sevtinge.hyperceiler.utils.*
+
+
+object SlideUpOnlyShowDock : BaseHook() {
+ override fun init() {
+ loadClass("com.miui.home.recents.DockGestureHelper").methodFinder()
+ .filterByName("dispatchTouchEvent").single().createHook {
+ replace {
+ // ================
+ // DockController dockController = getDockController();
+ // if (dockController == null) {
+ // Log.e("DockGestureHelper", "onTouchEvent: dockController=" + getDockController());
+ // return;
+ // }
+ // ================
+ val dockController = it.thisObject.callMethod("getDockController")
+ ?: return@replace null
+
+ // ================
+ // int actionMasked = motionEvent.getActionMasked();
+ // if (actionMasked == 3 || actionMasked == 1) {
+ // this.mTransitionYStyle.cancel();
+ // this.mIsDockTransitionAnimStart = false;
+ // }
+ // ================
+ val motionEvent = it.args[0] as MotionEvent
+ val actionMasked = motionEvent.actionMasked
+ if (actionMasked == 3 || actionMasked == 1) {
+ it.thisObject.getObjectField("mTransitionYStyle")?.callMethod("cancel")
+ it.thisObject.setBooleanField("mIsDockTransitionAnimStart", false)
+ }
+
+
+ // ================
+ // if (!dockController.isFloatingDockShowing()) {
+ // if (motionEvent.getEventTime() - motionEvent.getDownTime() >= 180) {
+ // if (actionMasked == 3 || actionMasked == 1 || actionMasked == 6 || actionMasked == 5) {
+ // dockController.dispatchUpEvent(motionEvent, this.mTouchTracker.getUpType());
+ // } else {
+ // animationTransitionDock(motionEvent, dockController);
+ // dockController.addMovement(motionEvent);
+ // dockController.updateLeaveSafeAreaStatus(motionEvent.getRawX(), motionEvent.getRawY(), true);
+ // }
+ // } else if (actionMasked != 3 && actionMasked != 1) {
+ // dockController.addMovement(motionEvent);
+ // dockController.updateLeaveSafeAreaStatus(motionEvent.getRawX(), motionEvent.getRawY(), false);
+ // }
+ // ================
+ val b = dockController.callMethod("isFloatingDockShowing") as Boolean
+ if (!b) {
+ // 将判断时间设置为0
+ // if (motionEvent.eventTime - motionEvent.downTime >= 180) {
+ if (actionMasked == 3 || actionMasked == 1 || actionMasked == 6 || actionMasked == 5) {
+ // dockController.callMethod("dispatchUpEvent", motionEvent, it.thisObject.getObjectField("mTouchTracker")?.callMethod("getUpType"))
+ // 设置为10, 表示是慢速上滑,后面就会执行打开dock的逻辑,如果是5则为快速上滑,会执行跳转桌面的逻辑
+ dockController.callMethod("dispatchUpEvent", motionEvent, 10)
+ } else {
+ it.thisObject.callMethod(
+ "animationTransitionDock", motionEvent, dockController
+ )
+ dockController.callMethod("addMovement", motionEvent)
+ dockController.callMethod(
+ "updateLeaveSafeAreaStatus",
+ motionEvent.rawX,
+ motionEvent.rawY,
+ true
+ )
+ }
+ // } else if (actionMasked != 3 && actionMasked != 1) {
+ // dockController.callMethod("addMovement", motionEvent)
+ // dockController.callMethod(
+ // "updateLeaveSafeAreaStatus",
+ // motionEvent.rawX,
+ // motionEvent.rawY,
+ // false
+ // )
+ // }
+ }
+
+ // ================
+ // if (!this.isStartedGesture) {
+ // if (isTargetValue(actionMasked, 2) && (dockController.isLeaveSafeArea() || this.mTouchTracker.isTaskStartMove(motionEvent.getRawY()))) {
+ // startGestureModeGesture(0);
+ // } else if (isTargetValue(actionMasked, 1, 3) && this.mTouchTracker.getUpType() == 5) {
+ // startGestureModeGesture(1);
+ // }
+ // }
+ // ================
+ // val isStartedGesture = it.thisObject.getBooleanField("isStartedGesture")
+ // if (!isStartedGesture) {
+ // if (it.thisObject.callMethod(
+ // "isTargetValue",
+ // actionMasked,
+ // 2
+ // ) as Boolean && (dockController.callMethod("isLeaveSafeArea") as Boolean || it.thisObject.callMethod(
+ // "mTouchTracker"
+ // )?.callMethod("isTaskStartMove", motionEvent.rawY) as Boolean)
+ // ) {
+ // it.thisObject.callMethod("startGestureModeGesture", 0)
+ // } else if (it.thisObject.callMethod(
+ // "isTargetValue",
+ // actionMasked,
+ // 1,
+ // 3
+ // ) as Boolean && it.thisObject.callMethod("mTouchTracker")
+ // ?.callMethod("getUpType") == 5
+ // ) {
+ // it.thisObject.callMethod("startGestureModeGesture", 1)
+ // }
+ // }
+ // 这部分是跳转最近任务或者桌面的逻辑,直接去掉
+
+
+ // ================
+ // if (this.isStartedGesture) {
+ // this.mGestureInputHelper.dispatchGestureModeTouchEvent(motionEvent);
+ // } else if ((actionMasked == 1 || actionMasked == 6) && (launcher = Application.getLauncher()) != null) {
+ // launcher.notifyPowerKeeperGesture("gesture_end", !this.mTouchTracker.isKeyboardEventTracker());
+ // }
+ // ================
+
+
+ val isStartedGesture0 = it.thisObject.getBooleanField("isStartedGesture")
+ if (isStartedGesture0) {
+ it.thisObject.callMethod("mGestureInputHelper")
+ ?.callMethod("dispatchGestureModeTouchEvent", motionEvent)
+ } else if (actionMasked == 1 || actionMasked == 6) {
+ val launcher = findClassIfExists(
+ "com.miui.home.launcher.Application", lpparam.classLoader
+ ).callStaticMethod("getLauncher")
+ launcher?.javaClass?.getDeclaredMethod(
+ "notifyPowerKeeperGesture",
+ String::class.java,
+ Boolean::class.javaPrimitiveType
+ )?.invoke(
+ launcher,
+ "gesture_end",
+ !(it.thisObject.getObjectField("mTouchTracker")!!
+ .callMethod("isKeyboardEventTracker") as Boolean)
+ )
+ } else {
+ }
+ }
+ }
+
+ // 拦截通过dock快速上滑进入桌面的方法
+ loadClass("com.miui.home.recents.DockGestureHelper").methodFinder()
+ .filterByName("startGestureModeGesture").single().createHook {
+ replace { }
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/navigation/HideNavigationBar.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/navigation/HideNavigationBar.java
index bde86a26d6..f4c4d62b4d 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/navigation/HideNavigationBar.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/navigation/HideNavigationBar.java
@@ -1,21 +1,21 @@
/*
- * This file is part of HyperCeiler.
+ * 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.
+ * 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.
+ * 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 .
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
- * Copyright (C) 2023-2024 HyperCeiler Contributions
-*/
+ * Copyright (C) 2023-2024 HyperCeiler Contributions
+ */
package com.sevtinge.hyperceiler.module.hook.home.navigation;
import android.provider.Settings;
@@ -31,58 +31,65 @@ public class HideNavigationBar extends BaseHook {
public void init() {
/*横屏隐藏*/
findAndHookMethod("com.miui.home.recents.views.RecentsContainer",
- "showLandscapeOverviewGestureView",
- boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) {
- param.args[0] = false;
+ "showLandscapeOverviewGestureView",
+ boolean.class,
+ new MethodHook() {
+ @Override
+ protected void before(MethodHookParam param) {
+ param.args[0] = false;
+ }
}
- }
);
/*锁定返回*/
findAndHookMethod("com.miui.home.recents.NavStubView",
- "isMistakeTouch", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) {
- View navView = (View) param.thisObject;
- boolean misTouch = false;
- boolean setting = Settings.Global.getInt(navView.getContext().getContentResolver(), "show_mistake_touch_toast", 1) != 0;
- if (setting) {
- boolean mIsShowStatusBar = XposedHelpers.getBooleanField(param.thisObject, "mIsShowStatusBar");
- if (!mIsShowStatusBar) {
- misTouch = (boolean) XposedHelpers.callMethod(param.thisObject, "isLandScapeActually");
+ "isMistakeTouch",
+ new MethodHook() {
+ @Override
+ protected void before(MethodHookParam param) {
+ View navView = (View) param.thisObject;
+ boolean misTouch;
+ boolean setting = Settings.Global.getInt(navView.getContext().getContentResolver(), "show_mistake_touch_toast", 1) == 0;
+ if (setting) {
+ param.setResult(setting);
+ return;
}
+ // boolean mIsShowStatusBar = (boolean) XposedHelpers.callMethod(param.thisObject, "isImmersive");
+ misTouch = (boolean) XposedHelpers.callMethod(param.thisObject, "isLandScapeActually");
+ param.setResult(misTouch);
}
- param.setResult(misTouch);
}
- }
);
/*横屏设置状态*/
findAndHookMethod("com.miui.home.recents.NavStubView", "onPointerEvent",
- MotionEvent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) {
- boolean mIsInFsMode = XposedHelpers.getBooleanField(param.thisObject, "mIsInFsMode");
- if (!mIsInFsMode) {
+ MotionEvent.class,
+ new MethodHook() {
+ @Override
+ protected void before(MethodHookParam param) {
+ boolean mIsInFsMode = XposedHelpers.getBooleanField(param.thisObject, "mIsInFsMode");
MotionEvent motionEvent = (MotionEvent) param.args[0];
- if (motionEvent.getAction() == 0) {
- XposedHelpers.setObjectField(param.thisObject, "mHideGestureLine", true);
+ if (!mIsInFsMode) {
+ if (motionEvent.getAction() == 0) {
+ XposedHelpers.setObjectField(param.thisObject, "mHideGestureLine", true);
+ // XposedHelpers.setObjectField(param.thisObject, "mIsShowNavBar", true);
+ // XposedHelpers.setObjectField(param.thisObject, "mIsShowStatusBar", true);
+ }
}
}
}
- }
);
/*恢复状态*/
findAndHookMethod("com.miui.home.recents.NavStubView", "updateScreenSize",
- new MethodHook() {
- @Override
- protected void before(MethodHookParam param) {
- XposedHelpers.setObjectField(param.thisObject, "mHideGestureLine", false);
+ new MethodHook() {
+ @Override
+ protected void before(MethodHookParam param) {
+ XposedHelpers.setObjectField(param.thisObject, "mHideGestureLine", false);
+ // XposedHelpers.setObjectField(param.thisObject, "mIsShowNavBar", true);
+ // XposedHelpers.setObjectField(param.thisObject, "mIsShowStatusBar", true);
+ }
}
- }
);
}
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 e391bc7666..a07ac5fd06 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
@@ -44,6 +44,7 @@
public class AppDisable extends BaseHook {
public ArrayList mMiuiCoreApps = new ArrayList<>();
+ private MenuItem menuItem = null;
@Override
public void init() {
@@ -54,6 +55,8 @@ public void init() {
protected void after(MethodHookParam param) throws Throwable {
Activity act = (Activity) param.thisObject;
Menu menu = (Menu) param.args[0];
+ menuItem = menu.findItem(6);
+ if (menuItem != null) menuItem.setVisible(false);
MenuItem dis = menu.add(0, 666, 1,
act.getResources().getIdentifier("app_manager_disable_text", "string", lpparam.packageName));
dis.setIcon(act.getResources().getIdentifier("action_button_stop_svg", "drawable", lpparam.packageName));
@@ -66,7 +69,8 @@ protected void after(MethodHookParam param) throws Throwable {
ApplicationInfo appInfo = pm.getApplicationInfo(mPackageInfo.packageName, PackageManager.GET_META_DATA);
boolean isSystem = (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
boolean isUpdatedSystem = (appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
- dis.setTitle(act.getResources().getIdentifier(appInfo.enabled ? "app_manager_disable_text" : "app_manager_enable_text", "string", lpparam.packageName));
+ dis.setTitle(act.getResources().getIdentifier(appInfo.enabled ? "app_manager_disable_text" : "app_manager_enable_text",
+ "string", lpparam.packageName));
getModuleRes(act);
mMiuiCoreApps = new ArrayList<>(Arrays.asList(act.getResources().getStringArray(R.array.miui_core_app_package_name)));
if (mMiuiCoreApps.contains(mPackageInfo.packageName)) {
@@ -80,6 +84,26 @@ protected void after(MethodHookParam param) throws Throwable {
}
);
+ findAndHookMethod("com.miui.appmanager.ApplicationsDetailsActivity",
+ "onPrepareOptionsMenu", Menu.class,
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ if (menuItem != null) menuItem.setVisible(false);
+ }
+ }
+ );
+
+ findAndHookMethod("com.miui.appmanager.ApplicationsDetailsActivity",
+ "onResume",
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ if (menuItem != null) menuItem.setVisible(false);
+ }
+ }
+ );
+
findAndHookMethod("com.miui.appmanager.ApplicationsDetailsActivity",
"onOptionsItemSelected", MenuItem.class,
new MethodHook() {
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/RotationButton.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/RotationButton.java
index 657b5e95c5..7ce8070079 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/RotationButton.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemframework/RotationButton.java
@@ -19,24 +19,30 @@
package com.sevtinge.hyperceiler.module.hook.systemframework;
import android.content.Context;
-import android.os.Handler;
import android.provider.Settings;
import com.sevtinge.hyperceiler.module.base.BaseHook;
+import com.sevtinge.hyperceiler.utils.devicesdk.SystemSDKKt;
import de.robv.android.xposed.XposedHelpers;
public class RotationButton extends BaseHook {
Context context;
+ boolean isHyper = false;
+
@Override
public void init() throws NoSuchMethodException {
- findAndHookConstructor("com.android.server.wm.DisplayRotation$OrientationListener",
- "com.android.server.wm.DisplayRotation", Context.class, Handler.class,
+ isHyper = SystemSDKKt.isMoreHyperOSVersion(1f);
+ if (isHyper) return;
+ hookAllConstructors("com.android.server.wm.DisplayRotation$OrientationListener",
new MethodHook() {
@Override
protected void after(MethodHookParam param) {
- context = (Context) param.args[1];
+ Object arg = param.args[1];
+ if (arg instanceof Context) {
+ context = (Context) param.args[1];
+ }
}
}
);
@@ -67,7 +73,7 @@ protected void before(MethodHookParam param) {
);
- findAndHookMethod("com.android.server.wm.DisplayRotation",
+ /*findAndHookMethod("com.android.server.wm.DisplayRotation",
"isRotationChoicePossible", int.class,
new MethodHook() {
@Override
@@ -80,7 +86,7 @@ protected void after(MethodHookParam param) throws Throwable {
// }
}
}
- );
+ );*/
}
private void setData(Context context, String value) {
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/MediaButton.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/MediaButton.java
new file mode 100644
index 0000000000..22f152ba72
--- /dev/null
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/MediaButton.java
@@ -0,0 +1,78 @@
+package com.sevtinge.hyperceiler.module.hook.systemui;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.media.session.MediaController;
+import android.media.session.PlaybackState;
+import android.os.UserHandle;
+
+import com.sevtinge.hyperceiler.module.base.BaseHook;
+
+import java.lang.reflect.Method;
+
+import de.robv.android.xposed.XposedHelpers;
+
+public class MediaButton extends BaseHook {
+ private String pkg = null;
+ 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 {
+ findAndHookMethod("com.android.systemui.media.controls.pipeline.MediaDataManager",
+ "createActionsFromState", String.class, MediaController.class, UserHandle.class,
+ new MethodHook() {
+ @Override
+ protected void before(MethodHookParam param) {
+ pkg = (String) param.args[0];
+ }
+ }
+ );
+
+ findAndHookMethod("com.android.systemui.media.controls.pipeline.MediaDataManager$createActionsFromState$customActions$1",
+ "invoke", Object.class, new MethodHook() {
+
+ @Override
+ protected void after(MethodHookParam param) throws Throwable {
+ if (typeCustom != 140) {
+ PlaybackState.CustomAction customAction = (PlaybackState.CustomAction) param.args[0];
+ Object MediaAction = param.getResult();
+ Object mediaDataManager = XposedHelpers.getObjectField(param.thisObject, "this$0");
+ Context context = (Context) XposedHelpers.getObjectField(mediaDataManager, "context");
+ Icon createWithResource = Icon.createWithResource(pkg, customAction.getIcon());
+ Drawable loadDrawable = createWithResource.loadDrawable(context);
+ Class> DrawableUtils = findClassIfExists("com.miui.utils.DrawableUtils", lpparam.classLoader);
+ Method method = DrawableUtils.getDeclaredMethod("drawable2Bitmap", Drawable.class);
+ Bitmap bitmap = (Bitmap) method.invoke(null, loadDrawable);
+ loadDrawable = new BitmapDrawable(context.getResources(), Bitmap.createScaledBitmap(bitmap,
+ typeCustom, typeCustom, true));
+ XposedHelpers.setObjectField(MediaAction, "icon", loadDrawable);
+ }
+ }
+ }
+ );
+
+ findAndHookMethod("com.android.systemui.media.controls.pipeline.MediaDataManager",
+ "getStandardAction", MediaController.class, long.class, long.class,
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) throws Throwable {
+ if (type != 140) {
+ Object MediaAction = param.getResult();
+ Context context = (Context) XposedHelpers.getObjectField(param.thisObject, "context");
+ Drawable drawable = (Drawable) XposedHelpers.getObjectField(MediaAction, "icon");
+ Class> DrawableUtils = findClassIfExists("com.miui.utils.DrawableUtils", lpparam.classLoader);
+ Method method = DrawableUtils.getDeclaredMethod("drawable2Bitmap", Drawable.class);
+ Bitmap bitmap = (Bitmap) method.invoke(null, drawable);
+ drawable = new BitmapDrawable(context.getResources(), Bitmap.createScaledBitmap(bitmap,
+ type, type, true));
+ XposedHelpers.setObjectField(MediaAction, "icon", drawable);
+ }
+ }
+ }
+ );
+ }
+}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/SquigglyProgress.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/SquigglyProgress.java
new file mode 100644
index 0000000000..d63466d2ad
--- /dev/null
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/SquigglyProgress.java
@@ -0,0 +1,25 @@
+package com.sevtinge.hyperceiler.module.hook.systemui;
+
+import android.graphics.drawable.Drawable;
+import android.widget.SeekBar;
+
+import com.sevtinge.hyperceiler.module.base.BaseHook;
+
+import de.robv.android.xposed.XposedHelpers;
+
+public class SquigglyProgress extends BaseHook {
+ @Override
+ public void init() throws NoSuchMethodException {
+ findAndHookConstructor("com.android.systemui.media.controls.models.player.MediaViewHolder",
+ android.view.View.class, new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ SeekBar seekBar = (SeekBar) XposedHelpers.getObjectField(param.thisObject, "seekBar");
+ Object squigglyProgress = XposedHelpers.newInstance(
+ findClassIfExists("com.android.systemui.media.controls.ui.SquigglyProgress"));
+ seekBar.setProgressDrawable((Drawable) squigglyProgress);
+ }
+ }
+ );
+ }
+}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/UnimportantNotification.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/UnimportantNotification.java
new file mode 100644
index 0000000000..be2380615e
--- /dev/null
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/UnimportantNotification.java
@@ -0,0 +1,56 @@
+/*
+ * 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-2024 HyperCeiler Contributions
+ */
+package com.sevtinge.hyperceiler.module.hook.systemui;
+
+import com.sevtinge.hyperceiler.module.base.BaseHook;
+
+import java.util.ArrayList;
+
+import de.robv.android.xposed.XposedHelpers;
+
+public class UnimportantNotification extends BaseHook {
+ @Override
+ public void init() throws NoSuchMethodException {
+ findAndHookMethod("com.android.systemui.statusbar.notification.collection.coordinator.FoldCoordinator$shadeExpansionListener$1",
+ "onPanelExpansionChanged", "com.android.systemui.shade.ShadeExpansionChangeEvent",
+ new MethodHook() {
+ @Override
+ protected void before(MethodHookParam param) {
+ Object FoldCoordinator = XposedHelpers.getObjectField(param.thisObject, "this$0");
+ XposedHelpers.setObjectField(FoldCoordinator, "mPendingNotifications", new ArrayList<>());
+ }
+ }
+ );
+
+ findAndHookMethod("com.android.systemui.statusbar.notification.collection.coordinator.FoldCoordinator",
+ "access$shouldIgnoreEntry",
+ "com.android.systemui.statusbar.notification.collection.coordinator.FoldCoordinator",
+ "com.android.systemui.statusbar.notification.collection.NotificationEntry",
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ // Object mSbn = XposedHelpers.getObjectField(param.args[1], "mSbn");
+ // String getPackageName = (String) XposedHelpers.callMethod(mSbn, "getPackageName");
+ // logE(TAG, "after: " + param.getResult() + " pkg: " + getPackageName);
+ param.setResult(true);
+ }
+ }
+ );
+ }
+}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/UnlockCustomActions.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/UnlockCustomActions.java
new file mode 100644
index 0000000000..78402e9e77
--- /dev/null
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/UnlockCustomActions.java
@@ -0,0 +1,27 @@
+package com.sevtinge.hyperceiler.module.hook.systemui;
+
+import com.sevtinge.hyperceiler.module.base.BaseHook;
+
+import java.util.ArrayList;
+
+import de.robv.android.xposed.XposedHelpers;
+
+public class UnlockCustomActions extends BaseHook {
+
+ @Override
+ public void init() throws NoSuchMethodException {
+ findAndHookMethod("com.android.systemui.media.controls.pipeline.MediaDataManager$createActionsFromState$customActions$1",
+ "invoke", Object.class
+ , new MethodHook() {
+ @Override
+ protected void before(MethodHookParam param) {
+ Object INSTANCE = XposedHelpers.getStaticObjectField(
+ findClassIfExists("com.android.systemui.statusbar.notification.NotificationSettingsManager$Holder"),
+ "INSTANCE");
+ XposedHelpers.setObjectField(INSTANCE, "mHiddenCustomActionsList", new ArrayList<>());
+ }
+
+ }
+ );
+ }
+}
diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGrid.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGrid.java
new file mode 100644
index 0000000000..3d63ee2712
--- /dev/null
+++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/controlcenter/CCGrid.java
@@ -0,0 +1,241 @@
+package com.sevtinge.hyperceiler.module.hook.systemui.controlcenter;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+import com.sevtinge.hyperceiler.R;
+import com.sevtinge.hyperceiler.module.base.BaseHook;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import de.robv.android.xposed.XposedHelpers;
+
+public class CCGrid extends BaseHook {
+ private static final int cols = mPrefsMap.getInt("system_control_center_cc_columns", 4); // 列数
+ private static final int rows = mPrefsMap.getInt("system_control_center_cc_rows", 4); // 行数
+ private static final boolean label = mPrefsMap.getBoolean("system_control_center_qs_tile_label"); // 移除标题
+ private static float scaledTileWidthDim = -1f;
+
+ @Override
+ public void init() throws NoSuchMethodException {
+ final String pkg = lpparam.packageName;
+ if (cols > 4) {
+ mResHook.setObjectReplacement(pkg, "dimen", "qs_control_tiles_columns", cols);
+ }
+
+ findAndHookMethod("com.android.systemui.SystemUIApplication",
+ "onCreate",
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ Context mContext = (Context) XposedHelpers.callMethod(param.thisObject,
+ "getApplicationContext");
+ Resources resources = mContext.getResources();
+ float density = resources.getDisplayMetrics().density;
+ int tileWidthResId = resources.getIdentifier("qs_control_center_tile_width", "dimen", "com.android.systemui");
+ float tileWidthDim = resources.getDimension(tileWidthResId);
+ if (cols > 4) {
+ tileWidthDim /= density;
+ scaledTileWidthDim = tileWidthDim * 4 / cols;
+ mResHook.setDensityReplacement(pkg, "dimen", "qs_control_center_tile_width",
+ scaledTileWidthDim);
+ mResHook.setDensityReplacement("miui.systemui.plugin", "dimen", "qs_control_center_tile_width",
+ scaledTileWidthDim);
+ mResHook.setDensityReplacement(pkg, "dimen", "qs_control_tile_icon_bg_size",
+ scaledTileWidthDim);
+ mResHook.setDensityReplacement("miui.systemui.plugin", "dimen", "qs_control_tile_icon_bg_size",
+ scaledTileWidthDim);
+ mResHook.setDensityReplacement("miui.systemui.plugin", "dimen", "qs_cell_height", 85f);
+ }
+ }
+
+ }
+ );
+ }
+
+ public static void loadCCGrid(ClassLoader pluginLoader) {
+ if (cols > 4) {
+ findAndHookConstructor("miui.systemui.controlcenter.qs.QSPager",
+ pluginLoader, Context.class, AttributeSet.class,
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ XposedHelpers.setObjectField(param.thisObject, "columns", cols);
+ }
+ }
+ );
+ }
+ if (!label) {
+ findAndHookMethod("miui.systemui.controlcenter.qs.tileview.StandardTileView", pluginLoader,
+ "createLabel", boolean.class,
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ Object label = XposedHelpers.getObjectField(param.thisObject, "label");
+ if (label != null) {
+ TextView lb = (TextView) label;
+ lb.setMaxLines(1);
+ lb.setSingleLine(true);
+ lb.setEllipsize(TextUtils.TruncateAt.MARQUEE);
+ lb.setMarqueeRepeatLimit(0);
+ View labelContainer = (View) XposedHelpers.getObjectField(param.thisObject, "labelContainer");
+ labelContainer.setPadding(4, 0, 4, 0);
+
+ }
+ }
+ }
+ );
+ }
+ if (rows != 4) {
+ findAndHookMethod("miui.systemui.controlcenter.qs.QSPager", pluginLoader,
+ "distributeTiles",
+ new MethodHook() {
+ @Override
+ protected void after(MethodHookParam param) {
+ boolean collapse = XposedHelpers.getBooleanField(param.thisObject, "collapse");
+ if (collapse) {
+ ArrayList> pages = (ArrayList>) XposedHelpers.getObjectField(param.thisObject, "pages");
+ for (Object tileLayoutImpl : pages) {
+ XposedHelpers.callMethod(tileLayoutImpl, "removeTiles");
+ }
+ ArrayList
Ẩn thanh ngang
Không chuyển đổi phím điều hướng
+ Không ẩn dòng nhắc cử chỉ
Vui lòng khởi động lại Miui Home và SystemUi
Tùy chỉnh thanh ngang
Chiều cao
@@ -657,7 +659,6 @@ Chức năng này là chức năng thử nghiệm có độ ổn định caoKích thước hàng đôi (0 là giá trị gốc)
Chỉ hợp lệ khi hiển thị ở hai hàng
Cố định màu
- Tính năng thử nghiệm
Tắt hoạt ảnh chuyển tiếp đồng hồ trong trung tâm thông báo
Cài đặt đồng hồ trên thanh trạng thái không được đồng bộ hóa
Đồng hồ trên thanh thông báo lớn không còn đồng bộ với định dạng đồng hồ trên thanh trạng thái
@@ -745,6 +746,14 @@ Chức năng này là chức năng thử nghiệm có độ ổn định caoGiá trị làm mờ nền
Độ trong suốt nền thanh thông báo kéo xuống
Tối ưu hóa hiệu ứng trộn màu của bảng điều khiển phương tiện
+ Thanh tiến trình
+ Loại bỏ hạn chế trong việc áp dụng các hành động tùy chỉnh cho thẻ thông báo phương tiện
+ Sóng
+ Trơn
+ Độ dày
+ Kích thước văn bản xem thời gian
+ Tùy chỉnh kích thước của nút hành động
+ Kích thước nút hành động có sẵn
Xóa nền màu hỗn hợp khỏi thẻ
Bán kính mờ ảnh nền
Độ mờ của lớp phủ nền
@@ -756,6 +765,7 @@ Chức năng này là chức năng thử nghiệm có độ ổn định caoHiện thị thành phố
Ẩn lời nhắc giám sát mạng
Tắt âm thông báo khi màn hình bật
+ Thu gọn vào thông báo lịch sử bị cấm
Mở rộng thông báo
Khi màn hình đang bật, thông báo không phát âm thanh
Ô hình chữ nhật bo tròn
@@ -1145,6 +1155,10 @@ Chức năng này là chức năng thử nghiệm có độ ổn định caoHiển thị tiêu đề ứng dụng
Ẩn ứng dụng gần đây khỏi thanh Dock
Tùy chỉnh làm mờ nền
+ Vuốt lên để chỉ hiển thị Dock
+ Vuốt lên lần thứ hai và chuyển đến tác vụ gần đây
+ Ẩn Dock
+ Sau khi bật, \"Vuốt lên để chỉ hiển thị Dock\" sẽ không hợp lệ.
Khác
Phím tắt
Chế độ máy tính
@@ -1479,6 +1493,7 @@ Hãy đảm bảo rằng các ứng dụng hệ thống có siêu dữ liệu is
Quản lý ứng dụng
Cài đặt ngôn ngữ
Siêu tối
+ Ứng dụng mặc định
Nhập
Không có con trỏ ảo
Biến con trỏ MIUI tròn thành con trỏ AOSP.
@@ -1582,7 +1597,10 @@ Hãy đảm bảo rằng các ứng dụng hệ thống có siêu dữ liệu is
Ứng dụng đã gỡ cài đặt:\n
Ứng dụng bị tắt hoặc bị ẩn:\n
Để duy trì tính đơn giản và khả năng sử dụng của trang chủ, chúng tôi ẩn quyền truy cập vào các loại tính năng ứng dụng sau:\n\n - Những tính năng này hiện bị vô hiệu hóa hoặc bị ẩn\n - Những tính năng này không được tìm thấy trên thiết bị của bạn\n - Những tính năng không tương thích với hệ thống hiện tại hoặc phiên bản ứng dụng\n\nVui lòng khắc phục sự cố dựa trên thông tin ở trên, khởi động lại HyperCeiler và thử lại. Nếu bạn vẫn không thể tìm thấy tính năng ứng dụng thì đó có thể là lỗi. Vui lòng cung cấp cho chúng tôi phản hồi kịp thời và hiệu quả.\n\nHiện không có mục ẩn nào!
+ Ẩn trợ giúp này trong trang chủ
+ Bạn vẫn có thể tìm thấy trang này trong \"Cài đặt - Thiết lập lối tắt trang chủ\". Khởi động lại ứng dụng để áp dụng.
Nguồn ROM bạn đang sử dụng có thể không phải chính thức từ Xiaomi và một số chức năng có thể không hoạt động, vui lòng liên hệ nhà cung cấp bạn đang sử dụng để biết chi tiết.
Xác minh chữ ký không thành công và phiên bản hiện tại bạn đang sử dụng có thể không phải là phiên bản chính thức của Re.chronoRain và có thể chứa mã độc.
Mẹo: Đây là mẹo mặc định. Nếu bạn có thể nhìn thấy tôi, điều đó có nghĩa là có vấn đề với HyperCeiler. Vui lòng thông báo cho nhà phát triển một cách kịp thời và hiệu quả.
+ Bạn đang cần tìm gì?
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index c75c8e3f61..4fc7c7f38e 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -308,6 +308,8 @@
系统默认模式
强制最高亮度
+ 强制启用
+
关闭
默认写入模式
写入模式一
@@ -326,9 +328,9 @@
上下行网速单行显示
上下行网速双排显示
- 单行状态栏时钟
- 状态栏时钟\n通知中心迷你时钟
- 通知中心迷你时钟\n状态栏时钟
+ 单行显示\n\n仅状态栏时钟
+ 双行显示\n\n状态栏时钟在上\n通知中心迷你时钟在下
+ 双行显示\n\n通知中心迷你时钟在上\n状态栏时钟在下
米老鼠
草莓熊
@@ -567,6 +569,7 @@
手势提示线
隐藏手势提示线
请勿切换经典导航键
+ 请勿隐藏手势提示线
请重启 \"系统桌面\" 和 \"系统界面\" 两个作用域
自定义手势提示线
高度
@@ -721,7 +724,6 @@
不同步状态栏时钟设置
通知中心大时钟不再同步状态栏时钟格式
修复时钟反色时颜色异常
- 实验性功能
显示
通知中心大时钟加粗
@@ -810,7 +812,15 @@
默认主题无需调节
通知背景透明度
下拉通知背景透明度
+ 媒体进度条样式
+ 波浪
+ 圆滑
+ 粗细
+ 解除自定义动作应用限制
+ 时间预览文本大小
优化音乐面板背景混色效果
+ 自定义动作按钮大小
+ 固有动作按钮大小
移除卡片混色背景
背景模糊半径
背景叠加层透明度
@@ -821,6 +831,7 @@
显示天气
显示地区
隐藏网络监控提示
+ 禁止折叠为历史通知
亮屏时静音
展开通知
亮屏时弹出通知不播放提示音
@@ -1221,6 +1232,10 @@
显示应用标题
隐藏 Dock 栏最近应用的图标
添加 Dock 栏背景模糊
+ 上滑只展示 Dock 栏
+ 第二次上滑再跳转到最近任务
+ 隐藏 Dock 栏
+ 开启后 \"上滑只展示 Dock 栏\" 将失效
其他
快捷菜单
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index de33872df5..a062e1a5a0 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -263,6 +263,7 @@
關閉
系統預設模式
強制最大亮度
+ 強制
關閉
預設寫入模式
寫入模式一
@@ -277,9 +278,9 @@
值和單位雙排顯示
上下行網速單行顯示
上下行網速雙排顯示
- 單行狀態欄時鐘
- 狀態欄時鐘\n通知欄迷你時鐘
- 通知欄迷你時鐘\n狀態欄時鐘
+ 單行顯示\n\n僅狀態欄時鐘
+ 兩行顯示\n\n頂部狀態欄時鐘\n底部通知欄迷你時鐘
+ 兩行顯示\n\n頂部通知欄迷你時鐘\n底部狀態欄時鐘
米奇
草莓熊
@@ -511,6 +512,7 @@
手勢提示線
隱藏導覽欄
不要切換導航鍵
+ 不要隱藏手勢提示線
請重新啟動 「系統桌面」 和 「系統介面」
手勢提示線自訂
高度
@@ -655,7 +657,6 @@
雙排時鐘大小
僅在雙排顯示下生效
修復時鐘反色時的顏色異常
- 實驗性功能
停用通知中心下滑時鐘過渡動畫
狀態欄時鐘設定不同步
大通知欄時鐘不再與狀態欄時鐘格式同步
@@ -743,6 +744,14 @@
通知背景透明度
下拉通知背景透明度
最佳化媒體控制面板混色效果
+ 進度條
+ 取消媒體通知卡應用程式自訂操作的限制
+ 波浪
+ 平滑
+ 粗細
+ 時間文字大小
+ 自訂操作按鈕的大小
+ 固有操作按鈕尺寸
從卡片中刪除混合顏色背景
背景圖案模糊半徑
背景覆蓋層的不透明度
@@ -754,6 +763,7 @@
顯示地區
隱藏網路監控提示
亮屏時靜音
+ 禁止折疊到歷史通知中
展開通知
亮屏時彈出通知不播放提示音
圓角矩形磁貼
@@ -1139,6 +1149,10 @@
顯示應用程式標題
在 Dock 欄中隱藏最近應用圖示
背景模糊自訂
+ 向上滑動以僅顯示 Dock
+ 第二次向上滑動,跳到最近的任務
+ 隱藏 Dock
+ 開啟後「向上滑動僅顯示 Dock」將失效。
其他
快捷選單
桌面模式
@@ -1374,6 +1388,9 @@
低
中
高
+ 卡片顯示類型
+ 淺色模式
+ 深色模式
小愛翻譯
強制啟用實時字幕
@@ -1462,6 +1479,7 @@
應用程式管理
語言設定
極暗模式
+ 預設應用程式
輸入
關閉 Magic Pointer
移除 Xiaomi Pad 系統破爛的圓形滑鼠指針,並恢復為安卓原生的滑鼠指針
@@ -1557,13 +1575,18 @@
禁用日誌
停用推薦
啟用推薦
+ 設定首頁入口
找不到應用程式功能?
+ 注意:\n此設定只是主頁入口可見性設定,已開啟的功能不會關閉!\n關閉入口會即時生效,需要重新啟動應用程式才能重新出現。
在主頁找不到應用程式功能?
為了保持主頁的簡單性和可用性,我們隱藏了對以下類型的應用程式功能的存取:\n\n - 目前已停用或隱藏的應用程式\n - 在您的裝置中未找到的應用程式\n -與目前版本不相容的應用程式系統或應用程式版本\n\n請根據上述資訊排查問題,重新啟動 HyperCeiler,然後重試。如果您仍然找不到應用程式功能,則可能是錯誤。請提供我們及時有效的回饋。\n\n目前隱藏的應用功能:\n\n
已解除安裝的應用程式:\n
停用或隱藏的應用程式:\n
為了保持主頁的簡單性和可用性,我們隱藏了對以下類型的應用程式功能的存取:\n\n - 目前已停用或隱藏的應用程式\n - 在您的裝置中未找到的應用程式\n -與目前版本不相容的應用程式系統或應用程式版本\n\n請根據上述資訊排查問題,重新啟動 HyperCeiler,然後重試。如果您仍然找不到應用程式功能,則可能是錯誤。請及時有效的回饋給我們。\n\n目前沒有隱藏入口!
+ 在主頁中隱藏此幫助
+ 您仍然可以在「設定-設定主頁入口」中找到該頁面。重新啟動應用程式即可套用。
您所使用的 ROM 來源可能不是屬於小米官方版本,部分功能可能無法使用,具體請聯絡您所使用的 ROM 開發者。
簽章驗證失敗,您目前使用的版本可能不是 Re.chronoRain 的正式版本,並且可能包含惡意程式碼,請注意使用安全。
提示:這是預設提示。如果你能看到我,則表示 HyperCeiler 有問題,請及時有效地向開發者報告。
+ 在找什麼嗎?
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 6f37caebd3..f772c0644d 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -263,6 +263,7 @@
關閉
系統預設模式
強制最大亮度
+ 強制
關閉
預設寫入模式
寫入模式一
@@ -277,9 +278,9 @@
值和單位雙排顯示
上下行網路單行顯示
上下行網路雙排顯示
- 單行狀態欄時鐘
- 狀態欄時鐘\n通知欄迷你時鐘
- 通知欄迷你時鐘\n狀態欄時鐘
+ 單行顯示\n\n僅狀態欄時鐘
+ 兩行顯示\n\n頂部狀態欄時鐘\n底部通知欄迷你時鐘
+ 兩行顯示\n\n頂部通知欄迷你時鐘\n底部狀態欄時鐘
米奇
草莓熊
@@ -511,6 +512,7 @@
手勢提示線
隱藏導覽列
不要切換導航鍵
+ 不要隱藏手勢提示線
請重新啟動 「系統桌面」 和 「系統介面」
手勢提示線自訂
高度
@@ -655,7 +657,6 @@
雙排時鐘大小
僅在雙排顯示下生效
修復時鐘反色時的顏色異常
- 實驗性功能
停用通知中心下滑時鐘過渡動畫
狀態欄時鐘設定不同步
大通知欄時鐘不再與狀態欄時鐘格式同步
@@ -743,6 +744,14 @@
通知背景透明度
下拉通知背景透明度
最佳化媒體控制面板混色效果
+ 進度條
+ 取消媒體通知卡應用程式自訂操作的限制
+ 波浪
+ 平滑
+ 粗細
+ 時間文字大小
+ 自訂操作按鈕的大小
+ 固有操作按鈕尺寸
從卡片中刪除混合顏色背景
背景圖案模糊半徑
背景覆蓋層的不透明度
@@ -754,6 +763,7 @@
顯示地區
隱藏網路監控提示
開啟螢幕時靜音
+ 禁止折疊到歷史通知中
展開通知
開啟螢幕時彈出通知不播放提示音
圓角矩形磁貼
@@ -1139,6 +1149,10 @@
顯示應用程式標題
在 Dock 欄中隱藏最近應用圖示
背景模糊自訂
+ 向上滑動以僅顯示 Dock
+ 第二次向上滑動,跳到最近的任務
+ 隱藏 Dock
+ 開啟後「向上滑動僅顯示 Dock」將失效。
其他
快捷選單
桌面模式
@@ -1255,7 +1269,7 @@
需要預先安裝更高版本的「Mi AI Engine」應用程式才能正常使用
規範截圖儲存位置為 /Pictures/Screenshots
自訂帶殼截圖型號
- 請輸入機型代號,有顏色的裝置填寫時應加上後綴,例如:\n- 小米 13 填寫的內容是 fuxi\n-小米 14 粉色版填寫的內容是 houji_PK
+ 請輸入機型代號,有顏色的裝置填寫時應加上後綴,例如:\n- 小米 13 填寫的內容是 fuxi\n- 小米 14 粉色版填寫的內容是 houji_PK
手機管家
平板管家
@@ -1374,6 +1388,9 @@
低
中
高
+ 卡片顯示類型
+ 淺色模式
+ 深色模式
小愛翻譯
強制啟用即時字幕
@@ -1462,6 +1479,7 @@
應用程式管理
語言設定
極暗模式
+ 預設應用程式
輸入
關閉 Magic Pointer
移除 Xiaomi Pad 系統破爛的圓形滑鼠指針,並恢復為安卓原生的滑鼠指針
@@ -1557,13 +1575,18 @@
停用日誌輸出
停用推薦
啟用推薦
+ 設定首頁入口
找不到應用程式功能?
+ 注意:\n此設定只是主頁入口可見性設定,已開啟的功能不會關閉!\n關閉入口會即時生效,需要重新啟動應用程式才能重新出現。
在主頁找不到應用程式功能?
為了保持主頁的簡單性和可用性,我們隱藏了對以下類型的應用程式功能的存取:\n\n - 目前已停用或隱藏的應用程式\n - 在您的裝置中未找到的應用程式\n -與目前版本不相容的應用程式系統或應用程式版本\n\n請根據上述資訊排查問題,重新啟動 HyperCeiler,然後重試。如果您仍然找不到應用程式功能,則可能是錯誤。請提供我們及時有效的回饋。\n\n目前隱藏的應用功能:\n\n
已解除安裝的應用程式:\n
停用或隱藏的應用程式:\n
為了保持主頁的簡單性和可用性,我們隱藏了對以下類型的應用程式功能的存取:\n\n - 目前已停用或隱藏的應用程式\n - 在您的裝置中未找到的應用程式\n -與目前版本不相容的應用程式系統或應用程式版本\n\n請根據上述資訊排查問題,重新啟動 HyperCeiler,然後重試。如果您仍然找不到應用程式功能,則可能是錯誤。請及時有效的回饋給我們。\n\n目前沒有隱藏入口!
+ 在主頁中隱藏此幫助
+ 您仍然可以在「設定-設定主頁入口」中找到該頁面。重新啟動應用程式即可套用。
您所使用的 ROM 來源可能不是屬於小米官方版本,部分功能可能無法使用,具體請聯絡您所使用的 ROM 開發者。
簽章驗證失敗,您目前使用的版本可能不是 Re.chronoRain 的正式版本,並且可能包含惡意程式碼,請注意使用安全。
提示:這是預設提示。如果你能看到我,則表示 HyperCeiler 有問題,請及時有效地向開發者報告。
+ 在找什麼嗎?
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 08193ce814..6d4628d4bc 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -264,6 +264,12 @@
- @string/control_center_sunshine_mode_two
+
+ - @string/array_default
+ - @string/array_close
+ - @string/system_framework_other_rotation_button_3
+
+
- @string/security_center_flash_light_default
- @string/security_center_flash_light_1
@@ -597,6 +603,18 @@
- 2
+
+ - @string/array_default
+ - @string/system_ui_control_center_media_control_progress_wavy
+ - @string/system_ui_control_center_media_control_progress_sleek
+
+
+
+ - 0
+ - 1
+ - 2
+
+
- @string/array_battery_both
- @string/array_battery_power
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d5ef682fe7..2867f631fc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -264,16 +264,16 @@
One-Handed Mode (Left)
One-Handed Mode (Right)
Scroll to top
- Show sidebar
- Floating window
- Pinning window
+ Show Sidebar
+ Floating Window
+ Side Window
Top
Bottom
Separate
Slow
Rainbow
- Version name
- Version code
+ Version Name
+ Version Code
Support SDK
Size
Disable
@@ -312,6 +312,7 @@
Close
System default mode
Force maximum brightness
+ Forced
Close
Default write mode
Write mode one
@@ -326,9 +327,9 @@
Values and units are displayed in two rows
The uplink and downlink network speed is displayed in a single line
Dual-row display of uplink and downlink network speeds
- Single line status bar clock
- Status bar clock\nNotification bar mini clock
- Notification bar mini clock\nStatus bar clock
+ Single line display\n\nStatus bar clock only
+ Two-line display\n\nStatus bar clock on top\nNotification bar mini clock on bottom
+ Two-line display\n\nNotification bar mini clock on top\nStatus bar clock on bottom
Mickey Mouse
Strawberry Bear
@@ -561,6 +562,7 @@
Handle line
Hide Navigation Bar
Don\'t switch navigation keys
+ Don\'t hide gesture lines
Please restart both the Miui Home and SystemUi scopes
Custom handle line
Height
@@ -705,7 +707,6 @@
Double row clock size
Valid only when displayed in two rows
Fix color
- Experimental features
Disable the slide clock transition animation in Notification Center
Status bar clock settings not synchronized
The big notification bar clock is no longer synchronized with the status bar clock format
@@ -793,6 +794,14 @@
Blur Background value
Default Background value
Optimize the color mixing effect of the media control panel
+ Progress Bar
+ Remove the restriction on the application of custom actions for media notification cards
+ Wavy
+ Sleek
+ Thickness
+ Time view text size
+ Customize the size of the action button
+ Intrinsic action button size
Remove mixed color background from card
Background blur radius
Opacity of the background overlay layer
@@ -804,6 +813,7 @@
Show city
Hide network monitoring prompts
Mute when screen is on
+ Collapse into history notifications is prohibited
Expand Notifications
When the screen is turned on, the pop-up notification does not play the prompt sound
Rounded rectangle tile
@@ -1194,6 +1204,10 @@
Show icon title in dock
Hide recent app icons from the Dock
Custom background blur
+ Swipe up to show only the Dock
+ Swipe up a second time and jump to the recent task
+ Hide the Dock
+ After turning it on, \"Swipe up to show only the Dock\" will be invalid.
Other
Shortcut
diff --git a/app/src/main/res/xml/framework_other.xml b/app/src/main/res/xml/framework_other.xml
index 326b28d7e8..bdd378bf41 100644
--- a/app/src/main/res/xml/framework_other.xml
+++ b/app/src/main/res/xml/framework_other.xml
@@ -3,16 +3,18 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
app:myLocation="@string/system_framework_other_title">
+
+
-
-
+
+
+
+
-->
-
\ No newline at end of file
diff --git a/app/src/main/res/xml/system_ui_control_center.xml b/app/src/main/res/xml/system_ui_control_center.xml
index 4cc942ea77..84670455ce 100644
--- a/app/src/main/res/xml/system_ui_control_center.xml
+++ b/app/src/main/res/xml/system_ui_control_center.xml
@@ -26,6 +26,11 @@
android:key="prefs_key_system_ui_control_center_expand_notification"
android:title="@string/system_ui_control_center_expand_notification" />
+
+
+
+
+
+
+
+
@@ -163,6 +195,35 @@
app:showSeekBarValue="true"
app:stepValue="1" />
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator.xml b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator.xml
index b71fdd9f67..e4cc836e06 100644
--- a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator.xml
+++ b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator.xml
@@ -37,7 +37,6 @@
diff --git a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_1.xml b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_1.xml
index 1c12d6b50c..0e742a2267 100644
--- a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_1.xml
+++ b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_1.xml
@@ -10,13 +10,13 @@
app:entryValues="@array/system_ui_status_bar_clock_double_mode_value" />
@@ -28,7 +28,7 @@
app:defaultValueText="@string/array_default"
app:displayDividerValue="20"
app:format="%s dp"
- app:maxValue="22"
+ app:maxValue="32"
app:minValue="14"
app:stepValue="1" />
diff --git a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_2.xml b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_2.xml
index def37abbd8..2129b34b36 100644
--- a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_2.xml
+++ b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_2.xml
@@ -3,12 +3,12 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
diff --git a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_3.xml b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_3.xml
index 38232a21f1..02cc5cd6f7 100644
--- a/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_3.xml
+++ b/app/src/main/res/xml/system_ui_status_bar_new_clock_indicator_3.xml
@@ -5,9 +5,9 @@