Skip to content

Commit 197b72b

Browse files
committed
Respect lockdown mode
1 parent 31ad130 commit 197b72b

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

universalauth-xposed/src/main/java/ax/nd/universalauth/xposed/Module.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import static ax.nd.universalauth.xposed.common.XposedConstants.EXTRA_UNLOCK_MODE;
55
import static ax.nd.universalauth.xposed.common.XposedConstants.MODE_UNLOCK_FADING;
66

7+
import android.app.ActivityManager;
78
import android.content.Context;
89
import android.content.Intent;
910
import android.os.Build;
1011

1112
import java.lang.reflect.AccessibleObject;
1213
import java.lang.reflect.Field;
14+
import java.lang.reflect.InvocationTargetException;
1315
import java.lang.reflect.Method;
1416
import java.util.Arrays;
1517
import java.util.Objects;
@@ -36,6 +38,8 @@ public class Module implements IXposedHookLoadPackage {
3638
// com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED
3739
private static final int SHADE_LOCKED = 2;
3840

41+
private Method isUserInLockdownMethod;
42+
3943
/**
4044
* This method is called when an app is loaded. It's called very early, even before
4145
* {@link Application#onCreate} is called.
@@ -48,6 +52,9 @@ public class Module implements IXposedHookLoadPackage {
4852
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
4953
// Hook SystemUi
5054
if (Objects.equals(lpparam.packageName, "com.android.systemui")) {
55+
Class<?> kumClazz = lpparam.classLoader.loadClass(KEYGUARD_UPDATE_MONITOR_CLASS);
56+
isUserInLockdownMethod = getIsUserInLockdownMethod(kumClazz);
57+
5158
try {
5259
// Hook com.android.systemui.statusbar.phone.StatusBar.start
5360
Class<?> statusBarClass = lpparam.classLoader.loadClass(STATUS_BAR_CLASS);
@@ -66,7 +73,6 @@ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Th
6673
}
6774
}
6875

69-
Class<?> kumClazz = lpparam.classLoader.loadClass(KEYGUARD_UPDATE_MONITOR_CLASS);
7076
// Hook com.android.keyguard.KeyguardUpdateMonitor.updateFaceListeningState
7177
try {
7278
addHookEarlyUnlock(kumClazz, lpparam);
@@ -98,6 +104,19 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
98104
);
99105
}
100106

107+
private Method getIsUserInLockdownMethod(Class<?> kumClazz) {
108+
try {
109+
return asAccessible(kumClazz.getDeclaredMethod("isUserInLockdown", int.class));
110+
} catch (NoSuchMethodException ignored) {
111+
return null;
112+
}
113+
}
114+
115+
private boolean isUserInLockdown(Object kum) throws InvocationTargetException, IllegalAccessException {
116+
return isUserInLockdownMethod != null
117+
&& (boolean) isUserInLockdownMethod.invoke(kum, Util.INSTANCE.getCurrentUser());
118+
}
119+
101120
private void addHookEarlyUnlock(Class<?> kumClazz, XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
102121
Field mStatusBarStateControllerField = asAccessible(kumClazz.getDeclaredField("mStatusBarStateController"));
103122
Field mKeyguardIsVisibleField = asAccessible(kumClazz.getDeclaredField("mKeyguardIsVisible"));
@@ -112,6 +131,10 @@ private void addHookEarlyUnlock(Class<?> kumClazz, XC_LoadPackage.LoadPackagePar
112131
@Override
113132
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
114133
Object kum = param.thisObject;
134+
if(isUserInLockdown(kum)) {
135+
return;
136+
}
137+
115138
Object sbsc = mStatusBarStateControllerField.get(kum);
116139
boolean mKeyguardIsVisible = mKeyguardIsVisibleField.getBoolean(kum);
117140
boolean mDeviceInteractive = mDeviceInteractiveField.getBoolean(kum);
@@ -188,12 +211,15 @@ private void hookStatusBar(Class<?> statusBarClass, ClassLoader classLoader, XC_
188211
systemUiClass = classLoader.loadClass(SYSTEM_UI_CLASS);
189212
}
190213
Context context = (Context) asAccessible(systemUiClass.getDeclaredField("mContext")).get(statusBar);
214+
Object kum = asAccessible(statusBarClass.getDeclaredField("mKeyguardUpdateMonitor")).get(statusBar);
191215

192216
UnlockMethod method = hookStatusBarBiometricUnlock(statusBar, statusBarClass);
193217

194218
UnlockReceiver.INSTANCE.setup(context, statusBar, intent -> {
195219
try {
196-
method.unlock(intent);
220+
if(!isUserInLockdown(kum)) {
221+
method.unlock(intent);
222+
}
197223
} catch (Throwable throwable) {
198224
throw new RuntimeException(throwable);
199225
}

universalauth-xposed/src/main/java/ax/nd/universalauth/xposed/TrustHook.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ object TrustHook {
1414
Int::class.javaPrimitiveType!!,
1515
Boolean::class.javaPrimitiveType!!
1616
).asAccessible()
17-
val activityManagerGetCurrentUser =
18-
ActivityManager::class.java.getDeclaredMethod("getCurrentUser").asAccessible()
1917
XposedHelpersExt.runAfterClassConstructed(kumClazz) { param ->
2018
val context = contextField.get(param.thisObject) as Context
2119
UnlockReceiver.setup(context, param.thisObject) { intent ->
2220
if (!intent.getBooleanExtra(EXTRA_BYPASS_KEYGUARD, true)) {
23-
val currentUser = activityManagerGetCurrentUser.invoke(null)
21+
val currentUser = Util.getCurrentUser()
2422
onFaceAuthenticated.invoke(param.thisObject, currentUser, true)
2523
}
2624
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ax.nd.universalauth.xposed
2+
3+
import android.app.ActivityManager
4+
import ax.nd.xposedutil.asAccessible
5+
6+
object Util {
7+
private val activityManagerGetCurrentUser =
8+
ActivityManager::class.java.getDeclaredMethod("getCurrentUser").asAccessible()
9+
10+
fun getCurrentUser(): Int {
11+
return activityManagerGetCurrentUser.invoke(null) as Int
12+
}
13+
}

0 commit comments

Comments
 (0)