ShadowLayoutInflater.java revision 33873d2b41a5cd2597b20a4e88eb8942944c0f23
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richardimport android.app.Application;
486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richardimport android.content.Context;
586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richardimport android.view.LayoutInflater;
686335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richardimport android.view.View;
786335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richardimport android.view.ViewGroup;
8a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.ProxyDelegatingHandler;
9a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.res.ViewLoader;
10a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.AppSingletonizer;
11a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.Implementation;
12a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.Implements;
1314631d0ae16b2bef974c854f758787bb31e9237eChristian Williamsimport com.xtremelabs.robolectric.util.SheepWrangler;
1486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
1586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard@Implements(LayoutInflater.class)
16afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowLayoutInflater {
1786335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    private static AppSingletonizer<LayoutInflater> instances = new LayoutInflaterAppSingletonizer();
1886335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
1914631d0ae16b2bef974c854f758787bb31e9237eChristian Williams    @SheepWrangler private ProxyDelegatingHandler proxyDelegatingHandler;
2086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    private Context context;
2186335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
2286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    @Implementation
2386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    public static LayoutInflater from(Context context) {
24a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams        return bind(instances.getInstance(context), context);
2586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
2686335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
2786335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    @Implementation
2886335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
29a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams        View view = getViewLoader().inflateView(context, resource);
3086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        if (root != null && attachToRoot) {
3186335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            root.addView(view);
3286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        }
3386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        return view;
3486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
3586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
36a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams    private ViewLoader getViewLoader() {
37b9a9446f8e0c06bf506e75b1e21f2ec89b723257Christian Williams & Ryan Richard        return ((ShadowApplication) proxyDelegatingHandler.shadowFor(context.getApplicationContext())).getResourceLoader().viewLoader;
38a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams    }
39a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams
4086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    @Implementation
4186335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    public View inflate(int resource, ViewGroup root) {
4286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        return inflate(resource, root, true);
4386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
4486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
45a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams    private static LayoutInflater bind(LayoutInflater layoutInflater, Context context) {
4603ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz        ShadowLayoutInflater shadowLayoutInflater = shadowFor(layoutInflater);
4703ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz        shadowLayoutInflater.context = context;
4886335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        return layoutInflater;
4986335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
5086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
51b9a9446f8e0c06bf506e75b1e21f2ec89b723257Christian Williams & Ryan Richard    private static ShadowLayoutInflater shadowFor(LayoutInflater instance) {
52b9a9446f8e0c06bf506e75b1e21f2ec89b723257Christian Williams & Ryan Richard        return ((ShadowLayoutInflater) ProxyDelegatingHandler.getInstance().shadowFor(instance));
5386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
5486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
5586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    private static class LayoutInflaterAppSingletonizer extends AppSingletonizer<LayoutInflater> {
5686335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        public LayoutInflaterAppSingletonizer() {
5786335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            super(LayoutInflater.class);
5886335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        }
5986335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
6003ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz        @Override protected LayoutInflater get(ShadowApplication shadowApplication) {
6103ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz            return shadowApplication.layoutInflater;
6286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        }
6386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
6403ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz        @Override protected void set(ShadowApplication shadowApplication, LayoutInflater instance) {
6503ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz            shadowApplication.layoutInflater = instance;
6686335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        }
6786335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
6886335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        @Override protected LayoutInflater createInstance(Application applicationContext) {
6986335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            return new MyLayoutInflater(applicationContext);
7086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        }
7186335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
7286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        private static class MyLayoutInflater extends LayoutInflater {
7386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            public MyLayoutInflater(Context context) {
7486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard                super(context);
7586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            }
7686335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
7786335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            @Override public LayoutInflater cloneInContext(Context newContext) {
78a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams                return bind(new MyLayoutInflater(newContext), newContext);
7986335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard            }
8086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard        }
8186335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
8286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard}
83