Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 现代,不报废弃警告
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

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
Expand All @@ -42,7 +44,12 @@
)

ThemeReceiver::class.java.chainMethod("validateTheme") {
sBypassDrmCheck.set(true)
val systemContext = ContextUtils.getContextNoError(ContextUtils.FlAG_ONLY_ANDROID)
if (RearScreenFlowGuard.isRearScreenActivityActive(systemContext)) {
return@chainMethod proceed()

Check warning on line 49 in library/libhook/src/main/java/com/sevtinge/hyperceiler/libhook/rules/systemframework/display/ThemeProvider.kt

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

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

Expression with labels increase complexity and affect maintainability.
} else {
sBypassDrmCheck.set(true)
}
try {
proceed()
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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 <https://www.gnu.org/licenses/>.
*
* 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<String> 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<ActivityManager.RunningTaskInfo> 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<ActivityManager.RunningTaskInfo> 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) {
}
}
}
Loading