ShadowView.java revision 5101cf6874bcc7ceef92354819497ea9cea04c22
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; 5684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williamsimport android.util.AttributeSet; 6924f851cb0ec279b6974744ce623f25bdc657551Ryan Richardimport android.view.MotionEvent; 76eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.view.View; 8d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultzimport android.view.ViewGroup; 95411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williamsimport android.view.ViewParent; 105101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultzimport com.xtremelabs.robolectric.res.ViewLoader; 11a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.Implementation; 12a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.Implements; 134a7b7902404d0c3743f96c043e3cc6b9069cf438Christian Williamsimport com.xtremelabs.robolectric.util.RealObject; 146eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 1586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream; 1651fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.HashMap; 1751fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultzimport java.util.Map; 18c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 1986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 2086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 21ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/** 22ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Shadow implementation of {@code View} that simulates the behavior of this class. Supports listeners, focusability 23ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * (but not focus order), resource loading, visibility, tags, and tracks the size and shape of the view. 24ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 25198b49fe81283e340891361045a8bdeb01f35e04Tyler Schultz@SuppressWarnings({"UnusedDeclaration"}) 260b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(View.class) 27afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowView { 28a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz @Deprecated 29f33e228a6f3eed1c97488df2ca30da315324aa1eHarry Ugol public static final int UNINITIALIZED_ATTRIBUTE = -1000; 30f33e228a6f3eed1c97488df2ca30da315324aa1eHarry Ugol 314a7b7902404d0c3743f96c043e3cc6b9069cf438Christian Williams @RealObject protected View realView; 326eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 336eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz private int id; 34afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams ShadowView parent; 356eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz private Context context; 364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean selected; 37810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore private View.OnClickListener onClickListener; 38c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz private Object tag; 39775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard private boolean enabled = true; 404d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int visibility = View.VISIBLE; 414d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int left; 424d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int top; 434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int right; 444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin int bottom; 454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingLeft; 464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingTop; 474d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingRight; 484d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int paddingBottom; 494d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(0, 0); 5044ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams private Map<Integer, Object> tags = new HashMap<Integer, Object>(); 514d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean clickable; 52254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin protected boolean focusable; 539729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin boolean focusableInTouchMode; 544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private int backgroundResourceId = -1; 555411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams protected View.OnKeyListener onKeyListener; 564d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean isFocused; 575411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams private View.OnFocusChangeListener onFocusChangeListener; 584d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private boolean wasInvalidated; 59924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard private View.OnTouchListener onTouchListener; 606eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 616eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void __constructor__(Context context) { 626eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz this.context = context; 636eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 646eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 65684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams public void __constructor__(Context context, AttributeSet attrs) { 66684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams __constructor__(context); 67684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams } 68684ccc2fc5a1c79aa45af22b95c37f7c509a00c1Christian Williams 69de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 706eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void setId(int id) { 716eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz this.id = id; 726eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 736eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 74de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 75cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz public void setClickable(boolean clickable) { 76cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz this.clickable = clickable; 77cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz } 78cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz 79ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 80ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Also sets focusable in touch mode to false if {@code focusable} is false, which is the Android behavior. 81ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 82ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param focusable the new status of the {@code View}'s focusability 83ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 84de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 85cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz public void setFocusable(boolean focusable) { 86cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz this.focusable = focusable; 87adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams if (!focusable) { 88415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard setFocusableInTouchMode(false); 89415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 90415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 91415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard 92415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard @Implementation 93415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard public final boolean isFocusableInTouchMode() { 94415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard return focusableInTouchMode; 95415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 96415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard 97ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 98ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Also sets focusable to true if {@code focusableInTouchMode} is true, which is the Android behavior. 99ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 100ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param focusableInTouchMode the new status of the {@code View}'s touch mode focusability 101ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 102415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard @Implementation 103415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard public void setFocusableInTouchMode(boolean focusableInTouchMode) { 104415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard this.focusableInTouchMode = focusableInTouchMode; 105adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams if (focusableInTouchMode) { 106415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard setFocusable(true); 107415f3fdab8162ece7185268f71b577f7faa0ba38Phil Goodwin & Ryan Richard } 108cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz } 109cc4bd26d94f6eba2a0dc3dae0065c8df2296a95eIan Fisher & Tyler Schultz 110de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 111254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin public boolean isFocusable() { 112254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin return focusable; 113254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin } 114254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin 115254044cea0df7e6aef3ce33c98a5003a6eba0512Christian Williams & Phil Goodwin @Implementation 1166eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public int getId() { 1176eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return id; 1186eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1196eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 120ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 121ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Simulates the inflating of the requested resource. 122ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 1238de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @param context the context from which to obtain a layout inflater 124ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param resource the ID of the resource to inflate 1258de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @param root the {@code ViewGroup} to add the inflated {@code View} to 126ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return the inflated View 127ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 128de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 129a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz public static View inflate(Context context, int resource, ViewGroup root) { 130afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams View view = ShadowLayoutInflater.from(context).inflate(resource, root); 131a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz if (root != null) { 132a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz root.addView(view); 133a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz } 134a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz return view; 135a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz } 136a66c979cb64d406c1646a0909bd9a0b6b6ccd802Ian Fisher & Tyler Schultz 137ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 138ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Finds this {@code View} if it's ID is passed in, returns {@code null} otherwise 139ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 140ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @param id the id of the {@code View} to find 141ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return the {@code View}, if found, {@code null} otherwise 142ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 143de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1446eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public View findViewById(int id) { 145e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz if (id == this.id) { 146e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz return realView; 147e617325bfe357b73644421064cae37e0a033eed7Christian Williams & Tyler Schulz } 1486eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 1496eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return null; 1506eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1516eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 152de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1530c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol public View getRootView() { 154afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams ShadowView root = this; 155adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams while (root.parent != null) { 1560c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol root = root.parent; 1570c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol } 1580c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol return root.realView; 1590c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol } 1600c40acb66824054e469b3afbc3609ba39bbdac1cChristian Williams & Harry Ugol 161de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 162d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz public ViewGroup.LayoutParams getLayoutParams() { 163d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz return layoutParams; 164d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz } 165d4f5daf12f1d112cf06b8b8914437ed6c0b3a677Ryan Richard & Tyler Schultz 166de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 167b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard public void setLayoutParams(ViewGroup.LayoutParams params) { 168b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard layoutParams = params; 169b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard } 170b0336c5991d124b6b157b9dc976ade56d00cba3eChristian Williams & Ryan Richard 171de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1725411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public final ViewParent getParent() { 173a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz return parent == null ? null : (ViewParent) parent.realView; 1745411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 1755411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 176de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1776eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public final Context getContext() { 1786eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return context; 1796eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1806eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 181de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1826eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public Resources getResources() { 1836eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return context.getResources(); 1846eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1856eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 186de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1874d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin public void setBackgroundResource(int backgroundResourceId) { 1884d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin this.backgroundResourceId = backgroundResourceId; 1894d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin } 1904d4b979c716f731be80852e7c04fdbe9862be3f0Ian Fisher & Phil Goodwin 191de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1926eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public int getVisibility() { 1936eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz return visibility; 1946eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 1956eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 196de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 1976eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz public void setVisibility(int visibility) { 1986eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz this.visibility = visibility; 1996eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz } 200eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz 201de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 202eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz public void setSelected(boolean selected) { 203eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz this.selected = selected; 204eaadc83b187e31670dec8837d0851c0646522987Joe Moore & Tyler Schultz } 205810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore 206de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 207acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz public boolean isSelected() { 208acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz return this.selected; 209acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz } 210acb084f15b3b6e2496136ee8449b5d64ccb54939Ryan Richard & Tyler Schultz 211de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 212775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard public boolean isEnabled() { 213775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard return this.enabled; 214775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard } 215adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams 216de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 217775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard public void setEnabled(boolean enabled) { 218775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard this.enabled = enabled; 219775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard } 220775ccf7ae53d9b4c77d3adf2514f26747cebd89cIan Fisher & Ryan Richard 221de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 222810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore public void setOnClickListener(View.OnClickListener onClickListener) { 223810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore this.onClickListener = onClickListener; 224810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 225810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore 226de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 227810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore public boolean performClick() { 228810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore if (onClickListener != null) { 229810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore onClickListener.onClick(realView); 230810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore return true; 231810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } else { 232810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore return false; 233810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 234810ca4e6f0dc6d69504b3e03ef61155f10083fbeChristian Williams & Joe Moore } 235c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 236de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2375411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setOnKeyListener(View.OnKeyListener onKeyListener) { 2385411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams this.onKeyListener = onKeyListener; 2395411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 2405411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 241de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 242c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz public Object getTag() { 243c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz return this.tag; 244c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz } 245c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz 246de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 247c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz public void setTag(Object tag) { 248c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz this.tag = tag; 249c6f46aeb970c9111e2e79b806451f63b4853950bIan Fisher & Tyler Schultz } 25018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 251de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 25218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public final int getHeight() { 253a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard return bottom - top; 25418141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 25518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 256de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 25718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public final int getWidth() { 258a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard return right - left; 25918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 26018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 261de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 262924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public final int getMeasuredWidth() { 263a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard return getWidth(); 264a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard } 265a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard 266de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 267a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard public final void layout(int l, int t, int r, int b) { 268a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard left = l; 269a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard top = t; 270a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard right = r; 271a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard bottom = b; 272a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard 273a1ef7deaed03310ed6ec51621125f69bb16ac8fcChristian Williams & Ryan Richard// todo: realView.onLayout(); 274924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 275adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams 276de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 27718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public void setPadding(int left, int top, int right, int bottom) { 27818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingLeft = left; 27918141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingTop = top; 28018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingRight = right; 28118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard paddingBottom = bottom; 28218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 28318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 284de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 28518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingTop() { 28618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingTop; 28718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 28818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 289de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 29018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingLeft() { 29118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingLeft; 29218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 29318141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 294de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 29518141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingRight() { 29618141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingRight; 29718141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 29818141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard 299de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 30018141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard public int getPaddingBottom() { 30118141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard return paddingBottom; 30218141e608f2e60c866a9b7729909e9ce3b9eb588Ian Fisher & Ryan Richard } 30351fe0b279e9f5568683d9ef67921f922a51c05d5Christian Williams & Tyler Schultz 304de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 30544ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams public Object getTag(int key) { 30644ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams return tags.get(key); 30744ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams } 30844ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams 309de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 31044ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams public void setTag(int key, Object value) { 31144ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams tags.put(key, value); 31244ade170c5bc611222ed25d5b1f8e7745104057dChristian Williams } 3135411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 31465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 31565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public final boolean requestFocus() { 31665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams return requestFocus(View.FOCUS_DOWN); 31765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 31865e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 31965e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 32065e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public final boolean requestFocus(int direction) { 32165e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams setViewFocus(true); 32265e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams return true; 32365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 32465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 3255411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setViewFocus(boolean hasFocus) { 3269729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin this.isFocused = hasFocus; 3275411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams if (onFocusChangeListener != null) { 3285411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams onFocusChangeListener.onFocusChange(realView, hasFocus); 3295411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 3305411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 3315411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 332de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 33365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public boolean isFocused() { 3349729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin return isFocused; 33565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 33665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 33765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 3385411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public boolean hasFocus() { 3399729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin return isFocused; 3405411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 3415411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams 342de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 34365e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams public void clearFocus() { 34465e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams setViewFocus(false); 34565e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams } 34665e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams 34765e90b1b9829e83cac5cdcf8836b9706aa67c072Christian Williams @Implementation 3485411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams public void setOnFocusChangeListener(View.OnFocusChangeListener listener) { 3495411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams onFocusChangeListener = listener; 3505411bf7cde998b5c2e70b69fe3d7227b6783ab7cChristian Williams } 3511c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard 352de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 3531c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard public void invalidate() { 3541c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard wasInvalidated = true; 3551c46c94a5affe7beeb8c6bfcb5ec0ed509e5fdbdRyan Richard } 356924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard 357de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 358924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public void setOnTouchListener(View.OnTouchListener onTouchListener) { 359924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard this.onTouchListener = onTouchListener; 360924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 361924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard 362de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 363924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard public boolean dispatchTouchEvent(MotionEvent event) { 364924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard if (onTouchListener != null) { 365924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard return onTouchListener.onTouch(realView, event); 366924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 367924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard return false; 368924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard } 3692ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin 370ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 371da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Returns a string representation of this {@code View}. Unless overridden, it will be an empty string. 372ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 373da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Robolectric extension. 374ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 3752ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin public String innerText() { 3762ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin return ""; 3772ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin } 37886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 379ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 380ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Dumps the status of this {@code View} to {@code System.out} 381ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 38286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams public void dump() { 38386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dump(System.out, 0); 38486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 38586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 386ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 387ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Dumps the status of this {@code View} to {@code System.out} at the given indentation level 388ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 38986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams public void dump(PrintStream out, int indent) { 39086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpFirstPart(out, indent); 39186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.println("/>"); 39286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 39386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 39486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams protected void dumpFirstPart(PrintStream out, int indent) { 39586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpIndent(out, indent); 39686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 39786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.print("<" + realView.getClass().getSimpleName()); 39886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams if (id > 0) { 39986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.print(" id=\"" + shadowOf(context).getResourceLoader().getNameForId(id) + "\""); 40086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 40186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 40286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 40386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams protected void dumpIndent(PrintStream out, int indent) { 40486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams for (int i = 0; i < indent; i++) out.print(" "); 40586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 4064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 407ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 408ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return left side of the view 409ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 410bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 4114d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getLeft() { 4124d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return left; 4134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4144d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 415ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 416ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return top coordinate of the view 417ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 418bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 4194d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getTop() { 4204d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return top; 4214d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4224d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 423ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 424ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return right side of the view 425ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 426bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 4274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getRight() { 4284d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return right; 4294d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4304d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 431ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 432ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return bottom coordinate of the view 433ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 434bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 4354d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getBottom() { 4364d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return bottom; 4374d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4384d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 439ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 440ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return whether the view is clickable 441ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 442bbf6ae3d37d2303d8463094096ef0bb9906fd658Christian Williams @Implementation 4434d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public boolean isClickable() { 4444d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return clickable; 4454d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4464d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 447ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 448de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 449ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 450ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return the resource ID of this views background 451ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 4524d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public int getBackgroundResourceId() { 4534d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return backgroundResourceId; 4544d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4554d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 456ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 457de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 458ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * 459ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * @return whether or not {@link #invalidate()} has been called 460ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 4614d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public boolean wasInvalidated() { 4624d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return wasInvalidated; 4634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 465ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 466ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Clears the wasInvalidated flag 467ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 4684d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void clearWasInvalidated() { 4694d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin wasInvalidated = false; 4704d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4714d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 472ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 473de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 474ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 4754d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setLeft(int left) { 4764d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.left = left; 4774d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4784d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 479ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 480de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 481ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 4824d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setTop(int top) { 4834d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.top = top; 4844d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4854d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 486ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 487de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 488ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 4894d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setRight(int right) { 4904d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.right = right; 4914d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4924d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 493ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 494de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 495ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 4964d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setBottom(int bottom) { 4974d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.bottom = bottom; 4984d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 4994d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 500ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 501de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 502ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 5034d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingLeft(int paddingLeft) { 5044d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingLeft = paddingLeft; 5054d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 5064d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 507ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 508de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 509ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 5104d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingTop(int paddingTop) { 5114d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingTop = paddingTop; 5124d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 5134d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 514ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 515de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 516ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 5174d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingRight(int paddingRight) { 5184d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingRight = paddingRight; 5194d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 5204d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 521ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 522de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 523ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 5244d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setPaddingBottom(int paddingBottom) { 5254d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin this.paddingBottom = paddingBottom; 5264d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 5274d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 528ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 529de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 530ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 5314d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public void setFocused(boolean focused) { 5324d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin isFocused = focused; 5334d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 5348de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz 5358de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz /** 5368de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * Non-Android accessor. 5378de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * 5388de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * @return true if this object and all of its ancestors are {@code View.VISIBLE}, returns false if this or 5398de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz * any ancestor is not {@code View.VISIBLE} 5408de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz */ 5418de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz public boolean derivedIsVisible() { 5428de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz View parent = realView; 5438de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz while (parent != null) { 5448de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz if (parent.getVisibility() != View.VISIBLE) { 5458de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz return false; 5468de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 5478de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz parent = (View) parent.getParent(); 5488de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 5498de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz return true; 5508de53d85207b90879fd242796941d526277b1245Phil Goodwin & Tyler Schultz } 551c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz 552c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz /** 553c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * Utility method for clicking on views exposing testing scenarios that are not possible when using the actual app. 554c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * 555c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz * @throws RuntimeException if the view is disabled or if the view or any of its parents are not visible. 556c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz */ 557c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz public boolean checkedPerformClick() { 558c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz if (!derivedIsVisible()) { 559c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz throw new RuntimeException("View is not visible and cannot be clicked"); 560c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 561c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz if (!realView.isEnabled()) { 562c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz throw new RuntimeException("View is not enabled and cannot be clicked"); 563c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 564c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz 565c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz return realView.performClick(); 566c140c89564a145280adf65188f25303e850d3a9cPhil Goodwin & Tyler Schultz } 5675101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 5685101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz public void applyViewNode(ViewLoader.ViewNode viewNode) { 5695101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz applyVisibilityAttribute(viewNode); 5705101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz applyEnabledAttribute(viewNode); 5715101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 5725101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 5735101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz private void applyVisibilityAttribute(ViewLoader.ViewNode viewNode) { 5745101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz String visibility = viewNode.getAttributeValue("android:visibility"); 5755101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz if (visibility != null) { 5765101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz if (visibility.equals("gone")) { 5775101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz setVisibility(View.GONE); 5785101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } else if (visibility.equals("invisible")) { 5795101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz setVisibility(View.INVISIBLE); 5805101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 5815101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 5825101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 5835101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz 5845101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz private void applyEnabledAttribute(ViewLoader.ViewNode viewNode) { 5855101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz Boolean enabled = viewNode.getAttributeAsBool("android:enabled"); 5865101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz if (enabled != null) { 5875101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz setEnabled(enabled); 5885101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 5895101cf6874bcc7ceef92354819497ea9cea04c22Phil Goodwin & Tyler Schultz } 5906eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz} 591