package sjm.xuitls.view; import android.app.Activity; import android.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.HashSet; import sjm.xuitls.ViewInjector; import sjm.xuitls.common.util.LogUtil; import sjm.xuitls.view.annotation.ContentView; import sjm.xuitls.view.annotation.Event; import sjm.xuitls.view.annotation.ViewInject; import sjm.xuitls.x; public final class ViewInjectorImpl implements ViewInjector { private static final HashSet<Class<?>> IGNORED; private static volatile ViewInjectorImpl instance; private static final Object lock = new Object(); static { HashSet<Class<?>> hashSet = new HashSet<>(); IGNORED = hashSet; hashSet.add(Object.class); hashSet.add(Activity.class); hashSet.add(Fragment.class); try { hashSet.add(Class.forName("androidx.fragment.app.Fragment")); hashSet.add(Class.forName("androidx.fragment.app.FragmentActivity")); } catch (Throwable unused) { } } private ViewInjectorImpl() { } public static void registerInstance() { if (instance == null) { synchronized (lock) { if (instance == null) { instance = new ViewInjectorImpl(); } } } x.Ext.setViewInjector(instance); } @Override // sjm.xuitls.ViewInjector public void inject(View view) { injectObject(view, view.getClass(), new ViewFinder(view)); } @Override // sjm.xuitls.ViewInjector public void inject(Activity activity) { int value; Class<?> cls = activity.getClass(); try { ContentView findContentView = findContentView(cls); if (findContentView != null && (value = findContentView.value()) > 0) { activity.setContentView(value); } } catch (Throwable th) { LogUtil.e(th.getMessage(), th); } injectObject(activity, cls, new ViewFinder(activity)); } @Override // sjm.xuitls.ViewInjector public void inject(Object obj, View view) { injectObject(obj, obj.getClass(), new ViewFinder(view)); } @Override // sjm.xuitls.ViewInjector public View inject(Object obj, LayoutInflater layoutInflater, ViewGroup viewGroup) { int value; Class<?> cls = obj.getClass(); View view = null; try { ContentView findContentView = findContentView(cls); if (findContentView != null && (value = findContentView.value()) > 0) { view = layoutInflater.inflate(value, viewGroup, false); } } catch (Throwable th) { LogUtil.e(th.getMessage(), th); } injectObject(obj, cls, new ViewFinder(view)); return view; } private static ContentView findContentView(Class<?> cls) { if (cls == null || IGNORED.contains(cls) || cls.getName().startsWith("androidx.")) { return null; } ContentView contentView = (ContentView) cls.getAnnotation(ContentView.class); return contentView == null ? findContentView(cls.getSuperclass()) : contentView; } private static void injectObject(Object obj, Class<?> cls, ViewFinder viewFinder) { Event event; int i; ViewInject viewInject; if (!(cls == null || IGNORED.contains(cls) || cls.getName().startsWith("androidx."))) { injectObject(obj, cls.getSuperclass(), viewFinder); Field[] declaredFields = cls.getDeclaredFields(); if (declaredFields != null && declaredFields.length > 0) { for (Field field : declaredFields) { Class<?> type = field.getType(); if (!Modifier.isStatic(field.getModifiers()) && !Modifier.isFinal(field.getModifiers()) && !type.isPrimitive() && !type.isArray() && (viewInject = (ViewInject) field.getAnnotation(ViewInject.class)) != null) { try { View findViewById = viewFinder.findViewById(viewInject.value(), viewInject.parentId()); if (findViewById != null) { field.setAccessible(true); field.set(obj, findViewById); } else { throw new RuntimeException("Invalid @ViewInject for " + cls.getSimpleName() + "." + field.getName()); } } catch (Throwable th) { LogUtil.e(th.getMessage(), th); } } } } Method[] declaredMethods = cls.getDeclaredMethods(); if (declaredMethods != null && declaredMethods.length > 0) { for (Method method : declaredMethods) { if (!Modifier.isStatic(method.getModifiers()) && Modifier.isPrivate(method.getModifiers()) && (event = (Event) method.getAnnotation(Event.class)) != null) { try { int[] value = event.value(); int[] parentId = event.parentId(); if (parentId == null) { i = 0; } else { i = parentId.length; } int i2 = 0; while (i2 < value.length) { int i3 = value[i2]; if (i3 > 0) { ViewInfo viewInfo = new ViewInfo(); viewInfo.value = i3; viewInfo.parentId = i > i2 ? parentId[i2] : 0; method.setAccessible(true); EventListenerManager.addEventMethod(viewFinder, viewInfo, event, obj, method); } i2++; } } catch (Throwable th2) { LogUtil.e(th2.getMessage(), th2); } } } } } } }