ShadowViewGroup.java revision b551a870eb9fb9acae0f8a6632fefea12a5f8598
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>();
22b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    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    }
40b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
41593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    @Implementation
42593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    @Override
43593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    public View findViewWithTag(Object obj) {
44b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        if (obj.equals(realView.getTag())) {
45593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken            return realView;
46593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken        }
47b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
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) {
60b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        ((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    }
72b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
7363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
74adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    public void addView(View child, int width, int height) {
75b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        ((ViewGroup) realView).addView(child, -1);
76adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    }
77adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams
78adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    @Implementation
79adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    public void addView(View child, ViewGroup.LayoutParams params) {
80b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        ((ViewGroup) realView).addView(child, -1);
81adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    }
82adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams
83adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    @Implementation
84adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    public void addView(View child, int index, ViewGroup.LayoutParams params) {
85b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        ((ViewGroup) realView).addView(child, index);
86adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    }
87adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams
88adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    @Implementation
890e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams    public int indexOfChild(View child) {
900e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams        int count = getChildCount();
910e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams        for (int i = 0; i < count; i++) {
920e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams            if (children.get(i) == child) {
930e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams                return i;
940e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams            }
950e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams        }
960e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams        return -1;
970e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams    }
980e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams
990e1c92ca35030e2c173b141c41341636bbb7a258Christian Williams    @Implementation
10063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public int getChildCount() {
10163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        return children.size();
10263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
10363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
10463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
10563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public View getChildAt(int index) {
10663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        return children.get(index);
10763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
10863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
10963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
11063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public void removeAllViews() {
11163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        for (View child : children) {
112a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams            shadowOf(child).parent = null;
11363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        }
11463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        children.clear();
11563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
11663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
11763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
11863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public void removeViewAt(int position) {
119a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams        shadowOf(children.remove(position)).parent = null;
12063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
12163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
122b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    @Override
123b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    @Implementation
1249729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    public boolean hasFocus() {
1259729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        if (super.hasFocus()) return true;
1269729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1279729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        for (View child : children) {
1289729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            if (child.hasFocus()) return true;
1299729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        }
1309729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1319729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return false;
1329729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    }
1339729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1349729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    @Implementation
1359729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    @Override
1369729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    public void clearFocus() {
1379729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        if (hasFocus()) {
1389729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            super.clearFocus();
1399729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1409729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            for (View child : children) {
1419729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin                child.clearFocus();
1429729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            }
1439729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        }
1449729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    }
1459729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
146ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
147da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Returns a string representation of this {@code ViewGroup} by concatenating all of the strings contained in all
148da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * of the descendants of this {@code ViewGroup}.
14940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * <p/>
150da9cd404c0db2ebcef4ecfb50836de00b56622f1Christian Williams     * Robolectric extension.
151ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
1522ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    @Override
1532ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
1542ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        String innerText = "";
155a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        String delimiter = "";
156a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz
1572ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        for (int i = 0; i < getChildCount(); i++) {
1582ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin            View child = getChildAt(i);
159a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams            String childText = shadowOf(child).innerText();
160a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz            if (childText.length() > 0) {
161a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz                innerText += delimiter;
162a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz                delimiter = " ";
1632ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin            }
1642ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin            innerText += childText;
1652ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        }
1662ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return innerText;
1672ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
16886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
169ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin    /**
170ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     * Non-Android method that dumps the state of this {@code ViewGroup} to {@code System.out}
171ac58b328bde3c77d1d9687408e547faad3b77e2bPhil Goodwin     */
172b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    @Override
173b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    public void dump(PrintStream out, int indent) {
17486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
17586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (children.size() > 0) {
17686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.println(">");
17786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
17886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            for (View child : children) {
17986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                shadowOf(child).dump(out, indent + 2);
18086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            }
18186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
18286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            dumpIndent(out, indent);
18386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.println("</" + realView.getClass().getSimpleName() + ">");
18486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        } else {
18586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.println("/>");
18686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
18786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
188b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
1892c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    @Implementation
190b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    public void setLayoutAnimationListener(AnimationListener listener) {
191b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        animListener = listener;
1922c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    }
193b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
1942c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    @Implementation
1952c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    public AnimationListener getLayoutAnimationListener() {
196b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        return animListener;
1972c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    }
198aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin
199aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin    @Implementation
200aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
201aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin        disallowInterceptTouchEvent = disallowIntercept;
202aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin    }
203aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin
204aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin    public boolean getDisallowInterceptTouchEvent() {
205aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin        return disallowInterceptTouchEvent;
206aafe6e8069d9c7fc9c9b2a8793deddf3fe71127fAaron VonderHaar & Phil Goodwin    }
2076eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
208