ShadowViewGroup.java revision aafe6e8069d9c7fc9c9b2a8793deddf3fe71127f
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows; 26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz 32c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowhamimport android.view.View; 42c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowhamimport android.view.ViewGroup; 52c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowhamimport android.view.animation.Animation.AnimationListener; 62c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowhamimport com.xtremelabs.robolectric.internal.Implementation; 72c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowhamimport com.xtremelabs.robolectric.internal.Implements; 8a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams 9aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwinimport java.io.PrintStream; 10aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwinimport java.util.ArrayList; 11aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwinimport java.util.List; 12aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin 13aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwinimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 14aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin 15ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin/** 16ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Shadow for {@code ViewGroup} that simulates its implementation 17ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 180b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@SuppressWarnings({"UnusedDeclaration"}) 190b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(ViewGroup.class) 20afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowViewGroup extends ShadowView { 2163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams private List<View> children = new ArrayList<View>(); 222c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham private AnimationListener animListener; 23aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin private boolean disallowInterceptTouchEvent = false; 2463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams 2563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams @Implementation 2663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams @Override 2763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams public View findViewById(int id) { 2863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams if (id == getId()) { 2963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams return realView; 3063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 3163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams 3263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams for (View child : children) { 3363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams View found = child.findViewById(id); 3463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams if (found != null) { 3563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams return found; 3663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 3763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 3863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams return null; 3963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 40593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken 41593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken @Implementation 42593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken @Override 43593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken public View findViewWithTag(Object obj) { 44593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken if (obj.equals(this.getTag())) { 45593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken return realView; 46593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 47593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken 48593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken for (View child : children) { 49593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken View found = child.findViewWithTag(obj); 50593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken if (found != null) { 51593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken return found; 52593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 53593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 54593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken 55593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken return null; 56593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 5763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams 5863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams @Implementation 5963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams public void addView(View child) { 60adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams ((ViewGroup)realView).addView(child, -1); 61adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams } 62adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams 63adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams @Implementation 64adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams public void addView(View child, int index) { 65adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams if (index == -1) { 66adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams children.add(child); 67adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams } else { 68adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams children.add(index, child); 69adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams } 70a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams shadowOf(child).parent = this; 7163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 7263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams @Implementation 73adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams public void addView(View child, int width, int height) { 74adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams ((ViewGroup)realView).addView(child, -1); 75adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams } 76adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams 77adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams @Implementation 78adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams public void addView(View child, ViewGroup.LayoutParams params) { 79adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams ((ViewGroup)realView).addView(child, -1); 80adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams } 81adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams 82adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams @Implementation 83adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams public void addView(View child, int index, ViewGroup.LayoutParams params) { 84adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams ((ViewGroup)realView).addView(child, index); 85adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams } 86adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams 87adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams @Implementation 880e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams public int indexOfChild(View child) { 890e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams int count = getChildCount(); 900e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams for (int i = 0; i < count; i++) { 910e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams if (children.get(i) == child) { 920e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams return i; 930e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams } 940e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams } 950e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams return -1; 960e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams } 970e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams 980e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams @Implementation 9963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams public int getChildCount() { 10063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams return children.size(); 10163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 10263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams 10363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams @Implementation 10463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams public View getChildAt(int index) { 10563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams return children.get(index); 10663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 10763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams 10863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams @Implementation 10963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams public void removeAllViews() { 11063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams for (View child : children) { 111a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams shadowOf(child).parent = null; 11263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 11363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams children.clear(); 11463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 11563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams 11663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams @Implementation 11763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams public void removeViewAt(int position) { 118a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams shadowOf(children.remove(position)).parent = null; 11963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams } 12063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams 1219729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin @Override @Implementation 1229729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin public boolean hasFocus() { 1239729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin if (super.hasFocus()) return true; 1249729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1259729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin for (View child : children) { 1269729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin if (child.hasFocus()) return true; 1279729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin } 1289729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1299729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin return false; 1309729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin } 1319729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1329729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin @Implementation 1339729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin @Override 1349729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin public void clearFocus() { 1359729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin if (hasFocus()) { 1369729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin super.clearFocus(); 1379729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1389729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin for (View child : children) { 1399729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child.clearFocus(); 1409729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin } 1419729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin } 1429729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin } 1439729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 144ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 145da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Returns a string representation of this {@code ViewGroup} by concatenating all of the strings contained in all 146da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * of the descendants of this {@code ViewGroup}. 14740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * <p/> 148da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams * Robolectric extension. 149ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 1502ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin @Override 1512ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin public String innerText() { 1522ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin String innerText = ""; 153a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz String delimiter = ""; 154a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 1552ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin for (int i = 0; i < getChildCount(); i++) { 1562ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin View child = getChildAt(i); 157a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams String childText = shadowOf(child).innerText(); 158a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz if (childText.length() > 0) { 159a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz innerText += delimiter; 160a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz delimiter = " "; 1612ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin } 1622ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin innerText += childText; 1632ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin } 1642ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin return innerText; 1652ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin } 16686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 167ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin /** 168ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin * Non-Android method that dumps the state of this {@code ViewGroup} to {@code System.out} 169ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin */ 17086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams @Override public void dump(PrintStream out, int indent) { 17186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpFirstPart(out, indent); 17286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams if (children.size() > 0) { 17386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.println(">"); 17486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 17586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams for (View child : children) { 17686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams shadowOf(child).dump(out, indent + 2); 17786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 17886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 17986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams dumpIndent(out, indent); 18086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.println("</" + realView.getClass().getSimpleName() + ">"); 18186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } else { 18286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams out.println("/>"); 18386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 18486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 1852c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham 1862c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham @Implementation 1872c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham public void setLayoutAnimationListener( AnimationListener listener ) { 1882c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham animListener = listener; 1892c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham } 1902c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham 1912c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham @Implementation 1922c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham public AnimationListener getLayoutAnimationListener() { 1932c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham return animListener; 1942c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham } 195aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin 196aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin @Implementation 197aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { 198aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin disallowInterceptTouchEvent = disallowIntercept; 199aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin } 200aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin 201aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin public boolean getDisallowInterceptTouchEvent() { 202aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin return disallowInterceptTouchEvent; 203aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin } 2046eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz} 205