翰林优商.apk(点击下载) / ViewInjectorImpl.java


package zj.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 zj.xuitls.ViewInjector;
import zj.xuitls.common.util.LogUtil;
import zj.xuitls.view.annotation.ContentView;
import zj.xuitls.view.annotation.Event;
import zj.xuitls.view.annotation.ViewInject;
import zj.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 // zj.xuitls.ViewInjector
    public void inject(View view) {
        injectObject(view, view.getClass(), new ViewFinder(view));
    }

    @Override // zj.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 // zj.xuitls.ViewInjector
    public void inject(Object obj, View view) {
        injectObject(obj, obj.getClass(), new ViewFinder(view));
    }

    @Override // zj.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);
                        }
                    }
                }
            }
        }
    }
}