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