package proton.inject;
import static proton.inject.util.Validator.checkNotNull;
import static proton.inject.util.Validator.checkState;
import java.util.Map;
import java.util.WeakHashMap;
import proton.inject.binding.Bindings;
import proton.inject.internal.InjectorImpl;
import proton.inject.listener.FieldListeners;
import proton.inject.listener.ProviderListeners;
import android.app.Application;
import android.content.Context;
public final class Proton {
private static Map<Context, InjectorImpl> sInjectors;
private static Bindings sBindings;
private static ProviderListeners sProviderListeners;
private static FieldListeners sFieldListeners;
private Proton() {
}
public static void initialize(Application app) {
initialize(app, new DefaultModule());
}
public static void initialize(Application app, Module... modules) {
synchronized (Proton.class) {
checkState(sInjectors == null, "Already initialized Proton");
sInjectors = new WeakHashMap<Context, InjectorImpl>();
sBindings = new Bindings();
sProviderListeners = new ProviderListeners();
sFieldListeners = new FieldListeners();
for (Module module : modules)
module.configure(sBindings, sProviderListeners, sFieldListeners);
InjectorImpl injector = new InjectorImpl(app, sBindings, sProviderListeners, sFieldListeners, null);
sInjectors.put(app, injector);
}
}
public static Injector getInjector(Context context) {
synchronized (Proton.class) {
checkInitialize();
InjectorImpl injector = sInjectors.get(context);
if (injector == null) {
InjectorImpl parent = sInjectors.get(context.getApplicationContext());
injector = new InjectorImpl(context, sBindings, sProviderListeners, sFieldListeners, parent);
sInjectors.put(context, injector);
}
return injector;
}
}
public static void destroy() {
synchronized (Proton.class) {
checkInitialize();
sProviderListeners = null;
sBindings = null;
sInjectors = null;
}
}
public static void destroyInjector(Context context) {
synchronized (Proton.class) {
checkInitialize();
sInjectors.remove(context);
}
}
private static void checkInitialize() {
checkNotNull(sInjectors, "Proton is not initialized yet");
}
}