ShadowView.java revision 46309a9995c013790cbc40ae207f10973350b14f
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;
6684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet;
7924f851cb0ec279b6974744ce623f25bdc657551Ryan Richardimport android.view.MotionEvent;
86eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.view.View;
9d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultzimport android.view.ViewGroup;
105411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williamsimport android.view.ViewParent;
113f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation;
123f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
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;
1951fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap;
2051fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map;
21c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
2286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
2386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
24ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/**
25ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Shadow implementation of {@code View} that simulates the behavior of this class. Supports listeners, focusability
26ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * (but not focus order), resource loading, visibility, tags, and tracks the size and shape of the view.
27ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */
28198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
290b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class)
30afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView {
314a7b7902404d0c3743f96c043e3cc6b9069cf438Christian Williams    @RealObject protected View realView;
326eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
336eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    private int id;
34afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    ShadowView parent;
3570e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz    protected Context context;
364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean selected;
37810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    private View.OnClickListener onClickListener;
38c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    private Object tag;
39775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    private boolean enabled = true;
404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int visibility = View.VISIBLE;
414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int left;
424d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int top;
434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int right;
444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int bottom;
454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingLeft;
464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingTop;
474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingRight;
484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingBottom;
494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0);
5044ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    private Map<Integer, Object> tags = new HashMap<Integer, Object>();
514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean clickable;
52254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    protected boolean focusable;
539729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    boolean focusableInTouchMode;
544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int backgroundResourceId = -1;
551f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    private int backgroundColor;
565411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    protected View.OnKeyListener onKeyListener;
574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean isFocused;
585411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    private View.OnFocusChangeListener onFocusChangeListener;
594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean wasInvalidated;
60924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    private View.OnTouchListener onTouchListener;
61a2dd5bb88b4bfe0cbe77cfc3581ce42745509760Phil Goodwin & Tyler Schultz    protected AttributeSet attributeSet;
62ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    private boolean drawingCacheEnabled;
633f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    private Animation animation;
646eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
656eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void __constructor__(Context context) {
663c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, null);
676eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
686eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
695189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    public void __constructor__(Context context, AttributeSet attributeSet) {
703c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, attributeSet, 0);
713c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
723c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
733c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) {
743c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        this.context = context;
755189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        this.attributeSet = attributeSet;
763c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
773c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        if (attributeSet != null) {
783c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams            applyAttributes();
793c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        }
803c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
813c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
823c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void applyAttributes() {
835189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        applyIdAttribute();
846be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        applyVisibilityAttribute();
8549e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        applyEnabledAttribute();
864cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz        applyBackgroundAttribute();
87684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams    }
88684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams
89de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
906eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setId(int id) {
916eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.id = id;
926eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
936eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
94de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
95cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setClickable(boolean clickable) {
96cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.clickable = clickable;
97cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
98cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
99ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
100ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior.
101ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
102ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusable the new status of the {@code View}'s focusability
103ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
104de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
105cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setFocusable(boolean focusable) {
106cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.focusable = focusable;
107adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (!focusable) {
108415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusableInTouchMode(false);
109415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
110415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
111415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
112415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
113415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public final boolean isFocusableInTouchMode() {
114415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        return focusableInTouchMode;
115415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
116415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
117ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
118ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior.
119ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
120ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability
121ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
122415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
123415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public void setFocusableInTouchMode(boolean focusableInTouchMode) {
124415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        this.focusableInTouchMode = focusableInTouchMode;
125adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (focusableInTouchMode) {
126415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusable(true);
127415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
128cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
129cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
130de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
131254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    public boolean isFocusable() {
132254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin        return focusable;
133254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    }
134254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin
135254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    @Implementation
1366eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getId() {
1376eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return id;
1386eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1396eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
140ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
141ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Simulates the inflating of the requested resource.
142ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
1438de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param context  the context from which to obtain a layout inflater
144ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param resource the ID of the resource to inflate
1458de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param root     the {@code ViewGroup} to add the inflated {@code View} to
146ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the inflated View
147ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
148de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
149a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    public static View inflate(Context context, int resource, ViewGroup root) {
15040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return ShadowLayoutInflater.from(context).inflate(resource, root);
151a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    }
152a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz
153ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
154ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise
155ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
156ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param id the id of the {@code View} to find
157ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the {@code View}, if found, {@code null} otherwise
158ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
159de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1606eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public View findViewById(int id) {
161e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        if (id == this.id) {
162e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz            return realView;
163e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        }
1646eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
1656eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return null;
1666eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1676eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
168de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1690c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    public View getRootView() {
170afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams        ShadowView root = this;
171adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        while (root.parent != null) {
1720c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol            root = root.parent;
1730c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        }
1740c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        return root.realView;
1750c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    }
1760c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol
177de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
178d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    public ViewGroup.LayoutParams getLayoutParams() {
179d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz        return layoutParams;
180d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    }
181d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz
182de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
183b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    public void setLayoutParams(ViewGroup.LayoutParams params) {
184b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard        layoutParams = params;
185b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    }
186b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard
187de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1885411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public final ViewParent getParent() {
189a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        return parent == null ? null : (ViewParent) parent.realView;
1905411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
1915411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
192de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1936eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public final Context getContext() {
1946eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context;
1956eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1966eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
197de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1986eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public Resources getResources() {
1996eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context.getResources();
2006eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2016eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
202de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2034d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    public void setBackgroundResource(int backgroundResourceId) {
2044d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin        this.backgroundResourceId = backgroundResourceId;
2054d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    }
2064d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin
207de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2086eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getVisibility() {
2096eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return visibility;
2106eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2116eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
212de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2136eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setVisibility(int visibility) {
2146eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.visibility = visibility;
2156eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
216eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz
217de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
218eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    public void setSelected(boolean selected) {
219eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz        this.selected = selected;
220eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    }
221810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
222de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
223acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    public boolean isSelected() {
224acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz        return this.selected;
225acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    }
226acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz
227de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
228775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public boolean isEnabled() {
229775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        return this.enabled;
230775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
231adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
232de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
233775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public void setEnabled(boolean enabled) {
234775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        this.enabled = enabled;
235775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
236775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard
237de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
238810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public void setOnClickListener(View.OnClickListener onClickListener) {
239810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        this.onClickListener = onClickListener;
240810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
241810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
242de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
243810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public boolean performClick() {
244810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        if (onClickListener != null) {
245810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            onClickListener.onClick(realView);
246810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return true;
247810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        } else {
248810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return false;
249810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        }
250810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
251c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
252de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2535411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnKeyListener(View.OnKeyListener onKeyListener) {
2545411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        this.onKeyListener = onKeyListener;
2555411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
2565411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
257de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
258c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public Object getTag() {
259c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        return this.tag;
260c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
261c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
262de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
263c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public void setTag(Object tag) {
264c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        this.tag = tag;
265c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
26618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
267de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
26818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getHeight() {
269a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return bottom - top;
27018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
27118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
272de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
27318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getWidth() {
274a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return right - left;
27518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
27618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
277de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
278924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final int getMeasuredWidth() {
279a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return getWidth();
280a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    }
281a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
282de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
283a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    public final void layout(int l, int t, int r, int b) {
284a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        left = l;
285a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        top = t;
286a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        right = r;
287a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        bottom = b;
288a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
289a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo:       realView.onLayout();
290924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
291adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
292de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
29318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public void setPadding(int left, int top, int right, int bottom) {
29418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingLeft = left;
29518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingTop = top;
29618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingRight = right;
29718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingBottom = bottom;
29818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
29918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
300de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
30118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingTop() {
30218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingTop;
30318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
30418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
305de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
30618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingLeft() {
30718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingLeft;
30818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
30918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
310de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
31118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingRight() {
31218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingRight;
31318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
31418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
315de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
31618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingBottom() {
31718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingBottom;
31818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
31951fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz
320de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
32144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public Object getTag(int key) {
32244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        return tags.get(key);
32344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
32444ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
325de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
32644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public void setTag(int key, Object value) {
32744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        tags.put(key, value);
32844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
3295411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
33065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
33165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus() {
33265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return requestFocus(View.FOCUS_DOWN);
33365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
33465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
33565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
33665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus(int direction) {
33765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(true);
33865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return true;
33965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
34065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
3415411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setViewFocus(boolean hasFocus) {
3429729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        this.isFocused = hasFocus;
3435411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        if (onFocusChangeListener != null) {
3445411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams            onFocusChangeListener.onFocusChange(realView, hasFocus);
3455411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        }
3465411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3475411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
348de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
34965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public boolean isFocused() {
3509729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
35165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
35265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
35365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
3545411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public boolean hasFocus() {
3559729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
3565411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3575411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
358de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
35965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public void clearFocus() {
36065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(false);
36165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
36265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
36365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
3645411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnFocusChangeListener(View.OnFocusChangeListener listener) {
3655411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        onFocusChangeListener = listener;
3665411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3671c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard
368de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
3691c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    public void invalidate() {
3701c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard        wasInvalidated = true;
3711c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    }
372924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
373de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
374924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public void setOnTouchListener(View.OnTouchListener onTouchListener) {
375924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        this.onTouchListener = onTouchListener;
376924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
377924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
378de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
379924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public boolean dispatchTouchEvent(MotionEvent event) {
380924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        if (onTouchListener != null) {
381924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard            return onTouchListener.onTouch(realView, event);
382924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        }
383924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        return false;
384924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
3852ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin
386ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
387da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string.
38840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * <p/>
389da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Robolectric extension.
390ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
3912ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
3922ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return "";
3932ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
39486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
395ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
396ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out}
397ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
39886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump() {
39986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dump(System.out, 0);
40086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
40186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
402ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
403ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out} at the given indentation level
404ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
40586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump(PrintStream out, int indent) {
40686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
40786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.println("/>");
40886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
40986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
41086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpFirstPart(PrintStream out, int indent) {
41186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpIndent(out, indent);
41286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
41386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.print("<" + realView.getClass().getSimpleName());
41486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (id > 0) {
41586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\"");
41686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
41786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
41886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
41986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpIndent(PrintStream out, int indent) {
42086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        for (int i = 0; i < indent; i++) out.print(" ");
42186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
4224d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
423ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
424ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return left side of the view
425ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
426bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getLeft() {
4284d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return left;
4294d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4304d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
431ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
432ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return top coordinate of the view
433ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
434bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4354d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getTop() {
4364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return top;
4374d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
439ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
440ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return right side of the view
441ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
442bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getRight() {
4444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return right;
4454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
447ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
448ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return bottom coordinate of the view
449ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
450bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBottom() {
4524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return bottom;
4534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
455ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
456ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the view is clickable
457ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
458bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
4594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean isClickable() {
4604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return clickable;
4614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
463ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
464de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
465ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
466ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the resource ID of this views background
467ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
4684d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBackgroundResourceId() {
4694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return backgroundResourceId;
4704d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
47140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
47240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    @Implementation
4731f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    public void setBackgroundColor(int color) {
47440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        backgroundColor = color;
4751f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    }
47640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
4771f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    public int getBackgroundColor() {
47840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return backgroundColor;
4791f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    }
48040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
481ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
482de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
483ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
484ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether or not {@link #invalidate()} has been called
485ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
4864d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean wasInvalidated() {
4874d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return wasInvalidated;
4884d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
490ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
491ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Clears the wasInvalidated flag
492ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
4934d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void clearWasInvalidated() {
4944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        wasInvalidated = false;
4954d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
4964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
497ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
498de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
499ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5004d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setLeft(int left) {
5014d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.left = left;
5024d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5034d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
504ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
505de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
506ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5074d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setTop(int top) {
5084d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.top = top;
5094d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5104d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
511ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
512de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
513ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5144d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setRight(int right) {
5154d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.right = right;
5164d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5174d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
518ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
519de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
520ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5214d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setBottom(int bottom) {
5224d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.bottom = bottom;
5234d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5244d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
525ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
526de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
527ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5284d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingLeft(int paddingLeft) {
5294d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingLeft = paddingLeft;
5304d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
532ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
533de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
534ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5354d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingTop(int paddingTop) {
5364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingTop = paddingTop;
5374d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
539ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
540de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
541ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5424d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingRight(int paddingRight) {
5434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingRight = paddingRight;
5444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
546ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
547de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
548ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingBottom(int paddingBottom) {
5504d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingBottom = paddingBottom;
5514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
553ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
554de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
555ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setFocused(boolean focused) {
5574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        isFocused = focused;
5584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5598de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz
5608de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    /**
5618de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * Non-Android accessor.
5628de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *
5638de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or
5648de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *         any ancestor is not {@code View.VISIBLE}
5658de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     */
5668de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    public boolean derivedIsVisible() {
5678de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        View parent = realView;
5688de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        while (parent != null) {
5698de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            if (parent.getVisibility() != View.VISIBLE) {
5708de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz                return false;
5718de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            }
5728de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            parent = (View) parent.getParent();
5738de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        }
5748de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        return true;
5758de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    }
576c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
577c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    /**
578c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app.
579c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     *
580c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible.
581c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     */
582c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    public boolean checkedPerformClick() {
583c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!derivedIsVisible()) {
584c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not visible and cannot be clicked");
585c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
586c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!realView.isEnabled()) {
587c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not enabled and cannot be clicked");
588c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
589c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
590c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        return realView.performClick();
591c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    }
5925101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
59306dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    public void applyFocus() {
59406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        if (noParentHasFocus(realView)) {
59506dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false);
59606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (focusRequested || realView.isFocusableInTouchMode()) {
59706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz                realView.requestFocus();
59806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            }
59906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        }
6005101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
6015101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
6025189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    private void applyIdAttribute() {
6035189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        Integer id = attributeSet.getAttributeResourceValue("android", "id", 0);
6045189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        if (getId() == 0) {
6055189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz            setId(id);
6062bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz        }
6072bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz    }
6082bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz
6096be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz    private void applyVisibilityAttribute() {
6106be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        String visibility = attributeSet.getAttributeValue("android", "visibility");
6115101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        if (visibility != null) {
6125101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            if (visibility.equals("gone")) {
6135101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.GONE);
6145101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            } else if (visibility.equals("invisible")) {
6155101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.INVISIBLE);
6165101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            }
6175101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        }
6185101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
6195101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
62049e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz    private void applyEnabledAttribute() {
62149e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true));
6225101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
62319d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz
6244cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz    private void applyBackgroundAttribute() {
62540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        String source = attributeSet.getAttributeValue("android", "background");
62640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        if (source != null) {
62740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            if (source.startsWith("@drawable/")) {
62840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0));
62940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            }
63040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        }
6316d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse    }
6326d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse
63306dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    private boolean noParentHasFocus(View view) {
63419d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        while (view != null) {
63506dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (view.hasFocus()) return false;
63619d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz            view = (View) view.getParent();
63719d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        }
63806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        return true;
63919d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz    }
6400ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi
6410ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    /**
6420ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * Non-android accessor.  Returns touch listener, if set.
6430ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     *
6440ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * @return
6450ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     */
6460ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    public View.OnTouchListener getOnTouchListener() {
6470ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    	return onTouchListener;
6480ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    }
64946309a9995c013790cbc40ae207f10973350b14fMichael Portuesi
65046309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    /**
65146309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * Non-android accessor.  Returns click listener, if set.
65246309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     *
65346309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * @return
65446309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     */
65546309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    public View.OnClickListener getOnClickListener() {
65646309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    	return onClickListener;
65746309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    }
658ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
659b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
660ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public void setDrawingCacheEnabled(boolean drawingCacheEnabled) {
661ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        this.drawingCacheEnabled = drawingCacheEnabled;
662ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
663ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
664b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
665ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public boolean isDrawingCacheEnabled() {
666ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return drawingCacheEnabled;
667ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
668ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
669b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
670ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public Bitmap getDrawingCache() {
671ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return Robolectric.newInstanceOf(Bitmap.class);
672ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
67340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
67434f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    @Implementation
67534f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    public void post(Runnable action) {
67634f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey        Robolectric.getUiThreadScheduler().post(action);
67734f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    }
678b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams
679b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    @Implementation
680b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    public void postDelayed(Runnable action, long delayMills) {
681b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams        Robolectric.getUiThreadScheduler().postDelayed(action, delayMills);
682b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    }
6833f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
6843f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
6853f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public Animation getAnimation() {
6863f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	return animation;
6873f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
6883f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
6893f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
6903f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void setAnimation(Animation anim) {
6913f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	animation = anim;
6923f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
6933f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
6943f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
6953f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void startAnimation(Animation anim) {
6963f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	setAnimation(anim);
6973f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	animation.start();
6983f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
6993f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi
7003f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
7013f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void clearAnimation() {
7023f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	if ( animation != null ) {
7033f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    		animation.cancel();
7043f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    	}
7053f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
7066eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
707