Home | History | Annotate | Download | only in shadows
      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