Skip to content

Commit 63a136e

Browse files
authored
修复开启允许使用第三方主题后背屏壁纸无法应用的问题 (#1537)
* fix: avoid breaking new rear screen apply when allowing third-party themes
1 parent 3de1a2c commit 63a136e

7 files changed

Lines changed: 160 additions & 8 deletions

File tree

app/src/main/java/com/sevtinge/hyperceiler/home/adapter/FragmentStateAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.sevtinge.hyperceiler.home.adapter;
22

3+
import android.view.View;
4+
import android.view.ViewGroup;
5+
36
import androidx.annotation.NonNull;
47
import androidx.fragment.app.Fragment;
58
import androidx.fragment.app.FragmentManager;
69
import androidx.fragment.app.FragmentTransaction;
710
import androidx.viewpager.widget.PagerAdapter;
811

9-
import android.view.View;
10-
import android.view.ViewGroup;
11-
1212
/**
1313
* 仿 ViewPager2 风格的 ViewPager1 适配器
1414
* 优点:滑动极速,API 现代,不报废弃警告

library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/home/title/TitleFontSize.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ package com.sevtinge.hyperceiler.libhook.rules.home.title
2020

2121
import android.util.TypedValue
2222
import android.widget.TextView
23+
import com.sevtinge.hyperceiler.common.log.XposedLog
24+
import com.sevtinge.hyperceiler.common.utils.PrefsBridge
2325
import com.sevtinge.hyperceiler.libhook.appbase.mihome.HomeBaseHookNew
2426
import com.sevtinge.hyperceiler.libhook.appbase.mihome.Version
2527
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.afterHookConstructor
2628
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.afterHookMethod
2729
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.callStaticMethod
2830
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.replaceMethod
29-
import com.sevtinge.hyperceiler.common.log.XposedLog
30-
import com.sevtinge.hyperceiler.common.utils.PrefsBridge
3131
import io.github.kyuubiran.ezxhelper.core.finder.MethodFinder
3232
import io.github.kyuubiran.ezxhelper.xposed.dsl.HookFactory.`-Static`.createHook
3333

library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/photopicker/DisableReroute.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.sevtinge.hyperceiler.libhook.rules.photopicker;
22

3-
import android.app.Activity;
43
import android.content.ComponentName;
54
import android.content.Intent;
65
import android.content.pm.PackageManager;

library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display/ThemeProvider.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ package com.sevtinge.hyperceiler.libhook.rules.systemframework.display
2020

2121
import com.sevtinge.hyperceiler.common.log.XposedLog
2222
import com.sevtinge.hyperceiler.libhook.base.BaseHook
23+
import com.sevtinge.hyperceiler.libhook.utils.api.ContextUtils
24+
import com.sevtinge.hyperceiler.libhook.utils.hookapi.guard.RearScreenFlowGuard
2325
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.chainMethod
2426
import io.github.libxposed.api.XposedInterface
2527
import miui.drm.DrmManager
@@ -42,7 +44,12 @@ class ThemeProvider : BaseHook() {
4244
)
4345

4446
ThemeReceiver::class.java.chainMethod("validateTheme") {
45-
sBypassDrmCheck.set(true)
47+
val systemContext = ContextUtils.getContextNoError(ContextUtils.FlAG_ONLY_ANDROID)
48+
if (RearScreenFlowGuard.isRearScreenActivityActive(systemContext)) {
49+
return@chainMethod proceed()
50+
} else {
51+
sBypassDrmCheck.set(true)
52+
}
4653
try {
4754
proceed()
4855
} finally {

library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/thememanager/AllowThirdTheme.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020

2121
import com.sevtinge.hyperceiler.libhook.base.BaseHook;
2222
import com.sevtinge.hyperceiler.libhook.callback.IMethodHook;
23+
import com.sevtinge.hyperceiler.libhook.utils.api.ContextUtils;
2324
import com.sevtinge.hyperceiler.libhook.utils.hookapi.dexkit.IDexKit;
25+
import com.sevtinge.hyperceiler.libhook.utils.hookapi.guard.RearScreenFlowGuard;
2426

2527
import org.luckypray.dexkit.DexKitBridge;
2628
import org.luckypray.dexkit.query.FindMethod;
@@ -58,9 +60,16 @@ public BaseData dexkit(DexKitBridge bridge) throws ReflectiveOperationException
5860

5961
@Override
6062
public void init() {
63+
runOnApplicationAttach(RearScreenFlowGuard::ensureActivityTrackerRegistered);
64+
6165
hookMethod(mCheckRightsIsLegalMethod, new IMethodHook() {
6266
@Override
6367
public void before(HookParam param) {
68+
if (RearScreenFlowGuard.isRearScreenActivityActive(
69+
ContextUtils.getContextNoError(ContextUtils.FLAG_CURRENT_APP)
70+
)) {
71+
return;
72+
}
6473
param.setResult(DrmManager.DrmResult.DRM_SUCCESS);
6574
}
6675
});

library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/various/clipboard/ClearClipboard.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import android.view.View.OnClickListener
2424
import android.widget.ImageView
2525
import android.widget.PopupWindow
2626
import android.widget.TextView
27+
import com.sevtinge.hyperceiler.common.log.XposedLog
2728
import com.sevtinge.hyperceiler.libhook.R
2829
import com.sevtinge.hyperceiler.libhook.utils.api.DeviceHelper.System.isMoreSmallVersion
2930
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.AppsTool
@@ -32,7 +33,6 @@ import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.callMethod
3233
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.callStaticMethod
3334
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.getObjectField
3435
import com.sevtinge.hyperceiler.libhook.utils.hookapi.tool.getObjectFieldAs
35-
import com.sevtinge.hyperceiler.common.log.XposedLog
3636
import io.github.kyuubiran.ezxhelper.core.finder.MethodFinder
3737
import io.github.kyuubiran.ezxhelper.xposed.dsl.HookFactory.`-Static`.createAfterHook
3838

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/*
2+
* This file is part of HyperCeiler.
3+
*
4+
* HyperCeiler is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU Affero General Public License as
6+
* published by the Free Software Foundation, either version 3 of the
7+
* License.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU Affero General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU Affero General Public License
15+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
16+
*
17+
* Copyright (C) 2023-2026 HyperCeiler Contributions
18+
*/
19+
package com.sevtinge.hyperceiler.libhook.utils.hookapi.guard;
20+
21+
import android.app.Activity;
22+
import android.app.ActivityManager;
23+
import android.app.Application;
24+
import android.content.ComponentName;
25+
import android.content.Context;
26+
import android.os.Bundle;
27+
28+
import java.util.Collections;
29+
import java.util.HashSet;
30+
import java.util.List;
31+
import java.util.Set;
32+
import java.util.concurrent.atomic.AtomicBoolean;
33+
34+
public final class RearScreenFlowGuard {
35+
private static final String REAR_SCREEN_DETAIL_ACTIVITY = "com.rearScreen.RearScreenDetailActivity";
36+
private static final AtomicBoolean sLifecycleRegistered = new AtomicBoolean(false);
37+
private static final Set<String> sActiveActivityClassNames =
38+
Collections.synchronizedSet(new HashSet<>());
39+
40+
private RearScreenFlowGuard() {
41+
}
42+
43+
public static void ensureActivityTrackerRegistered(Context context) {
44+
if (context == null) {
45+
return;
46+
}
47+
Context applicationContext = context.getApplicationContext();
48+
if (!(applicationContext instanceof Application application)) {
49+
return;
50+
}
51+
refreshCurrentActivity(applicationContext);
52+
if (!sLifecycleRegistered.compareAndSet(false, true)) {
53+
return;
54+
}
55+
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
56+
@Override
57+
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
58+
// No-op.
59+
}
60+
61+
@Override
62+
public void onActivityStarted(Activity activity) {
63+
sActiveActivityClassNames.add(activity.getClass().getName());
64+
}
65+
66+
@Override
67+
public void onActivityResumed(Activity activity) {
68+
sActiveActivityClassNames.add(activity.getClass().getName());
69+
}
70+
71+
@Override
72+
public void onActivityPaused(Activity activity) {
73+
// No-op.
74+
}
75+
76+
@Override
77+
public void onActivityStopped(Activity activity) {
78+
sActiveActivityClassNames.remove(activity.getClass().getName());
79+
}
80+
81+
@Override
82+
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
83+
// No-op.
84+
}
85+
86+
@Override
87+
public void onActivityDestroyed(Activity activity) {
88+
sActiveActivityClassNames.remove(activity.getClass().getName());
89+
}
90+
});
91+
}
92+
93+
public static boolean isRearScreenActivityActive() {
94+
return sActiveActivityClassNames.contains(REAR_SCREEN_DETAIL_ACTIVITY);
95+
}
96+
97+
public static boolean isRearScreenActivityActive(Context context) {
98+
if (isRearScreenActivityActive()) {
99+
return true;
100+
}
101+
if (context == null) {
102+
return false;
103+
}
104+
try {
105+
ActivityManager activityManager = context.getSystemService(ActivityManager.class);
106+
if (activityManager == null) {
107+
return false;
108+
}
109+
List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(1);
110+
if (runningTasks == null || runningTasks.isEmpty()) {
111+
return false;
112+
}
113+
ComponentName topActivity = runningTasks.get(0).topActivity;
114+
return topActivity != null && REAR_SCREEN_DETAIL_ACTIVITY.equals(topActivity.getClassName());
115+
} catch (Throwable ignored) {
116+
return false;
117+
}
118+
}
119+
120+
private static void refreshCurrentActivity(Context context) {
121+
try {
122+
ActivityManager activityManager = context.getSystemService(ActivityManager.class);
123+
if (activityManager == null) {
124+
return;
125+
}
126+
List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(1);
127+
if (runningTasks == null || runningTasks.isEmpty()) {
128+
return;
129+
}
130+
ComponentName topActivity = runningTasks.get(0).topActivity;
131+
if (topActivity != null) {
132+
sActiveActivityClassNames.add(topActivity.getClassName());
133+
}
134+
} catch (Throwable ignored) {
135+
}
136+
}
137+
}

0 commit comments

Comments
 (0)