package view_inspector.aspect;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import view_inspector.ViewInspector;
@Aspect public class ViewInspectorAspect {
private static final int OVERLAY_PERMISSION_CALL = 1;
private ViewInspector mViewInspector;
private boolean isRequestingOverlayPermission = false;
private boolean isRestarting = false;
public ViewInspectorAspect() {
mViewInspector = ViewInspector.create();
}
@Pointcut("within(android.app.Activity+)") public void withinActivityClass() {
}
@Pointcut("execution(void onCreate(..)) && withinActivityClass()")
public void activityOnCreatedCall() {
}
@Around("activityOnCreatedCall()")
public Object injectViewInspector(ProceedingJoinPoint joinPoint) throws Throwable {
Log.d(ViewInspector.TAG, "injectViewInspector");
Context context = (Context) joinPoint.getThis();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(context)) {
mViewInspector.onCreate(context);
isRestarting = false;
} else {
isRequestingOverlayPermission = true;
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
((Activity) context).startActivityForResult(intent, OVERLAY_PERMISSION_CALL);
}
} else {
mViewInspector.onCreate(context);
}
return joinPoint.proceed();
}
@Pointcut("execution(void onResume()) && withinActivityClass()")
public void activityOnResumeCall() {
}
@Around("activityOnResumeCall()") public Object showViewInspector(ProceedingJoinPoint joinPoint)
throws Throwable {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Context context = (Context) joinPoint.getThis();
if (isRequestingOverlayPermission) {
if (Settings.canDrawOverlays(context)) {
// relaunching the app for deploying Probe features
Intent intent =
context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
((Activity) context).finish();
isRequestingOverlayPermission = false;
isRestarting = true;
context.startActivity(intent);
}
} else {
mViewInspector.onResume();
}
} else {
mViewInspector.onResume();
}
return joinPoint.proceed();
}
@Pointcut("execution(void onPause()) && withinActivityClass()")
public void activityOnPauseCall() {
}
@Around("activityOnPauseCall()") public Object hideViewInspector(ProceedingJoinPoint joinPoint)
throws Throwable {
if (!isRequestingOverlayPermission && !isRestarting) {
mViewInspector.onPause();
}
return joinPoint.proceed();
}
@Pointcut("execution(void onDestroy()) && withinActivityClass()")
public void activityOnDestroyCall() {
}
@Around("activityOnDestroyCall()")
public Object destroyViewInspector(ProceedingJoinPoint joinPoint) throws Throwable {
if (!isRequestingOverlayPermission && !isRestarting) {
Context context = (Context) joinPoint.getThis();
mViewInspector.onDestroy(context);
}
return joinPoint.proceed();
}
}