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