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