122c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinpackage com.xtremelabs.robolectric.internal;
290651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard
390651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport android.app.Application;
490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richardimport android.content.Context;
533873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzimport com.xtremelabs.robolectric.shadows.ShadowApplication;
690651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard
7e7a41c9b39233781c97dd599ff61024f0510e308Christian Williamsimport static com.xtremelabs.robolectric.Robolectric.newInstanceOf;
8e7a41c9b39233781c97dd599ff61024f0510e308Christian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
9e7a41c9b39233781c97dd599ff61024f0510e308Christian Williams
1086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richardpublic abstract class AppSingletonizer<T> {
1190651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard    private Class<T> clazz;
1290651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard
1390651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard    public AppSingletonizer(Class<T> clazz) {
1490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard        this.clazz = clazz;
1590651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard    }
1690651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard
1790651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard    synchronized public T getInstance(Context context) {
1886335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        Application applicationContext = (Application) context.getApplicationContext();
19e7a41c9b39233781c97dd599ff61024f0510e308Christian Williams        ShadowApplication shadowApplication = (ShadowApplication) shadowOf(applicationContext);
2003ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz        T instance = get(shadowApplication);
2190651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard        if (instance == null) {
2286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            instance = createInstance(applicationContext);
2303ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz            set(shadowApplication, instance);
2490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard        }
2590651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard        return instance;
2690651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard    }
2790651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard
2803ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz    protected abstract T get(ShadowApplication shadowApplication);
2986335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
3003ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz    protected abstract void set(ShadowApplication shadowApplication, T instance);
3186335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
3286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    protected T createInstance(Application applicationContext) {
33e7a41c9b39233781c97dd599ff61024f0510e308Christian Williams        return newInstanceOf(clazz);
3490651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard    }
3590651a8499bcc859bd5c88a56a1d76c584e6bdfbChristian Williams & Ryan Richard}
36