1package com.xtremelabs.robolectric.internal;
2
3import android.app.Application;
4import android.content.Context;
5import com.xtremelabs.robolectric.shadows.ShadowApplication;
6
7import static com.xtremelabs.robolectric.Robolectric.newInstanceOf;
8import static com.xtremelabs.robolectric.Robolectric.shadowOf;
9
10public abstract class AppSingletonizer<T> {
11    private Class<T> clazz;
12
13    public AppSingletonizer(Class<T> clazz) {
14        this.clazz = clazz;
15    }
16
17    synchronized public T getInstance(Context context) {
18        Application applicationContext = (Application) context.getApplicationContext();
19        ShadowApplication shadowApplication = (ShadowApplication) shadowOf(applicationContext);
20        T instance = get(shadowApplication);
21        if (instance == null) {
22            instance = createInstance(applicationContext);
23            set(shadowApplication, instance);
24        }
25        return instance;
26    }
27
28    protected abstract T get(ShadowApplication shadowApplication);
29
30    protected abstract void set(ShadowApplication shadowApplication, T instance);
31
32    protected T createInstance(Application applicationContext) {
33        return newInstanceOf(clazz);
34    }
35}
36