blob: e61f821baf22a4b06e29e3b6c1961e5b1d3b2f9d [file] [log] [blame]
package com.xtremelabs.robolectric.shadows;
import static com.xtremelabs.robolectric.Robolectric.shadowOf;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
@SuppressWarnings({"UnusedDeclaration"})
@Implements(ListView.class)
public class ShadowListView extends ShadowAdapterView {
@RealObject private ListView realListView;
private boolean itemsCanFocus;
private List<View> headerViews = new ArrayList<View>();
private List<View> footerViews = new ArrayList<View>();
@Implementation
@Override
public View findViewById(int id) {
View child = super.findViewById( id );
if( child == null ) {
child = findView( headerViews, id );
if( child == null ) {
child = findView( footerViews, id );
}
}
return child;
}
private View findView( List<View> views, int viewId ) {
View child = null;
for( View v : views ) {
child = v.findViewById( viewId );
if( child != null ) {
break;
}
}
return child;
}
@Implementation
public void setItemsCanFocus(boolean itemsCanFocus) {
this.itemsCanFocus = itemsCanFocus;
}
@Implementation
@Override
public boolean performItemClick(View view, int position, long id) {
AdapterView.OnItemClickListener onItemClickListener = getOnItemClickListener();
if (onItemClickListener != null) {
onItemClickListener.onItemClick(realListView, view, position, id);
return true;
}
return false;
}
@Implementation
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
}
@Implementation
public void addHeaderView(View headerView) {
ensureAdapterNotSet("header");
headerViews.add(headerView);
}
@Implementation
public void addHeaderView(View headerView, Object data, boolean isSelectable ) {
ensureAdapterNotSet("header");
headerViews.add(headerView);
}
@Implementation
public int getHeaderViewsCount() {
return headerViews.size();
}
@Implementation
public void addFooterView(View footerView, Object data, boolean isSelectable) {
ensureAdapterNotSet("footer");
footerViews.add(footerView);
}
@Implementation
public void addFooterView(View footerView) {
addFooterView(footerView, null, false);
}
public boolean performItemClick(int position) {
return realListView.performItemClick(realListView.getChildAt(position), position, realListView.getItemIdAtPosition(position));
}
public int findIndexOfItemContainingText(String targetText) {
for (int i = 0; i < realListView.getChildCount(); i++) {
View childView = realListView.getChildAt(i);
String innerText = shadowOf(childView).innerText();
if (innerText.contains(targetText)) {
return i;
}
}
return -1;
}
public View findItemContainingText(String targetText) {
int itemIndex = findIndexOfItemContainingText(targetText);
if (itemIndex == -1) {
return null;
}
return realListView.getChildAt(itemIndex);
}
public void clickFirstItemContainingText(String targetText) {
int itemIndex = findIndexOfItemContainingText(targetText);
if (itemIndex == -1) {
throw new IllegalArgumentException("No item found containing text \"" + targetText + "\"");
}
performItemClick(itemIndex);
}
private void ensureAdapterNotSet(String view) {
if (adapter != null) {
throw new IllegalStateException("Cannot add " + view + " view to list -- setAdapter has already been called");
}
}
public boolean isItemsCanFocus() {
return itemsCanFocus;
}
public List<View> getHeaderViews() {
return headerViews;
}
public void setHeaderViews(List<View> headerViews) {
this.headerViews = headerViews;
}
public List<View> getFooterViews() {
return footerViews;
}
public void setFooterViews(List<View> footerViews) {
this.footerViews = footerViews;
}
}