1package com.xtremelabs.robolectric.shadows;
2
3import android.app.ListActivity;
4import android.view.View;
5import android.view.ViewGroup;
6import android.widget.AdapterView;
7import android.widget.ListAdapter;
8import android.widget.ListView;
9import com.xtremelabs.robolectric.internal.Implementation;
10import com.xtremelabs.robolectric.internal.Implements;
11
12import java.lang.reflect.InvocationTargetException;
13import java.lang.reflect.Method;
14
15/**
16 * Shadow of {@code ListActivity} that supports the retrieval of {@code ListViews}
17 */
18
19@SuppressWarnings({"UnusedDeclaration"})
20@Implements(ListActivity.class)
21public class ShadowListActivity extends ShadowActivity {
22    private ListView listView;
23    private ListAdapter listAdapter;
24
25    @Implementation
26    public ListView getListView() {
27        if (listView == null) {
28            if ((listView = findListView(getContentView())) == null) {
29                throw new RuntimeException("No ListView found under content view");
30            }
31        }
32        return listView;
33    }
34
35    public void setListView(ListView view) {
36    	listView = view;
37    }
38
39    @Implementation
40    public void setListAdapter(ListAdapter listAdapter) {
41        this.listAdapter = listAdapter;
42        ListView lv = findListView(getContentView());
43        if (lv != null) {
44            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
45                @Override
46                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
47                    try {
48                        Method handler = realActivity.getClass().getDeclaredMethod("onListItemClick",
49                                ListView.class, View.class, int.class, long.class);
50                        handler.setAccessible(true);
51                        handler.invoke(realActivity, parent, view, position, id);
52                    } catch (NoSuchMethodException ignored) {
53                    } catch (InvocationTargetException ignored) {
54                    } catch (IllegalAccessException ignored) {
55                    }
56                }
57            });
58            lv.setAdapter(listAdapter);
59        }
60    }
61
62    @Implementation
63    public ListAdapter getListAdapter() {
64        return listAdapter;
65    }
66
67    private ListView findListView(View parent) {
68        if (parent instanceof ListView) {
69            return (ListView) parent;
70        } else if (parent instanceof ViewGroup) {
71            ViewGroup viewGroup = (ViewGroup) parent;
72            for (int i = 0; i < viewGroup.getChildCount(); i++) {
73                ListView listView = findListView(viewGroup.getChildAt(i));
74                if (listView != null) {
75                    return listView;
76                }
77            }
78        }
79        return null;
80    }
81}
82