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