ShadowView.java revision 43c9cb31115b8f00b079d1dff9e70503f040d8cc
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
36ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
46ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport static com.xtremelabs.robolectric.Robolectric.Reflection.newInstanceOf;
56ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen
66eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.Context;
76eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.res.Resources;
8ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport android.graphics.Bitmap;
9a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultzimport android.graphics.Point;
10a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.ColorDrawable;
11a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.Drawable;
12684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet;
136ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.KeyEvent;
146ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.MotionEvent;
156ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.View;
166ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewGroup;
176ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewParent;
186ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewTreeObserver;
193f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation;
206ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen
21ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
2222c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
2322c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
2422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
256eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
2686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream;
276c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.InvocationTargetException;
286c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.Method;
2951fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap;
3051fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map;
31c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
32ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/**
336c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Shadow implementation of {@code View} that simulates the behavior of this
346c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * class.
35d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * <p/>
366c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Supports listeners, focusability (but not focus order), resource loading,
376c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * visibility, onclick, tags, and tracks the size and shape of the view.
38ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */
39198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
400b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class)
41afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView {
42d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @RealObject
43d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    protected View realView;
446eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
456eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    private int id;
46afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    ShadowView parent;
4770e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz    protected Context context;
484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean selected;
49810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    private View.OnClickListener onClickListener;
50d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    private View.OnLongClickListener onLongClickListener;
51c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    private Object tag;
52775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    private boolean enabled = true;
534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int visibility = View.VISIBLE;
544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int left;
554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int top;
564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int right;
574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int bottom;
584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingLeft;
594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingTop;
604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingRight;
614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingBottom;
624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0);
6343c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen    private final Map<Integer, Object> tags = new HashMap<Integer, Object>();
644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean clickable;
65254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    protected boolean focusable;
669729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    boolean focusableInTouchMode;
674d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int backgroundResourceId = -1;
681f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    private int backgroundColor;
695411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    protected View.OnKeyListener onKeyListener;
704d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean isFocused;
715411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    private View.OnFocusChangeListener onFocusChangeListener;
724d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean wasInvalidated;
73924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    private View.OnTouchListener onTouchListener;
74a2dd5bb88b4bfe0cbe77cfc3581ce42745509760Phil Goodwin & Tyler Schultz    protected AttributeSet attributeSet;
75ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    private boolean drawingCacheEnabled;
76a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Point scrollToCoordinates;
774241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    private boolean didRequestLayout;
78a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    private Drawable background;
793f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    private Animation animation;
80f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private ViewTreeObserver viewTreeObserver;
81840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    private MotionEvent lastTouchEvent;
827cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    private int nextFocusDownId = View.NO_ID;
83cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    private CharSequence contentDescription = null;
846eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
856eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void __constructor__(Context context) {
863c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, null);
876eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
886eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
895189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    public void __constructor__(Context context, AttributeSet attributeSet) {
903c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, attributeSet, 0);
913c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
923c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
933c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) {
943c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        this.context = context;
955189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        this.attributeSet = attributeSet;
963c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
973c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        if (attributeSet != null) {
983c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams            applyAttributes();
993c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        }
1003c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
1013c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
1023c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void applyAttributes() {
1035189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        applyIdAttribute();
1046be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        applyVisibilityAttribute();
10549e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        applyEnabledAttribute();
1064cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz        applyBackgroundAttribute();
107b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken        applyTagAttribute();
1086c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        applyOnClickAttribute();
109cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        applyContentDescriptionAttribute();
110684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams    }
111684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams
112de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1136eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setId(int id) {
1146eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.id = id;
1156eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1166eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
117de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
118cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setClickable(boolean clickable) {
119cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.clickable = clickable;
120cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
121cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
122ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
123ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior.
124ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
125ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusable the new status of the {@code View}'s focusability
126ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
127de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
128cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setFocusable(boolean focusable) {
129cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.focusable = focusable;
130adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (!focusable) {
131415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusableInTouchMode(false);
132415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
133415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
134415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
135415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
136415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public final boolean isFocusableInTouchMode() {
137415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        return focusableInTouchMode;
138415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
139415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
140ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
141ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior.
142ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
143ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability
144ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
145415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
146415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public void setFocusableInTouchMode(boolean focusableInTouchMode) {
147415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        this.focusableInTouchMode = focusableInTouchMode;
148adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (focusableInTouchMode) {
149415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusable(true);
150415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
151cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
152cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
153cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    @Implementation(i18nSafe = false)
154cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    public void setContentDescription(CharSequence contentDescription) {
155cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        this.contentDescription = contentDescription;
156cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
157cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
158de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
159254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    public boolean isFocusable() {
160254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin        return focusable;
161254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    }
162254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin
163254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    @Implementation
1646eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getId() {
1656eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return id;
1666eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1676eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
168cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    @Implementation
169cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    public CharSequence getContentDescription() {
170cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        return contentDescription;
171cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
172cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
173ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
174ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Simulates the inflating of the requested resource.
175ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
1768de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param context  the context from which to obtain a layout inflater
177ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param resource the ID of the resource to inflate
1788de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param root     the {@code ViewGroup} to add the inflated {@code View} to
179ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the inflated View
180ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
181de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
182a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    public static View inflate(Context context, int resource, ViewGroup root) {
18340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return ShadowLayoutInflater.from(context).inflate(resource, root);
184a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    }
185a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz
186ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
187ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise
188ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
189ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param id the id of the {@code View} to find
190ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the {@code View}, if found, {@code null} otherwise
191ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
192de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1936eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public View findViewById(int id) {
194e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        if (id == this.id) {
195e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz            return realView;
196e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        }
1976eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
1986eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return null;
1996eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
200f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
201593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    @Implementation
202593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    public View findViewWithTag(Object obj) {
203b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        if (obj.equals(realView.getTag())) {
204593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken            return realView;
205593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        }
206593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken
207593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        return null;
208593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    }
2096eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
210de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2110c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    public View getRootView() {
212afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams        ShadowView root = this;
213adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        while (root.parent != null) {
2140c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol            root = root.parent;
2150c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        }
2160c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        return root.realView;
2170c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    }
2180c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol
219de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
220d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    public ViewGroup.LayoutParams getLayoutParams() {
221d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz        return layoutParams;
222d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    }
223d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz
224de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
225b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    public void setLayoutParams(ViewGroup.LayoutParams params) {
226b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard        layoutParams = params;
227b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    }
228b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard
229de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2305411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public final ViewParent getParent() {
231a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        return parent == null ? null : (ViewParent) parent.realView;
2325411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
2335411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
234de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2356eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public final Context getContext() {
2366eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context;
2376eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2386eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
239de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2406eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public Resources getResources() {
2416eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context.getResources();
2426eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2436eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
244de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2454d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    public void setBackgroundResource(int backgroundResourceId) {
2464d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin        this.backgroundResourceId = backgroundResourceId;
247a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(getResources().getDrawable(backgroundResourceId));
248a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
249a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
250a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
251a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
252a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
253a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource ID of this views background
254a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
255a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundResourceId() {
256a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundResourceId;
257a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
258a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
259a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
260a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundColor(int color) {
261a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        backgroundColor = color;
262a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(new ColorDrawable(getResources().getColor(color)));
263a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
264a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
265a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
266a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
267a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
268a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource color ID of this views background
269a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
270a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundColor() {
271a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundColor;
272a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
273a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
274a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
275a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundDrawable(Drawable d) {
276a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.background = d;
277a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
278a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
279a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
280a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Drawable getBackground() {
281a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return background;
2824d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    }
2834d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin
284de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2856eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getVisibility() {
2866eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return visibility;
2876eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2886eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
289de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2906eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setVisibility(int visibility) {
2916eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.visibility = visibility;
2926eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
293eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz
294de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
295eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    public void setSelected(boolean selected) {
296eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz        this.selected = selected;
297eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    }
298810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
299de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
300acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    public boolean isSelected() {
301acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz        return this.selected;
302acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    }
303acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz
304de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
305775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public boolean isEnabled() {
306775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        return this.enabled;
307775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
308adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
309de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
310775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public void setEnabled(boolean enabled) {
311775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        this.enabled = enabled;
312775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
313775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard
314de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
315810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public void setOnClickListener(View.OnClickListener onClickListener) {
316810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        this.onClickListener = onClickListener;
317810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
318810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
319de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
320810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public boolean performClick() {
321810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        if (onClickListener != null) {
322810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            onClickListener.onClick(realView);
323810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return true;
324810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        } else {
325810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return false;
326810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        }
327810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
328c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
329de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
330d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) {
331d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        this.onLongClickListener = onLongClickListener;
332d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
333d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
334d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
335d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public boolean performLongClick() {
336d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (onLongClickListener != null) {
337d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            onLongClickListener.onLongClick(realView);
338d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return true;
339d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        } else {
340d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return false;
341d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
342d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
343d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
344d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
3455411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnKeyListener(View.OnKeyListener onKeyListener) {
3465411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        this.onKeyListener = onKeyListener;
3475411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3485411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
349de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
350c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public Object getTag() {
351c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        return this.tag;
352c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
353c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
354de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
355c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public void setTag(Object tag) {
356c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        this.tag = tag;
357c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
35818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
359de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
36018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getHeight() {
361a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return bottom - top;
36218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
36318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
364de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
36518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getWidth() {
366a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return right - left;
36718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
36818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
369de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
370924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final int getMeasuredWidth() {
371a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return getWidth();
372a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    }
373a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
374de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
3752b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public final int getMeasuredHeight() {
3762b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur        return getHeight();
3772b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    }
3782b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur
3792b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    @Implementation
380a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    public final void layout(int l, int t, int r, int b) {
381a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        left = l;
382a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        top = t;
383a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        right = r;
384a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        bottom = b;
385a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
386a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo:       realView.onLayout();
387924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
388adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
389de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
39018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public void setPadding(int left, int top, int right, int bottom) {
39118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingLeft = left;
39218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingTop = top;
39318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingRight = right;
39418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingBottom = bottom;
39518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
39618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
397de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
39818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingTop() {
39918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingTop;
40018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
40118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
402de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
40318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingLeft() {
40418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingLeft;
40518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
40618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
407de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
40818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingRight() {
40918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingRight;
41018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
41118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
412de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
41318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingBottom() {
41418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingBottom;
41518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
41651fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz
417de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
41844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public Object getTag(int key) {
41944ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        return tags.get(key);
42044ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
42144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
422de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
42344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public void setTag(int key, Object value) {
42444ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        tags.put(key, value);
42544ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
4265411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
42765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4284241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public void requestLayout() {
4294241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        didRequestLayout = true;
4304241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4314241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4324241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public boolean didRequestLayout() {
4334241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        return didRequestLayout;
4344241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4354241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4364241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    @Implementation
43765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus() {
43865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return requestFocus(View.FOCUS_DOWN);
43965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
44065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
44165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
44265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus(int direction) {
44365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(true);
44465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return true;
44565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
44665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
4475411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setViewFocus(boolean hasFocus) {
4489729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        this.isFocused = hasFocus;
44943c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen
4506ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        try {
4516ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            Class rectClass = Class.forName("android.graphics.Rect");
45243c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen            Method method = View.class.getDeclaredMethod("onFocusChanged", Boolean.TYPE, Integer.TYPE,
4536ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen                rectClass);
4546ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            method.setAccessible(true);
4556ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            method.invoke(realView, this.isFocused, 0, null);
4566ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (IllegalAccessException e) {
4576ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
4586ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (InvocationTargetException e) {
4596ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
4606ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (NoSuchMethodException e) {
4616ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
4626ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (ClassNotFoundException e) {
4636ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
4646ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        }
46543c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen
4665411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        if (onFocusChangeListener != null) {
46743c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen            onFocusChangeListener.onFocusChange(realView, hasFocus);
4685411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        }
4695411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
4705411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
471de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
4727cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public int getNextFocusDownId() {
4737cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        return nextFocusDownId;
4747cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
4757cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
4767cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
4777cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public void setNextFocusDownId(int nextFocusDownId) {
4787cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        this.nextFocusDownId = nextFocusDownId;
4797cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
4807cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
4817cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
48265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public boolean isFocused() {
4839729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
48465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
48565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
48665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4875411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public boolean hasFocus() {
4889729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
4895411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
4905411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
491de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
49265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public void clearFocus() {
49365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(false);
49465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
49543c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen
49665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4975411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnFocusChangeListener(View.OnFocusChangeListener listener) {
4985411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        onFocusChangeListener = listener;
4995411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
500f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
5010a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    @Implementation
5022b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public View.OnFocusChangeListener getOnFocusChangeListener() {
5030a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor        return onFocusChangeListener;
5040a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    }
5051c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard
506de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
5071c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    public void invalidate() {
5081c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard        wasInvalidated = true;
5091c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    }
510924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
511de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
5121e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    public boolean onTouchEvent(MotionEvent event) {
513840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        lastTouchEvent = event;
514840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return false;
5151e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    }
5161e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu
5171e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    @Implementation
518924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public void setOnTouchListener(View.OnTouchListener onTouchListener) {
519924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        this.onTouchListener = onTouchListener;
520924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
521924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
522de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
523924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public boolean dispatchTouchEvent(MotionEvent event) {
5247bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala        if (onTouchListener != null && onTouchListener.onTouch(realView, event)) {
5257bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala            return true;
526924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        }
527840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return realView.onTouchEvent(event);
528840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    }
529840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu
530840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    public MotionEvent getLastTouchEvent() {
531840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return lastTouchEvent;
532924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
5332ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin
534445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    @Implementation
5352b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public boolean dispatchKeyEvent(KeyEvent event) {
536445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        if (onKeyListener != null) {
537445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin            return onKeyListener.onKey(realView, event.getKeyCode(), event);
538445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        }
539445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        return false;
540445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    }
541445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin
542ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
543da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string.
54440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * <p/>
545da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Robolectric extension.
546ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5472ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
5482ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return "";
5492ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
55086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
551ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
552ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out}
553ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
55486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump() {
55586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dump(System.out, 0);
55686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
55786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
558ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
559ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out} at the given indentation level
560ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
56186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump(PrintStream out, int indent) {
56286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
56386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.println("/>");
56486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
56586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
56686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpFirstPart(PrintStream out, int indent) {
56786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpIndent(out, indent);
56886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
56986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.print("<" + realView.getClass().getSimpleName());
57086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (id > 0) {
57186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\"");
57286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
57386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
57486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
57586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpIndent(PrintStream out, int indent) {
57686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        for (int i = 0; i < indent; i++) out.print(" ");
57786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
5784d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
579ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
580ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return left side of the view
581ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
582bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5834d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getLeft() {
5844d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return left;
5854d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5864d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
587ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
588ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return top coordinate of the view
589ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
590bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5914d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getTop() {
5924d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return top;
5934d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
595ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
596ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return right side of the view
597ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
598bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5994d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getRight() {
6004d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return right;
6014d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6024d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
603ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
604ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return bottom coordinate of the view
605ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
606bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6074d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBottom() {
6084d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return bottom;
6094d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6104d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
611ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
612ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the view is clickable
613ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
614bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6154d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean isClickable() {
6164d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return clickable;
6174d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6184d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
619ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
620de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
621ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
622ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether or not {@link #invalidate()} has been called
623ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6244d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean wasInvalidated() {
6254d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return wasInvalidated;
6264d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
628ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
629ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Clears the wasInvalidated flag
630ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void clearWasInvalidated() {
6324d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        wasInvalidated = false;
6334d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6344d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
635ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
636de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
637ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setLeft(int left) {
6394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.left = left;
6404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
642ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
643de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
644ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setTop(int top) {
6464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.top = top;
6474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
649ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
650de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
651ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setRight(int right) {
6534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.right = right;
6544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
656ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
657de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
658ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setBottom(int bottom) {
6604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.bottom = bottom;
6614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
663ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
664de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
665ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingLeft(int paddingLeft) {
6674d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingLeft = paddingLeft;
6684d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
670ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
671de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
672ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6734d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingTop(int paddingTop) {
6744d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingTop = paddingTop;
6754d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6764d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
677ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
678de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
679ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6804d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingRight(int paddingRight) {
6814d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingRight = paddingRight;
6824d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6834d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
684ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
685de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
686ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6874d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingBottom(int paddingBottom) {
6884d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingBottom = paddingBottom;
6894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6904d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
691ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
692de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
693ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setFocused(boolean focused) {
6954d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        isFocused = focused;
6964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6978de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz
6988de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    /**
6998de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * Non-Android accessor.
7008de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *
7018de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or
7028de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *         any ancestor is not {@code View.VISIBLE}
7038de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     */
7048de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    public boolean derivedIsVisible() {
7058de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        View parent = realView;
7068de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        while (parent != null) {
7078de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            if (parent.getVisibility() != View.VISIBLE) {
7088de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz                return false;
7098de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            }
7108de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            parent = (View) parent.getParent();
7118de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        }
7128de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        return true;
7138de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    }
714c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
715c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    /**
716c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app.
717c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     *
718c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible.
719c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     */
720c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    public boolean checkedPerformClick() {
721c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!derivedIsVisible()) {
722c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not visible and cannot be clicked");
723c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
724c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!realView.isEnabled()) {
725c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not enabled and cannot be clicked");
726c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
727c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
728c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        return realView.performClick();
729c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    }
7305101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
73106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    public void applyFocus() {
73206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        if (noParentHasFocus(realView)) {
73306dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false);
73406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (focusRequested || realView.isFocusableInTouchMode()) {
73506dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz                realView.requestFocus();
73606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            }
73706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        }
7385101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
7395101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
7405189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    private void applyIdAttribute() {
7415189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        Integer id = attributeSet.getAttributeResourceValue("android", "id", 0);
7425189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        if (getId() == 0) {
7435189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz            setId(id);
7442bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz        }
7452bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz    }
746d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
747b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken    private void applyTagAttribute() {
748d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        Object tag = attributeSet.getAttributeValue("android", "tag");
749d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (tag != null) {
750d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            setTag(tag);
751d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
752d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
7532bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz
7546be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz    private void applyVisibilityAttribute() {
7556be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        String visibility = attributeSet.getAttributeValue("android", "visibility");
7565101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        if (visibility != null) {
7575101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            if (visibility.equals("gone")) {
7585101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.GONE);
7595101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            } else if (visibility.equals("invisible")) {
7605101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.INVISIBLE);
7615101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            }
7625101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        }
7635101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
7645101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
76549e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz    private void applyEnabledAttribute() {
76649e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true));
7675101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
76819d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz
7694cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz    private void applyBackgroundAttribute() {
77040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        String source = attributeSet.getAttributeValue("android", "background");
77140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        if (source != null) {
77240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            if (source.startsWith("@drawable/")) {
77340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0));
77440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            }
77540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        }
7766d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse    }
7776d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse
7786c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    private void applyOnClickAttribute() {
7796c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        final String handlerName = attributeSet.getAttributeValue("android",
780d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                "onClick");
7816c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        if (handlerName == null) {
7826c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            return;
7836c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        }
7846c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
7856c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        /* good part of following code has been directly copied from original
7866c887826366610c9e44c21a9fec6020219226283Gautier Hayoun         * android source */
7876c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        setOnClickListener(new View.OnClickListener() {
78843c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen            @Override
7896c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            public void onClick(View v) {
7906c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                Method mHandler;
7916c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
7926c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler = getContext().getClass().getMethod(handlerName,
793d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            View.class);
7946c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (NoSuchMethodException e) {
7956c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    int id = getId();
7966c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    String idText = id == View.NO_ID ? "" : " with id '"
7976c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + shadowOf(context).getResourceLoader()
798d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            .getNameForId(id) + "'";
7996c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not find a method " +
8006c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            handlerName + "(View) in the activity "
8016c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + getContext().getClass() + " for onClick handler"
8026c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + " on view " + realView.getClass() + idText, e);
8036c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
8046c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
8056c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
8066c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler.invoke(getContext(), realView);
8076c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (IllegalAccessException e) {
8086c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute non "
8096c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "public method of the activity", e);
8106c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (InvocationTargetException e) {
8116c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute "
8126c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "method of the activity", e);
8136c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
8146c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            }
8156c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        });
8166c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    }
8176c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
818cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    private void applyContentDescriptionAttribute() {
819cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        String contentDescription = attributeSet.getAttributeValue("android", "contentDescription");
820cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        if (contentDescription != null) {
821cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            if (contentDescription.startsWith("@string/")) {
822cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella                int resId = attributeSet.getAttributeResourceValue("android", "contentDescription", 0);
823cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella                contentDescription = context.getResources().getString(resId);
824cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            }
825cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            setContentDescription(contentDescription);
826cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        }
827cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
828cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
82906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    private boolean noParentHasFocus(View view) {
83019d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        while (view != null) {
83106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (view.hasFocus()) return false;
83219d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz            view = (View) view.getParent();
83319d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        }
83406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        return true;
83519d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz    }
836d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8370ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    /**
8380ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * Non-android accessor.  Returns touch listener, if set.
839d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
8400ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * @return
8410ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     */
8420ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    public View.OnTouchListener getOnTouchListener() {
843d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onTouchListener;
8440ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    }
845d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
84646309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    /**
84746309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * Non-android accessor.  Returns click listener, if set.
848d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
84946309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * @return
85046309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     */
85146309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    public View.OnClickListener getOnClickListener() {
852d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onClickListener;
85346309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    }
854ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
855b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
856ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public void setDrawingCacheEnabled(boolean drawingCacheEnabled) {
857ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        this.drawingCacheEnabled = drawingCacheEnabled;
858ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
859ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
860b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
861ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public boolean isDrawingCacheEnabled() {
862ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return drawingCacheEnabled;
863ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
864ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
865b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
866ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public Bitmap getDrawingCache() {
867ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return Robolectric.newInstanceOf(Bitmap.class);
868ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
86940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
87034f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    @Implementation
87134f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    public void post(Runnable action) {
87234f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey        Robolectric.getUiThreadScheduler().post(action);
87334f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    }
874b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams
875b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    @Implementation
876b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    public void postDelayed(Runnable action, long delayMills) {
877b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams        Robolectric.getUiThreadScheduler().postDelayed(action, delayMills);
878b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    }
879289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz
880289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    @Implementation
881289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    public void postInvalidateDelayed(long delayMilliseconds) {
882289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        Robolectric.getUiThreadScheduler().postDelayed(new Runnable() {
883289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            @Override
884289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            public void run() {
885289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz                realView.invalidate();
886289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            }
887289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        }, delayMilliseconds);
888289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    }
889d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8903f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
8913f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public Animation getAnimation() {
892d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return animation;
8933f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
894d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8953f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
8963f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void setAnimation(Animation anim) {
897d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation = anim;
8983f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
899d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9003f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9013f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void startAnimation(Animation anim) {
902d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        setAnimation(anim);
903d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation.start();
9043f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
905d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9063f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9073f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void clearAnimation() {
908d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (animation != null) {
909d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            animation.cancel();
910d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
9113f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
912a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
913a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
914a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void scrollTo(int x, int y) {
915a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.scrollToCoordinates = new Point(x, y);
916a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
917f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
918cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
919cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollX() {
920cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.x : 0;
921cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
922cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard
923cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
924cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollY() {
925cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.y : 0;
926cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
927f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
928f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    @Implementation
929f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    public ViewTreeObserver getViewTreeObserver() {
930f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        if (viewTreeObserver == null) {
931f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard            viewTreeObserver = newInstanceOf(ViewTreeObserver.class);
932f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        }
933f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        return viewTreeObserver;
934f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
9350c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala
9360c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    @Implementation
9370c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    public void onAnimationEnd() {
9380c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    }
9390c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala
9400c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    /*
9410c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala     * Non-Android accessor.
9420c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala     */
9430c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    public void finishedAnimation() {
94423da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        try {
94523da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            Method onAnimationEnd = realView.getClass().getDeclaredMethod("onAnimationEnd", new Class[0]);
94623da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            onAnimationEnd.setAccessible(true);
94723da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            onAnimationEnd.invoke(realView);
94823da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        } catch (Exception e) {
94923da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            throw new RuntimeException(e);
95023da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        }
9510c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    }
9526eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
953