package com.example.plugintest.activity;
import android.app.Activity;
import android.app.Dialog;
import android.support.annotation.CheckResult;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.view.View;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedHashMap;
import java.util.Map;
import butterknife.ButterKnife;
import butterknife.Unbinder;
/**
* Created by cailiming on 2017/5/12.
*/
public class ButterKnifeCompat {
static final Map<Class<?>, Constructor<? extends Unbinder>> BINDINGS = new LinkedHashMap();
@NonNull
@UiThread
public static Unbinder bind(@NonNull Activity target) {
Unbinder unbinder = ButterKnife.bind(target);
if (unbinder == Unbinder.EMPTY) {
View sourceView = target.getWindow().getDecorView();
return createBinding(target, sourceView);
} else {
return unbinder;
}
}
@NonNull
@UiThread
public static Unbinder bind(@NonNull View target) {
Unbinder unbinder = ButterKnife.bind(target);
if (unbinder == Unbinder.EMPTY) {
return createBinding(target, target);
} else {
return unbinder;
}
}
@NonNull
@UiThread
public static Unbinder bind(@NonNull Dialog target) {
Unbinder unbinder = ButterKnife.bind(target);
if (unbinder == Unbinder.EMPTY) {
View sourceView = target.getWindow().getDecorView();
return createBinding(target, sourceView);
} else {
return unbinder;
}
}
@NonNull
@UiThread
public static Unbinder bind(@NonNull Object target, @NonNull Activity source) {
Unbinder unbinder = ButterKnife.bind(target, source);
if (unbinder == Unbinder.EMPTY) {
View sourceView = source.getWindow().getDecorView();
return createBinding(target, sourceView);
} else {
return unbinder;
}
}
@NonNull
@UiThread
public static Unbinder bind(@NonNull Object target, @NonNull View source) {
Unbinder unbinder = ButterKnife.bind(target, source);
if (unbinder == Unbinder.EMPTY) {
return createBinding(target, source);
} else {
return unbinder;
}
}
@NonNull
@UiThread
public static Unbinder bind(@NonNull Object target, @NonNull Dialog source) {
Unbinder unbinder = ButterKnife.bind(target, source);
if (unbinder == Unbinder.EMPTY) {
View sourceView = source.getWindow().getDecorView();
return createBinding(target, sourceView);
} else {
return unbinder;
}
}
private static Unbinder createBinding(@NonNull Object target, @NonNull View source) {
Class targetClass = target.getClass();
Constructor constructor = findBindingConstructorForClass(targetClass);
if(constructor == null) {
return Unbinder.EMPTY;
} else {
try {
return (Unbinder)constructor.newInstance(new Object[]{target, source});
} catch (IllegalAccessException var6) {
throw new RuntimeException("Unable to invoke " + constructor, var6);
} catch (InstantiationException var7) {
throw new RuntimeException("Unable to invoke " + constructor, var7);
} catch (InvocationTargetException var8) {
Throwable cause = var8.getCause();
if(cause instanceof RuntimeException) {
throw (RuntimeException)cause;
} else if(cause instanceof Error) {
throw (Error)cause;
} else {
throw new RuntimeException("Unable to create binding instance.", cause);
}
}
}
}
@Nullable
@CheckResult
@UiThread
private static Constructor<? extends Unbinder> findBindingConstructorForClass(Class<?> cls) {
Constructor bindingCtor = (Constructor)BINDINGS.get(cls);
if(bindingCtor != null) {
return bindingCtor;
} else {
String clsName = cls.getName();
if(!clsName.startsWith("android.") && !clsName.startsWith("java.")) {
try {
Class e = Class.forName(clsName + "_ViewBinding", true, cls.getClassLoader());
bindingCtor = e.getConstructor(new Class[]{cls, View.class});
} catch (ClassNotFoundException var4) {
bindingCtor = findBindingConstructorForClass(cls.getSuperclass());
} catch (NoSuchMethodException var5) {
throw new RuntimeException("Unable to find binding constructor for " + clsName, var5);
}
BINDINGS.put(cls, bindingCtor);
return bindingCtor;
} else {
return null;
}
}
}
}