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) { + } + } +}