ShadowLayoutInflater.java revision 33873d2b41a5cd2597b20a4e88eb8942944c0f23
1package com.xtremelabs.robolectric.shadows;
2
3import android.app.Application;
4import android.content.Context;
5import android.view.LayoutInflater;
6import android.view.View;
7import android.view.ViewGroup;
8import com.xtremelabs.robolectric.ProxyDelegatingHandler;
9import com.xtremelabs.robolectric.res.ViewLoader;
10import com.xtremelabs.robolectric.util.AppSingletonizer;
11import com.xtremelabs.robolectric.util.Implementation;
12import com.xtremelabs.robolectric.util.Implements;
13import com.xtremelabs.robolectric.util.SheepWrangler;
14
15@Implements(LayoutInflater.class)
16public class ShadowLayoutInflater {
17    private static AppSingletonizer<LayoutInflater> instances = new LayoutInflaterAppSingletonizer();
18
19    @SheepWrangler private ProxyDelegatingHandler proxyDelegatingHandler;
20    private Context context;
21
22    @Implementation
23    public static LayoutInflater from(Context context) {
24        return bind(instances.getInstance(context), context);
25    }
26
27    @Implementation
28    public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
29        View view = getViewLoader().inflateView(context, resource);
30        if (root != null && attachToRoot) {
31            root.addView(view);
32        }
33        return view;
34    }
35
36    private ViewLoader getViewLoader() {
37        return ((ShadowApplication) proxyDelegatingHandler.shadowFor(context.getApplicationContext())).getResourceLoader().viewLoader;
38    }
39
40    @Implementation
41    public View inflate(int resource, ViewGroup root) {
42        return inflate(resource, root, true);
43    }
44
45    private static LayoutInflater bind(LayoutInflater layoutInflater, Context context) {
46        ShadowLayoutInflater shadowLayoutInflater = shadowFor(layoutInflater);
47        shadowLayoutInflater.context = context;
48        return layoutInflater;
49    }
50
51    private static ShadowLayoutInflater shadowFor(LayoutInflater instance) {
52        return ((ShadowLayoutInflater) ProxyDelegatingHandler.getInstance().shadowFor(instance));
53    }
54
55    private static class LayoutInflaterAppSingletonizer extends AppSingletonizer<LayoutInflater> {
56        public LayoutInflaterAppSingletonizer() {
57            super(LayoutInflater.class);
58        }
59
60        @Override protected LayoutInflater get(ShadowApplication shadowApplication) {
61            return shadowApplication.layoutInflater;
62        }
63
64        @Override protected void set(ShadowApplication shadowApplication, LayoutInflater instance) {
65            shadowApplication.layoutInflater = instance;
66        }
67
68        @Override protected LayoutInflater createInstance(Application applicationContext) {
69            return new MyLayoutInflater(applicationContext);
70        }
71
72        private static class MyLayoutInflater extends LayoutInflater {
73            public MyLayoutInflater(Context context) {
74                super(context);
75            }
76
77            @Override public LayoutInflater cloneInContext(Context newContext) {
78                return bind(new MyLayoutInflater(newContext), newContext);
79            }
80        }
81    }
82}
83