diff --git a/vaop-runtime/src/main/java/vaop/PermissionAspect.java b/vaop-runtime/src/main/java/vaop/PermissionAspect.java index 9a99cfb..9b286d4 100644 --- a/vaop-runtime/src/main/java/vaop/PermissionAspect.java +++ b/vaop-runtime/src/main/java/vaop/PermissionAspect.java @@ -11,6 +11,11 @@ import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import vaop.annotation.Permission; @Aspect @@ -32,6 +37,14 @@ public void interceptPermissionRequest(final ProceedingJoinPoint joinPoint, fina context = ((Fragment) object).getActivity(); } + if (context == null) { + try { + context = getContext(joinPoint.getThis()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + if (context == null) { Log.e("interceptPermission", "UnKnown Context"); return; @@ -56,4 +69,28 @@ public void interceptPermissionRequest(final ProceedingJoinPoint joinPoint, fina } }); } + + private Context getContext(Object object) throws IllegalAccessException { + List fieldList = new ArrayList<>(); + Class tempClass = object.getClass(); + while (tempClass != null && !tempClass.equals(Object.class)) { + fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields())); + tempClass = tempClass.getSuperclass(); + } + + for (Field field : fieldList) { + field.setAccessible(true); + if (field.get(object) instanceof Context) { + return (Context) field.get(object); + + } else if (field.get(object) instanceof android.support.v4.app.Fragment) { + return ((android.support.v4.app.Fragment) field.get(object)).getActivity(); + + } else if (field.get(object) instanceof android.app.Fragment) { + return ((android.app.Fragment) field.get(object)).getActivity(); + } + } + + return null; + } } \ No newline at end of file