package io.github.libxposed; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.ConcurrentModificationException; public interface XposedInterface { interface BeforeHookCallback { @NonNull T getOrigin(); @Nullable Object getThis(); @NonNull Object[] getArgs(); void returnAndSkip(@Nullable Object returnValue); void throwAndSkip(@Nullable Throwable throwable); @Nullable Object invokeOrigin(@Nullable Object thisObject, Object[] args); void setExtra(@NonNull String key, @Nullable U value) throws ConcurrentModificationException; } interface AfterHookCallback { @NonNull T getOrigin(); @Nullable Object getThis(); @NonNull Object[] getArgs(); @Nullable Object getResult(); @Nullable Throwable getThrowable(); boolean isSkipped(); void setResult(@Nullable Object result); void setThrowable(@Nullable Throwable throwable); @Nullable Object invokeOrigin(@Nullable Object thisObject, Object[] args); @Nullable U getExtra(@NonNull String key); } interface PriorityMethodHooker { int PRIORITY_DEFAULT = 50; default int getPriority() { return PRIORITY_DEFAULT; } } interface BeforeMethodHooker extends PriorityMethodHooker { void before(@NonNull BeforeHookCallback callback); } interface AfterMethodHooker extends PriorityMethodHooker { void after(@NonNull AfterHookCallback callback); } interface MethodHooker extends BeforeMethodHooker, AfterMethodHooker { } interface MethodUnhooker { @NonNull U getOrigin(); @NonNull T getHooker(); void unhook(); } @NonNull String implementationName(); @NonNull String implementationVersion(); long implementationVersionCode(); MethodUnhooker, Method> hookBefore(@NonNull Method origin, @NonNull BeforeMethodHooker hooker); MethodUnhooker, Method> hookAfter(@NonNull Method origin, @NonNull AfterMethodHooker hooker); MethodUnhooker, Method> hook(@NonNull Method origin, @NonNull MethodHooker hooker); MethodUnhooker>, Constructor> hookBefore(@NonNull Constructor origin, @NonNull BeforeMethodHooker> hooker); MethodUnhooker>, Constructor> hookAfter(@NonNull Constructor origin, @NonNull AfterMethodHooker> hooker); MethodUnhooker>, Constructor> hook(@NonNull Constructor origin, @NonNull MethodHooker> hooker); boolean deoptimize(@Nullable Method method); boolean deoptimize(@Nullable Constructor constructor); @Nullable XposedUtils getUtils(); void log(@NonNull String message); void log(@NonNull String message, @NonNull Throwable throwable); }