package me.ele.amigo.hook;
import android.content.Context;
import java.lang.reflect.Method;
import me.ele.amigo.Amigo;
import me.ele.amigo.utils.Log;
public class HookedMethodHandler {
private static final String TAG = HookedMethodHandler.class.getSimpleName();
protected final Context context;
private Object fakedResult = null;
private boolean useFakedResult = false;
public HookedMethodHandler(Context context) {
this.context = context;
}
public Object doHookInner(Object receiver, Method method, Object[] args) throws
Throwable {
long b = System.currentTimeMillis();
Amigo.rollAmigoBack(context);
useFakedResult = false;
fakedResult = null;
boolean suc = beforeInvoke(receiver, method, args);
Log.d(TAG, "doHookInner beforeInvoke cost %s ms", System.currentTimeMillis()
- b);
b = System.currentTimeMillis();
Object invokeResult = null;
if (!suc) {
invokeResult = method.invoke(receiver, args);
Log.i(TAG, "doHookInner invoke cost %s ms", System.currentTimeMillis() - b);
b = System.currentTimeMillis();
}
afterInvoke(receiver, method, args, invokeResult);
Log.d(TAG, "doHookInner afterInvoke cost %s ms", System.currentTimeMillis() -
b);
if (useFakedResult) {
return fakedResult;
} else {
return invokeResult;
}
}
public void setFakedResult(Object fakedResult) {
this.fakedResult = fakedResult;
useFakedResult = true;
}
protected boolean beforeInvoke(Object receiver, Method method, Object[] args) throws Throwable {
return false;
}
protected void afterInvoke(Object receiver, Method method, Object[] args, Object
invokeResult) throws Throwable {
}
}