1package org.robolectric.shadows;
2
3import static org.robolectric.Shadows.shadowOf;
4import static org.robolectric.shadow.api.Shadow.directlyOn;
5
6import android.view.View;
7import android.widget.Adapter;
8import android.widget.AdapterView;
9import android.widget.FrameLayout;
10import org.robolectric.annotation.Implementation;
11import org.robolectric.annotation.Implements;
12import org.robolectric.annotation.RealObject;
13import org.robolectric.util.ReflectionHelpers.ClassParameter;
14
15@SuppressWarnings({"UnusedDeclaration"})
16@Implements(AdapterView.class)
17public class ShadowAdapterView<T extends Adapter> extends ShadowViewGroup {
18  private static int ignoreRowsAtEndOfList = 0;
19
20  @RealObject
21  private AdapterView<T> realAdapterView;
22
23  private AdapterView.OnItemSelectedListener itemSelectedListener;
24
25  @Implementation
26  public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener itemSelectedListener) {
27    this.itemSelectedListener = itemSelectedListener;
28    directlyOn(realAdapterView, AdapterView.class, "setOnItemSelectedListener", ClassParameter.from(AdapterView.OnItemSelectedListener.class, itemSelectedListener));
29  }
30
31  public AdapterView.OnItemSelectedListener getItemSelectedListener() {
32    return itemSelectedListener;
33  }
34
35  public boolean performItemClick(int position) {
36    return realAdapterView.performItemClick(realAdapterView.getChildAt(position),
37        position, realAdapterView.getItemIdAtPosition(position));
38  }
39
40  public int findIndexOfItemContainingText(String targetText) {
41    for (int i = 0; i < realAdapterView.getCount(); i++) {
42      View childView = realAdapterView.getAdapter().getView(i, null, new FrameLayout(realAdapterView.getContext()));
43      String innerText = shadowOf(childView).innerText();
44      if (innerText.contains(targetText)) {
45        return i;
46      }
47    }
48    return -1;
49  }
50
51  public View findItemContainingText(String targetText) {
52    int itemIndex = findIndexOfItemContainingText(targetText);
53    if (itemIndex == -1) {
54      return null;
55    }
56    return realAdapterView.getChildAt(itemIndex);
57  }
58
59  public void clickFirstItemContainingText(String targetText) {
60    int itemIndex = findIndexOfItemContainingText(targetText);
61    if (itemIndex == -1) {
62      throw new IllegalArgumentException("No item found containing text \"" + targetText + "\"");
63    }
64    performItemClick(itemIndex);
65  }
66
67  public void populateItems() {
68    realView.measure(0, 0);
69    realView.layout(0, 0, 100, 10000);
70  }
71
72  public void selectItemWithText(String s) {
73    int itemIndex = findIndexOfItemContainingText(s);
74    realAdapterView.setSelection(itemIndex);
75  }
76}
77