ShadowViewGroup.java revision 86e98619f5f1b5f6b1fd5742ba911d7ebc83c2dd
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
26eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
32ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwinimport android.view.View;
46eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulzimport android.view.ViewGroup;
5a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.Implementation;
6a2043a8fff01f3e2d9a5e30dd1cf5fb6a5342f4dTyler Schultzimport com.xtremelabs.robolectric.util.Implements;
76eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz
886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream;
963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williamsimport java.util.ArrayList;
1063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williamsimport java.util.List;
1163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
12a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
13a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams
140b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@SuppressWarnings({"UnusedDeclaration"})
150b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(ViewGroup.class)
16afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowViewGroup extends ShadowView {
1763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    private List<View> children = new ArrayList<View>();
1863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
1963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
2063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Override
2163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public View findViewById(int id) {
2263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        if (id == getId()) {
2363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams            return realView;
2463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        }
2563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
2663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        for (View child : children) {
2763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams            View found = child.findViewById(id);
2863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams            if (found != null) {
2963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams                return found;
3063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams            }
3163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        }
3263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        return null;
3363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
3463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
3563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
3663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public void addView(View child) {
3763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        children.add(child);
38a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams        shadowOf(child).parent = this;
3963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
4063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
4163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
4263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public int getChildCount() {
4363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        return children.size();
4463bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
4563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
4663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
4763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public View getChildAt(int index) {
4863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        return children.get(index);
4963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
5063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
5163bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
5263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public void removeAllViews() {
5363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        for (View child : children) {
54a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams            shadowOf(child).parent = null;
5563bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        }
5663bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams        children.clear();
5763bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
5863bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
5963bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    @Implementation
6063bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    public void removeViewAt(int position) {
61a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams        shadowOf(children.remove(position)).parent = null;
6263bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams    }
6363bd7c4e869525014879db3428e17eb4d2728cf9Christian Williams
649729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    @Override @Implementation
659729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    public boolean hasFocus() {
669729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        if (super.hasFocus()) return true;
679729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
689729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        for (View child : children) {
699729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            if (child.hasFocus()) return true;
709729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        }
719729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
729729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        return false;
739729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    }
749729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
759729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    @Implementation
769729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    @Override
779729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    public void clearFocus() {
789729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        if (hasFocus()) {
799729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            super.clearFocus();
809729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
819729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            for (View child : children) {
829729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin                child.clearFocus();
839729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin            }
849729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        }
859729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    }
869729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
872ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    @Override
882ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    public String innerText() {
892ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        String innerText = "";
90a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        String delimiter = "";
91a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz
922ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        for (int i = 0; i < getChildCount(); i++) {
932ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin            View child = getChildAt(i);
94a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams            String childText = shadowOf(child).innerText();
95a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz            if (childText.length() > 0) {
96a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz                innerText += delimiter;
97a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz                delimiter = " ";
982ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin            }
992ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin            innerText += childText;
1002ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        }
1012ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin        return innerText;
1022ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    }
10386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
10486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    @Override public void dump(PrintStream out, int indent) {
10586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        dumpFirstPart(out, indent);
10686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        if (children.size() > 0) {
10786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.println(">");
10886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
10986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            for (View child : children) {
11086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                shadowOf(child).dump(out, indent + 2);
11186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            }
11286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
11386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            dumpIndent(out, indent);
11486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.println("</" + realView.getClass().getSimpleName() + ">");
11586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        } else {
11686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams            out.println("/>");
11786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        }
11886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
1196eedf728138e6f79fa898ff3e31bf61c9b1151dChristian Williams & Tyler Schulz}
120