1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.JELLY_BEAN; 4 import static org.robolectric.shadow.api.Shadow.directlyOn; 5 6 import android.content.res.Configuration; 7 import android.util.DisplayMetrics; 8 import android.view.Display; 9 import android.view.View; 10 import android.view.ViewGroup; 11 import android.view.WindowManagerImpl; 12 import java.util.ArrayList; 13 import java.util.List; 14 import org.robolectric.RuntimeEnvironment; 15 import org.robolectric.annotation.Implementation; 16 import org.robolectric.annotation.Implements; 17 import org.robolectric.annotation.RealObject; 18 import org.robolectric.annotation.Resetter; 19 import org.robolectric.shadow.api.Shadow; 20 import org.robolectric.util.ReflectionHelpers; 21 import org.robolectric.util.ReflectionHelpers.ClassParameter; 22 23 @Implements(value = WindowManagerImpl.class, isInAndroidSdk = false) 24 public class ShadowWindowManagerImpl extends ShadowWindowManager { 25 26 private static Display defaultDisplayJB; 27 28 /** internal only */ 29 public static void configureDefaultDisplayForJBOnly( 30 Configuration configuration, DisplayMetrics displayMetrics) { 31 Class<?> arg2Type = ReflectionHelpers.loadClass(ShadowWindowManagerImpl.class.getClassLoader(), 32 "android.view.CompatibilityInfoHolder"); 33 34 defaultDisplayJB = ReflectionHelpers.callConstructor(Display.class, 35 ClassParameter.from(int.class, 0), 36 ClassParameter.from(arg2Type, null)); 37 ShadowDisplay shadowDisplay = Shadow.extract(defaultDisplayJB); 38 shadowDisplay.configureForJBOnly(configuration, displayMetrics); 39 } 40 41 @RealObject 42 WindowManagerImpl realObject; 43 private List<View> views = new ArrayList<>(); 44 45 @Implementation 46 public void addView(View view, android.view.ViewGroup.LayoutParams layoutParams) { 47 views.add(view); 48 directlyOn(realObject, WindowManagerImpl.class, "addView", 49 ClassParameter.from(View.class, view), 50 ClassParameter.from(ViewGroup.LayoutParams.class, layoutParams)); 51 } 52 53 @Implementation 54 public void removeView(View view) { 55 views.remove(view); 56 directlyOn(realObject, WindowManagerImpl.class, "removeView", 57 ClassParameter.from(View.class, view)); 58 } 59 60 public List<View> getViews() { 61 return views; 62 } 63 64 @Implementation(maxSdk = JELLY_BEAN) 65 public Display getDefaultDisplay() { 66 if (RuntimeEnvironment.getApiLevel() > JELLY_BEAN) { 67 return directlyOn(realObject, WindowManagerImpl.class).getDefaultDisplay(); 68 } else { 69 return defaultDisplayJB; 70 } 71 } 72 73 @Implements(className = "android.view.WindowManagerImpl$CompatModeWrapper", maxSdk = JELLY_BEAN) 74 public static class ShadowCompatModeWrapper { 75 @Implementation(maxSdk = JELLY_BEAN) 76 public Display getDefaultDisplay() { 77 return defaultDisplayJB; 78 } 79 80 } 81 82 @Resetter 83 public static void reset() { 84 defaultDisplayJB = null; 85 } 86 } 87