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;
822c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.AppSingletonizer;
922c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1022c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
1125cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultzimport com.xtremelabs.robolectric.res.ResourceLoader;
1286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
13e7a41c9b39233781c97dd599ff61024f0510e308Christian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
14e7a41c9b39233781c97dd599ff61024f0510e308Christian Williams
1559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/**
1659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow of {@code LayoutInflater} that actually inflates layouts into {@code View}s that are functional enough to
1759d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * support testing.
1859d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */
1959d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin
2086335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard@Implements(LayoutInflater.class)
21afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowLayoutInflater {
2286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    private static AppSingletonizer<LayoutInflater> instances = new LayoutInflaterAppSingletonizer();
2386335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
2486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    private Context context;
2586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
2625cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz    private static LayoutInflater bind(LayoutInflater layoutInflater, Context context) {
2725cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz        shadowOf(layoutInflater).context = context;
2825cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz        return layoutInflater;
2925cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz    }
3025cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz
3186335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    @Implementation
3286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    public static LayoutInflater from(Context context) {
33a7e263ae4add03982ef3fe294d72ae43102ce52eChristian Williams        return bind(instances.getInstance(context), context);
3486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
3586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
3686335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    @Implementation
37bc2947bf7cd4f8d61d7e456277e2ca6a2b1c2dc0Christian Williams    public Context getContext() {
38bc2947bf7cd4f8d61d7e456277e2ca6a2b1c2dc0Christian Williams        return context;
39bc2947bf7cd4f8d61d7e456277e2ca6a2b1c2dc0Christian Williams    }
40bc2947bf7cd4f8d61d7e456277e2ca6a2b1c2dc0Christian Williams
41bc2947bf7cd4f8d61d7e456277e2ca6a2b1c2dc0Christian Williams    @Implementation
4286335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
4325cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz        return getResourceLoader().inflateView(context, resource, attachToRoot ? root : null);
4486335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    }
4586335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard
4686335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    @Implementation
4786335af816f048e32aad504aed0af63a73097a5fChristian Williams & Ryan Richard    public View inflate(int resource, ViewGroup root) {
486f39d63484e91fa2cc7aba47594210a7f8404542Phil Goodwin & Tyler Schultz        return inflate(resource, root, root != null);
496f39d63484e91fa2cc7aba47594210a7f8404542Phil Goodwin & Tyler Schultz    }
506f39d63484e91fa2cc7aba47594210a7f8404542Phil Goodwin & Tyler Schultz
5125cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz    private ResourceLoader getResourceLoader() {
5225cbf6f16c0fc8e6524935e6fa3d70ec2a92ed25Phil Goodwin & Tyler Schultz        return shadowOf(context.getApplicationContext()).getResourceLoader();
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) {
61cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin            return shadowApplication.getLayoutInflater();
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