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