ShadowView.java revision f058047d73230c81d51a52b5fb17a14ae7403dc3
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
36eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.Context;
46eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.res.Resources;
5ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport android.graphics.Bitmap;
6a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultzimport android.graphics.Point;
7a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.ColorDrawable;
8a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.Drawable;
9684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet;
10445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwinimport android.view.*;
110eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesiimport android.view.View.MeasureSpec;
123f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation;
13ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
1422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
1622c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
176eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
1886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream;
196c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.InvocationTargetException;
206c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.Method;
2151fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap;
2251fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map;
23c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
24f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport static com.xtremelabs.robolectric.Robolectric.Reflection.newInstanceOf;
2586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
2686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
27ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/**
286c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Shadow implementation of {@code View} that simulates the behavior of this
296c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * class.
30d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * <p/>
316c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Supports listeners, focusability (but not focus order), resource loading,
326c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * visibility, onclick, tags, and tracks the size and shape of the view.
33ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */
34198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
350b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class)
36afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView {
37d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @RealObject
38d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    protected View realView;
396eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
406eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    private int id;
41afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    ShadowView parent;
4270e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz    protected Context context;
434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean selected;
44810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    private View.OnClickListener onClickListener;
45d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    private View.OnLongClickListener onLongClickListener;
46c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    private Object tag;
47775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    private boolean enabled = true;
484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int visibility = View.VISIBLE;
494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int left;
504d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int top;
514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int right;
524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int bottom;
534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingLeft;
544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingTop;
554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingRight;
564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingBottom;
574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0);
5844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    private Map<Integer, Object> tags = new HashMap<Integer, Object>();
594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean clickable;
60254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    protected boolean focusable;
619729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    boolean focusableInTouchMode;
624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int backgroundResourceId = -1;
631f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    private int backgroundColor;
645411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    protected View.OnKeyListener onKeyListener;
654d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean isFocused;
665411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    private View.OnFocusChangeListener onFocusChangeListener;
674d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean wasInvalidated;
68924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    private View.OnTouchListener onTouchListener;
69a2dd5bb88b4bfe0cbe77cfc3581ce42745509760Phil Goodwin & Tyler Schultz    protected AttributeSet attributeSet;
70ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    private boolean drawingCacheEnabled;
71a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Point scrollToCoordinates;
724241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    private boolean didRequestLayout;
73a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    private Drawable background;
743f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    private Animation animation;
75f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private ViewTreeObserver viewTreeObserver;
76840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    private MotionEvent lastTouchEvent;
777cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    private int nextFocusDownId = View.NO_ID;
78cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    private CharSequence contentDescription = null;
790eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    private int measuredWidth = 0;
800eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    private int measuredHeight = 0;
816eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
826eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void __constructor__(Context context) {
833c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, null);
846eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
856eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
865189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    public void __constructor__(Context context, AttributeSet attributeSet) {
873c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, attributeSet, 0);
883c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
893c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
903c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) {
913c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        this.context = context;
925189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        this.attributeSet = attributeSet;
933c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
943c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        if (attributeSet != null) {
953c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams            applyAttributes();
963c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        }
973c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
983c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
993c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void applyAttributes() {
1005189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        applyIdAttribute();
1016be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        applyVisibilityAttribute();
10249e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        applyEnabledAttribute();
1034cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz        applyBackgroundAttribute();
104b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken        applyTagAttribute();
1056c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        applyOnClickAttribute();
106cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        applyContentDescriptionAttribute();
107684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams    }
108684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams
109de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1106eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setId(int id) {
1116eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.id = id;
1126eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1136eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
114de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
115cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setClickable(boolean clickable) {
116cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.clickable = clickable;
117cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
118cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
119ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
120ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior.
121ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
122ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusable the new status of the {@code View}'s focusability
123ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
124de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
125cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setFocusable(boolean focusable) {
126cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.focusable = focusable;
127adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (!focusable) {
128415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusableInTouchMode(false);
129415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
130415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
131415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
132415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
133415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public final boolean isFocusableInTouchMode() {
134415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        return focusableInTouchMode;
135415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
136415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
137ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
138ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior.
139ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
140ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability
141ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
142415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
143415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public void setFocusableInTouchMode(boolean focusableInTouchMode) {
144415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        this.focusableInTouchMode = focusableInTouchMode;
145adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (focusableInTouchMode) {
146415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusable(true);
147415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
148cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
149cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
150cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    @Implementation(i18nSafe = false)
151cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    public void setContentDescription(CharSequence contentDescription) {
152cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        this.contentDescription = contentDescription;
153cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
154cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
155de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
156254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    public boolean isFocusable() {
157254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin        return focusable;
158254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    }
159254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin
160254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    @Implementation
1616eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getId() {
1626eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return id;
1636eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1646eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
165cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    @Implementation
166cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    public CharSequence getContentDescription() {
167cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        return contentDescription;
168cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
169cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
170ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
171ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Simulates the inflating of the requested resource.
172ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
1738de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param context  the context from which to obtain a layout inflater
174ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param resource the ID of the resource to inflate
1758de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param root     the {@code ViewGroup} to add the inflated {@code View} to
176ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the inflated View
177ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
178de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
179a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    public static View inflate(Context context, int resource, ViewGroup root) {
18040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return ShadowLayoutInflater.from(context).inflate(resource, root);
181a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    }
182a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz
183ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
184ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise
185ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
186ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param id the id of the {@code View} to find
187ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the {@code View}, if found, {@code null} otherwise
188ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
189de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1906eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public View findViewById(int id) {
191e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        if (id == this.id) {
192e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz            return realView;
193e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        }
1946eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
1956eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return null;
1966eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
197f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
198593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    @Implementation
199593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    public View findViewWithTag(Object obj) {
200b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        if (obj.equals(realView.getTag())) {
201593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken            return realView;
202593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        }
203593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken
204593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        return null;
205593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    }
2066eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
207de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2080c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    public View getRootView() {
209afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams        ShadowView root = this;
210adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        while (root.parent != null) {
2110c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol            root = root.parent;
2120c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        }
2130c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        return root.realView;
2140c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    }
2150c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol
216de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
217d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    public ViewGroup.LayoutParams getLayoutParams() {
218d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz        return layoutParams;
219d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    }
220d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz
221de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
222b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    public void setLayoutParams(ViewGroup.LayoutParams params) {
223b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard        layoutParams = params;
224b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    }
225b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard
226de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2275411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public final ViewParent getParent() {
228a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        return parent == null ? null : (ViewParent) parent.realView;
2295411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
2305411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
231de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2326eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public final Context getContext() {
2336eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context;
2346eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2356eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
236de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2376eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public Resources getResources() {
2386eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context.getResources();
2396eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2406eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
241de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2424d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    public void setBackgroundResource(int backgroundResourceId) {
2434d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin        this.backgroundResourceId = backgroundResourceId;
244a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(getResources().getDrawable(backgroundResourceId));
245a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
246a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
247a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
248a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
249a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
250a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource ID of this views background
251a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
252a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundResourceId() {
253a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundResourceId;
254a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
255a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
256a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
257a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundColor(int color) {
258a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        backgroundColor = color;
259a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(new ColorDrawable(getResources().getColor(color)));
260a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
261a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
262a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
263a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
264a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
265a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource color ID of this views background
266a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
267a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundColor() {
268a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundColor;
269a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
270a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
271a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
272a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundDrawable(Drawable d) {
273a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.background = d;
274a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
275a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
276a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
277a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Drawable getBackground() {
278a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return background;
2794d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    }
2804d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin
281de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2826eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getVisibility() {
2836eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return visibility;
2846eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2856eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
286de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2876eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setVisibility(int visibility) {
2886eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.visibility = visibility;
2896eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
290eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz
291de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
292eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    public void setSelected(boolean selected) {
293eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz        this.selected = selected;
294eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    }
295810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
296de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
297acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    public boolean isSelected() {
298acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz        return this.selected;
299acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    }
300acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz
301de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
302775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public boolean isEnabled() {
303775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        return this.enabled;
304775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
305adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
306de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
307775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public void setEnabled(boolean enabled) {
308775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        this.enabled = enabled;
309775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
310775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard
311de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
312810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public void setOnClickListener(View.OnClickListener onClickListener) {
313810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        this.onClickListener = onClickListener;
314810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
315810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
316de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
317810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public boolean performClick() {
318810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        if (onClickListener != null) {
319810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            onClickListener.onClick(realView);
320810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return true;
321810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        } else {
322810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return false;
323810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        }
324810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
325c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
326de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
327d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) {
328d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        this.onLongClickListener = onLongClickListener;
329d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
330d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
331d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
332d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public boolean performLongClick() {
333d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (onLongClickListener != null) {
334d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            onLongClickListener.onLongClick(realView);
335d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return true;
336d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        } else {
337d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return false;
338d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
339d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
340d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
341d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
3425411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnKeyListener(View.OnKeyListener onKeyListener) {
3435411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        this.onKeyListener = onKeyListener;
3445411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3455411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
346de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
347c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public Object getTag() {
348c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        return this.tag;
349c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
350c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
351de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
352c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public void setTag(Object tag) {
353c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        this.tag = tag;
354c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
35518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
356de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
35718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getHeight() {
358a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return bottom - top;
35918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
36018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
361de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
36218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getWidth() {
363a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return right - left;
36418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
36518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
366de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
367924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final int getMeasuredWidth() {
3680eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi        return measuredWidth;
369a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    }
370a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
371de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
3722b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public final int getMeasuredHeight() {
3730eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi        return measuredHeight;
3742b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    }
3750eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
3760eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    @Implementation
3770eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    public final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
3780eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	this.measuredWidth = measuredWidth;
3790eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	this.measuredHeight = measuredHeight;
3800eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    }
3810eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
3820eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    @Implementation
3830eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
3840eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
3850eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    			MeasureSpec.getSize(heightMeasureSpec));
3860eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    }
3870eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
3880eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    @Implementation
3890eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
3900eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// We really want to invoke the onMeasure method of the real view,
3910eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// as the real View likely contains an implementation of onMeasure
3920eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// worthy of test, rather the default shadow implementation.
3930eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	// But Android declares onMeasure as protected.
3940eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    	try {
3950eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    		Method onMeasureMethod = realView.getClass().getDeclaredMethod("onMeasure", Integer.TYPE, Integer.TYPE );
3960eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    		onMeasureMethod.setAccessible(true);
3970eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    		onMeasureMethod.invoke( realView, widthMeasureSpec, heightMeasureSpec );
398f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	} catch ( NoSuchMethodException e ) {
399f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		// use default shadow implementation
400f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		onMeasure(widthMeasureSpec, heightMeasureSpec);
401f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	} catch ( IllegalAccessException e ) {
402f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		throw new RuntimeException(e);
403f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	} catch ( InvocationTargetException e ) {
404f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    		throw new RuntimeException(e);
405f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi    	}
4060eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi    }
4070eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi
4082b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    @Implementation
409a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    public final void layout(int l, int t, int r, int b) {
410a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        left = l;
411a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        top = t;
412a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        right = r;
413a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        bottom = b;
414a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo:       realView.onLayout();
415924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
416adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
417de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
41818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public void setPadding(int left, int top, int right, int bottom) {
41918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingLeft = left;
42018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingTop = top;
42118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingRight = right;
42218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingBottom = bottom;
42318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
42418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
425de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
42618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingTop() {
42718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingTop;
42818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
42918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
430de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
43118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingLeft() {
43218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingLeft;
43318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
43418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
435de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
43618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingRight() {
43718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingRight;
43818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
43918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
440de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
44118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingBottom() {
44218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingBottom;
44318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
44451fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz
445de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
44644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public Object getTag(int key) {
44744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        return tags.get(key);
44844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
44944ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
450de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
45144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public void setTag(int key, Object value) {
45244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        tags.put(key, value);
45344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
4545411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
45565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4564241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public void requestLayout() {
4574241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        didRequestLayout = true;
4584241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4594241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4604241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public boolean didRequestLayout() {
4614241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        return didRequestLayout;
4624241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4634241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4644241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    @Implementation
46565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus() {
46665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return requestFocus(View.FOCUS_DOWN);
46765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
46865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
46965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
47065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus(int direction) {
47165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(true);
47265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return true;
47365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
47465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
4755411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setViewFocus(boolean hasFocus) {
4769729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        this.isFocused = hasFocus;
4775411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        if (onFocusChangeListener != null) {
4785411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams            onFocusChangeListener.onFocusChange(realView, hasFocus);
4795411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        }
4805411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
4815411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
482de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
4837cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public int getNextFocusDownId() {
4847cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        return nextFocusDownId;
4857cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
4867cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
4877cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
4887cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public void setNextFocusDownId(int nextFocusDownId) {
4897cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        this.nextFocusDownId = nextFocusDownId;
4907cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
4917cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
4927cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
49365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public boolean isFocused() {
4949729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
49565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
49665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
49765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4985411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public boolean hasFocus() {
4999729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
5005411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
5015411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
502de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
50365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public void clearFocus() {
50465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(false);
50565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
50665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
50765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
5085411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnFocusChangeListener(View.OnFocusChangeListener listener) {
5095411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        onFocusChangeListener = listener;
5105411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
511f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
5120a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    @Implementation
5132b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public View.OnFocusChangeListener getOnFocusChangeListener() {
5140a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor        return onFocusChangeListener;
5150a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    }
5161c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard
517de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
5181c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    public void invalidate() {
5191c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard        wasInvalidated = true;
5201c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    }
521924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
522de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
5231e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    public boolean onTouchEvent(MotionEvent event) {
524840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        lastTouchEvent = event;
525840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return false;
5261e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    }
5271e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu
5281e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    @Implementation
529924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public void setOnTouchListener(View.OnTouchListener onTouchListener) {
530924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        this.onTouchListener = onTouchListener;
531924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
532924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
533de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
534924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public boolean dispatchTouchEvent(MotionEvent event) {
5357bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala        if (onTouchListener != null && onTouchListener.onTouch(realView, event)) {
5367bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala            return true;
537924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        }
538840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return realView.onTouchEvent(event);
539840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    }
540840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu
541840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    public MotionEvent getLastTouchEvent() {
542840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return lastTouchEvent;
543924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
5442ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin
545445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    @Implementation
5462b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public boolean dispatchKeyEvent(KeyEvent event) {
547445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        if (onKeyListener != null) {
548445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin            return onKeyListener.onKey(realView, event.getKeyCode(), event);
549445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        }
550445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        return false;
551445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    }
552445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin
553ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
554da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string.
55540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * <p/>
556da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Robolectric extension.
557ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5582ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
5592ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return "";
5602ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
56186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
562ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
563ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out}
564ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
56586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump() {
56686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dump(System.out, 0);
56786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
56886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
569ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
570ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out} at the given indentation level
571ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
57286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump(PrintStream out, int indent) {
57386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
57486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.println("/>");
57586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
57686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
57786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpFirstPart(PrintStream out, int indent) {
57886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpIndent(out, indent);
57986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
58086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.print("<" + realView.getClass().getSimpleName());
58186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (id > 0) {
58286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\"");
58386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
58486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
58586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
58686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpIndent(PrintStream out, int indent) {
58786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        for (int i = 0; i < indent; i++) out.print(" ");
58886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
5894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
590ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
591ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return left side of the view
592ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
593bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getLeft() {
5954d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return left;
5964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5974d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
598ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
599ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return top coordinate of the view
600ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
601bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6024d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getTop() {
6034d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return top;
6044d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
606ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
607ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return right side of the view
608ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
609bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6104d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getRight() {
6114d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return right;
6124d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
614ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
615ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return bottom coordinate of the view
616ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
617bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6184d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBottom() {
6194d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return bottom;
6204d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6214d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
622ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
623ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the view is clickable
624ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
625bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
6264d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean isClickable() {
6274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return clickable;
6284d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6294d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
630ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
631de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
632ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
633ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether or not {@link #invalidate()} has been called
634ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6354d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean wasInvalidated() {
6364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return wasInvalidated;
6374d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
639ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
640ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Clears the wasInvalidated flag
641ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6424d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void clearWasInvalidated() {
6434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        wasInvalidated = false;
6444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
646ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
647de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
648ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setLeft(int left) {
6504d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.left = left;
6514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
653ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
654de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
655ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setTop(int top) {
6574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.top = top;
6584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
660ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
661de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
662ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setRight(int right) {
6644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.right = right;
6654d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
667ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
668de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
669ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6704d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setBottom(int bottom) {
6714d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.bottom = bottom;
6724d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6734d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
674ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
675de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
676ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6774d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingLeft(int paddingLeft) {
6784d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingLeft = paddingLeft;
6794d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6804d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
681ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
682de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
683ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6844d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingTop(int paddingTop) {
6854d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingTop = paddingTop;
6864d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6874d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
688ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
689de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
690ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6914d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingRight(int paddingRight) {
6924d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingRight = paddingRight;
6934d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
695ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
696de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
697ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6984d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingBottom(int paddingBottom) {
6994d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingBottom = paddingBottom;
7004d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7014d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
702ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
703de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
704ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
7054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setFocused(boolean focused) {
7064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        isFocused = focused;
7074d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
7088de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz
7098de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    /**
7108de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * Non-Android accessor.
7118de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *
7128de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or
7138de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *         any ancestor is not {@code View.VISIBLE}
7148de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     */
7158de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    public boolean derivedIsVisible() {
7168de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        View parent = realView;
7178de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        while (parent != null) {
7188de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            if (parent.getVisibility() != View.VISIBLE) {
7198de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz                return false;
7208de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            }
7218de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            parent = (View) parent.getParent();
7228de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        }
7238de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        return true;
7248de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    }
725c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
726c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    /**
727c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app.
728c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     *
729c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible.
730c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     */
731c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    public boolean checkedPerformClick() {
732c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!derivedIsVisible()) {
733c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not visible and cannot be clicked");
734c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
735c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!realView.isEnabled()) {
736c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not enabled and cannot be clicked");
737c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
738c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
739c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        return realView.performClick();
740c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    }
7415101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
74206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    public void applyFocus() {
74306dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        if (noParentHasFocus(realView)) {
74406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false);
74506dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (focusRequested || realView.isFocusableInTouchMode()) {
74606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz                realView.requestFocus();
74706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            }
74806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        }
7495101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
7505101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
7515189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    private void applyIdAttribute() {
7525189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        Integer id = attributeSet.getAttributeResourceValue("android", "id", 0);
7535189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        if (getId() == 0) {
7545189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz            setId(id);
7552bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz        }
7562bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz    }
757d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
758b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken    private void applyTagAttribute() {
759d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        Object tag = attributeSet.getAttributeValue("android", "tag");
760d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (tag != null) {
761d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            setTag(tag);
762d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
763d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
7642bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz
7656be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz    private void applyVisibilityAttribute() {
7666be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        String visibility = attributeSet.getAttributeValue("android", "visibility");
7675101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        if (visibility != null) {
7685101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            if (visibility.equals("gone")) {
7695101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.GONE);
7705101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            } else if (visibility.equals("invisible")) {
7715101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.INVISIBLE);
7725101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            }
7735101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        }
7745101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
7755101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
77649e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz    private void applyEnabledAttribute() {
77749e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true));
7785101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
77919d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz
7804cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz    private void applyBackgroundAttribute() {
78140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        String source = attributeSet.getAttributeValue("android", "background");
78240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        if (source != null) {
78340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            if (source.startsWith("@drawable/")) {
78440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0));
78540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            }
78640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        }
7876d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse    }
7886d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse
7896c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    private void applyOnClickAttribute() {
7906c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        final String handlerName = attributeSet.getAttributeValue("android",
791d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                "onClick");
7926c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        if (handlerName == null) {
7936c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            return;
7946c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        }
7956c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
7966c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        /* good part of following code has been directly copied from original
7976c887826366610c9e44c21a9fec6020219226283Gautier Hayoun         * android source */
7986c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        setOnClickListener(new View.OnClickListener() {
7996c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            public void onClick(View v) {
8006c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                Method mHandler;
8016c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
8026c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler = getContext().getClass().getMethod(handlerName,
803d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            View.class);
8046c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (NoSuchMethodException e) {
8056c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    int id = getId();
8066c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    String idText = id == View.NO_ID ? "" : " with id '"
8076c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + shadowOf(context).getResourceLoader()
808d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            .getNameForId(id) + "'";
8096c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not find a method " +
8106c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            handlerName + "(View) in the activity "
8116c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + getContext().getClass() + " for onClick handler"
8126c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + " on view " + realView.getClass() + idText, e);
8136c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
8146c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
8156c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
8166c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler.invoke(getContext(), realView);
8176c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (IllegalAccessException e) {
8186c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute non "
8196c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "public method of the activity", e);
8206c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (InvocationTargetException e) {
8216c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute "
8226c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "method of the activity", e);
8236c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
8246c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            }
8256c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        });
8266c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    }
8276c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
828cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    private void applyContentDescriptionAttribute() {
829cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        String contentDescription = attributeSet.getAttributeValue("android", "contentDescription");
830cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        if (contentDescription != null) {
831cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            if (contentDescription.startsWith("@string/")) {
832cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella                int resId = attributeSet.getAttributeResourceValue("android", "contentDescription", 0);
833cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella                contentDescription = context.getResources().getString(resId);
834cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            }
835cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella            setContentDescription(contentDescription);
836cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella        }
837cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella    }
838cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella
83906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    private boolean noParentHasFocus(View view) {
84019d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        while (view != null) {
84106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (view.hasFocus()) return false;
84219d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz            view = (View) view.getParent();
84319d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        }
84406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        return true;
84519d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz    }
846d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8470ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    /**
8480ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * Non-android accessor.  Returns touch listener, if set.
849d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
8500ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * @return
8510ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     */
8520ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    public View.OnTouchListener getOnTouchListener() {
853d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onTouchListener;
8540ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    }
855d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
85646309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    /**
85746309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * Non-android accessor.  Returns click listener, if set.
858d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
85946309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * @return
86046309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     */
86146309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    public View.OnClickListener getOnClickListener() {
862d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onClickListener;
86346309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    }
864ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
865b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
866ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public void setDrawingCacheEnabled(boolean drawingCacheEnabled) {
867ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        this.drawingCacheEnabled = drawingCacheEnabled;
868ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
869ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
870b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
871ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public boolean isDrawingCacheEnabled() {
872ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return drawingCacheEnabled;
873ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
874ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
875b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
876ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public Bitmap getDrawingCache() {
877ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return Robolectric.newInstanceOf(Bitmap.class);
878ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
87940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
88034f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    @Implementation
88134f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    public void post(Runnable action) {
88234f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey        Robolectric.getUiThreadScheduler().post(action);
88334f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    }
884b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams
885b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    @Implementation
886b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    public void postDelayed(Runnable action, long delayMills) {
887b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams        Robolectric.getUiThreadScheduler().postDelayed(action, delayMills);
888b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    }
889289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz
890289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    @Implementation
891289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    public void postInvalidateDelayed(long delayMilliseconds) {
892289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        Robolectric.getUiThreadScheduler().postDelayed(new Runnable() {
893289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            @Override
894289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            public void run() {
895289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz                realView.invalidate();
896289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            }
897289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        }, delayMilliseconds);
898289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    }
899d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9003f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9013f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public Animation getAnimation() {
902d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return animation;
9033f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
904d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9053f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9063f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void setAnimation(Animation anim) {
907d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation = anim;
9083f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
909d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9103f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9113f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void startAnimation(Animation anim) {
912d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        setAnimation(anim);
913d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation.start();
9143f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
915d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
9163f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
9173f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void clearAnimation() {
918d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (animation != null) {
919d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            animation.cancel();
920f65a5dab0313865a75b98d7ef53f2773167224e0Jessica Chen            animation = null;
921d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
9223f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
923a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
924a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
925a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void scrollTo(int x, int y) {
926a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.scrollToCoordinates = new Point(x, y);
927a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
928f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
929cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
930cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollX() {
931cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.x : 0;
932cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
933cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard
934cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
935cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollY() {
936cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.y : 0;
937cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
938f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
939f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    @Implementation
940f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    public ViewTreeObserver getViewTreeObserver() {
941f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        if (viewTreeObserver == null) {
942f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard            viewTreeObserver = newInstanceOf(ViewTreeObserver.class);
943f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        }
944f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        return viewTreeObserver;
945f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
9460c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala
9470c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    @Implementation
9480c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    public void onAnimationEnd() {
9490c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    }
9500c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala
9510c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    /*
9520c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala     * Non-Android accessor.
9530c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala     */
9540c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    public void finishedAnimation() {
95523da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        try {
95623da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            Method onAnimationEnd = realView.getClass().getDeclaredMethod("onAnimationEnd", new Class[0]);
95723da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            onAnimationEnd.setAccessible(true);
95823da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            onAnimationEnd.invoke(realView);
95923da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        } catch (Exception e) {
96023da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala            throw new RuntimeException(e);
96123da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala        }
9620c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala    }
9636eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
964