package com.google.android.apps.common.testing.ui.espresso; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import com.google.android.apps.common.testing.testrunner.UsageTrackerRegistry; import com.google.android.apps.common.testing.ui.espresso.base.BaseLayerModule; import com.google.android.apps.common.testing.ui.espresso.base.IdlingResourceRegistry; import dagger.Module; import dagger.ObjectGraph; import java.util.concurrent.atomic.AtomicReference; /** * Holds Espresso's ObjectGraph. */ public final class GraphHolder { private static final AtomicReference<GraphHolder> instance = new AtomicReference<GraphHolder>(null); private final ObjectGraph graph; private GraphHolder(ObjectGraph graph) { this.graph = checkNotNull(graph); } static ObjectGraph graph() { GraphHolder instanceRef = instance.get(); if (null == instanceRef) { instanceRef = new GraphHolder(ObjectGraph.create(EspressoModule.class)); if (instance.compareAndSet(null, instanceRef)) { UsageTrackerRegistry.getInstance().trackUsage("Espresso"); return instanceRef.graph; } else { return instance.get().graph; } } else { return instanceRef.graph; } } // moe:begin_strip public static void initialize(Object... modules) { checkNotNull(modules); Object[] allModules = new Object[modules.length + 1]; allModules[0] = EspressoModule.class; System.arraycopy(modules, 0, allModules, 1, modules.length); GraphHolder holder = new GraphHolder(ObjectGraph.create(modules)); checkState(instance.compareAndSet(null, holder), "Espresso already initialized."); } // moe:end_strip @Module( includes = BaseLayerModule.class, injects = IdlingResourceRegistry.class ) static class EspressoModule { } }