ShadowView.java revision 289938e9153024d2146a7130de98fdc16efd5aa2
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
3a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.R;
46eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.Context;
56eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.res.Resources;
6ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport android.graphics.Bitmap;
7a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.ColorDrawable;
8a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.Drawable;
9684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet;
10924f851cb0ec279b6974744ce623f25bdc657551Ryan Richardimport android.view.MotionEvent;
116eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.view.View;
12d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultzimport android.view.ViewGroup;
135411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williamsimport android.view.ViewParent;
143f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation;
153f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
16ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
1722c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1822c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
1922c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
206eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
2186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream;
226c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.InvocationTargetException;
236c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.Method;
2451fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap;
2551fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map;
26c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
2786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
2886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
29ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/**
306c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Shadow implementation of {@code View} that simulates the behavior of this
316c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * class.
326c887826366610c9e44c21a9fec6020219226283Gautier Hayoun *
336c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Supports listeners, focusability (but not focus order), resource loading,
346c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * visibility, onclick, tags, and tracks the size and shape of the view.
35ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */
36198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
370b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class)
38afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView {
394a7b7902404d0c3743f96c043e3cc6b9069cf438Christian Williams    @RealObject protected View realView;
406eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
416eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    private int id;
42afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    ShadowView parent;
4370e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz    protected Context context;
444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean selected;
45810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    private View.OnClickListener onClickListener;
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;
71a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultz    private Drawable background = new ColorDrawable(R.color.transparent);
723f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    private Animation animation;
736eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
746eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void __constructor__(Context context) {
753c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, null);
766eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
776eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
785189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    public void __constructor__(Context context, AttributeSet attributeSet) {
793c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, attributeSet, 0);
803c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
813c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
823c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) {
833c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        this.context = context;
845189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        this.attributeSet = attributeSet;
853c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
863c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        if (attributeSet != null) {
873c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams            applyAttributes();
883c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        }
893c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
903c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
913c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void applyAttributes() {
925189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        applyIdAttribute();
936be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        applyVisibilityAttribute();
9449e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        applyEnabledAttribute();
954cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz        applyBackgroundAttribute();
96b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken        applyTagAttribute();
976c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        applyOnClickAttribute();
987876d6565cc75b9822ab0ce57152c598a3a9fab7Chris Van Vranken    }
99b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken
10057eb2dc77605e3a41499f23219b2cd42172e7869Chris Van Vranken    @Implementation
1016eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setId(int id) {
1026eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.id = id;
1036eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1046eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
105de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
106cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setClickable(boolean clickable) {
107cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.clickable = clickable;
108cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
109cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
110ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
111ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior.
112ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
113ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusable the new status of the {@code View}'s focusability
114ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
115de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
116cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setFocusable(boolean focusable) {
117cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.focusable = focusable;
118adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (!focusable) {
119415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusableInTouchMode(false);
120415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
121415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
122415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
123415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
124415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public final boolean isFocusableInTouchMode() {
125415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        return focusableInTouchMode;
126415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
127415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
128ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
129ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior.
130ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
131ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability
132ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
133415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
134415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public void setFocusableInTouchMode(boolean focusableInTouchMode) {
135415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        this.focusableInTouchMode = focusableInTouchMode;
136adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (focusableInTouchMode) {
137415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusable(true);
138415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
139cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
140cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
141de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
142254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    public boolean isFocusable() {
143254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin        return focusable;
144254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    }
145254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin
146254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    @Implementation
1476eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getId() {
1486eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return id;
1496eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1506eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
151ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
152ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Simulates the inflating of the requested resource.
153ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
1548de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param context  the context from which to obtain a layout inflater
155ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param resource the ID of the resource to inflate
1568de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param root     the {@code ViewGroup} to add the inflated {@code View} to
157ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the inflated View
158ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
159de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
160a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    public static View inflate(Context context, int resource, ViewGroup root) {
16140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return ShadowLayoutInflater.from(context).inflate(resource, root);
162a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    }
163a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz
164ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
165ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise
166ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
167ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param id the id of the {@code View} to find
168ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the {@code View}, if found, {@code null} otherwise
169ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
170de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1716eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public View findViewById(int id) {
172e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        if (id == this.id) {
173e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz            return realView;
174e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        }
1756eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
1766eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return null;
1776eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1786eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
179de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1800c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    public View getRootView() {
181afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams        ShadowView root = this;
182adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        while (root.parent != null) {
1830c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol            root = root.parent;
1840c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        }
1850c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        return root.realView;
1860c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    }
1870c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol
188de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
189d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    public ViewGroup.LayoutParams getLayoutParams() {
190d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz        return layoutParams;
191d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    }
192d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz
193de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
194b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    public void setLayoutParams(ViewGroup.LayoutParams params) {
195b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard        layoutParams = params;
196b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    }
197b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard
198de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1995411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public final ViewParent getParent() {
200a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        return parent == null ? null : (ViewParent) parent.realView;
2015411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
2025411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
203de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2046eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public final Context getContext() {
2056eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context;
2066eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2076eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
208de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2096eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public Resources getResources() {
2106eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context.getResources();
2116eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2126eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
213de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2144d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    public void setBackgroundResource(int backgroundResourceId) {
215a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultz        this.background = this.getResources().getDrawable(backgroundResourceId);
2164d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin        this.backgroundResourceId = backgroundResourceId;
2174d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    }
2184d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin
219de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2206eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getVisibility() {
2216eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return visibility;
2226eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2236eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
224de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2256eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setVisibility(int visibility) {
2266eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.visibility = visibility;
2276eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
228eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz
229de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
230eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    public void setSelected(boolean selected) {
231eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz        this.selected = selected;
232eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    }
233810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
234de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
235acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    public boolean isSelected() {
236acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz        return this.selected;
237acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    }
238acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz
239de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
240775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public boolean isEnabled() {
241775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        return this.enabled;
242775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
243adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
244de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
245775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public void setEnabled(boolean enabled) {
246775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        this.enabled = enabled;
247775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
248775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard
249de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
250810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public void setOnClickListener(View.OnClickListener onClickListener) {
251810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        this.onClickListener = onClickListener;
252810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
253810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
254de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
255810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public boolean performClick() {
256810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        if (onClickListener != null) {
257810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            onClickListener.onClick(realView);
258810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return true;
259810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        } else {
260810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return false;
261810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        }
262810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
263c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
264de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2655411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnKeyListener(View.OnKeyListener onKeyListener) {
2665411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        this.onKeyListener = onKeyListener;
2675411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
2685411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
269de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
270c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public Object getTag() {
271c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        return this.tag;
272c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
273c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
274de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
275c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public void setTag(Object tag) {
276c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        this.tag = tag;
277c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
27818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
279de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
28018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getHeight() {
281a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return bottom - top;
28218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
28318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
284de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
28518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getWidth() {
286a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return right - left;
28718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
28818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
289de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
290924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final int getMeasuredWidth() {
291a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return getWidth();
292a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    }
293a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
294de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
295a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    public final void layout(int l, int t, int r, int b) {
296a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        left = l;
297a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        top = t;
298a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        right = r;
299a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        bottom = b;
300a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
301a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo:       realView.onLayout();
302924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
303adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
304de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
30518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public void setPadding(int left, int top, int right, int bottom) {
30618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingLeft = left;
30718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingTop = top;
30818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingRight = right;
30918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingBottom = bottom;
31018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
31118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
312de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
31318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingTop() {
31418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingTop;
31518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
31618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
317de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
31818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingLeft() {
31918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingLeft;
32018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
32118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
322de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
32318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingRight() {
32418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingRight;
32518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
32618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
327de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
32818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingBottom() {
32918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingBottom;
33018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
33151fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz
332de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
33344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public Object getTag(int key) {
33444ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        return tags.get(key);
33544ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
33644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
337de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
33844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public void setTag(int key, Object value) {
33944ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        tags.put(key, value);
34044ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
3415411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
34265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
34365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus() {
34465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return requestFocus(View.FOCUS_DOWN);
34565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
34665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
34765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
34865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus(int direction) {
34965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(true);
35065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return true;
35165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
35265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
3535411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setViewFocus(boolean hasFocus) {
3549729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        this.isFocused = hasFocus;
3555411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        if (onFocusChangeListener != null) {
3565411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams            onFocusChangeListener.onFocusChange(realView, hasFocus);
3575411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        }
3585411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3595411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
360de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
36165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public boolean isFocused() {
3629729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
36365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
36465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
36565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
3665411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public boolean hasFocus() {
3679729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
3685411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3695411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
370de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
37165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public void clearFocus() {
37265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(false);
37365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
37465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
37565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
3765411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnFocusChangeListener(View.OnFocusChangeListener listener) {
3775411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        onFocusChangeListener = listener;
3785411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3791c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard
380de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
3811c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    public void invalidate() {
3821c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard        wasInvalidated = true;
3831c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    }
384924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
385de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
386924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public void setOnTouchListener(View.OnTouchListener onTouchListener) {
387924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        this.onTouchListener = onTouchListener;
388924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
389924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
390de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
391924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public boolean dispatchTouchEvent(MotionEvent event) {
392924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        if (onTouchListener != null) {
393924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard            return onTouchListener.onTouch(realView, event);
394924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        }
395924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        return false;
396924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
3972ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin
398ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
399da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string.
40040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * <p/>
401da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Robolectric extension.
402ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
4032ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
4042ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return "";
4052ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
40686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
407ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
408ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out}
409ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
41086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump() {
41186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dump(System.out, 0);
41286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
41386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
414ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
415ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out} at the given indentation level
416ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
41786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump(PrintStream out, int indent) {
41886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
41986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.println("/>");
42086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
42186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
42286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpFirstPart(PrintStream out, int indent) {
42386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpIndent(out, indent);
42486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
42586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.print("<" + realView.getClass().getSimpleName());
42686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (id > 0) {
42786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\"");
42886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
42986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
43086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
43186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpIndent(PrintStream out, int indent) {
43286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        for (int i = 0; i < indent; i++) out.print(" ");
43386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
4344d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
435ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
436ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return left side of the view
437ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
438bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getLeft() {
4404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return left;
4414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4424d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
443ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
444ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return top coordinate of the view
445ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
446bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getTop() {
4484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return top;
4494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4504d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
451ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
452ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return right side of the view
453ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
454bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getRight() {
4564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return right;
4574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
459ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
460ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return bottom coordinate of the view
461ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
462bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBottom() {
4644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return bottom;
4654d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
467ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
468ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the view is clickable
469ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
470bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4714d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean isClickable() {
4724d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return clickable;
4734d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4744d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
475a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultz    @Implementation
476a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultz    public Drawable getBackground() {
477a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultz        return background;
478a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultz    }
479ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
480de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
481ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
482ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the resource ID of this views background
483ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
4844d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBackgroundResourceId() {
4854d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return backgroundResourceId;
4864d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
48740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
48840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    @Implementation
4891f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    public void setBackgroundColor(int color) {
490a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultz        this.background = new ColorDrawable(getResources().getColor(color));
49140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        backgroundColor = color;
4921f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    }
49340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
4941f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    public int getBackgroundColor() {
49540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return backgroundColor;
4961f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    }
49740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
498ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
499de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
500ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
501ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether or not {@link #invalidate()} has been called
502ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5034d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean wasInvalidated() {
5044d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return wasInvalidated;
5054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
507ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
508ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Clears the wasInvalidated flag
509ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5104d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void clearWasInvalidated() {
5114d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        wasInvalidated = false;
5124d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
514ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
515de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
516ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5174d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setLeft(int left) {
5184d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.left = left;
5194d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5204d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
521ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
522de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
523ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5244d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setTop(int top) {
5254d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.top = top;
5264d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
528ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
529de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
530ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setRight(int right) {
5324d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.right = right;
5334d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5344d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
535ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
536de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
537ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setBottom(int bottom) {
5394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.bottom = bottom;
5404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
542ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
543de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
544ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingLeft(int paddingLeft) {
5464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingLeft = paddingLeft;
5474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
549ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
550de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
551ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingTop(int paddingTop) {
5534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingTop = paddingTop;
5544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
556ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
557de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
558ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingRight(int paddingRight) {
5604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingRight = paddingRight;
5614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
563ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
564de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
565ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingBottom(int paddingBottom) {
5674d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingBottom = paddingBottom;
5684d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
570ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
571de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
572ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5734d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setFocused(boolean focused) {
5744d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        isFocused = focused;
5754d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5768de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz
5778de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    /**
5788de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * Non-Android accessor.
5798de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *
5808de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or
5818de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *         any ancestor is not {@code View.VISIBLE}
5828de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     */
5838de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    public boolean derivedIsVisible() {
5848de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        View parent = realView;
5858de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        while (parent != null) {
5868de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            if (parent.getVisibility() != View.VISIBLE) {
5878de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz                return false;
5888de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            }
5898de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            parent = (View) parent.getParent();
5908de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        }
5918de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        return true;
5928de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    }
593c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
594c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    /**
595c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app.
596c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     *
597c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible.
598c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     */
599c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    public boolean checkedPerformClick() {
600c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!derivedIsVisible()) {
601c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not visible and cannot be clicked");
602c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
603c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!realView.isEnabled()) {
604c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not enabled and cannot be clicked");
605c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
606c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
607c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        return realView.performClick();
608c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    }
6095101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
61006dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    public void applyFocus() {
61106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        if (noParentHasFocus(realView)) {
61206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false);
61306dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (focusRequested || realView.isFocusableInTouchMode()) {
61406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz                realView.requestFocus();
61506dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            }
61606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        }
6175101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
6185101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
6195189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    private void applyIdAttribute() {
6205189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        Integer id = attributeSet.getAttributeResourceValue("android", "id", 0);
6215189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        if (getId() == 0) {
6225189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz            setId(id);
6232bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz        }
6242bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz    }
625b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken
626b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken    private void applyTagAttribute() {
627b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken    	 Object tag = attributeSet.getAttributeValue("android", "tag");
628b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken         if (tag != null) {
629b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken             setTag(tag);
630b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken         }
631b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken	}
6322bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz
6336be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz    private void applyVisibilityAttribute() {
6346be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        String visibility = attributeSet.getAttributeValue("android", "visibility");
6355101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        if (visibility != null) {
6365101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            if (visibility.equals("gone")) {
6375101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.GONE);
6385101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            } else if (visibility.equals("invisible")) {
6395101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.INVISIBLE);
6405101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            }
6415101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        }
6425101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
6435101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
64449e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz    private void applyEnabledAttribute() {
64549e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true));
6465101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
64719d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz
6484cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz    private void applyBackgroundAttribute() {
64940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        String source = attributeSet.getAttributeValue("android", "background");
65040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        if (source != null) {
65140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            if (source.startsWith("@drawable/")) {
65240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0));
65340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            }
65440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        }
6556d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse    }
6566d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse
6576c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    private void applyOnClickAttribute() {
6586c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        final String handlerName = attributeSet.getAttributeValue("android",
6596c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                                                                  "onClick");
6606c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        if (handlerName == null) {
6616c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            return;
6626c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        }
6636c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
6646c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        /* good part of following code has been directly copied from original
6656c887826366610c9e44c21a9fec6020219226283Gautier Hayoun         * android source */
6666c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        setOnClickListener(new View.OnClickListener() {
6676c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            public void onClick(View v) {
6686c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                Method mHandler;
6696c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
6706c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler = getContext().getClass().getMethod(handlerName,
6716c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                                                                 View.class);
6726c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (NoSuchMethodException e) {
6736c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    int id = getId();
6746c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    String idText = id == View.NO_ID ? "" : " with id '"
6756c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + shadowOf(context).getResourceLoader()
6766c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                                               .getNameForId(id) + "'";
6776c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not find a method " +
6786c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            handlerName + "(View) in the activity "
6796c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + getContext().getClass() + " for onClick handler"
6806c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + " on view " + realView.getClass() + idText, e);
6816c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
6826c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
6836c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
6846c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler.invoke(getContext(), realView);
6856c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (IllegalAccessException e) {
6866c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute non "
6876c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "public method of the activity", e);
6886c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (InvocationTargetException e) {
6896c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute "
6906c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "method of the activity", e);
6916c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
6926c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            }
6936c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        });
6946c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    }
6956c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
69606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    private boolean noParentHasFocus(View view) {
69719d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        while (view != null) {
69806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (view.hasFocus()) return false;
69919d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz            view = (View) view.getParent();
70019d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        }
70106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        return true;
70219d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz    }
7030ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi
7040ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    /**
7050ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * Non-android accessor.  Returns touch listener, if set.
7060ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     *
7070ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * @return
7080ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     */
7090ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    public View.OnTouchListener getOnTouchListener() {
7100ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    	return onTouchListener;
7110ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    }
71246309a9995c013790cbc40ae207f10973350b14fMichael Portuesi
71346309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    /**
71446309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * Non-android accessor.  Returns click listener, if set.
71546309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     *
71646309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * @return
71746309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     */
71846309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    public View.OnClickListener getOnClickListener() {
71946309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    	return onClickListener;
72046309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    }
721ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
722b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
723ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public void setDrawingCacheEnabled(boolean drawingCacheEnabled) {
724ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        this.drawingCacheEnabled = drawingCacheEnabled;
725ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
726ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
727b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
728ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public boolean isDrawingCacheEnabled() {
729ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return drawingCacheEnabled;
730ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
731ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
732b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
733ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public Bitmap getDrawingCache() {
734ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return Robolectric.newInstanceOf(Bitmap.class);
735ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
73640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
73734f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    @Implementation
73834f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    public void post(Runnable action) {
73934f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey        Robolectric.getUiThreadScheduler().post(action);
74034f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    }
741b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams
742b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    @Implementation
743b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    public void postDelayed(Runnable action, long delayMills) {
744b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams        Robolectric.getUiThreadScheduler().postDelayed(action, delayMills);
745b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    }
746289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz
747289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    @Implementation
748289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    public void postInvalidateDelayed(long delayMilliseconds) {
749289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        Robolectric.getUiThreadScheduler().postDelayed(new Runnable() {
750289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            @Override
751289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            public void run() {
752289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz                realView.invalidate();
753289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            }
754289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        }, delayMilliseconds);
755289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    }
7563f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
7573f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
7583f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public Animation getAnimation() {
7593f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	return animation;
7603f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
7613f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
7623f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
7633f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void setAnimation(Animation anim) {
7643f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	animation = anim;
7653f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
7663f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
7673f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
7683f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void startAnimation(Animation anim) {
7693f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	setAnimation(anim);
7703f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	animation.start();
7713f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
7723f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
7733f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
7743f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void clearAnimation() {
7753f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	if ( animation != null ) {
7763f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    		animation.cancel();
7773f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	}
7783f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
7796eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
780