blob: b3c378414e3a46167cc6b66c98361ddf0b45e8e0 [file] [log] [blame]
package com.xtremelabs.robolectric.shadows;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
@SuppressWarnings({"UnusedDeclaration"})
@Implements(PopupWindow.class)
public class ShadowPopupWindow {
@RealObject
protected PopupWindow realPopupWindow;
private View contentView;
private int width;
private int height;
private boolean focusable;
private boolean touchable;
private boolean outSideTouchable;
private boolean showing;
private Drawable background;
private View.OnTouchListener onTouchInterceptor;
private Context context;
private LinearLayout containerView;
private int xOffset;
private int yOffset;
public void __constructor__(View contentView) {
setContentView(contentView);
getWindowManager();
}
public void __constructor__(View contentView, int width, int height, boolean focusable) {
__constructor__(contentView);
this.width = width;
this.height = height;
this.focusable = focusable;
}
@Implementation
public void setContentView(View contentView) {
this.contentView = contentView;
context = contentView.getContext();
}
@Implementation
public View getContentView() {
return contentView;
}
@Implementation
public void setWidth(int width) {
this.width = width;
}
@Implementation
public int getWidth() {
return width;
}
@Implementation
public void setHeight(int height) {
this.height = height;
}
@Implementation
public int getHeight() {
return height;
}
@Implementation
public void setFocusable(boolean focusable) {
this.focusable = focusable;
}
@Implementation
public boolean isFocusable() {
return focusable;
}
@Implementation
public void setTouchable(boolean touchable) {
this.touchable = touchable;
}
@Implementation
public boolean isTouchable() {
return touchable;
}
@Implementation
public void setOutsideTouchable(boolean touchable) {
outSideTouchable = touchable;
}
@Implementation
public boolean isOutsideTouchable() {
return outSideTouchable;
}
/**
* non-android setter for testing
*
* @param showing true if popup window is showing
*/
public void setShowing(boolean showing) {
this.showing = showing;
}
@Implementation
public boolean isShowing() {
return showing;
}
@Implementation
public void dismiss() {
if (context != null) {
getWindowManager().removeView(containerView);
}
showing = false;
}
@Implementation
public void setBackgroundDrawable(Drawable background) {
this.background = background;
}
@Implementation
public Drawable getBackground() {
return background;
}
@Implementation
public void setTouchInterceptor(android.view.View.OnTouchListener l) {
onTouchInterceptor = l;
}
@Implementation
public void showAsDropDown(View anchor) {
containerView = new LinearLayout(context);
containerView.addView(contentView);
containerView.setBackgroundDrawable(background);
getWindowManager().addView(containerView, null);
}
@Implementation
public void showAsDropDown(View anchor, int xoff, int yoff) {
xOffset = xoff;
yOffset = yoff;
showAsDropDown(anchor);
}
public boolean dispatchTouchEvent(MotionEvent e) {
return onTouchInterceptor != null && onTouchInterceptor.onTouch(realPopupWindow.getContentView(), e);
}
private WindowManager getWindowManager() {
return (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
public int getXOffset() {
return xOffset;
}
public int getYOffset() {
return yOffset;
}
}