blob: f324b5ecfab74c65743e82afbb8916ea8223fb15 [file] [log] [blame]
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.JELLY_BEAN;
import static org.robolectric.shadow.api.Shadow.directlyOn;
import android.content.res.Configuration;
import android.os.Build.VERSION_CODES;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManagerImpl;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import java.util.HashMap;
import java.util.List;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.util.ReflectionHelpers;
import org.robolectric.util.ReflectionHelpers.ClassParameter;
@Implements(value = WindowManagerImpl.class, isInAndroidSdk = false)
public class ShadowWindowManagerImpl extends ShadowWindowManager {
private static Display defaultDisplayJB;
/** internal only */
public static void configureDefaultDisplayForJBOnly(
Configuration configuration, DisplayMetrics displayMetrics) {
Class<?> arg2Type = ReflectionHelpers.loadClass(ShadowWindowManagerImpl.class.getClassLoader(),
"android.view.CompatibilityInfoHolder");
defaultDisplayJB = ReflectionHelpers.callConstructor(Display.class,
ClassParameter.from(int.class, 0),
ClassParameter.from(arg2Type, null));
ShadowDisplay shadowDisplay = Shadow.extract(defaultDisplayJB);
shadowDisplay.configureForJBOnly(configuration, displayMetrics);
}
@RealObject
WindowManagerImpl realObject;
private static final Multimap<Integer, View> views = ArrayListMultimap.create();
@Implementation
public void addView(View view, android.view.ViewGroup.LayoutParams layoutParams) {
views.put(realObject.getDefaultDisplay().getDisplayId(), view);
// views.add(view);
directlyOn(
realObject,
WindowManagerImpl.class,
"addView",
ClassParameter.from(View.class, view),
ClassParameter.from(ViewGroup.LayoutParams.class, layoutParams));
}
@Implementation
public void removeView(View view) {
views.remove(realObject.getDefaultDisplay().getDisplayId(), view);
directlyOn(realObject, WindowManagerImpl.class, "removeView",
ClassParameter.from(View.class, view));
}
public List<View> getViews() {
return ImmutableList.copyOf(views.get(realObject.getDefaultDisplay().getDisplayId()));
}
@Implementation(maxSdk = JELLY_BEAN)
public Display getDefaultDisplay() {
if (RuntimeEnvironment.getApiLevel() > JELLY_BEAN) {
return directlyOn(realObject, WindowManagerImpl.class).getDefaultDisplay();
} else {
return defaultDisplayJB;
}
}
@Implements(className = "android.view.WindowManagerImpl$CompatModeWrapper", maxSdk = JELLY_BEAN)
public static class ShadowCompatModeWrapper {
@Implementation(maxSdk = JELLY_BEAN)
protected Display getDefaultDisplay() {
return defaultDisplayJB;
}
}
@Resetter
public static void reset() {
defaultDisplayJB = null;
views.clear();
if (RuntimeEnvironment.getApiLevel() <= VERSION_CODES.JELLY_BEAN) {
ReflectionHelpers.setStaticField(
WindowManagerImpl.class,
"sWindowManager",
ReflectionHelpers.newInstance(WindowManagerImpl.class));
HashMap windowManagers =
ReflectionHelpers.getStaticField(WindowManagerImpl.class, "sCompatWindowManagers");
windowManagers.clear();
}
}
}