133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows; 26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 36ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 46ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport static com.xtremelabs.robolectric.Robolectric.Reflection.newInstanceOf; 56ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen 66eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.Context; 76eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.res.Resources; 8ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport android.graphics.Bitmap; 9a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultzimport android.graphics.Point; 10a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.ColorDrawable; 11a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.Drawable; 12684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet; 136ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.KeyEvent; 146ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.MotionEvent; 156ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.View; 160eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesiimport android.view.View.MeasureSpec; 176ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewGroup; 186ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewParent; 196ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogenimport android.view.ViewTreeObserver; 203f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation; 216ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen 22ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport com.xtremelabs.robolectric.Robolectric; 2322c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation; 2422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements; 2522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject; 266eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 2786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream; 286c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.InvocationTargetException; 296c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.Method; 3051fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap; 3151fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map; 32c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 33ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/** 346c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Shadow implementation of {@code View} that simulates the behavior of this 356c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * class. 36d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * <p/> 376c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Supports listeners, focusability (but not focus order), resource loading, 386c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * visibility, onclick, tags, and tracks the size and shape of the view. 39ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 40198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"}) 410b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class) 42afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView { 43d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz @RealObject 44d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz protected View realView; 456eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 466eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz private int id; 47afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams ShadowView parent; 4870e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz protected Context context; 494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean selected; 50810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore private View.OnClickListener onClickListener; 51d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz private View.OnLongClickListener onLongClickListener; 52c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz private Object tag; 53775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard private boolean enabled = true; 544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int visibility = View.VISIBLE; 5518f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo private boolean filterTouchesWhenObscured = false; 564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int left; 574d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int top; 584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int right; 594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int bottom; 604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingLeft; 614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingTop; 624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingRight; 634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingBottom; 644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0); 6543c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen private final Map<Integer, Object> tags = new HashMap<Integer, Object>(); 664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean clickable; 67254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin protected boolean focusable; 689729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin boolean focusableInTouchMode; 694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int backgroundResourceId = -1; 701f4067d01d9e2907f2d926b17d378cb40a379dcaRich Humphrey private int backgroundColor; 715411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams protected View.OnKeyListener onKeyListener; 724d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean isFocused; 735411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams private View.OnFocusChangeListener onFocusChangeListener; 744d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean wasInvalidated; 75924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard private View.OnTouchListener onTouchListener; 76a2dd5bb88b4bfe0cbe77cfc3581ce42745509760Phil Goodwin & Tyler Schultz protected AttributeSet attributeSet; 77ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams private boolean drawingCacheEnabled; 78a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public Point scrollToCoordinates; 794241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard private boolean didRequestLayout; 80a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz private Drawable background; 813f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi private Animation animation; 82f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard private ViewTreeObserver viewTreeObserver; 83840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu private MotionEvent lastTouchEvent; 847cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard private int nextFocusDownId = View.NO_ID; 85cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella private CharSequence contentDescription = null; 860eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi private int measuredWidth = 0; 870eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi private int measuredHeight = 0; 886eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 896eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void __constructor__(Context context) { 903c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams __constructor__(context, null); 916eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 926eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 935189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz public void __constructor__(Context context, AttributeSet attributeSet) { 943c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams __constructor__(context, attributeSet, 0); 953c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams } 963c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams 973c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) { 983c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams this.context = context; 995189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz this.attributeSet = attributeSet; 1003c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams 1013c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams if (attributeSet != null) { 1023c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams applyAttributes(); 1033c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams } 1043c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams } 1053c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams 1063c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams public void applyAttributes() { 1075189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz applyIdAttribute(); 1086be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz applyVisibilityAttribute(); 10918f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo applyFilterTouchesWhenObscuredAttribute(); 110ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo applyClickableAttribute(); 111ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo applyFocusableAttribute(); 11249e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz applyEnabledAttribute(); 1134cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz applyBackgroundAttribute(); 114b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken applyTagAttribute(); 1156c887826366610c9e44c21a9fec6020219226283Gautier Hayoun applyOnClickAttribute(); 116cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella applyContentDescriptionAttribute(); 117684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams } 118684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams 119de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1206eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void setId(int id) { 1216eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz this.id = id; 1226eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1236eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 124de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 125cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz public void setClickable(boolean clickable) { 126cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz this.clickable = clickable; 127cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz } 128cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz 129ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 130ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior. 131ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 132ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param focusable the new status of the {@code View}'s focusability 133ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 134de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 135cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz public void setFocusable(boolean focusable) { 136cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz this.focusable = focusable; 137adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams if (!focusable) { 138415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard setFocusableInTouchMode(false); 139415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 140415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 141415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard 142415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard @Implementation 143415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard public final boolean isFocusableInTouchMode() { 144415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard return focusableInTouchMode; 145415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 146415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard 147ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 148ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior. 149ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 150ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability 151ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 152415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard @Implementation 153415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard public void setFocusableInTouchMode(boolean focusableInTouchMode) { 154415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard this.focusableInTouchMode = focusableInTouchMode; 155adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams if (focusableInTouchMode) { 156415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard setFocusable(true); 157415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 158cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz } 159cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz 160cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella @Implementation(i18nSafe = false) 161cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella public void setContentDescription(CharSequence contentDescription) { 162cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella this.contentDescription = contentDescription; 163cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 164cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella 165de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 166254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin public boolean isFocusable() { 167254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin return focusable; 168254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin } 169254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin 170254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin @Implementation 1716eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public int getId() { 1726eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return id; 1736eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1746eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 175cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella @Implementation 176cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella public CharSequence getContentDescription() { 177cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella return contentDescription; 178cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 179cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella 180ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 181ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Simulates the inflating of the requested resource. 182ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 1838de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @param context the context from which to obtain a layout inflater 184ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param resource the ID of the resource to inflate 1858de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @param root the {@code ViewGroup} to add the inflated {@code View} to 186ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return the inflated View 187ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 188de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 189a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz public static View inflate(Context context, int resource, ViewGroup root) { 19040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams return ShadowLayoutInflater.from(context).inflate(resource, root); 191a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz } 192a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz 193ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 194ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise 195ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 196ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param id the id of the {@code View} to find 197ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return the {@code View}, if found, {@code null} otherwise 198ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 199de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2006eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public View findViewById(int id) { 201e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz if (id == this.id) { 202e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz return realView; 203e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz } 2046eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 2056eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return null; 2066eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 207f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 208593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken @Implementation 209593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken public View findViewWithTag(Object obj) { 210b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz if (obj.equals(realView.getTag())) { 211593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken return realView; 212593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 213593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken 214593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken return null; 215593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 2166eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 217de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2180c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol public View getRootView() { 219afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams ShadowView root = this; 220adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams while (root.parent != null) { 2210c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol root = root.parent; 2220c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol } 2230c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol return root.realView; 2240c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol } 2250c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol 226de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 227d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz public ViewGroup.LayoutParams getLayoutParams() { 228d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz return layoutParams; 229d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz } 230d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz 231de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 232b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard public void setLayoutParams(ViewGroup.LayoutParams params) { 233b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard layoutParams = params; 234b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard } 235b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard 236de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2375411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public final ViewParent getParent() { 238a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz return parent == null ? null : (ViewParent) parent.realView; 2395411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 2405411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 241de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2426eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public final Context getContext() { 2436eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return context; 2446eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 2456eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 246de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2476eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public Resources getResources() { 2486eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return context.getResources(); 2496eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 2506eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 251de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2524d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin public void setBackgroundResource(int backgroundResourceId) { 2534d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin this.backgroundResourceId = backgroundResourceId; 254a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz setBackgroundDrawable(getResources().getDrawable(backgroundResourceId)); 255a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 256a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 257a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz /** 258a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * Non-Android accessor. 259a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * 260a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * @return the resource ID of this views background 261a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz */ 262a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public int getBackgroundResourceId() { 263a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz return backgroundResourceId; 264a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 265a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 266a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 267a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public void setBackgroundColor(int color) { 268a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz backgroundColor = color; 269a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz setBackgroundDrawable(new ColorDrawable(getResources().getColor(color))); 270a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 271a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 272a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz /** 273a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * Non-Android accessor. 274a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * 275a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * @return the resource color ID of this views background 276a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz */ 277a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public int getBackgroundColor() { 278a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz return backgroundColor; 279a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 280a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 281a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 282a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public void setBackgroundDrawable(Drawable d) { 283a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz this.background = d; 284a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 285a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 286a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 287a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public Drawable getBackground() { 288a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz return background; 2894d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin } 2904d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin 291de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2926eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public int getVisibility() { 2936eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return visibility; 2946eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 2956eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 296de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2976eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void setVisibility(int visibility) { 2986eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz this.visibility = visibility; 2996eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 300eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz 301de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 30218f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo public boolean getFilterTouchesWhenObscured() { 30318f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo return filterTouchesWhenObscured; 30418f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo } 30518f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo 30618f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo @Implementation 30718f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo public void setFilterTouchesWhenObscured(boolean enabled) { 30818f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo this.filterTouchesWhenObscured = enabled; 30918f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo } 31018f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo 31118f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo @Implementation 312eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz public void setSelected(boolean selected) { 313eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz this.selected = selected; 314eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz } 315810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore 316de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 317acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz public boolean isSelected() { 318acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz return this.selected; 319acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz } 320acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz 321de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 322775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard public boolean isEnabled() { 323775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard return this.enabled; 324775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard } 325adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams 326de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 327775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard public void setEnabled(boolean enabled) { 328775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard this.enabled = enabled; 329775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard } 330775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard 331de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 332810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore public void setOnClickListener(View.OnClickListener onClickListener) { 333810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore this.onClickListener = onClickListener; 334810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 335810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore 336de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 337810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore public boolean performClick() { 338810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore if (onClickListener != null) { 339810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore onClickListener.onClick(realView); 340810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore return true; 341810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } else { 342810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore return false; 343810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 344810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 345c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 346de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 347d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) { 348d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz this.onLongClickListener = onLongClickListener; 349d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 350d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 351d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz @Implementation 352d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz public boolean performLongClick() { 353d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz if (onLongClickListener != null) { 354d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz onLongClickListener.onLongClick(realView); 355d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return true; 356d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } else { 357d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return false; 358d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 359d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 360d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 361d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz @Implementation 3625411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setOnKeyListener(View.OnKeyListener onKeyListener) { 3635411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams this.onKeyListener = onKeyListener; 3645411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 3655411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 366de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 367c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz public Object getTag() { 368c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz return this.tag; 369c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz } 370c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 371de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 372c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz public void setTag(Object tag) { 373c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz this.tag = tag; 374c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz } 37518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 376de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 37718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public final int getHeight() { 378a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard return bottom - top; 37918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 38018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 381de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 38218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public final int getWidth() { 383a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard return right - left; 38418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 38518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 386de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 387924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public final int getMeasuredWidth() { 3880eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi return measuredWidth; 389a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard } 390a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard 391de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 3922b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur public final int getMeasuredHeight() { 3930eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi return measuredHeight; 3942b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur } 3950eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 3960eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi @Implementation 3970eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi public final void setMeasuredDimension(int measuredWidth, int measuredHeight) { 3980eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi this.measuredWidth = measuredWidth; 3990eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi this.measuredHeight = measuredHeight; 4000eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi } 4010eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 4020eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi @Implementation 4030eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 4040eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), 4050eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi MeasureSpec.getSize(heightMeasureSpec)); 4060eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi } 4070eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 4080eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi @Implementation 4090eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi public final void measure(int widthMeasureSpec, int heightMeasureSpec) { 4100eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // We really want to invoke the onMeasure method of the real view, 4110eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // as the real View likely contains an implementation of onMeasure 4120eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // worthy of test, rather the default shadow implementation. 4130eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // But Android declares onMeasure as protected. 4140eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi try { 4150eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi Method onMeasureMethod = realView.getClass().getDeclaredMethod("onMeasure", Integer.TYPE, Integer.TYPE ); 4160eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi onMeasureMethod.setAccessible(true); 4170eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi onMeasureMethod.invoke( realView, widthMeasureSpec, heightMeasureSpec ); 418f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi } catch ( NoSuchMethodException e ) { 419f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi // use default shadow implementation 420f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi onMeasure(widthMeasureSpec, heightMeasureSpec); 421f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi } catch ( IllegalAccessException e ) { 422f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi throw new RuntimeException(e); 423f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi } catch ( InvocationTargetException e ) { 424f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi throw new RuntimeException(e); 425f058047d73230c81d51a52b5fb17a14ae7403dc3Michael Portuesi } 4260eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi } 4270eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 4282b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur @Implementation 429a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard public final void layout(int l, int t, int r, int b) { 430a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard left = l; 431a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard top = t; 432a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard right = r; 433a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard bottom = b; 434a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo: realView.onLayout(); 435924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 436adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams 437de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 43818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public void setPadding(int left, int top, int right, int bottom) { 43918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingLeft = left; 44018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingTop = top; 44118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingRight = right; 44218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingBottom = bottom; 44318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 44418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 445de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 44618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingTop() { 44718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingTop; 44818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 44918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 450de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 45118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingLeft() { 45218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingLeft; 45318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 45418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 455de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 45618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingRight() { 45718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingRight; 45818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 45918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 460de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 46118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingBottom() { 46218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingBottom; 46318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 46451fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz 465de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 46644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams public Object getTag(int key) { 46744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams return tags.get(key); 46844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams } 46944ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams 470de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 47144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams public void setTag(int key, Object value) { 47244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams tags.put(key, value); 47344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams } 4745411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 47565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 4764241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard public void requestLayout() { 4774241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard didRequestLayout = true; 4784241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard } 4794241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard 4804241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard public boolean didRequestLayout() { 4814241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard return didRequestLayout; 4824241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard } 4834241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard 4844241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard @Implementation 48565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public final boolean requestFocus() { 48665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams return requestFocus(View.FOCUS_DOWN); 48765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 48865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 48965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 49065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public final boolean requestFocus(int direction) { 49165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams setViewFocus(true); 49265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams return true; 49365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 49465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 4955411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setViewFocus(boolean hasFocus) { 4969729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin this.isFocused = hasFocus; 49743c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen 4986ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen try { 4996ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen Class rectClass = Class.forName("android.graphics.Rect"); 50043c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen Method method = View.class.getDeclaredMethod("onFocusChanged", Boolean.TYPE, Integer.TYPE, 5016ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen rectClass); 5026ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen method.setAccessible(true); 5036ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen method.invoke(realView, this.isFocused, 0, null); 5046ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen } catch (IllegalAccessException e) { 5056ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen throw new RuntimeException(e); 5066ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen } catch (InvocationTargetException e) { 5076ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen throw new RuntimeException(e); 5086ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen } catch (NoSuchMethodException e) { 5096ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen throw new RuntimeException(e); 5106ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen } catch (ClassNotFoundException e) { 5116ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen throw new RuntimeException(e); 5126ea37ea78d5e32d8fd7c1ac09f99542c314b7ed3Jon Boekenoogen } 51343c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen 5145411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams if (onFocusChangeListener != null) { 51543c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen onFocusChangeListener.onFocusChange(realView, hasFocus); 5165411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 5175411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 5185411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 519de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 5207cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard public int getNextFocusDownId() { 5217cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard return nextFocusDownId; 5227cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard } 5237cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard 5247cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard @Implementation 5257cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard public void setNextFocusDownId(int nextFocusDownId) { 5267cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard this.nextFocusDownId = nextFocusDownId; 5277cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard } 5287cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard 5297cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard @Implementation 53065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public boolean isFocused() { 5319729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin return isFocused; 53265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 53365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 53465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 5355411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public boolean hasFocus() { 5369729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin return isFocused; 5375411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 5385411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 539de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 54065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public void clearFocus() { 54165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams setViewFocus(false); 54265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 54343c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen 54465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 54510afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias public View findFocus() { 54610afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias return hasFocus() ? realView : null; 54710afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias } 54810afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias 54910afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias @Implementation 5505411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setOnFocusChangeListener(View.OnFocusChangeListener listener) { 5515411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams onFocusChangeListener = listener; 5525411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 553f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 5540a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor @Implementation 5552b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur public View.OnFocusChangeListener getOnFocusChangeListener() { 5560a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor return onFocusChangeListener; 5570a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor } 5581c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard 559de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 5601c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard public void invalidate() { 5611c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard wasInvalidated = true; 5621c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard } 563924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard 564de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 5651e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu public boolean onTouchEvent(MotionEvent event) { 566840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu lastTouchEvent = event; 567840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu return false; 5681e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu } 5691e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu 5701e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu @Implementation 571924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public void setOnTouchListener(View.OnTouchListener onTouchListener) { 572924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard this.onTouchListener = onTouchListener; 573924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 574924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard 575de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 576924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public boolean dispatchTouchEvent(MotionEvent event) { 5777bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala if (onTouchListener != null && onTouchListener.onTouch(realView, event)) { 5787bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala return true; 579924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 580840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu return realView.onTouchEvent(event); 581840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu } 582840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu 583840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu public MotionEvent getLastTouchEvent() { 584840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu return lastTouchEvent; 585924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 5862ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin 587445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin @Implementation 5882b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur public boolean dispatchKeyEvent(KeyEvent event) { 589445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin if (onKeyListener != null) { 590445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin return onKeyListener.onKey(realView, event.getKeyCode(), event); 591445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin } 592445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin return false; 593445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin } 594445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin 595ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 596da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string. 59740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * <p/> 598da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Robolectric extension. 599ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6002ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin public String innerText() { 6012ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin return ""; 6022ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin } 60386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 604ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 605ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Dumps the status of this {@code View} to {@code System.out} 606ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 60786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams public void dump() { 60886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dump(System.out, 0); 60986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 61086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 611ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 612ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Dumps the status of this {@code View} to {@code System.out} at the given indentation level 613ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 61486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams public void dump(PrintStream out, int indent) { 61586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpFirstPart(out, indent); 61686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.println("/>"); 61786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 61886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 61986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams protected void dumpFirstPart(PrintStream out, int indent) { 62086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpIndent(out, indent); 62186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 62286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.print("<" + realView.getClass().getSimpleName()); 62386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams if (id > 0) { 62486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\""); 62586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 62686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 62786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 62886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams protected void dumpIndent(PrintStream out, int indent) { 62986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams for (int i = 0; i < indent; i++) out.print(" "); 63086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 6314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 632ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 633ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return left side of the view 634ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 635bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getLeft() { 6374d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return left; 6384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 640ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 641ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return top coordinate of the view 642ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 643bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getTop() { 6454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return top; 6464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 648ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 649ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return right side of the view 650ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 651bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getRight() { 6534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return right; 6544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 656ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 657ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return bottom coordinate of the view 658ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 659bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getBottom() { 6614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return bottom; 6624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 664ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 665ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return whether the view is clickable 666ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 667bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6684d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public boolean isClickable() { 6694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return clickable; 6704d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6714d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 672ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 673de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 674ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 675ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return whether or not {@link #invalidate()} has been called 676ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6774d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public boolean wasInvalidated() { 6784d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return wasInvalidated; 6794d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6804d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 681ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 682ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Clears the wasInvalidated flag 683ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6844d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void clearWasInvalidated() { 6854d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin wasInvalidated = false; 6864d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6874d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 6880bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi @Implementation 6894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setLeft(int left) { 6904d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.left = left; 6914d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6924d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 6930bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi @Implementation 6944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setTop(int top) { 6954d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.top = top; 6964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6974d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 6980bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi @Implementation 6994d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setRight(int right) { 7004d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.right = right; 7014d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7024d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 7030bcbd37475c4774b3287f0a403ac26ca84a029efMichael Portuesi @Implementation 7044d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setBottom(int bottom) { 7054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.bottom = bottom; 7064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7074d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 708ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 709de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 710ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 7114d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingLeft(int paddingLeft) { 7124d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingLeft = paddingLeft; 7134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7144d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 715ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 716de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 717ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 7184d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingTop(int paddingTop) { 7194d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingTop = paddingTop; 7204d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7214d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 722ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 723de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 724ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 7254d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingRight(int paddingRight) { 7264d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingRight = paddingRight; 7274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7284d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 729ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 730de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 731ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 7324d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingBottom(int paddingBottom) { 7334d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingBottom = paddingBottom; 7344d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7354d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 736ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 737de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 738ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 7394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setFocused(boolean focused) { 7404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin isFocused = focused; 7414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7428de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz 7438de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz /** 7448de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * Non-Android accessor. 7458de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * 7468de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or 7478de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * any ancestor is not {@code View.VISIBLE} 7488de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz */ 7498de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz public boolean derivedIsVisible() { 7508de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz View parent = realView; 7518de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz while (parent != null) { 7528de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz if (parent.getVisibility() != View.VISIBLE) { 7538de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz return false; 7548de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 7558de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz parent = (View) parent.getParent(); 7568de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 7578de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz return true; 7588de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 759c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz 760c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz /** 761c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app. 762c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * 763c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible. 764c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz */ 765c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz public boolean checkedPerformClick() { 766c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz if (!derivedIsVisible()) { 767c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz throw new RuntimeException("View is not visible and cannot be clicked"); 768c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 769c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz if (!realView.isEnabled()) { 770c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz throw new RuntimeException("View is not enabled and cannot be clicked"); 771c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 772c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz 773c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz return realView.performClick(); 774c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 7755101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 77606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz public void applyFocus() { 77706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz if (noParentHasFocus(realView)) { 77806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false); 77906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz if (focusRequested || realView.isFocusableInTouchMode()) { 78006dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz realView.requestFocus(); 78106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz } 78206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz } 7835101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 7845101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 7855189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz private void applyIdAttribute() { 7865189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz Integer id = attributeSet.getAttributeResourceValue("android", "id", 0); 7875189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz if (getId() == 0) { 7885189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz setId(id); 7892bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz } 7902bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz } 791d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 792b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken private void applyTagAttribute() { 793d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz Object tag = attributeSet.getAttributeValue("android", "tag"); 794d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz if (tag != null) { 795d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz setTag(tag); 796d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 797d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 7982bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz 7996be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz private void applyVisibilityAttribute() { 8006be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz String visibility = attributeSet.getAttributeValue("android", "visibility"); 8015101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz if (visibility != null) { 8025101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz if (visibility.equals("gone")) { 8035101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz setVisibility(View.GONE); 8045101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } else if (visibility.equals("invisible")) { 8055101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz setVisibility(View.INVISIBLE); 8065101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 8075101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 8085101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 8095101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 81018f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo private void applyFilterTouchesWhenObscuredAttribute() { 81118f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo setFilterTouchesWhenObscured(attributeSet.getAttributeBooleanValue( 81218f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo "android", "filterTouchesWhenObscured", false)); 81318f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo } 81418f30a45c8b66060e65bd95a2c2690161cfb1644Farand Koo 815ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo private void applyClickableAttribute() { 816ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo setClickable(attributeSet.getAttributeBooleanValue("android", "clickable", false)); 817ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo } 818ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo 819ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo private void applyFocusableAttribute() { 820ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo setFocusable(attributeSet.getAttributeBooleanValue("android", "focusable", false)); 821ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo } 822ae96ffab1cf315ec04d4dfd2b0ab25337347ac85Farand Koo 82349e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz private void applyEnabledAttribute() { 82449e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true)); 8255101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 82619d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz 8274cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz private void applyBackgroundAttribute() { 82840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams String source = attributeSet.getAttributeValue("android", "background"); 82940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams if (source != null) { 83040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams if (source.startsWith("@drawable/")) { 83140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0)); 83240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams } 83340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams } 8346d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse } 8356d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse 8366c887826366610c9e44c21a9fec6020219226283Gautier Hayoun private void applyOnClickAttribute() { 8376c887826366610c9e44c21a9fec6020219226283Gautier Hayoun final String handlerName = attributeSet.getAttributeValue("android", 838d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz "onClick"); 8396c887826366610c9e44c21a9fec6020219226283Gautier Hayoun if (handlerName == null) { 8406c887826366610c9e44c21a9fec6020219226283Gautier Hayoun return; 8416c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8426c887826366610c9e44c21a9fec6020219226283Gautier Hayoun 8436c887826366610c9e44c21a9fec6020219226283Gautier Hayoun /* good part of following code has been directly copied from original 8446c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * android source */ 8456c887826366610c9e44c21a9fec6020219226283Gautier Hayoun setOnClickListener(new View.OnClickListener() { 84643c9cb31115b8f00b079d1dff9e70503f040d8ccJon Boekenoogen @Override 8476c887826366610c9e44c21a9fec6020219226283Gautier Hayoun public void onClick(View v) { 8486c887826366610c9e44c21a9fec6020219226283Gautier Hayoun Method mHandler; 8496c887826366610c9e44c21a9fec6020219226283Gautier Hayoun try { 8506c887826366610c9e44c21a9fec6020219226283Gautier Hayoun mHandler = getContext().getClass().getMethod(handlerName, 851d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz View.class); 8526c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } catch (NoSuchMethodException e) { 8536c887826366610c9e44c21a9fec6020219226283Gautier Hayoun int id = getId(); 8546c887826366610c9e44c21a9fec6020219226283Gautier Hayoun String idText = id == View.NO_ID ? "" : " with id '" 8556c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + shadowOf(context).getResourceLoader() 856d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz .getNameForId(id) + "'"; 8576c887826366610c9e44c21a9fec6020219226283Gautier Hayoun throw new IllegalStateException("Could not find a method " + 8586c887826366610c9e44c21a9fec6020219226283Gautier Hayoun handlerName + "(View) in the activity " 8596c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + getContext().getClass() + " for onClick handler" 8606c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + " on view " + realView.getClass() + idText, e); 8616c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8626c887826366610c9e44c21a9fec6020219226283Gautier Hayoun 8636c887826366610c9e44c21a9fec6020219226283Gautier Hayoun try { 8646c887826366610c9e44c21a9fec6020219226283Gautier Hayoun mHandler.invoke(getContext(), realView); 8656c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } catch (IllegalAccessException e) { 8666c887826366610c9e44c21a9fec6020219226283Gautier Hayoun throw new IllegalStateException("Could not execute non " 8676c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + "public method of the activity", e); 8686c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } catch (InvocationTargetException e) { 8696c887826366610c9e44c21a9fec6020219226283Gautier Hayoun throw new IllegalStateException("Could not execute " 8706c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + "method of the activity", e); 8716c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8726c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8736c887826366610c9e44c21a9fec6020219226283Gautier Hayoun }); 8746c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8756c887826366610c9e44c21a9fec6020219226283Gautier Hayoun 876cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella private void applyContentDescriptionAttribute() { 877cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella String contentDescription = attributeSet.getAttributeValue("android", "contentDescription"); 878cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella if (contentDescription != null) { 879cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella if (contentDescription.startsWith("@string/")) { 880cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella int resId = attributeSet.getAttributeResourceValue("android", "contentDescription", 0); 881cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella contentDescription = context.getResources().getString(resId); 882cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 883cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella setContentDescription(contentDescription); 884cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 885cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 886cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella 88706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz private boolean noParentHasFocus(View view) { 88819d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz while (view != null) { 88906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz if (view.hasFocus()) return false; 89019d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz view = (View) view.getParent(); 89119d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz } 89206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz return true; 89319d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz } 894d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 8950ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi /** 8960ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi * Non-android accessor. Returns touch listener, if set. 897d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * 8980ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi * @return 8990ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi */ 9000ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi public View.OnTouchListener getOnTouchListener() { 901d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return onTouchListener; 9020ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi } 903d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 90446309a9995c013790cbc40ae207f10973350b14fMichael Portuesi /** 90546309a9995c013790cbc40ae207f10973350b14fMichael Portuesi * Non-android accessor. Returns click listener, if set. 906d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * 90746309a9995c013790cbc40ae207f10973350b14fMichael Portuesi * @return 90846309a9995c013790cbc40ae207f10973350b14fMichael Portuesi */ 90946309a9995c013790cbc40ae207f10973350b14fMichael Portuesi public View.OnClickListener getOnClickListener() { 910d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return onClickListener; 91146309a9995c013790cbc40ae207f10973350b14fMichael Portuesi } 912ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams 913b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams @Implementation 914ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams public void setDrawingCacheEnabled(boolean drawingCacheEnabled) { 915ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams this.drawingCacheEnabled = drawingCacheEnabled; 916ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams } 917ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams 918b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams @Implementation 919ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams public boolean isDrawingCacheEnabled() { 920ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams return drawingCacheEnabled; 921ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams } 922ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams 923b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams @Implementation 924ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams public Bitmap getDrawingCache() { 925ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams return Robolectric.newInstanceOf(Bitmap.class); 926ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams } 92740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 92834f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey @Implementation 92934f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey public void post(Runnable action) { 93034f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey Robolectric.getUiThreadScheduler().post(action); 93134f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey } 932b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams 933b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams @Implementation 934b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams public void postDelayed(Runnable action, long delayMills) { 935b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams Robolectric.getUiThreadScheduler().postDelayed(action, delayMills); 936b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams } 937289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz 938289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz @Implementation 939289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz public void postInvalidateDelayed(long delayMilliseconds) { 940289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz Robolectric.getUiThreadScheduler().postDelayed(new Runnable() { 941289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz @Override 942289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz public void run() { 943289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz realView.invalidate(); 944289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz } 945289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz }, delayMilliseconds); 946289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz } 947d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 9483f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 9493f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public Animation getAnimation() { 950d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return animation; 9513f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 952d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 9533f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 9543f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public void setAnimation(Animation anim) { 955d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz animation = anim; 9563f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 957d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 9583f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 9593f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public void startAnimation(Animation anim) { 960d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz setAnimation(anim); 961d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz animation.start(); 9623f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 963d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 9643f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 9653f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public void clearAnimation() { 966d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz if (animation != null) { 967d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz animation.cancel(); 968f65a5dab0313865a75b98d7ef53f2773167224e0Jessica Chen animation = null; 969d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 9703f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 971a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 972a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 973a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public void scrollTo(int x, int y) { 974a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz this.scrollToCoordinates = new Point(x, y); 975a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 976f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 977cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard @Implementation 978cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard public int getScrollX() { 979cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard return scrollToCoordinates != null ? scrollToCoordinates.x : 0; 980cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard } 981cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard 982cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard @Implementation 983cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard public int getScrollY() { 984cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard return scrollToCoordinates != null ? scrollToCoordinates.y : 0; 985cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard } 986f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 987f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard @Implementation 988f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard public ViewTreeObserver getViewTreeObserver() { 989f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard if (viewTreeObserver == null) { 990f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard viewTreeObserver = newInstanceOf(ViewTreeObserver.class); 991f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard } 992f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard return viewTreeObserver; 993f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard } 9940c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala 9950c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala @Implementation 9960c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala public void onAnimationEnd() { 9970c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala } 9980c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala 9990c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala /* 10000c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala * Non-Android accessor. 10010c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala */ 10020c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala public void finishedAnimation() { 100323da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala try { 100423da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala Method onAnimationEnd = realView.getClass().getDeclaredMethod("onAnimationEnd", new Class[0]); 100523da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala onAnimationEnd.setAccessible(true); 100623da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala onAnimationEnd.invoke(realView); 100723da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala } catch (Exception e) { 100823da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala throw new RuntimeException(e); 100923da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala } 10100c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala } 10116eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz} 1012