ShadowView.java revision 0eecf58900c7b49c4cf833aafb51696bcda5e1f6
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows; 26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 36eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.Context; 46eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.content.res.Resources; 5ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport android.graphics.Bitmap; 6a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultzimport android.graphics.Point; 7a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.ColorDrawable; 8a075f94a84c6dd3493700d0c752fc545642e44d5Mike Grafton & Tyler Schultzimport android.graphics.drawable.Drawable; 9684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet; 10445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwinimport android.view.*; 110eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesiimport android.view.View.MeasureSpec; 123f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesiimport android.view.animation.Animation; 13ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williamsimport com.xtremelabs.robolectric.Robolectric; 1422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation; 1522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements; 1622c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject; 176eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 1886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream; 196c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.InvocationTargetException; 206c887826366610c9e44c21a9fec6020219226283Gautier Hayounimport java.lang.reflect.Method; 2151fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap; 2251fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map; 23c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 24f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richardimport static com.xtremelabs.robolectric.Robolectric.Reflection.newInstanceOf; 2586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 2686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 27ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/** 286c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Shadow implementation of {@code View} that simulates the behavior of this 296c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * class. 30d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * <p/> 316c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * Supports listeners, focusability (but not focus order), resource loading, 326c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * visibility, onclick, tags, and tracks the size and shape of the view. 33ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 34198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"}) 350b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class) 36afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView { 37d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz @RealObject 38d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz protected View realView; 396eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 406eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz private int id; 41afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams ShadowView parent; 4270e43520d16dba344ad0f2f96e5d9300880153ffPhil Goodwin & Tyler Schultz protected Context context; 434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean selected; 44810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore private View.OnClickListener onClickListener; 45d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz private View.OnLongClickListener onLongClickListener; 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; 71a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public Point scrollToCoordinates; 724241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard private boolean didRequestLayout; 73a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz private Drawable background; 743f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi private Animation animation; 75f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard private ViewTreeObserver viewTreeObserver; 76840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu private MotionEvent lastTouchEvent; 777cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard private int nextFocusDownId = View.NO_ID; 78cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella private CharSequence contentDescription = null; 790eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi private int measuredWidth = 0; 800eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi private int measuredHeight = 0; 816eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 826eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void __constructor__(Context context) { 833c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams __constructor__(context, null); 846eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 856eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 865189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz public void __constructor__(Context context, AttributeSet attributeSet) { 873c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams __constructor__(context, attributeSet, 0); 883c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams } 893c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams 903c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams public void __constructor__(Context context, AttributeSet attributeSet, int defStyle) { 913c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams this.context = context; 925189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz this.attributeSet = attributeSet; 933c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams 943c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams if (attributeSet != null) { 953c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams applyAttributes(); 963c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams } 973c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams } 983c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams 993c5249864cabd318d8b3f551f2f4ab7af7434f8bChristian Williams public void applyAttributes() { 1005189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz applyIdAttribute(); 1016be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz applyVisibilityAttribute(); 10249e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz applyEnabledAttribute(); 1034cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz applyBackgroundAttribute(); 104b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken applyTagAttribute(); 1056c887826366610c9e44c21a9fec6020219226283Gautier Hayoun applyOnClickAttribute(); 106cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella applyContentDescriptionAttribute(); 107684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams } 108684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams 109de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1106eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void setId(int id) { 1116eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz this.id = id; 1126eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1136eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 114de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 115cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz public void setClickable(boolean clickable) { 116cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz this.clickable = clickable; 117cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz } 118cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz 119ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 120ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior. 121ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 122ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param focusable the new status of the {@code View}'s focusability 123ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 124de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 125cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz public void setFocusable(boolean focusable) { 126cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz this.focusable = focusable; 127adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams if (!focusable) { 128415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard setFocusableInTouchMode(false); 129415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 130415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 131415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard 132415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard @Implementation 133415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard public final boolean isFocusableInTouchMode() { 134415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard return focusableInTouchMode; 135415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 136415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard 137ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 138ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior. 139ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 140ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability 141ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 142415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard @Implementation 143415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard public void setFocusableInTouchMode(boolean focusableInTouchMode) { 144415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard this.focusableInTouchMode = focusableInTouchMode; 145adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams if (focusableInTouchMode) { 146415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard setFocusable(true); 147415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 148cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz } 149cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz 150cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella @Implementation(i18nSafe = false) 151cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella public void setContentDescription(CharSequence contentDescription) { 152cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella this.contentDescription = contentDescription; 153cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 154cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella 155de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 156254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin public boolean isFocusable() { 157254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin return focusable; 158254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin } 159254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin 160254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin @Implementation 1616eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public int getId() { 1626eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return id; 1636eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1646eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 165cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella @Implementation 166cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella public CharSequence getContentDescription() { 167cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella return contentDescription; 168cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 169cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella 170ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 171ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Simulates the inflating of the requested resource. 172ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 1738de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @param context the context from which to obtain a layout inflater 174ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param resource the ID of the resource to inflate 1758de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @param root the {@code ViewGroup} to add the inflated {@code View} to 176ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return the inflated View 177ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 178de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 179a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz public static View inflate(Context context, int resource, ViewGroup root) { 18040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams return ShadowLayoutInflater.from(context).inflate(resource, root); 181a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz } 182a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz 183ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 184ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise 185ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 186ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param id the id of the {@code View} to find 187ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return the {@code View}, if found, {@code null} otherwise 188ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 189de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1906eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public View findViewById(int id) { 191e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz if (id == this.id) { 192e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz return realView; 193e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz } 1946eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 1956eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return null; 1966eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 197f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 198593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken @Implementation 199593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken public View findViewWithTag(Object obj) { 200b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz if (obj.equals(realView.getTag())) { 201593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken return realView; 202593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 203593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken 204593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken return null; 205593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 2066eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 207de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2080c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol public View getRootView() { 209afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams ShadowView root = this; 210adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams while (root.parent != null) { 2110c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol root = root.parent; 2120c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol } 2130c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol return root.realView; 2140c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol } 2150c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol 216de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 217d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz public ViewGroup.LayoutParams getLayoutParams() { 218d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz return layoutParams; 219d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz } 220d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz 221de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 222b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard public void setLayoutParams(ViewGroup.LayoutParams params) { 223b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard layoutParams = params; 224b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard } 225b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard 226de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2275411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public final ViewParent getParent() { 228a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz return parent == null ? null : (ViewParent) parent.realView; 2295411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 2305411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 231de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2326eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public final Context getContext() { 2336eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return context; 2346eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 2356eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 236de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2376eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public Resources getResources() { 2386eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return context.getResources(); 2396eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 2406eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 241de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2424d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin public void setBackgroundResource(int backgroundResourceId) { 2434d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin this.backgroundResourceId = backgroundResourceId; 244a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz setBackgroundDrawable(getResources().getDrawable(backgroundResourceId)); 245a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 246a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 247a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz /** 248a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * Non-Android accessor. 249a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * 250a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * @return the resource ID of this views background 251a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz */ 252a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public int getBackgroundResourceId() { 253a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz return backgroundResourceId; 254a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 255a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 256a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 257a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public void setBackgroundColor(int color) { 258a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz backgroundColor = color; 259a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz setBackgroundDrawable(new ColorDrawable(getResources().getColor(color))); 260a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 261a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 262a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz /** 263a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * Non-Android accessor. 264a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * 265a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz * @return the resource color ID of this views background 266a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz */ 267a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public int getBackgroundColor() { 268a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz return backgroundColor; 269a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 270a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 271a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 272a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public void setBackgroundDrawable(Drawable d) { 273a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz this.background = d; 274a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 275a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 276a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 277a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public Drawable getBackground() { 278a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz return background; 2794d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin } 2804d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin 281de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2826eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public int getVisibility() { 2836eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return visibility; 2846eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 2856eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 286de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2876eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void setVisibility(int visibility) { 2886eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz this.visibility = visibility; 2896eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 290eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz 291de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 292eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz public void setSelected(boolean selected) { 293eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz this.selected = selected; 294eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz } 295810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore 296de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 297acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz public boolean isSelected() { 298acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz return this.selected; 299acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz } 300acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz 301de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 302775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard public boolean isEnabled() { 303775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard return this.enabled; 304775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard } 305adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams 306de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 307775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard public void setEnabled(boolean enabled) { 308775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard this.enabled = enabled; 309775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard } 310775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard 311de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 312810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore public void setOnClickListener(View.OnClickListener onClickListener) { 313810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore this.onClickListener = onClickListener; 314810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 315810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore 316de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 317810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore public boolean performClick() { 318810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore if (onClickListener != null) { 319810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore onClickListener.onClick(realView); 320810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore return true; 321810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } else { 322810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore return false; 323810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 324810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 325c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 326de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 327d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) { 328d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz this.onLongClickListener = onLongClickListener; 329d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 330d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 331d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz @Implementation 332d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz public boolean performLongClick() { 333d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz if (onLongClickListener != null) { 334d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz onLongClickListener.onLongClick(realView); 335d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return true; 336d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } else { 337d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return false; 338d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 339d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 340d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 341d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz @Implementation 3425411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setOnKeyListener(View.OnKeyListener onKeyListener) { 3435411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams this.onKeyListener = onKeyListener; 3445411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 3455411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 346de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 347c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz public Object getTag() { 348c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz return this.tag; 349c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz } 350c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 351de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 352c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz public void setTag(Object tag) { 353c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz this.tag = tag; 354c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz } 35518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 356de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 35718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public final int getHeight() { 358a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard return bottom - top; 35918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 36018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 361de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 36218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public final int getWidth() { 363a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard return right - left; 36418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 36518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 366de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 367924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public final int getMeasuredWidth() { 3680eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi return measuredWidth; 369a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard } 370a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard 371de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 3722b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur public final int getMeasuredHeight() { 3730eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi return measuredHeight; 3742b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur } 3750eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 3760eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi @Implementation 3770eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi public final void setMeasuredDimension(int measuredWidth, int measuredHeight) { 3780eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi this.measuredWidth = measuredWidth; 3790eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi this.measuredHeight = measuredHeight; 3800eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi } 3810eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 3820eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi @Implementation 3830eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 3840eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), 3850eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi MeasureSpec.getSize(heightMeasureSpec)); 3860eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi } 3870eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 3880eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi @Implementation 3890eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi public final void measure(int widthMeasureSpec, int heightMeasureSpec) { 3900eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // We really want to invoke the onMeasure method of the real view, 3910eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // as the real View likely contains an implementation of onMeasure 3920eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // worthy of test, rather the default shadow implementation. 3930eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi // But Android declares onMeasure as protected. 3940eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi try { 3950eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi Method onMeasureMethod = realView.getClass().getDeclaredMethod("onMeasure", Integer.TYPE, Integer.TYPE ); 3960eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi onMeasureMethod.setAccessible(true); 3970eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi onMeasureMethod.invoke( realView, widthMeasureSpec, heightMeasureSpec ); 3980eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi } catch ( NoSuchMethodException e ) { throw new RuntimeException(e); } 3990eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi catch ( IllegalAccessException e ) { throw new RuntimeException(e); } 4000eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi catch ( InvocationTargetException e ) { throw new RuntimeException(e); } 4010eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi } 4020eecf58900c7b49c4cf833aafb51696bcda5e1f6Michael Portuesi 4032b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur @Implementation 404a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard public final void layout(int l, int t, int r, int b) { 405a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard left = l; 406a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard top = t; 407a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard right = r; 408a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard bottom = b; 409a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo: realView.onLayout(); 410924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 411adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams 412de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 41318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public void setPadding(int left, int top, int right, int bottom) { 41418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingLeft = left; 41518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingTop = top; 41618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingRight = right; 41718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingBottom = bottom; 41818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 41918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 420de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 42118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingTop() { 42218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingTop; 42318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 42418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 425de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 42618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingLeft() { 42718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingLeft; 42818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 42918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 430de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 43118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingRight() { 43218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingRight; 43318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 43418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 435de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 43618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingBottom() { 43718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingBottom; 43818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 43951fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz 440de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 44144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams public Object getTag(int key) { 44244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams return tags.get(key); 44344ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams } 44444ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams 445de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 44644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams public void setTag(int key, Object value) { 44744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams tags.put(key, value); 44844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams } 4495411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 45065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 4514241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard public void requestLayout() { 4524241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard didRequestLayout = true; 4534241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard } 4544241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard 4554241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard public boolean didRequestLayout() { 4564241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard return didRequestLayout; 4574241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard } 4584241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard 4594241c0d59435626c1858d15e5e3612674a666ec0Lowell Kirsh & Ryan Richard @Implementation 46065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public final boolean requestFocus() { 46165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams return requestFocus(View.FOCUS_DOWN); 46265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 46365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 46465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 46565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public final boolean requestFocus(int direction) { 46665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams setViewFocus(true); 46765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams return true; 46865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 46965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 4705411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setViewFocus(boolean hasFocus) { 4719729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin this.isFocused = hasFocus; 4725411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams if (onFocusChangeListener != null) { 4735411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams onFocusChangeListener.onFocusChange(realView, hasFocus); 4745411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 4755411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 4765411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 477de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 4787cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard public int getNextFocusDownId() { 4797cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard return nextFocusDownId; 4807cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard } 4817cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard 4827cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard @Implementation 4837cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard public void setNextFocusDownId(int nextFocusDownId) { 4847cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard this.nextFocusDownId = nextFocusDownId; 4857cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard } 4867cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard 4877cd4fd403867d4e7e6ee944a07ad6fb6c537f3ecRyan Richard @Implementation 48865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public boolean isFocused() { 4899729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin return isFocused; 49065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 49165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 49265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 4935411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public boolean hasFocus() { 4949729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin return isFocused; 4955411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 4965411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 497de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 49865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public void clearFocus() { 49965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams setViewFocus(false); 50065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 50165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 50265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 5035411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setOnFocusChangeListener(View.OnFocusChangeListener listener) { 5045411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams onFocusChangeListener = listener; 5055411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 506f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 5070a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor @Implementation 5082b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur public View.OnFocusChangeListener getOnFocusChangeListener() { 5090a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor return onFocusChangeListener; 5100a780446a9b9384ec3e1ffa2d47c132dbaa8e63cRobert Taylor } 5111c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard 512de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 5131c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard public void invalidate() { 5141c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard wasInvalidated = true; 5151c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard } 516924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard 517de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 5181e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu public boolean onTouchEvent(MotionEvent event) { 519840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu lastTouchEvent = event; 520840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu return false; 5211e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu } 5221e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu 5231e17997177f9683996d07a7c88cbc9a938116e73Rick Kawala & Wei Wu @Implementation 524924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public void setOnTouchListener(View.OnTouchListener onTouchListener) { 525924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard this.onTouchListener = onTouchListener; 526924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 527924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard 528de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 529924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public boolean dispatchTouchEvent(MotionEvent event) { 5307bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala if (onTouchListener != null && onTouchListener.onTouch(realView, event)) { 5317bffa835922296fdd6ad995c8b28a735739cb839Andrew Dai & Rick Kawala return true; 532924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 533840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu return realView.onTouchEvent(event); 534840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu } 535840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu 536840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu public MotionEvent getLastTouchEvent() { 537840b7de2b17a13dc045a278cd8f2a05c2d6ef609Rick Kawala & Wei Wu return lastTouchEvent; 538924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 5392ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin 540445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin @Implementation 5412b03c587c2f87875d4e70e77df53c7ea912414bcAaron VonderHaar & Amrit Thakur public boolean dispatchKeyEvent(KeyEvent event) { 542445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin if (onKeyListener != null) { 543445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin return onKeyListener.onKey(realView, event.getKeyCode(), event); 544445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin } 545445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin return false; 546445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin } 547445ec52f595fdb5eeb9111056651c79e46e29941Aaron VonderHaar & Phil Goodwin 548ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 549da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string. 55040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * <p/> 551da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Robolectric extension. 552ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 5532ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin public String innerText() { 5542ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin return ""; 5552ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin } 55686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 557ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 558ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Dumps the status of this {@code View} to {@code System.out} 559ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 56086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams public void dump() { 56186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dump(System.out, 0); 56286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 56386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 564ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 565ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Dumps the status of this {@code View} to {@code System.out} at the given indentation level 566ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 56786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams public void dump(PrintStream out, int indent) { 56886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpFirstPart(out, indent); 56986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.println("/>"); 57086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 57186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 57286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams protected void dumpFirstPart(PrintStream out, int indent) { 57386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpIndent(out, indent); 57486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 57586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.print("<" + realView.getClass().getSimpleName()); 57686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams if (id > 0) { 57786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\""); 57886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 57986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 58086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 58186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams protected void dumpIndent(PrintStream out, int indent) { 58286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams for (int i = 0; i < indent; i++) out.print(" "); 58386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 5844d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 585ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 586ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return left side of the view 587ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 588bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 5894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getLeft() { 5904d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return left; 5914d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 5924d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 593ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 594ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return top coordinate of the view 595ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 596bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 5974d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getTop() { 5984d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return top; 5994d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6004d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 601ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 602ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return right side of the view 603ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 604bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getRight() { 6064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return right; 6074d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6084d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 609ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 610ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return bottom coordinate of the view 611ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 612bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getBottom() { 6144d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return bottom; 6154d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6164d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 617ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 618ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return whether the view is clickable 619ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 620bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 6214d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public boolean isClickable() { 6224d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return clickable; 6234d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6244d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 625ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 626de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 627ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 628ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return whether or not {@link #invalidate()} has been called 629ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6304d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public boolean wasInvalidated() { 6314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return wasInvalidated; 6324d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6334d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 634ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 635ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Clears the wasInvalidated flag 636ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6374d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void clearWasInvalidated() { 6384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin wasInvalidated = false; 6394d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 641ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 642de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 643ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setLeft(int left) { 6454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.left = left; 6464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 648ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 649de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 650ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setTop(int top) { 6524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.top = top; 6534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 655ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 656de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 657ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setRight(int right) { 6594d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.right = right; 6604d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 662ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 663de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 664ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6654d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setBottom(int bottom) { 6664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.bottom = bottom; 6674d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6684d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 669ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 670de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 671ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6724d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingLeft(int paddingLeft) { 6734d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingLeft = paddingLeft; 6744d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6754d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 676ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 677de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 678ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6794d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingTop(int paddingTop) { 6804d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingTop = paddingTop; 6814d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6824d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 683ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 684de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 685ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6864d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingRight(int paddingRight) { 6874d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingRight = paddingRight; 6884d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 690ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 691de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 692ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 6934d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingBottom(int paddingBottom) { 6944d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingBottom = paddingBottom; 6954d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 6964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 697ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 698de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 699ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 7004d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setFocused(boolean focused) { 7014d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin isFocused = focused; 7024d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 7038de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz 7048de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz /** 7058de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * Non-Android accessor. 7068de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * 7078de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or 7088de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * any ancestor is not {@code View.VISIBLE} 7098de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz */ 7108de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz public boolean derivedIsVisible() { 7118de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz View parent = realView; 7128de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz while (parent != null) { 7138de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz if (parent.getVisibility() != View.VISIBLE) { 7148de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz return false; 7158de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 7168de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz parent = (View) parent.getParent(); 7178de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 7188de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz return true; 7198de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 720c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz 721c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz /** 722c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app. 723c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * 724c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible. 725c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz */ 726c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz public boolean checkedPerformClick() { 727c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz if (!derivedIsVisible()) { 728c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz throw new RuntimeException("View is not visible and cannot be clicked"); 729c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 730c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz if (!realView.isEnabled()) { 731c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz throw new RuntimeException("View is not enabled and cannot be clicked"); 732c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 733c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz 734c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz return realView.performClick(); 735c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 7365101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 73706dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz public void applyFocus() { 73806dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz if (noParentHasFocus(realView)) { 73906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz Boolean focusRequested = attributeSet.getAttributeBooleanValue("android", "focus", false); 74006dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz if (focusRequested || realView.isFocusableInTouchMode()) { 74106dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz realView.requestFocus(); 74206dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz } 74306dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz } 7445101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 7455101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 7465189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz private void applyIdAttribute() { 7475189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz Integer id = attributeSet.getAttributeResourceValue("android", "id", 0); 7485189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz if (getId() == 0) { 7495189dc7b67bf8426200b68a998442ba821a27222Phil Goodwin & Tyler Schultz setId(id); 7502bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz } 7512bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz } 752d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 753b53a662c0c9502e86039aa5d0c3fb7fb3f22e6bbChris Van Vranken private void applyTagAttribute() { 754d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz Object tag = attributeSet.getAttributeValue("android", "tag"); 755d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz if (tag != null) { 756d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz setTag(tag); 757d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 758d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 7592bc51e5a1e4d54158f7ff81af442d306fcd9a449Phil Goodwin & Tyler Schultz 7606be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz private void applyVisibilityAttribute() { 7616be1495845e002cf1888bf1fe6b2ef1f43a0198dPhil Goodwin & Tyler Schultz String visibility = attributeSet.getAttributeValue("android", "visibility"); 7625101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz if (visibility != null) { 7635101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz if (visibility.equals("gone")) { 7645101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz setVisibility(View.GONE); 7655101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } else if (visibility.equals("invisible")) { 7665101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz setVisibility(View.INVISIBLE); 7675101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 7685101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 7695101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 7705101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 77149e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz private void applyEnabledAttribute() { 77249e04b12550327c269ed8b826c71b1affe503336Phil Goodwin & Tyler Schultz setEnabled(attributeSet.getAttributeBooleanValue("android", "enabled", true)); 7735101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 77419d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz 7754cee28dd02fadbaec9b236f04ff15057fd866077Phil Goodwin & Tyler Schultz private void applyBackgroundAttribute() { 77640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams String source = attributeSet.getAttributeValue("android", "background"); 77740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams if (source != null) { 77840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams if (source.startsWith("@drawable/")) { 77940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams setBackgroundResource(attributeSet.getAttributeResourceValue("android", "background", 0)); 78040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams } 78140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams } 7826d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse } 7836d2ed84f8604e5022dd0576567bf3a0bd0e22403Macarse 7846c887826366610c9e44c21a9fec6020219226283Gautier Hayoun private void applyOnClickAttribute() { 7856c887826366610c9e44c21a9fec6020219226283Gautier Hayoun final String handlerName = attributeSet.getAttributeValue("android", 786d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz "onClick"); 7876c887826366610c9e44c21a9fec6020219226283Gautier Hayoun if (handlerName == null) { 7886c887826366610c9e44c21a9fec6020219226283Gautier Hayoun return; 7896c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 7906c887826366610c9e44c21a9fec6020219226283Gautier Hayoun 7916c887826366610c9e44c21a9fec6020219226283Gautier Hayoun /* good part of following code has been directly copied from original 7926c887826366610c9e44c21a9fec6020219226283Gautier Hayoun * android source */ 7936c887826366610c9e44c21a9fec6020219226283Gautier Hayoun setOnClickListener(new View.OnClickListener() { 7946c887826366610c9e44c21a9fec6020219226283Gautier Hayoun public void onClick(View v) { 7956c887826366610c9e44c21a9fec6020219226283Gautier Hayoun Method mHandler; 7966c887826366610c9e44c21a9fec6020219226283Gautier Hayoun try { 7976c887826366610c9e44c21a9fec6020219226283Gautier Hayoun mHandler = getContext().getClass().getMethod(handlerName, 798d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz View.class); 7996c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } catch (NoSuchMethodException e) { 8006c887826366610c9e44c21a9fec6020219226283Gautier Hayoun int id = getId(); 8016c887826366610c9e44c21a9fec6020219226283Gautier Hayoun String idText = id == View.NO_ID ? "" : " with id '" 8026c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + shadowOf(context).getResourceLoader() 803d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz .getNameForId(id) + "'"; 8046c887826366610c9e44c21a9fec6020219226283Gautier Hayoun throw new IllegalStateException("Could not find a method " + 8056c887826366610c9e44c21a9fec6020219226283Gautier Hayoun handlerName + "(View) in the activity " 8066c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + getContext().getClass() + " for onClick handler" 8076c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + " on view " + realView.getClass() + idText, e); 8086c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8096c887826366610c9e44c21a9fec6020219226283Gautier Hayoun 8106c887826366610c9e44c21a9fec6020219226283Gautier Hayoun try { 8116c887826366610c9e44c21a9fec6020219226283Gautier Hayoun mHandler.invoke(getContext(), realView); 8126c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } catch (IllegalAccessException e) { 8136c887826366610c9e44c21a9fec6020219226283Gautier Hayoun throw new IllegalStateException("Could not execute non " 8146c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + "public method of the activity", e); 8156c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } catch (InvocationTargetException e) { 8166c887826366610c9e44c21a9fec6020219226283Gautier Hayoun throw new IllegalStateException("Could not execute " 8176c887826366610c9e44c21a9fec6020219226283Gautier Hayoun + "method of the activity", e); 8186c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8196c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8206c887826366610c9e44c21a9fec6020219226283Gautier Hayoun }); 8216c887826366610c9e44c21a9fec6020219226283Gautier Hayoun } 8226c887826366610c9e44c21a9fec6020219226283Gautier Hayoun 823cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella private void applyContentDescriptionAttribute() { 824cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella String contentDescription = attributeSet.getAttributeValue("android", "contentDescription"); 825cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella if (contentDescription != null) { 826cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella if (contentDescription.startsWith("@string/")) { 827cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella int resId = attributeSet.getAttributeResourceValue("android", "contentDescription", 0); 828cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella contentDescription = context.getResources().getString(resId); 829cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 830cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella setContentDescription(contentDescription); 831cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 832cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella } 833cd6a55965421b7a1bcea900058a98c464c157319Matteo Panella 83406dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz private boolean noParentHasFocus(View view) { 83519d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz while (view != null) { 83606dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz if (view.hasFocus()) return false; 83719d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz view = (View) view.getParent(); 83819d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz } 83906dfb798c2833348ed593991759fb581f7c7b20dPhil Goodwin & Tyler Schultz return true; 84019d90b633936ae8dacbc7b09a8e44b2ad90be497Phil Goodwin & Tyler Schultz } 841d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 8420ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi /** 8430ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi * Non-android accessor. Returns touch listener, if set. 844d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * 8450ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi * @return 8460ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi */ 8470ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi public View.OnTouchListener getOnTouchListener() { 848d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return onTouchListener; 8490ed02e080ff9f471642662ba0678db1d42221343Michael Portuesi } 850d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 85146309a9995c013790cbc40ae207f10973350b14fMichael Portuesi /** 85246309a9995c013790cbc40ae207f10973350b14fMichael Portuesi * Non-android accessor. Returns click listener, if set. 853d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz * 85446309a9995c013790cbc40ae207f10973350b14fMichael Portuesi * @return 85546309a9995c013790cbc40ae207f10973350b14fMichael Portuesi */ 85646309a9995c013790cbc40ae207f10973350b14fMichael Portuesi public View.OnClickListener getOnClickListener() { 857d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return onClickListener; 85846309a9995c013790cbc40ae207f10973350b14fMichael Portuesi } 859ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams 860b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams @Implementation 861ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams public void setDrawingCacheEnabled(boolean drawingCacheEnabled) { 862ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams this.drawingCacheEnabled = drawingCacheEnabled; 863ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams } 864ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams 865b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams @Implementation 866ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams public boolean isDrawingCacheEnabled() { 867ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams return drawingCacheEnabled; 868ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams } 869ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams 870b76cabccd9f35b57fe486faf7d5763952c07c1a9Josh Lauer & Christian Williams @Implementation 871ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams public Bitmap getDrawingCache() { 872ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams return Robolectric.newInstanceOf(Bitmap.class); 873ae26238c7d01caef84ceddd8ffb42c32306918d6Josh Lauer & Christian Williams } 87440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 87534f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey @Implementation 87634f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey public void post(Runnable action) { 87734f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey Robolectric.getUiThreadScheduler().post(action); 87834f3d7cb9f41c9480d7b7b4e03be6df4c1c8021fRich Humphrey } 879b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams 880b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams @Implementation 881b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams public void postDelayed(Runnable action, long delayMills) { 882b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams Robolectric.getUiThreadScheduler().postDelayed(action, delayMills); 883b020d9a038a8d1274806e1cccbc015f559396f05Christian Williams } 884289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz 885289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz @Implementation 886289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz public void postInvalidateDelayed(long delayMilliseconds) { 887289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz Robolectric.getUiThreadScheduler().postDelayed(new Runnable() { 888289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz @Override 889289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz public void run() { 890289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz realView.invalidate(); 891289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz } 892289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz }, delayMilliseconds); 893289938e9153024d2146a7130de98fdc16efd5aa2Tim Labeeuw & Tyler Schultz } 894d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 8953f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 8963f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public Animation getAnimation() { 897d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz return animation; 8983f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 899d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 9003f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 9013f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public void setAnimation(Animation anim) { 902d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz animation = anim; 9033f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 904d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 9053f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 9063f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public void startAnimation(Animation anim) { 907d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz setAnimation(anim); 908d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz animation.start(); 9093f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 910d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz 9113f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi @Implementation 9123f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi public void clearAnimation() { 913d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz if (animation != null) { 914d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz animation.cancel(); 915f65a5dab0313865a75b98d7ef53f2773167224e0Jessica Chen animation = null; 916d723e05df54299b88daa5b626c460d733d9bcf6dLenny Turetsky & Tyler Schultz } 9173f78da998ce73c1c7c25798a7e7e4f19287eff23Michael Portuesi } 918a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz 919a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz @Implementation 920a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz public void scrollTo(int x, int y) { 921a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz this.scrollToCoordinates = new Point(x, y); 922a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz } 923f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 924cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard @Implementation 925cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard public int getScrollX() { 926cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard return scrollToCoordinates != null ? scrollToCoordinates.x : 0; 927cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard } 928cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard 929cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard @Implementation 930cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard public int getScrollY() { 931cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard return scrollToCoordinates != null ? scrollToCoordinates.y : 0; 932cf952a3ce2fd0bf7d9236ea7b909924e6091cf09Phil Goodwin & Ryan Richard } 933f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard 934f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard @Implementation 935f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard public ViewTreeObserver getViewTreeObserver() { 936f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard if (viewTreeObserver == null) { 937f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard viewTreeObserver = newInstanceOf(ViewTreeObserver.class); 938f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard } 939f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard return viewTreeObserver; 940f5850efa8da26855e1e60ab7497b78da56b1a5baAmrit Thakur & Ryan Richard } 9410c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala 9420c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala @Implementation 9430c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala public void onAnimationEnd() { 9440c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala } 9450c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala 9460c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala /* 9470c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala * Non-Android accessor. 9480c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala */ 9490c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala public void finishedAnimation() { 95023da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala try { 95123da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala Method onAnimationEnd = realView.getClass().getDeclaredMethod("onAnimationEnd", new Class[0]); 95223da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala onAnimationEnd.setAccessible(true); 95323da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala onAnimationEnd.invoke(realView); 95423da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala } catch (Exception e) { 95523da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala throw new RuntimeException(e); 95623da7c64347b46b8fccf281c5d9894299cfb7622Amrit Thakur & Rick Kawala } 9570c428886526fc277d3b47d08b1fce79c89920a92Amrit Thakur & Rick Kawala } 9586eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz} 959