ShadowView.java revision 7cd4fd403867d4e7e6ee944a07ad6fb6c537f3ec
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
36eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.Context;
46eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.res.Resources;
5ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport android.graphics.Bitmap;
6a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultzimport android.graphics.Point;
7a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.ColorDrawable;
8a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.Drawable;
9684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet;
10445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwinimport android.view.*;
113f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation;
12ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
1322c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
1522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
166eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
1786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream;
186c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.InvocationTargetException;
196c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.Method;
2051fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap;
2151fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map;
22c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
23f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport static com.xtremelabs.robolectric.Robolectric.Reflection.newInstanceOf;
2486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
2586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
26ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/**
276c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Shadow implementation of {@code View} that simulates the behavior of this
286c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * class.
29d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * <p/>
306c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Supports listeners, focusability (but not focus order), resource loading,
316c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * visibility, onclick, tags, and tracks the size and shape of the view.
32ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */
33198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
340b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class)
35afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView {
36d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @RealObject
37d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    protected View realView;
386eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
396eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    private int id;
40afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    ShadowView parent;
4170e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz    protected Context context;
424d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean selected;
43810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    private View.OnClickListener onClickListener;
44d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    private View.OnLongClickListener onLongClickListener;
45c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    private Object tag;
46775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    private boolean enabled = true;
474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int visibility = View.VISIBLE;
484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int left;
494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int top;
504d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int right;
514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    int bottom;
524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingLeft;
534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingTop;
544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingRight;
554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int paddingBottom;
564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0);
5744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    private Map<Integer, Object> tags = new HashMap<Integer, Object>();
584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean clickable;
59254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    protected boolean focusable;
609729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    boolean focusableInTouchMode;
614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private int backgroundResourceId = -1;
621f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey    private int backgroundColor;
635411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    protected View.OnKeyListener onKeyListener;
644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean isFocused;
655411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    private View.OnFocusChangeListener onFocusChangeListener;
664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    private boolean wasInvalidated;
67924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    private View.OnTouchListener onTouchListener;
68a2dd5bb88b4bfe0cbe77cfc3581ce42745509760Phil Goodwin & Tyler Schultz    protected AttributeSet attributeSet;
69ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    private boolean drawingCacheEnabled;
70a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Point scrollToCoordinates;
714241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    private boolean didRequestLayout;
72a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    private Drawable background;
733f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    private Animation animation;
74f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    private ViewTreeObserver viewTreeObserver;
75840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    private MotionEvent lastTouchEvent;
767cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    private int nextFocusDownId = View.NO_ID;
776eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
786eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void __constructor__(Context context) {
793c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, null);
806eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
816eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
825189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    public void __constructor__(Context context, AttributeSet attributeSet) {
833c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        __constructor__(context, attributeSet, 0);
843c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
853c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
863c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) {
873c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        this.context = context;
885189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        this.attributeSet = attributeSet;
893c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
903c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        if (attributeSet != null) {
913c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams            applyAttributes();
923c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams        }
933c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    }
943c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams
953c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams    public void applyAttributes() {
965189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        applyIdAttribute();
976be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        applyVisibilityAttribute();
9849e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        applyEnabledAttribute();
994cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz        applyBackgroundAttribute();
100b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken        applyTagAttribute();
1016c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        applyOnClickAttribute();
102684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams    }
103684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams
104de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1056eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setId(int id) {
1066eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.id = id;
1076eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1086eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
109de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
110cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setClickable(boolean clickable) {
111cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.clickable = clickable;
112cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
113cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
114ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
115ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior.
116ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
117ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusable the new status of the {@code View}'s focusability
118ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
119de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
120cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    public void setFocusable(boolean focusable) {
121cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz        this.focusable = focusable;
122adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (!focusable) {
123415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusableInTouchMode(false);
124415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
125415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
126415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
127415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
128415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public final boolean isFocusableInTouchMode() {
129415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        return focusableInTouchMode;
130415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    }
131415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard
132ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
133ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior.
134ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
135ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability
136ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
137415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    @Implementation
138415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard    public void setFocusableInTouchMode(boolean focusableInTouchMode) {
139415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        this.focusableInTouchMode = focusableInTouchMode;
140adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        if (focusableInTouchMode) {
141415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard            setFocusable(true);
142415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard        }
143cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz    }
144cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz
145de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
146254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    public boolean isFocusable() {
147254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin        return focusable;
148254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    }
149254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin
150254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin    @Implementation
1516eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getId() {
1526eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return id;
1536eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
1546eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
155ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
156ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Simulates the inflating of the requested resource.
157ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
1588de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param context  the context from which to obtain a layout inflater
159ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param resource the ID of the resource to inflate
1608de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @param root     the {@code ViewGroup} to add the inflated {@code View} to
161ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the inflated View
162ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
163de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
164a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    public static View inflate(Context context, int resource, ViewGroup root) {
16540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        return ShadowLayoutInflater.from(context).inflate(resource, root);
166a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz    }
167a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz
168ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
169ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise
170ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
171ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @param id the id of the {@code View} to find
172ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return the {@code View}, if found, {@code null} otherwise
173ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
174de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1756eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public View findViewById(int id) {
176e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        if (id == this.id) {
177e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz            return realView;
178e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz        }
1796eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
1806eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return null;
1816eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
182f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
183593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    @Implementation
184593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    public View findViewWithTag(Object obj) {
185593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        if (obj.equals(this.getTag())) {
186593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken            return realView;
187593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        }
188593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken
189593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        return null;
190593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    }
1916eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
192de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
1930c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    public View getRootView() {
194afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams        ShadowView root = this;
195adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams        while (root.parent != null) {
1960c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol            root = root.parent;
1970c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        }
1980c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol        return root.realView;
1990c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol    }
2000c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol
201de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
202d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    public ViewGroup.LayoutParams getLayoutParams() {
203d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz        return layoutParams;
204d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz    }
205d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz
206de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
207b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    public void setLayoutParams(ViewGroup.LayoutParams params) {
208b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard        layoutParams = params;
209b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard    }
210b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard
211de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2125411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public final ViewParent getParent() {
213a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        return parent == null ? null : (ViewParent) parent.realView;
2145411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
2155411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
216de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2176eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public final Context getContext() {
2186eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context;
2196eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2206eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
221de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2226eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public Resources getResources() {
2236eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return context.getResources();
2246eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2256eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
226de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2274d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    public void setBackgroundResource(int backgroundResourceId) {
2284d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin        this.backgroundResourceId = backgroundResourceId;
229a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(getResources().getDrawable(backgroundResourceId));
230a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
231a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
232a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
233a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
234a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
235a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource ID of this views background
236a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
237a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundResourceId() {
238a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundResourceId;
239a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
240a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
241a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
242a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundColor(int color) {
243a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        backgroundColor = color;
244a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        setBackgroundDrawable(new ColorDrawable(getResources().getColor(color)));
245a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
246a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
247a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    /**
248a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * Non-Android accessor.
249a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     *
250a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     * @return the resource color ID of this views background
251a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz     */
252a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public int getBackgroundColor() {
253a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return backgroundColor;
254a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
255a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
256a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
257a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void setBackgroundDrawable(Drawable d) {
258a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.background = d;
259a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
260a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
261a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
262a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public Drawable getBackground() {
263a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        return background;
2644d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin    }
2654d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin
266de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2676eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public int getVisibility() {
2686eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        return visibility;
2696eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
2706eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
271de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2726eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    public void setVisibility(int visibility) {
2736eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz        this.visibility = visibility;
2746eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz    }
275eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz
276de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
277eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    public void setSelected(boolean selected) {
278eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz        this.selected = selected;
279eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz    }
280810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
281de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
282acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    public boolean isSelected() {
283acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz        return this.selected;
284acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz    }
285acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz
286de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
287775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public boolean isEnabled() {
288775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        return this.enabled;
289775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
290adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
291de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
292775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    public void setEnabled(boolean enabled) {
293775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard        this.enabled = enabled;
294775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard    }
295775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard
296de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
297810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public void setOnClickListener(View.OnClickListener onClickListener) {
298810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        this.onClickListener = onClickListener;
299810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
300810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore
301de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
302810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    public boolean performClick() {
303810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        if (onClickListener != null) {
304810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            onClickListener.onClick(realView);
305810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return true;
306810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        } else {
307810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore            return false;
308810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore        }
309810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore    }
310c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
311de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
312d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) {
313d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        this.onLongClickListener = onLongClickListener;
314d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
315d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
316d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
317d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    public boolean performLongClick() {
318d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (onLongClickListener != null) {
319d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            onLongClickListener.onLongClick(realView);
320d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return true;
321d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        } else {
322d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            return false;
323d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
324d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
325d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
326d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    @Implementation
3275411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnKeyListener(View.OnKeyListener onKeyListener) {
3285411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        this.onKeyListener = onKeyListener;
3295411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
3305411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
331de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
332c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public Object getTag() {
333c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        return this.tag;
334c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
335c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz
336de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
337c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    public void setTag(Object tag) {
338c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz        this.tag = tag;
339c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz    }
34018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
341de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
34218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getHeight() {
343a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return bottom - top;
34418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
34518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
346de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
34718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public final int getWidth() {
348a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return right - left;
34918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
35018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
351de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
352924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final int getMeasuredWidth() {
353a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        return getWidth();
354a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    }
355a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
356de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
3572b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public final int getMeasuredHeight() {
3582b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur        return getHeight();
3592b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    }
3602b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur
3612b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    @Implementation
362a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard    public final void layout(int l, int t, int r, int b) {
363a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        left = l;
364a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        top = t;
365a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        right = r;
366a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard        bottom = b;
367a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard
368a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo:       realView.onLayout();
369924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
370adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
371de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
37218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public void setPadding(int left, int top, int right, int bottom) {
37318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingLeft = left;
37418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingTop = top;
37518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingRight = right;
37618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        paddingBottom = bottom;
37718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
37818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
379de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
38018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingTop() {
38118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingTop;
38218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
38318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
384de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
38518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingLeft() {
38618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingLeft;
38718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
38818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
389de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
39018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingRight() {
39118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingRight;
39218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
39318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard
394de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
39518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    public int getPaddingBottom() {
39618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard        return paddingBottom;
39718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard    }
39851fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz
399de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
40044ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public Object getTag(int key) {
40144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        return tags.get(key);
40244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
40344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams
404de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
40544ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    public void setTag(int key, Object value) {
40644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams        tags.put(key, value);
40744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams    }
4085411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
40965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4104241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public void requestLayout() {
4114241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        didRequestLayout = true;
4124241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4134241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4144241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    public boolean didRequestLayout() {
4154241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard        return didRequestLayout;
4164241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    }
4174241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard
4184241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard    @Implementation
41965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus() {
42065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return requestFocus(View.FOCUS_DOWN);
42165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
42265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
42365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
42465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public final boolean requestFocus(int direction) {
42565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(true);
42665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        return true;
42765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
42865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
4295411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setViewFocus(boolean hasFocus) {
4309729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        this.isFocused = hasFocus;
4315411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        if (onFocusChangeListener != null) {
4325411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams            onFocusChangeListener.onFocusChange(realView, hasFocus);
4335411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        }
4345411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
4355411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
436de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
4377cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public int getNextFocusDownId() {
4387cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        return nextFocusDownId;
4397cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
4407cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
4417cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
4427cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    public void setNextFocusDownId(int nextFocusDownId) {
4437cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard        this.nextFocusDownId = nextFocusDownId;
4447cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    }
4457cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard
4467cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard    @Implementation
44765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public boolean isFocused() {
4489729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
44965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
45065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
45165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4525411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public boolean hasFocus() {
4539729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return isFocused;
4545411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
4555411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams
456de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
45765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    public void clearFocus() {
45865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams        setViewFocus(false);
45965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    }
46065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams
46165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams    @Implementation
4625411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    public void setOnFocusChangeListener(View.OnFocusChangeListener listener) {
4635411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams        onFocusChangeListener = listener;
4645411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams    }
465f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
4660a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    @Implementation
4672b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public View.OnFocusChangeListener getOnFocusChangeListener() {
4680a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor        return onFocusChangeListener;
4690a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor    }
4701c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard
471de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
4721c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    public void invalidate() {
4731c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard        wasInvalidated = true;
4741c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard    }
475924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
476de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
4771e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    public boolean onTouchEvent(MotionEvent event) {
478840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        lastTouchEvent = event;
479840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return false;
4801e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    }
4811e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu
4821e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu    @Implementation
483924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public void setOnTouchListener(View.OnTouchListener onTouchListener) {
484924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        this.onTouchListener = onTouchListener;
485924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
486924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
487de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
488924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public boolean dispatchTouchEvent(MotionEvent event) {
4897bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala        if (onTouchListener != null && onTouchListener.onTouch(realView, event)) {
4907bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala            return true;
491924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard        }
492840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return realView.onTouchEvent(event);
493840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    }
494840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu
495840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu    public MotionEvent getLastTouchEvent() {
496840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu        return lastTouchEvent;
497924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
4982ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin
499445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    @Implementation
5002b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur    public boolean dispatchKeyEvent(KeyEvent event) {
501445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        if (onKeyListener != null) {
502445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin            return onKeyListener.onKey(realView, event.getKeyCode(), event);
503445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        }
504445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin        return false;
505445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin    }
506445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin
507ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
508da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string.
50940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * <p/>
510da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Robolectric extension.
511ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5122ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
5132ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return "";
5142ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
51586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
516ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
517ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out}
518ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
51986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump() {
52086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dump(System.out, 0);
52186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
52286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
523ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
524ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Dumps the status of this {@code View} to {@code System.out} at the given indentation level
525ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
52686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump(PrintStream out, int indent) {
52786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
52886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.println("/>");
52986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
53086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
53186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpFirstPart(PrintStream out, int indent) {
53286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpIndent(out, indent);
53386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
53486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        out.print("<" + realView.getClass().getSimpleName());
53586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (id > 0) {
53686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\"");
53786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
53886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
53986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
54086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    protected void dumpIndent(PrintStream out, int indent) {
54186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        for (int i = 0; i < indent; i++) out.print(" ");
54286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
5434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
544ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
545ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return left side of the view
546ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
547bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getLeft() {
5494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return left;
5504d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
552ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
553ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return top coordinate of the view
554ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
555bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getTop() {
5574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return top;
5584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
560ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
561ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return right side of the view
562ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
563bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getRight() {
5654d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return right;
5664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5674d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
568ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
569ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return bottom coordinate of the view
570ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
571bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5724d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public int getBottom() {
5734d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return bottom;
5744d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5754d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
576ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
577ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether the view is clickable
578ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
579bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams    @Implementation
5804d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean isClickable() {
5814d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return clickable;
5824d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5834d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
584ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
585de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
586ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     *
587ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * @return whether or not {@link #invalidate()} has been called
588ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public boolean wasInvalidated() {
5904d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        return wasInvalidated;
5914d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5924d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
593ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
594ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Clears the wasInvalidated flag
595ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
5964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void clearWasInvalidated() {
5974d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        wasInvalidated = false;
5984d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
5994d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
600ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
601de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
602ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6034d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setLeft(int left) {
6044d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.left = left;
6054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
607ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
608de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
609ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6104d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setTop(int top) {
6114d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.top = top;
6124d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
614ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
615de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
616ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6174d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setRight(int right) {
6184d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.right = right;
6194d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6204d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
621ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
622de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
623ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6244d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setBottom(int bottom) {
6254d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.bottom = bottom;
6264d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
628ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
629de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
630ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingLeft(int paddingLeft) {
6324d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingLeft = paddingLeft;
6334d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6344d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
635ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
636de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
637ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingTop(int paddingTop) {
6394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingTop = paddingTop;
6404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
642ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
643de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
644ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingRight(int paddingRight) {
6464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingRight = paddingRight;
6474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
649ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
650de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
651ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setPaddingBottom(int paddingBottom) {
6534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        this.paddingBottom = paddingBottom;
6544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin
656ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
657de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams     * Non-Android accessor.
658ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
6594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    public void setFocused(boolean focused) {
6604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin        isFocused = focused;
6614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin    }
6628de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz
6638de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    /**
6648de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * Non-Android accessor.
6658de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *
6668de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or
6678de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     *         any ancestor is not {@code View.VISIBLE}
6688de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz     */
6698de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    public boolean derivedIsVisible() {
6708de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        View parent = realView;
6718de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        while (parent != null) {
6728de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            if (parent.getVisibility() != View.VISIBLE) {
6738de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz                return false;
6748de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            }
6758de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz            parent = (View) parent.getParent();
6768de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        }
6778de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz        return true;
6788de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz    }
679c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
680c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    /**
681c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app.
682c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     *
683c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible.
684c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz     */
685c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    public boolean checkedPerformClick() {
686c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!derivedIsVisible()) {
687c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not visible and cannot be clicked");
688c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
689c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        if (!realView.isEnabled()) {
690c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz            throw new RuntimeException("View is not enabled and cannot be clicked");
691c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        }
692c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz
693c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz        return realView.performClick();
694c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz    }
6955101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
69606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    public void applyFocus() {
69706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        if (noParentHasFocus(realView)) {
69806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false);
69906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (focusRequested || realView.isFocusableInTouchMode()) {
70006dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz                realView.requestFocus();
70106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            }
70206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        }
7035101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
7045101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
7055189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz    private void applyIdAttribute() {
7065189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        Integer id = attributeSet.getAttributeResourceValue("android", "id", 0);
7075189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz        if (getId() == 0) {
7085189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz            setId(id);
7092bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz        }
7102bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz    }
711d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
712b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken    private void applyTagAttribute() {
713d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        Object tag = attributeSet.getAttributeValue("android", "tag");
714d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (tag != null) {
715d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            setTag(tag);
716d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
717d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz    }
7182bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz
7196be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz    private void applyVisibilityAttribute() {
7206be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz        String visibility = attributeSet.getAttributeValue("android", "visibility");
7215101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        if (visibility != null) {
7225101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            if (visibility.equals("gone")) {
7235101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.GONE);
7245101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            } else if (visibility.equals("invisible")) {
7255101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz                setVisibility(View.INVISIBLE);
7265101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz            }
7275101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz        }
7285101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
7295101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz
73049e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz    private void applyEnabledAttribute() {
73149e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz        setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true));
7325101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz    }
73319d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz
7344cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz    private void applyBackgroundAttribute() {
73540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        String source = attributeSet.getAttributeValue("android", "background");
73640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        if (source != null) {
73740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            if (source.startsWith("@drawable/")) {
73840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0));
73940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams            }
74040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        }
7416d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse    }
7426d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse
7436c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    private void applyOnClickAttribute() {
7446c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        final String handlerName = attributeSet.getAttributeValue("android",
745d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                "onClick");
7466c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        if (handlerName == null) {
7476c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            return;
7486c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        }
7496c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
7506c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        /* good part of following code has been directly copied from original
7516c887826366610c9e44c21a9fec6020219226283Gautier Hayoun         * android source */
7526c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        setOnClickListener(new View.OnClickListener() {
7536c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            public void onClick(View v) {
7546c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                Method mHandler;
7556c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
7566c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler = getContext().getClass().getMethod(handlerName,
757d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            View.class);
7586c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (NoSuchMethodException e) {
7596c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    int id = getId();
7606c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    String idText = id == View.NO_ID ? "" : " with id '"
7616c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + shadowOf(context).getResourceLoader()
762d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz                            .getNameForId(id) + "'";
7636c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not find a method " +
7646c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            handlerName + "(View) in the activity "
7656c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + getContext().getClass() + " for onClick handler"
7666c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + " on view " + realView.getClass() + idText, e);
7676c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
7686c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
7696c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                try {
7706c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    mHandler.invoke(getContext(), realView);
7716c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (IllegalAccessException e) {
7726c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute non "
7736c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "public method of the activity", e);
7746c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                } catch (InvocationTargetException e) {
7756c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                    throw new IllegalStateException("Could not execute "
7766c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                            + "method of the activity", e);
7776c887826366610c9e44c21a9fec6020219226283Gautier Hayoun                }
7786c887826366610c9e44c21a9fec6020219226283Gautier Hayoun            }
7796c887826366610c9e44c21a9fec6020219226283Gautier Hayoun        });
7806c887826366610c9e44c21a9fec6020219226283Gautier Hayoun    }
7816c887826366610c9e44c21a9fec6020219226283Gautier Hayoun
78206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz    private boolean noParentHasFocus(View view) {
78319d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        while (view != null) {
78406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz            if (view.hasFocus()) return false;
78519d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz            view = (View) view.getParent();
78619d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz        }
78706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz        return true;
78819d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz    }
789d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
7900ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    /**
7910ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * Non-android accessor.  Returns touch listener, if set.
792d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
7930ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     * @return
7940ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi     */
7950ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    public View.OnTouchListener getOnTouchListener() {
796d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onTouchListener;
7970ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi    }
798d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
79946309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    /**
80046309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * Non-android accessor.  Returns click listener, if set.
801d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz     *
80246309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     * @return
80346309a9995c013790cbc40ae207f10973350b14fMichael Portuesi     */
80446309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    public View.OnClickListener getOnClickListener() {
805d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return onClickListener;
80646309a9995c013790cbc40ae207f10973350b14fMichael Portuesi    }
807ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
808b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
809ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public void setDrawingCacheEnabled(boolean drawingCacheEnabled) {
810ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        this.drawingCacheEnabled = drawingCacheEnabled;
811ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
812ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
813b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
814ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public boolean isDrawingCacheEnabled() {
815ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return drawingCacheEnabled;
816ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
817ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams
818b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams    @Implementation
819ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    public Bitmap getDrawingCache() {
820ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams        return Robolectric.newInstanceOf(Bitmap.class);
821ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams    }
82240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
82334f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    @Implementation
82434f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    public void post(Runnable action) {
82534f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey        Robolectric.getUiThreadScheduler().post(action);
82634f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey    }
827b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams
828b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    @Implementation
829b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    public void postDelayed(Runnable action, long delayMills) {
830b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams        Robolectric.getUiThreadScheduler().postDelayed(action, delayMills);
831b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams    }
832289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz
833289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    @Implementation
834289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    public void postInvalidateDelayed(long delayMilliseconds) {
835289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        Robolectric.getUiThreadScheduler().postDelayed(new Runnable() {
836289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            @Override
837289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            public void run() {
838289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz                realView.invalidate();
839289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz            }
840289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz        }, delayMilliseconds);
841289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz    }
842d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8433f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
8443f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public Animation getAnimation() {
845d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        return animation;
8463f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
847d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8483f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
8493f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void setAnimation(Animation anim) {
850d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation = anim;
8513f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
852d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8533f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
8543f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void startAnimation(Animation anim) {
855d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        setAnimation(anim);
856d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        animation.start();
8573f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
858d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz
8593f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    @Implementation
8603f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    public void clearAnimation() {
861d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        if (animation != null) {
862d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz            animation.cancel();
863d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz        }
8643f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi    }
865a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
866a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
867a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void scrollTo(int x, int y) {
868a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        this.scrollToCoordinates = new Point(x, y);
869a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
870f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
871cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
872cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollX() {
873cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.x : 0;
874cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
875cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard
876cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    @Implementation
877cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    public int getScrollY() {
878cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard        return scrollToCoordinates != null ? scrollToCoordinates.y : 0;
879cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard    }
880f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard
881f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    @Implementation
882f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    public ViewTreeObserver getViewTreeObserver() {
883f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        if (viewTreeObserver == null) {
884f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard            viewTreeObserver = newInstanceOf(ViewTreeObserver.class);
885f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        }
886f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard        return viewTreeObserver;
887f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard    }
8886eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
889