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