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;
160eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesiimport android.view.View.MeasureSpec;
176ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewGroup;
186ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewParent;
196ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewTreeObserver;
203f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation;
216ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen
22ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
2322c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
2422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
2522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
266eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
2786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream;
286c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.InvocationTargetException;
296c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.Method;
3051fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap;
3151fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map;
32c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
33ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/**
346c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Shadow implementation of {@code View} that simulates the behavior of this
356c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * class.
36d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * <p/>
376c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Supports listeners, focusability (but not focus order), resource loading,
386c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * visibility, onclick, tags, and tracks the size and shape of the view.
39ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */
40198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
410b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class)
42afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView {
43d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @RealObject
44d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    protected View realView;
456eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
466eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    private int id;
47afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    ShadowView parent;
4870e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz    protected Context context;
494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean selected;
50810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    private View.OnClickListener onClickListener;
51d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    private View.OnLongClickListener onLongClickListener;
52c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    private Object tag;
53775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    private boolean enabled = true;
544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int visibility = View.VISIBLE;
5518f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    private boolean filterTouchesWhenObscured = false;
564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int left;
574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int top;
584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int right;
594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int bottom;
604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingLeft;
614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingTop;
624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingRight;
634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingBottom;
644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0);
6543c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen    private final Map<Integer, Object> tags = new HashMap<Integer, Object>();
664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean clickable;
67254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    protected boolean focusable;
689729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    boolean focusableInTouchMode;
694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int backgroundResourceId = -1;
701f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    private int backgroundColor;
715411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    protected View.OnKeyListener onKeyListener;
724d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean isFocused;
735411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    private View.OnFocusChangeListener onFocusChangeListener;
744d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean wasInvalidated;
75924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    private View.OnTouchListener onTouchListener;
76a2dd5bb88b4bfe0cbe77cfc3581ce42745509760Phil Goodwin & Tyler Schultz    protected AttributeSet attributeSet;
77ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    private boolean drawingCacheEnabled;
78a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Point scrollToCoordinates;
794241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    private boolean didRequestLayout;
80a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    private Drawable background;
813f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    private Animation animation;
82f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private ViewTreeObserver viewTreeObserver;
83840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    private MotionEvent lastTouchEvent;
847cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    private int nextFocusDownId = View.NO_ID;
85cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    private CharSequence contentDescription = null;
860eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    private int measuredWidth = 0;
870eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    private int measuredHeight = 0;
886eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
896eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void __constructor__(Context context) {
903c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, null);
916eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
926eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
935189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    public void __constructor__(Context context, AttributeSet attributeSet) {
943c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, attributeSet, 0);
953c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
963c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
973c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) {
983c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        this.context = context;
995189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        this.attributeSet = attributeSet;
1003c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
1013c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        if (attributeSet != null) {
1023c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams            applyAttributes();
1033c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        }
1043c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
1053c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
1063c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void applyAttributes() {
1075189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        applyIdAttribute();
1086be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        applyVisibilityAttribute();
10918f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo        applyFilterTouchesWhenObscuredAttribute();
110ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo        applyClickableAttribute();
111ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo        applyFocusableAttribute();
11249e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        applyEnabledAttribute();
1134cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz        applyBackgroundAttribute();
114b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken        applyTagAttribute();
1156c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        applyOnClickAttribute();
116cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        applyContentDescriptionAttribute();
117684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams    }
118684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams
119de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1206eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setId(int id) {
1216eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.id = id;
1226eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1236eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
124de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
125cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setClickable(boolean clickable) {
126cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.clickable = clickable;
127cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
128cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
129ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
130ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior.
131ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
132ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusable the new status of the {@code View}'s focusability
133ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
134de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
135cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setFocusable(boolean focusable) {
136cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.focusable = focusable;
137adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (!focusable) {
138415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusableInTouchMode(false);
139415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
140415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
141415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
142415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
143415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public final boolean isFocusableInTouchMode() {
144415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        return focusableInTouchMode;
145415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
146415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
147ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
148ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior.
149ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
150ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability
151ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
152415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
153415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public void setFocusableInTouchMode(boolean focusableInTouchMode) {
154415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        this.focusableInTouchMode = focusableInTouchMode;
155adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (focusableInTouchMode) {
156415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusable(true);
157415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
158cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
159cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
160cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    @Implementation(i18nSafe = false)
161cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    public void setContentDescription(CharSequence contentDescription) {
162cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        this.contentDescription = contentDescription;
163cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
164cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
165de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
166254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    public boolean isFocusable() {
167254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin        return focusable;
168254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    }
169254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin
170254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    @Implementation
1716eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getId() {
1726eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return id;
1736eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1746eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
175cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    @Implementation
176cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    public CharSequence getContentDescription() {
177cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        return contentDescription;
178cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
179cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
180ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
181ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Simulates the inflating of the requested resource.
182ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
1838de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param context  the context from which to obtain a layout inflater
184ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param resource the ID of the resource to inflate
1858de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param root     the {@code ViewGroup} to add the inflated {@code View} to
186ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the inflated View
187ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
188de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
189a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    public static View inflate(Context context, int resource, ViewGroup root) {
19040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return ShadowLayoutInflater.from(context).inflate(resource, root);
191a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    }
192a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz
193ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
194ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise
195ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
196ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param id the id of the {@code View} to find
197ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the {@code View}, if found, {@code null} otherwise
198ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
199de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2006eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public View findViewById(int id) {
201e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        if (id == this.id) {
202e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz            return realView;
203e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        }
2046eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
2056eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return null;
2066eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
207f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
208593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    @Implementation
209593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    public View findViewWithTag(Object obj) {
210b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        if (obj.equals(realView.getTag())) {
211593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken            return realView;
212593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        }
213593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken
214593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        return null;
215593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    }
2166eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
217de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2180c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    public View getRootView() {
219afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams        ShadowView root = this;
220adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        while (root.parent != null) {
2210c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol            root = root.parent;
2220c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        }
2230c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        return root.realView;
2240c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    }
2250c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol
226de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
227d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    public ViewGroup.LayoutParams getLayoutParams() {
228d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz        return layoutParams;
229d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    }
230d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz
231de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
232b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    public void setLayoutParams(ViewGroup.LayoutParams params) {
233b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard        layoutParams = params;
234b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    }
235b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard
236de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2375411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public final ViewParent getParent() {
238a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        return parent == null ? null : (ViewParent) parent.realView;
2395411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
2405411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
241de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2426eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public final Context getContext() {
2436eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context;
2446eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2456eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
246de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2476eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public Resources getResources() {
2486eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context.getResources();
2496eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2506eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
251de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2524d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    public void setBackgroundResource(int backgroundResourceId) {
2534d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin        this.backgroundResourceId = backgroundResourceId;
254a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(getResources().getDrawable(backgroundResourceId));
255a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
256a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
257a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
258a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
259a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
260a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource ID of this views background
261a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
262a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundResourceId() {
263a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundResourceId;
264a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
265a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
266a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
267a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundColor(int color) {
268a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        backgroundColor = color;
269a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(new ColorDrawable(getResources().getColor(color)));
270a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
271a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
272a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
273a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
274a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
275a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource color ID of this views background
276a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
277a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundColor() {
278a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundColor;
279a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
280a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
281a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
282a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundDrawable(Drawable d) {
283a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.background = d;
284a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
285a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
286a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
287a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Drawable getBackground() {
288a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return background;
2894d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    }
2904d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin
291de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2926eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getVisibility() {
2936eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return visibility;
2946eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2956eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
296de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2976eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setVisibility(int visibility) {
2986eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.visibility = visibility;
2996eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
300eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz
301de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
30218f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    public boolean getFilterTouchesWhenObscured() {
30318f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo        return filterTouchesWhenObscured;
30418f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    }
30518f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo
30618f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    @Implementation
30718f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    public void setFilterTouchesWhenObscured(boolean enabled) {
30818f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo        this.filterTouchesWhenObscured = enabled;
30918f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    }
31018f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo
31118f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    @Implementation
312eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    public void setSelected(boolean selected) {
313eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz        this.selected = selected;
314eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    }
315810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
316de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
317acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    public boolean isSelected() {
318acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz        return this.selected;
319acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    }
320acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz
321de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
322775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public boolean isEnabled() {
323775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        return this.enabled;
324775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
325adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
326de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
327775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public void setEnabled(boolean enabled) {
328775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        this.enabled = enabled;
329775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
330775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard
331de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
332810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public void setOnClickListener(View.OnClickListener onClickListener) {
333810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        this.onClickListener = onClickListener;
334810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
335810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
336de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
337810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public boolean performClick() {
338810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        if (onClickListener != null) {
339810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            onClickListener.onClick(realView);
340810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return true;
341810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        } else {
342810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return false;
343810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        }
344810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
345c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
346de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
347d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) {
348d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        this.onLongClickListener = onLongClickListener;
349d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
350d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
351d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
352d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public boolean performLongClick() {
353d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (onLongClickListener != null) {
354d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            onLongClickListener.onLongClick(realView);
355d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return true;
356d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        } else {
357d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return false;
358d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
359d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
360d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
361d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
3625411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnKeyListener(View.OnKeyListener onKeyListener) {
3635411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        this.onKeyListener = onKeyListener;
3645411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3655411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
366de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
367c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public Object getTag() {
368c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        return this.tag;
369c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
370c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
371de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
372c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public void setTag(Object tag) {
373c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        this.tag = tag;
374c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
37518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
376de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
37718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getHeight() {
378a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return bottom - top;
37918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
38018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
381de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
38218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getWidth() {
383a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return right - left;
38418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
38518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
386de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
387924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final int getMeasuredWidth() {
3880eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi        return measuredWidth;
389a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    }
390a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
391de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
3922b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public final int getMeasuredHeight() {
3930eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi        return measuredHeight;
3942b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    }
3950eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
3960eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    @Implementation
3970eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    public final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
3980eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	this.measuredWidth = measuredWidth;
3990eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	this.measuredHeight = measuredHeight;
4000eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    }
4010eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
4020eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    @Implementation
4030eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
4040eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
4050eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    			MeasureSpec.getSize(heightMeasureSpec));
4060eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    }
4070eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
4080eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    @Implementation
4090eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
4100eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// We really want to invoke the onMeasure method of the real view,
4110eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// as the real View likely contains an implementation of onMeasure
4120eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// worthy of test, rather the default shadow implementation.
4130eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// But Android declares onMeasure as protected.
4140eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	try {
4150eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    		Method onMeasureMethod = realView.getClass().getDeclaredMethod("onMeasure", Integer.TYPE, Integer.TYPE );
4160eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    		onMeasureMethod.setAccessible(true);
4170eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    		onMeasureMethod.invoke( realView, widthMeasureSpec, heightMeasureSpec );
418f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	} catch ( NoSuchMethodException e ) {
419f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		// use default shadow implementation
420f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		onMeasure(widthMeasureSpec, heightMeasureSpec);
421f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	} catch ( IllegalAccessException e ) {
422f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		throw new RuntimeException(e);
423f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	} catch ( InvocationTargetException e ) {
424f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		throw new RuntimeException(e);
425f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	}
4260eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    }
4270eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
4282b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    @Implementation
429a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    public final void layout(int l, int t, int r, int b) {
430a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        left = l;
431a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        top = t;
432a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        right = r;
433a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        bottom = b;
434a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo:       realView.onLayout();
435924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
436adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
437de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
43818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public void setPadding(int left, int top, int right, int bottom) {
43918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingLeft = left;
44018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingTop = top;
44118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingRight = right;
44218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingBottom = bottom;
44318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
44418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
445de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
44618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingTop() {
44718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingTop;
44818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
44918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
450de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
45118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingLeft() {
45218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingLeft;
45318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
45418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
455de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
45618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingRight() {
45718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingRight;
45818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
45918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
460de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
46118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingBottom() {
46218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingBottom;
46318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
46451fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz
465de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
46644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public Object getTag(int key) {
46744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        return tags.get(key);
46844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
46944ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
470de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
47144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public void setTag(int key, Object value) {
47244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        tags.put(key, value);
47344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
4745411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
47565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4764241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public void requestLayout() {
4774241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        didRequestLayout = true;
4784241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4794241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4804241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public boolean didRequestLayout() {
4814241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        return didRequestLayout;
4824241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4834241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4844241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    @Implementation
48565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus() {
48665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return requestFocus(View.FOCUS_DOWN);
48765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
48865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
48965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
49065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus(int direction) {
49165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(true);
49265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return true;
49365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
49465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
4955411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setViewFocus(boolean hasFocus) {
4969729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        this.isFocused = hasFocus;
49743c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen
4986ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        try {
4996ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            Class rectClass = Class.forName("android.graphics.Rect");
50043c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen            Method method = View.class.getDeclaredMethod("onFocusChanged", Boolean.TYPE, Integer.TYPE,
5016ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen                rectClass);
5026ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            method.setAccessible(true);
5036ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            method.invoke(realView, this.isFocused, 0, null);
5046ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (IllegalAccessException e) {
5056ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
5066ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (InvocationTargetException e) {
5076ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
5086ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (NoSuchMethodException e) {
5096ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
5106ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        } catch (ClassNotFoundException e) {
5116ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen            throw new RuntimeException(e);
5126ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen        }
51343c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen
5145411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        if (onFocusChangeListener != null) {
51543c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen            onFocusChangeListener.onFocusChange(realView, hasFocus);
5165411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        }
5175411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
5185411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
519de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
5207cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public int getNextFocusDownId() {
5217cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        return nextFocusDownId;
5227cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
5237cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
5247cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
5257cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public void setNextFocusDownId(int nextFocusDownId) {
5267cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        this.nextFocusDownId = nextFocusDownId;
5277cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
5287cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
5297cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
53065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public boolean isFocused() {
5319729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
53265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
53365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
53465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
5355411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public boolean hasFocus() {
5369729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
5375411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
5385411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
539de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
54065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public void clearFocus() {
54165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(false);
54265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
54343c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen
54465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
54510afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    public View findFocus() {
54610afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        return hasFocus() ? realView : null;
54710afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    }
54810afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias
54910afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    @Implementation
5505411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnFocusChangeListener(View.OnFocusChangeListener listener) {
5515411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        onFocusChangeListener = listener;
5525411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
553f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
5540a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    @Implementation
5552b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public View.OnFocusChangeListener getOnFocusChangeListener() {
5560a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor        return onFocusChangeListener;
5570a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    }
5581c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard
559de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
5601c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    public void invalidate() {
5611c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard        wasInvalidated = true;
5621c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    }
563924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
564de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
5651e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    public boolean onTouchEvent(MotionEvent event) {
566840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        lastTouchEvent = event;
567840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return false;
5681e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    }
5691e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu
5701e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    @Implementation
571924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public void setOnTouchListener(View.OnTouchListener onTouchListener) {
572924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        this.onTouchListener = onTouchListener;
573924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
574924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
575de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
576924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public boolean dispatchTouchEvent(MotionEvent event) {
5777bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala        if (onTouchListener != null && onTouchListener.onTouch(realView, event)) {
5787bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala            return true;
579924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        }
580840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return realView.onTouchEvent(event);
581840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    }
582840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu
583840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    public MotionEvent getLastTouchEvent() {
584840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return lastTouchEvent;
585924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
5862ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin
587445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    @Implementation
5882b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public boolean dispatchKeyEvent(KeyEvent event) {
589445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        if (onKeyListener != null) {
590445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin            return onKeyListener.onKey(realView, event.getKeyCode(), event);
591445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        }
592445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        return false;
593445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    }
594445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin
595ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
596da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string.
59740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * <p/>
598da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Robolectric extension.
599ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6002ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
6012ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return "";
6022ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
60386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
604ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
605ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out}
606ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
60786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump() {
60886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dump(System.out, 0);
60986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
61086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
611ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
612ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out} at the given indentation level
613ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
61486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump(PrintStream out, int indent) {
61586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
61686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.println("/>");
61786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
61886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
61986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpFirstPart(PrintStream out, int indent) {
62086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpIndent(out, indent);
62186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
62286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.print("<" + realView.getClass().getSimpleName());
62386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (id > 0) {
62486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\"");
62586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
62686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
62786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
62886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpIndent(PrintStream out, int indent) {
62986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        for (int i = 0; i < indent; i++) out.print(" ");
63086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
6314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
632ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
633ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return left side of the view
634ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
635bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getLeft() {
6374d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return left;
6384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
640ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
641ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return top coordinate of the view
642ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
643bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getTop() {
6454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return top;
6464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
648ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
649ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return right side of the view
650ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
651bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getRight() {
6534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return right;
6544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
656ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
657ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return bottom coordinate of the view
658ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
659bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBottom() {
6614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return bottom;
6624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
664ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
665ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the view is clickable
666ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
667bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6684d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean isClickable() {
6694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return clickable;
6704d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6714d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
672ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
673de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
674ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
675ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether or not {@link #invalidate()} has been called
676ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6774d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean wasInvalidated() {
6784d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return wasInvalidated;
6794d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6804d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
681ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
682ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Clears the wasInvalidated flag
683ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6844d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void clearWasInvalidated() {
6854d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        wasInvalidated = false;
6864d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6874d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
6880bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi    @Implementation
6894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setLeft(int left) {
6904d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.left = left;
6914d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6924d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
6930bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi    @Implementation
6944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setTop(int top) {
6954d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.top = top;
6964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6974d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
6980bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi    @Implementation
6994d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setRight(int right) {
7004d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.right = right;
7014d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7024d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
7030bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi    @Implementation
7044d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setBottom(int bottom) {
7054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.bottom = bottom;
7064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7074d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
708ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
709de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
710ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
7114d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingLeft(int paddingLeft) {
7124d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingLeft = paddingLeft;
7134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7144d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
715ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
716de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
717ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
7184d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingTop(int paddingTop) {
7194d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingTop = paddingTop;
7204d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7214d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
722ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
723de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
724ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
7254d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingRight(int paddingRight) {
7264d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingRight = paddingRight;
7274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7284d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
729ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
730de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
731ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
7324d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingBottom(int paddingBottom) {
7334d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingBottom = paddingBottom;
7344d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7354d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
736ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
737de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
738ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
7394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setFocused(boolean focused) {
7404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        isFocused = focused;
7414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7428de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz
7438de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    /**
7448de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * Non-Android accessor.
7458de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *
7468de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or
7478de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *         any ancestor is not {@code View.VISIBLE}
7488de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     */
7498de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    public boolean derivedIsVisible() {
7508de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        View parent = realView;
7518de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        while (parent != null) {
7528de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            if (parent.getVisibility() != View.VISIBLE) {
7538de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz                return false;
7548de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            }
7558de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            parent = (View) parent.getParent();
7568de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        }
7578de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        return true;
7588de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    }
759c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
760c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    /**
761c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app.
762c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     *
763c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible.
764c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     */
765c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    public boolean checkedPerformClick() {
766c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!derivedIsVisible()) {
767c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not visible and cannot be clicked");
768c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
769c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!realView.isEnabled()) {
770c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not enabled and cannot be clicked");
771c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
772c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
773c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        return realView.performClick();
774c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    }
7755101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
77606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    public void applyFocus() {
77706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        if (noParentHasFocus(realView)) {
77806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false);
77906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (focusRequested || realView.isFocusableInTouchMode()) {
78006dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz                realView.requestFocus();
78106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            }
78206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        }
7835101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
7845101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
7855189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    private void applyIdAttribute() {
7865189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        Integer id = attributeSet.getAttributeResourceValue("android", "id", 0);
7875189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        if (getId() == 0) {
7885189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz            setId(id);
7892bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz        }
7902bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz    }
791d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
792b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken    private void applyTagAttribute() {
793d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        Object tag = attributeSet.getAttributeValue("android", "tag");
794d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (tag != null) {
795d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            setTag(tag);
796d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
797d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
7982bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz
7996be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz    private void applyVisibilityAttribute() {
8006be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        String visibility = attributeSet.getAttributeValue("android", "visibility");
8015101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        if (visibility != null) {
8025101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            if (visibility.equals("gone")) {
8035101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.GONE);
8045101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            } else if (visibility.equals("invisible")) {
8055101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.INVISIBLE);
8065101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            }
8075101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        }
8085101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
8095101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
81018f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    private void applyFilterTouchesWhenObscuredAttribute() {
81118f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo        setFilterTouchesWhenObscured(attributeSet.getAttributeBooleanValue(
81218f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo                "android", "filterTouchesWhenObscured", false));
81318f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo    }
81418f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo
815ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo    private void applyClickableAttribute() {
816ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo        setClickable(attributeSet.getAttributeBooleanValue("android", "clickable", false));
817ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo    }
818ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo
819ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo    private void applyFocusableAttribute() {
820ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo        setFocusable(attributeSet.getAttributeBooleanValue("android", "focusable", false));
821ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo    }
822ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo
82349e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz    private void applyEnabledAttribute() {
82449e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true));
8255101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
82619d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz
8274cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz    private void applyBackgroundAttribute() {
82840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        String source = attributeSet.getAttributeValue("android", "background");
82940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        if (source != null) {
83040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            if (source.startsWith("@drawable/")) {
83140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0));
83240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            }
83340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        }
8346d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse    }
8356d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse
8366c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    private void applyOnClickAttribute() {
8376c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        final String handlerName = attributeSet.getAttributeValue("android",
838d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                "onClick");
8396c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        if (handlerName == null) {
8406c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            return;
8416c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        }
8426c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
8436c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        /* good part of following code has been directly copied from original
8446c887826366610c9e44c21a9fec6020219226283Gautier Hayoun         * android source */
8456c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        setOnClickListener(new View.OnClickListener() {
84643c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen            @Override
8476c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            public void onClick(View v) {
8486c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                Method mHandler;
8496c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
8506c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler = getContext().getClass().getMethod(handlerName,
851d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            View.class);
8526c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (NoSuchMethodException e) {
8536c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    int id = getId();
8546c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    String idText = id == View.NO_ID ? "" : " with id '"
8556c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + shadowOf(context).getResourceLoader()
856d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            .getNameForId(id) + "'";
8576c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not find a method " +
8586c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            handlerName + "(View) in the activity "
8596c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + getContext().getClass() + " for onClick handler"
8606c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + " on view " + realView.getClass() + idText, e);
8616c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
8626c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
8636c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
8646c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler.invoke(getContext(), realView);
8656c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (IllegalAccessException e) {
8666c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute non "
8676c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "public method of the activity", e);
8686c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (InvocationTargetException e) {
8696c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute "
8706c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "method of the activity", e);
8716c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
8726c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            }
8736c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        });
8746c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    }
8756c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
876cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    private void applyContentDescriptionAttribute() {
877cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        String contentDescription = attributeSet.getAttributeValue("android", "contentDescription");
878cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        if (contentDescription != null) {
879cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            if (contentDescription.startsWith("@string/")) {
880cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella                int resId = attributeSet.getAttributeResourceValue("android", "contentDescription", 0);
881cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella                contentDescription = context.getResources().getString(resId);
882cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            }
883cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            setContentDescription(contentDescription);
884cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        }
885cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
886cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
88706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    private boolean noParentHasFocus(View view) {
88819d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        while (view != null) {
88906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (view.hasFocus()) return false;
89019d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz            view = (View) view.getParent();
89119d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        }
89206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        return true;
89319d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz    }
894d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8950ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    /**
8960ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * Non-android accessor.  Returns touch listener, if set.
897d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
8980ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * @return
8990ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     */
9000ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    public View.OnTouchListener getOnTouchListener() {
901d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onTouchListener;
9020ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    }
903d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
90446309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    /**
90546309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * Non-android accessor.  Returns click listener, if set.
906d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
90746309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * @return
90846309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     */
90946309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    public View.OnClickListener getOnClickListener() {
910d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onClickListener;
91146309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    }
912ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
913b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
914ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public void setDrawingCacheEnabled(boolean drawingCacheEnabled) {
915ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        this.drawingCacheEnabled = drawingCacheEnabled;
916ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
917ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
918b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
919ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public boolean isDrawingCacheEnabled() {
920ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return drawingCacheEnabled;
921ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
922ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
923b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
924ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public Bitmap getDrawingCache() {
925ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return Robolectric.newInstanceOf(Bitmap.class);
926ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
92740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
92834f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    @Implementation
92934f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    public void post(Runnable action) {
93034f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey        Robolectric.getUiThreadScheduler().post(action);
93134f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    }
932b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams
933b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    @Implementation
934b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    public void postDelayed(Runnable action, long delayMills) {
935b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams        Robolectric.getUiThreadScheduler().postDelayed(action, delayMills);
936b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    }
937289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz
938289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    @Implementation
939289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    public void postInvalidateDelayed(long delayMilliseconds) {
940289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        Robolectric.getUiThreadScheduler().postDelayed(new Runnable() {
941289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            @Override
942289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            public void run() {
943289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz                realView.invalidate();
944289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            }
945289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        }, delayMilliseconds);
946289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    }
947d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9483f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9493f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public Animation getAnimation() {
950d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return animation;
9513f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
952d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9533f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9543f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void setAnimation(Animation anim) {
955d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation = anim;
9563f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
957d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9583f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9593f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void startAnimation(Animation anim) {
960d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        setAnimation(anim);
961d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation.start();
9623f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
963d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9643f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9653f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void clearAnimation() {
966d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (animation != null) {
967d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            animation.cancel();
968f65a5dab0313865a75b98d7ef53f2773167224e0Jessica Chen            animation = null;
969d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
9703f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
971a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
972a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
973a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void scrollTo(int x, int y) {
974a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.scrollToCoordinates = new Point(x, y);
975a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
976f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
977cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
978cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollX() {
979cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.x : 0;
980cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
981cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard
982cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
983cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollY() {
984cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.y : 0;
985cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
986f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
987f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    @Implementation
988f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    public ViewTreeObserver getViewTreeObserver() {
989f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        if (viewTreeObserver == null) {
990f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard            viewTreeObserver = newInstanceOf(ViewTreeObserver.class);
991f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        }
992f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        return viewTreeObserver;
993f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
9940c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala
9950c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    @Implementation
9960c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    public void onAnimationEnd() {
9970c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    }
9980c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala
9990c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    /*
10000c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala     * Non-Android accessor.
10010c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala     */
10020c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    public void finishedAnimation() {
100323da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        try {
100423da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            Method onAnimationEnd = realView.getClass().getDeclaredMethod("onAnimationEnd", new Class[0]);
100523da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            onAnimationEnd.setAccessible(true);
100623da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            onAnimationEnd.invoke(realView);
100723da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        } catch (Exception e) {
100823da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            throw new RuntimeException(e);
100923da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        }
10100c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    }
10116eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
1012