1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.widget;
18
19import android.test.suitebuilder.annotation.Suppress;
20import com.google.android.collect.Lists;
21
22import junit.framework.Assert;
23
24import android.content.Context;
25import android.content.res.Resources;
26import android.test.InstrumentationTestCase;
27import android.test.mock.MockContext;
28import android.test.suitebuilder.annotation.MediumTest;
29import android.view.View;
30import android.view.ViewGroup;
31import android.widget.ArrayAdapter;
32import android.widget.ListView;
33
34import java.util.List;
35
36@Suppress // Failing.
37public class ListViewTest extends InstrumentationTestCase {
38
39    /**
40     * If a view in a ListView requests a layout it should be remeasured.
41     */
42    @MediumTest
43    public void testRequestLayout() throws Exception {
44        MockContext context = new MockContext2();
45        ListView listView = new ListView(context);
46        List<String> items = Lists.newArrayList("hello");
47        Adapter<String> adapter = new Adapter<String>(context, 0, items);
48        listView.setAdapter(adapter);
49
50        int measureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
51
52        adapter.notifyDataSetChanged();
53        listView.measure(measureSpec, measureSpec);
54        listView.layout(0, 0, 100, 100);
55
56        MockView childView = (MockView) listView.getChildAt(0);
57
58        childView.requestLayout();
59        childView.onMeasureCalled = false;
60        listView.measure(measureSpec, measureSpec);
61        listView.layout(0, 0, 100, 100);
62        Assert.assertTrue(childView.onMeasureCalled);
63    }
64
65    /**
66     * The list view should handle the disappearance of the only selected item, even when that item
67     * was selected before its disappearance.
68     *
69     */
70    @MediumTest
71    public void testNoSelectableItems() throws Exception {
72        MockContext context = new MockContext2();
73        ListView listView = new ListView(context);
74        // We use a header as the unselectable item to remain after the selectable one is removed.
75        listView.addHeaderView(new View(context), null, false);
76        List<String> items = Lists.newArrayList("hello");
77        Adapter<String> adapter = new Adapter<String>(context, 0, items);
78        listView.setAdapter(adapter);
79
80        listView.setSelection(1);
81
82        int measureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);
83
84        adapter.notifyDataSetChanged();
85        listView.measure(measureSpec, measureSpec);
86        listView.layout(0, 0, 100, 100);
87
88        items.remove(0);
89
90        adapter.notifyDataSetChanged();
91        listView.measure(measureSpec, measureSpec);
92        listView.layout(0, 0, 100, 100);
93    }
94
95    private class MockContext2 extends MockContext {
96
97        @Override
98        public Resources getResources() {
99            return getInstrumentation().getTargetContext().getResources();
100        }
101
102        @Override
103        public Resources.Theme getTheme() {
104            return getInstrumentation().getTargetContext().getTheme();
105        }
106
107        @Override
108        public Object getSystemService(String name) {
109            if (Context.LAYOUT_INFLATER_SERVICE.equals(name)) {
110                return getInstrumentation().getTargetContext().getSystemService(name);
111            }
112            return super.getSystemService(name);
113        }
114    }
115
116    private class MockView extends View {
117
118        public boolean onMeasureCalled = false;
119
120        public MockView(Context context) {
121            super(context);
122        }
123
124        @Override
125        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
126            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
127            onMeasureCalled = true;
128        }
129    }
130
131    private class Adapter<T> extends ArrayAdapter<T> {
132
133        public Adapter(Context context, int resource, List<T> objects) {
134            super(context, resource, objects);
135        }
136
137        @Override
138        public View getView(int position, View convertView, ViewGroup parent) {
139            return new MockView(getContext());
140        }
141    }
142
143}
144