133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
27309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz
316e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylorimport java.util.ArrayList;
416e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylorimport java.util.List;
516e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor
6f5937727530ccf761ae1f35cb3888cb25cd3be2fRobert Taylorimport android.util.SparseBooleanArray;
77309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultzimport android.view.View;
87309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultzimport android.widget.ListAdapter;
97309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultzimport android.widget.ListView;
1016e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor
1122c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
1222c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
1322c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
147309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz
157309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz@SuppressWarnings({"UnusedDeclaration"})
160b378afcde0200166e546c46a7642015accfce49Christian Williams & Ian Fisher@Implements(ListView.class)
17a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultzpublic class ShadowListView extends ShadowAbsListView {
184a7b7902404d0c3743f96c043e3cc6b9069cf438Christian Williams    @RealObject private ListView realListView;
194a7b7902404d0c3743f96c043e3cc6b9069cf438Christian Williams
20cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    private boolean itemsCanFocus;
21cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    private List<View> headerViews = new ArrayList<View>();
22cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    private List<View> footerViews = new ArrayList<View>();
237309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz
24f5937727530ccf761ae1f35cb3888cb25cd3be2fRobert Taylor    private int choiceMode;
25f5937727530ccf761ae1f35cb3888cb25cd3be2fRobert Taylor    private SparseBooleanArray checkedItemPositions = new SparseBooleanArray();
267e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
27de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
2831a8e1464480b177154e2c83618f3f9c57bcddb1adriancowham    @Override
2931a8e1464480b177154e2c83618f3f9c57bcddb1adriancowham    public View findViewById(int id) {
307598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        View child = super.findViewById(id);
317598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        if (child == null) {
327598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz            child = findView(headerViews, id);
337598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
347598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz            if (child == null) {
357598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz                child = findView(footerViews, id);
367598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz            }
377598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        }
387598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        return child;
397598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
407598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
417598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    private View findView(List<View> views, int viewId) {
427598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        View child = null;
437598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        for (View v : views) {
447598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz            child = v.findViewById(viewId);
457598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz            if (child != null) {
467598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz                break;
477598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz            }
487598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        }
497598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        return child;
507598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
517598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
527598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
53de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
547309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz    public void setItemsCanFocus(boolean itemsCanFocus) {
557309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz        this.itemsCanFocus = itemsCanFocus;
567309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz    }
577309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz
58de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
592ff94a9e4df5b0d3eb21bda70793b27d9f1f353cChristian Williams & Phil Goodwin    @Override
607309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz    public boolean performItemClick(View view, int position, long id) {
617e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        boolean handled = false;
6216e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor        if (choiceMode != ListView.CHOICE_MODE_NONE) {
6316e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor            handled = true;
6416e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor
6516e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor            if (choiceMode == ListView.CHOICE_MODE_MULTIPLE) {
6616e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor                boolean newValue = !checkedItemPositions.get(position, false);
6716e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor                checkedItemPositions.put(position, newValue);
6816e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor            } else {
6916e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor                boolean newValue = !checkedItemPositions.get(position, false);
7016e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor                if (newValue) {
7116e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor                	checkedItemPositions.clear();
7216e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor                	checkedItemPositions.put(position, true);
737e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel                }
7416e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor            }
757309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz        }
7616e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor
7716e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor        handled |= super.performItemClick(view, position, id);
7816e661f8a0c2bebf1f74a84e2ade81b989d8b0bdRobert Taylor        return handled;
797309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz    }
807309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz
81de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
827309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz    public void setAdapter(ListAdapter adapter) {
837309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz        super.setAdapter(adapter);
847e59ae318f1fe609017d9f92f0ae2d55cf881d29Ian Fisher & Ryan Richard    }
85199dae2d9eaca58662258231e3981cf526b13ab2Christian Williams & Tyler Schultz
860c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    @Implementation
870c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    public void addHeaderView(View headerView) {
88a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        addHeaderView(headerView, null, true);
890c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    }
900c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz
910c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    @Implementation
927598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    public void addHeaderView(View headerView, Object data, boolean isSelectable) {
932417bedde7b01be937b0b2064b2d6f53691f1f6badriancowham        ensureAdapterNotSet("header");
942417bedde7b01be937b0b2064b2d6f53691f1f6badriancowham        headerViews.add(headerView);
95a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        realListView.addView(headerView);
962417bedde7b01be937b0b2064b2d6f53691f1f6badriancowham    }
977598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
982417bedde7b01be937b0b2064b2d6f53691f1f6badriancowham    @Implementation
992417bedde7b01be937b0b2064b2d6f53691f1f6badriancowham    public int getHeaderViewsCount() {
1007598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        return headerViews.size();
1012417bedde7b01be937b0b2064b2d6f53691f1f6badriancowham    }
1027598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
1032417bedde7b01be937b0b2064b2d6f53691f1f6badriancowham    @Implementation
1049aaa69e03f00080db5340018a2edfacae4500345Tyler Schultz & Wei Wu    public int getFooterViewsCount() {
1059aaa69e03f00080db5340018a2edfacae4500345Tyler Schultz & Wei Wu        return footerViews.size();
1069aaa69e03f00080db5340018a2edfacae4500345Tyler Schultz & Wei Wu    }
1079aaa69e03f00080db5340018a2edfacae4500345Tyler Schultz & Wei Wu
1089aaa69e03f00080db5340018a2edfacae4500345Tyler Schultz & Wei Wu    @Implementation
1090c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    public void addFooterView(View footerView, Object data, boolean isSelectable) {
1100c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz        ensureAdapterNotSet("footer");
1110c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz        footerViews.add(footerView);
112a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        realListView.addView(footerView);
1130c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    }
1140c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz
1150c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    @Implementation
1160c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    public void addFooterView(View footerView) {
1170c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz        addFooterView(footerView, null, false);
1180c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    }
1190c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz
120a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
121a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void removeAllViews() {
122a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        throw new UnsupportedOperationException();
123a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
124a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
125a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
126a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void removeView(View view) {
127a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        throw new UnsupportedOperationException();
128a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
129a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
130a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Implementation
131a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    public void removeViewAt(int index) {
132a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        throw new UnsupportedOperationException();
133a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
1340c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz
1350c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    private void ensureAdapterNotSet(String view) {
136800e363213bad2720ac3952bd84ec8a9b0142354Adam Cohen-Rose        if (getAdapter() != null) {
1370c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz            throw new IllegalStateException("Cannot add " + view + " view to list -- setAdapter has already been called");
1380c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz        }
1390c14e1b65bf7128a3f11cb6dee74429719c5beecTyler Schultz    }
140cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin
141cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    public boolean isItemsCanFocus() {
142cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin        return itemsCanFocus;
143cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    }
144cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin
145cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    public List<View> getHeaderViews() {
146cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin        return headerViews;
147cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    }
148cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin
149cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    public void setHeaderViews(List<View> headerViews) {
150cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin        this.headerViews = headerViews;
151cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    }
152cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin
153cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    public List<View> getFooterViews() {
154cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin        return footerViews;
155cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    }
156cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin
157cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    public void setFooterViews(List<View> footerViews) {
158cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin        this.footerViews = footerViews;
159cc54a84f7c9f42028529e545e50b043e83f53c1cChristian Williams & Phil Goodwin    }
160a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
161a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    @Override
162a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    protected void addViews() {
163a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        for (View headerView : headerViews) {
164a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz            addView(headerView);
165a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        }
166a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
167a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        super.addViews();
168a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz
169a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        for (View footerView : footerViews) {
170a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz            addView(footerView);
171a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz        }
172a739b57a6b1a99f14d586f609f0f62f48b8e2284Ian Fisher & Tyler Schultz    }
1737e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
1747e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    @Implementation
1757e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    public int getChoiceMode() {
1767e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        return choiceMode;
1777e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    }
1787e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
1797e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    @Implementation
1807e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    public void setChoiceMode(int choiceMode) {
1817e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        this.choiceMode = choiceMode;
1827e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    }
1837e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
1847e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    @Implementation
1857e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    public void setItemChecked(int position, boolean value) {
1867e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        if (choiceMode == ListView.CHOICE_MODE_SINGLE) {
1877e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel            checkedItemPositions.clear();
1887e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel            checkedItemPositions.put(position, value);
1897e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        } else if (choiceMode == ListView.CHOICE_MODE_MULTIPLE) {
1907e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel            checkedItemPositions.put(position, value);
1917e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        }
1927e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    }
1937e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
1947e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    @Implementation
1957e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    public int getCheckedItemPosition() {
1967e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        if (choiceMode != ListView.CHOICE_MODE_SINGLE || checkedItemPositions.size() != 1)
1977e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel            return ListView.INVALID_POSITION;
1987e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
1997e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        return checkedItemPositions.keyAt(0);
2007e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    }
2017e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
2027e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    @Implementation
2037e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    public SparseBooleanArray getCheckedItemPositions() {
2047e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        if (choiceMode == ListView.CHOICE_MODE_NONE)
2057e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel            return null;
2067e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel
2077e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel        return checkedItemPositions;
2087e4c2b80178ee77f5c3ec4083c1310833621d7f2Jan Berkel    }
2097309919cca1b8a46e21634c1988ea38f62f97c09Christian Williams & Tyler Schultz}
210