diff --git a/app/src/main/java/com/sevtinge/hyperceiler/home/adapter/FragmentStateAdapter.java b/app/src/main/java/com/sevtinge/hyperceiler/home/adapter/FragmentStateAdapter.java
index 30e66bd226..7a7917ed9f 100644
--- a/app/src/main/java/com/sevtinge/hyperceiler/home/adapter/FragmentStateAdapter.java
+++ b/app/src/main/java/com/sevtinge/hyperceiler/home/adapter/FragmentStateAdapter.java
@@ -1,14 +1,14 @@
package com.sevtinge.hyperceiler.home.adapter;
+import android.view.View;
+import android.view.ViewGroup;
+
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager.widget.PagerAdapter;
-import android.view.View;
-import android.view.ViewGroup;
-
/**
* 仿 ViewPager2 风格的 ViewPager1 适配器
* 优点:滑动极速,API 现代,不报废弃警告
diff --git a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/home/title/TitleFontSize.kt b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/home/title/TitleFontSize.kt
index a00cfe56e4..835af3414f 100644
--- a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/home/title/TitleFontSize.kt
+++ b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/home/title/TitleFontSize.kt
@@ -20,14 +20,14 @@ package com.sevtinge.hyperceiler.libhook.rules.home.title
import android.util.TypedValue
import android.widget.TextView
+import com.sevtinge.hyperceiler.common.log.XposedLog
+import com.sevtinge.hyperceiler.common.utils.PrefsBridge
import com.sevtinge.hyperceiler.libhook.appbase.mihome.HomeBaseHookNew
import com.sevtinge.hyperceiler.libhook.appbase.mihome.Version
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.afterHookConstructor
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.afterHookMethod
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.callStaticMethod
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.replaceMethod
-import com.sevtinge.hyperceiler.common.log.XposedLog
-import com.sevtinge.hyperceiler.common.utils.PrefsBridge
import io.github.kyuubiran.ezxhelper.core.finder.MethodFinder
import io.github.kyuubiran.ezxhelper.xposed.dsl.HookFactory.`-Static`.createHook
diff --git a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/photopicker/DisableReroute.java b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/photopicker/DisableReroute.java
index fd255c2e14..4a2b989aef 100644
--- a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/photopicker/DisableReroute.java
+++ b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/photopicker/DisableReroute.java
@@ -1,6 +1,5 @@
package com.sevtinge.hyperceiler.libhook.rules.photopicker;
-import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
diff --git a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display/ThemeProvider.kt b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display/ThemeProvider.kt
index a663c9ce6f..e9037977da 100644
--- a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display/ThemeProvider.kt
+++ b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display/ThemeProvider.kt
@@ -20,6 +20,8 @@ package com.sevtinge.hyperceiler.libhook.rules.systemframework.display
import com.sevtinge.hyperceiler.common.log.XposedLog
import com.sevtinge.hyperceiler.libhook.base.BaseHook
+import com.sevtinge.hyperceiler.libhook.utils.api.ContextUtils
+import com.sevtinge.hyperceiler.libhook.utils.hookapi.guard.RearScreenFlowGuard
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.chainMethod
import io.github.libxposed.api.XposedInterface
import miui.drm.DrmManager
@@ -42,7 +44,12 @@ class ThemeProvider : BaseHook() {
)
ThemeReceiver::class.java.chainMethod("validateTheme") {
- sBypassDrmCheck.set(true)
+ val systemContext = ContextUtils.getContextNoError(ContextUtils.FlAG_ONLY_ANDROID)
+ if (RearScreenFlowGuard.isRearScreenActivityActive(systemContext)) {
+ return@chainMethod proceed()
+ } else {
+ sBypassDrmCheck.set(true)
+ }
try {
proceed()
} finally {
diff --git a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/thememanager/AllowThirdTheme.java b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/thememanager/AllowThirdTheme.java
index cbe00019e1..fbd7931289 100644
--- a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/thememanager/AllowThirdTheme.java
+++ b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/thememanager/AllowThirdTheme.java
@@ -20,7 +20,9 @@
import com.sevtinge.hyperceiler.libhook.base.BaseHook;
import com.sevtinge.hyperceiler.libhook.callback.IMethodHook;
+import com.sevtinge.hyperceiler.libhook.utils.api.ContextUtils;
import com.sevtinge.hyperceiler.libhook.utils.hookapi.dexkit.IDexKit;
+import com.sevtinge.hyperceiler.libhook.utils.hookapi.guard.RearScreenFlowGuard;
import org.luckypray.dexkit.DexKitBridge;
import org.luckypray.dexkit.query.FindMethod;
@@ -58,9 +60,16 @@ public BaseData dexkit(DexKitBridge bridge) throws ReflectiveOperationException
@Override
public void init() {
+ runOnApplicationAttach(RearScreenFlowGuard::ensureActivityTrackerRegistered);
+
hookMethod(mCheckRightsIsLegalMethod, new IMethodHook() {
@Override
public void before(HookParam param) {
+ if (RearScreenFlowGuard.isRearScreenActivityActive(
+ ContextUtils.getContextNoError(ContextUtils.FLAG_CURRENT_APP)
+ )) {
+ return;
+ }
param.setResult(DrmManager.DrmResult.DRM_SUCCESS);
}
});
diff --git a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/various/clipboard/ClearClipboard.kt b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/various/clipboard/ClearClipboard.kt
index a450e44dec..8111b7be6d 100644
--- a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/various/clipboard/ClearClipboard.kt
+++ b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/various/clipboard/ClearClipboard.kt
@@ -24,6 +24,7 @@ import android.view.View.OnClickListener
import android.widget.ImageView
import android.widget.PopupWindow
import android.widget.TextView
+import com.sevtinge.hyperceiler.common.log.XposedLog
import com.sevtinge.hyperceiler.libhook.R
import com.sevtinge.hyperceiler.libhook.utils.api.DeviceHelper.System.isMoreSmallVersion
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.AppsTool
@@ -32,7 +33,6 @@ import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.callMethod
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.callStaticMethod
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.getObjectField
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.getObjectFieldAs
-import com.sevtinge.hyperceiler.common.log.XposedLog
import io.github.kyuubiran.ezxhelper.core.finder.MethodFinder
import io.github.kyuubiran.ezxhelper.xposed.dsl.HookFactory.`-Static`.createAfterHook
diff --git a/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/utils/hookapi/guard/RearScreenFlowGuard.java b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/utils/hookapi/guard/RearScreenFlowGuard.java
new file mode 100644
index 0000000000..b9cdc0f9a5
--- /dev/null
+++ b/library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/utils/hookapi/guard/RearScreenFlowGuard.java
@@ -0,0 +1,137 @@
+/*
+ * 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-2026 HyperCeiler Contributions
+ */
+package com.sevtinge.hyperceiler.libhook.utils.hookapi.guard;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Bundle;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public final class RearScreenFlowGuard {
+ private static final String REAR_SCREEN_DETAIL_ACTIVITY = "com.rearScreen.RearScreenDetailActivity";
+ private static final AtomicBoolean sLifecycleRegistered = new AtomicBoolean(false);
+ private static final Set sActiveActivityClassNames =
+ Collections.synchronizedSet(new HashSet<>());
+
+ private RearScreenFlowGuard() {
+ }
+
+ public static void ensureActivityTrackerRegistered(Context context) {
+ if (context == null) {
+ return;
+ }
+ Context applicationContext = context.getApplicationContext();
+ if (!(applicationContext instanceof Application application)) {
+ return;
+ }
+ refreshCurrentActivity(applicationContext);
+ if (!sLifecycleRegistered.compareAndSet(false, true)) {
+ return;
+ }
+ application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
+ @Override
+ public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
+ // No-op.
+ }
+
+ @Override
+ public void onActivityStarted(Activity activity) {
+ sActiveActivityClassNames.add(activity.getClass().getName());
+ }
+
+ @Override
+ public void onActivityResumed(Activity activity) {
+ sActiveActivityClassNames.add(activity.getClass().getName());
+ }
+
+ @Override
+ public void onActivityPaused(Activity activity) {
+ // No-op.
+ }
+
+ @Override
+ public void onActivityStopped(Activity activity) {
+ sActiveActivityClassNames.remove(activity.getClass().getName());
+ }
+
+ @Override
+ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+ // No-op.
+ }
+
+ @Override
+ public void onActivityDestroyed(Activity activity) {
+ sActiveActivityClassNames.remove(activity.getClass().getName());
+ }
+ });
+ }
+
+ public static boolean isRearScreenActivityActive() {
+ return sActiveActivityClassNames.contains(REAR_SCREEN_DETAIL_ACTIVITY);
+ }
+
+ public static boolean isRearScreenActivityActive(Context context) {
+ if (isRearScreenActivityActive()) {
+ return true;
+ }
+ if (context == null) {
+ return false;
+ }
+ try {
+ ActivityManager activityManager = context.getSystemService(ActivityManager.class);
+ if (activityManager == null) {
+ return false;
+ }
+ List runningTasks = activityManager.getRunningTasks(1);
+ if (runningTasks == null || runningTasks.isEmpty()) {
+ return false;
+ }
+ ComponentName topActivity = runningTasks.get(0).topActivity;
+ return topActivity != null && REAR_SCREEN_DETAIL_ACTIVITY.equals(topActivity.getClassName());
+ } catch (Throwable ignored) {
+ return false;
+ }
+ }
+
+ private static void refreshCurrentActivity(Context context) {
+ try {
+ ActivityManager activityManager = context.getSystemService(ActivityManager.class);
+ if (activityManager == null) {
+ return;
+ }
+ List runningTasks = activityManager.getRunningTasks(1);
+ if (runningTasks == null || runningTasks.isEmpty()) {
+ return;
+ }
+ ComponentName topActivity = runningTasks.get(0).topActivity;
+ if (topActivity != null) {
+ sActiveActivityClassNames.add(topActivity.getClassName());
+ }
+ } catch (Throwable ignored) {
+ }
+ }
+}