1b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount/*
2b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * Copyright (C) 2015 The Android Open Source Project
3b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount *
4b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * Licensed under the Apache License, Version 2.0 (the "License");
5b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * you may not use this file except in compliance with the License.
6b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * You may obtain a copy of the License at
7b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount *
8b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount *      http://www.apache.org/licenses/LICENSE-2.0
9b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount *
10b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * Unless required by applicable law or agreed to in writing, software
11b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * distributed under the License is distributed on an "AS IS" BASIS,
12b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * See the License for the specific language governing permissions and
14b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount * limitations under the License.
15b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount */
16b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountpackage android.databinding.testapp;
17b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
18b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.app.Instrumentation;
19b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.content.Context;
20b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.databinding.testapp.databinding.TwoWayBinding;
21b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.databinding.testapp.vo.TwoWayBindingObject;
22b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.os.SystemClock;
23b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.text.Spannable;
24b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.text.SpannableString;
25b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.text.style.BackgroundColorSpan;
26b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.view.MotionEvent;
27b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.view.View;
28b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.view.ViewConfiguration;
29b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.view.ViewGroup;
30b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.widget.EditText;
31b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport android.widget.TabHost.TabSpec;
32b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
3311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mountimport java.util.Calendar;
34b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport java.util.concurrent.CountDownLatch;
35b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountimport java.util.concurrent.TimeUnit;
36b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
37b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mountpublic class TwoWayBindingAdapterTest extends BaseDataBinderTest<TwoWayBinding> {
38b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
39b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    TwoWayBindingObject mBindingObject;
40b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
41b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public TwoWayBindingAdapterTest() {
42b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        super(TwoWayBinding.class);
43b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
44b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
45b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    @Override
46b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    protected void setUp() throws Exception {
47b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        super.setUp();
48b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        initBinder(new Runnable() {
49b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
50b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
51b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                Context context = getBinder().getRoot().getContext();
52b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBindingObject = new TwoWayBindingObject(context);
53b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                getBinder().setObj(mBindingObject);
54b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                getBinder().executePendingBindings();
55b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
56b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
57b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
58b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
59b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testListViewSelectedItemPosition() throws Throwable {
60b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.listView);
61b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
62b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
63b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
64b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(0, mBindingObject.selectedItemPosition.get());
65b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(0, mBinder.listView.getSelectedItemPosition());
66b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.listView.setSelection(1);
67b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
68b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
69b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        long timeout = SystemClock.uptimeMillis() + 500;
70b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.selectedItemPosition.get() == 0 &&
71b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                SystemClock.uptimeMillis() < timeout) {
72b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
73b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
74b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
75b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
76b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
77b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBinder.listView.getSelectedItemPosition());
78b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBindingObject.selectedItemPosition.get());
79b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
80b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
81b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
82b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
83b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    private void clickView(final View view, float offsetX) throws Throwable {
84b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final int[] xy = new int[2];
85b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final int[] viewSize = new int[2];
86b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        do {
87b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            runTestOnUiThread(new Runnable() {
88b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                @Override
89b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                public void run() {
90b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    view.getLocationOnScreen(xy);
91b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    viewSize[0] = view.getWidth();
92b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    viewSize[1] = view.getHeight();
93b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                }
94b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            });
95b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        } while (xy[0] < 0 || xy[1] < 0);
96b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
97b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final float x = xy[0] + offsetX;
98b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final float y = xy[1] + (viewSize[1] / 2f);
99b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
100b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        Instrumentation inst = getInstrumentation();
101b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
102b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        long downTime = SystemClock.uptimeMillis();
103b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        long eventTime = SystemClock.uptimeMillis();
104b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
105b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        MotionEvent event = MotionEvent.obtain(downTime, eventTime,
106b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                MotionEvent.ACTION_DOWN, x, y, 0);
107b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        inst.sendPointerSync(event);
108b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        inst.waitForIdleSync();
109b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
110b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        eventTime = SystemClock.uptimeMillis();
111b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final int touchSlop = ViewConfiguration.get(view.getContext()).getScaledTouchSlop();
112b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE,
113b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                x + (touchSlop / 2.0f), y + (touchSlop / 2.0f), 0);
114b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        inst.sendPointerSync(event);
115b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        inst.waitForIdleSync();
116b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
117b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        eventTime = SystemClock.uptimeMillis();
118b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, x, y, 0);
119b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        inst.sendPointerSync(event);
120b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        inst.waitForIdleSync();
121b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
122b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
123b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    private void clickChild(View view, float offsetX) throws Throwable {
124b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        View childView = view;
125b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (childView != null) {
126b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            childView.callOnClick();
127b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            if (childView instanceof ViewGroup) {
128b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                final ViewGroup viewGroup = (ViewGroup) childView;
129b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                if (viewGroup.getChildCount() > 0) {
130b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    childView = viewGroup.getChildAt(0);
131b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                } else {
132b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    childView = null;
133b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                }
134b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            } else {
135b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                clickView(childView, offsetX);
136b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                childView = null;
137b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
138b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
139b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
140b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
141b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testCalendarViewDate() throws Throwable {
142b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.calendarView);
143b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
144b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
145b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
14611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                assertTrue(mBindingObject.date.get() != 0);
14711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                assertDatesMatch(mBindingObject.date.get(), mBinder.calendarView.getDate());
148b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
149b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
150b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long[] date = new long[2];
151b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        float offsetX = 0;
152b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        long timeout = SystemClock.uptimeMillis() + 1500;
153b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        do {
154b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            // Just randomly poke at the CalendarView to set the date
155b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            clickChild(mBinder.calendarView, offsetX);
156b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            offsetX += 48;
157b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            runTestOnUiThread(new Runnable() {
158b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                @Override
159b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                public void run() {
160b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    date[0] = mBinder.calendarView.getDate();
161b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    if (date[1] == 0) {
162b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                        date[1] = date[0];
163b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    }
164b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                }
165b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            });
166b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        } while (date[0] == date[1] && SystemClock.uptimeMillis() < timeout);
167b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
168b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        timeout = SystemClock.uptimeMillis() + 100;
169b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.date.get() == 0 && SystemClock.uptimeMillis() < timeout) {
170b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
171b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
172b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
17311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertDatesMatch(date[0], mBindingObject.date.get());
17411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount    }
17511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount
17611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount    public void assertDatesMatch(long expectedTimeMillis, long testTimeMillis) {
17711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        Calendar expected = Calendar.getInstance();
17811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        expected.setTimeInMillis(expectedTimeMillis);
17911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        Calendar testValue = Calendar.getInstance();
18011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        testValue.setTimeInMillis(testTimeMillis);
18111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(expected.get(Calendar.YEAR), testValue.get(Calendar.YEAR));
18211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(expected.get(Calendar.MONTH), testValue.get(Calendar.MONTH));
18311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(expected.get(Calendar.DAY_OF_MONTH),
18411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                testValue.get(Calendar.DAY_OF_MONTH));
185b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
186b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
187b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testCheckBoxChecked() throws Throwable {
188b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.checkBox);
189b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
190b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
191b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
192b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertFalse(mBindingObject.checked.get());
193b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertFalse(mBinder.checkBox.isChecked());
194b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.checkBox.setChecked(true);
195b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
196b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
197b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
198b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
199b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (!mBindingObject.checked.get() && SystemClock.uptimeMillis() < timeout) {
200b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
201b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
202b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
203b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
204b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
205b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
206b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertTrue(mBinder.checkBox.isChecked());
207b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertTrue(mBindingObject.checked.get());
208b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
209b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
210b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
211b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
212b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    private boolean focusOn(final View view) throws Throwable {
213b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
214b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
215b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
216b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                view.requestFocus();
217b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
218b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
219b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        long timeout = SystemClock.uptimeMillis() + 500;
220b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final boolean[] focused = new boolean[1];
221b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (SystemClock.uptimeMillis() < timeout) {
222b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            runTestOnUiThread(new Runnable() {
223b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                @Override
224b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                public void run() {
225b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    focused[0] = view.isFocused();
226b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                }
227b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            });
228b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            if (focused[0]) {
229b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                return true;
230b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
231b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
232b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        return false;
233b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
234b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
235b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testNumberPickerNumber() throws Throwable {
236b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.textView, mBinder.numberPicker);
237b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertTrue(focusOn(mBinder.textView));
238b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final EditText[] pickerText = new EditText[1];
239b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
240b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
241b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
242b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBindingObject.number.get());
243b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBinder.numberPicker.getValue());
244b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                for (int i = 0; i < mBinder.numberPicker.getChildCount(); i++) {
245b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    View view = mBinder.numberPicker.getChildAt(i);
246b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    if (view instanceof EditText) {
247b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                        pickerText[0] = (EditText) view;
248b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                        break;
249b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    }
250b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                }
251b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
252b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
253b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertNotNull(pickerText[0]);
254b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertTrue(focusOn(pickerText[0]));
255b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
256b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
257b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
258b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                pickerText[0].setText("10");
259b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
260b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
261b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertTrue(focusOn(mBinder.textView));
262b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
263b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 10;
264b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.number.get() == 1 && SystemClock.uptimeMillis() < timeout) {
265b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
266b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
267b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
268b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
269b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
270b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
271b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(10, mBinder.numberPicker.getValue());
272b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(10, mBindingObject.number.get());
273b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
274b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
275b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
276b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
277b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testRatingBarRating() throws Throwable {
278b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.ratingBar);
279b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
280b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
281b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
282b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1f, mBindingObject.rating.get());
283b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1f, mBinder.ratingBar.getRating());
284b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.ratingBar.setRating(2.5f);
285b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
286b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
287b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
288b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
289b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.rating.get() == 1f && SystemClock.uptimeMillis() < timeout) {
290b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
291b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
292b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
293b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
294b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
295b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
296b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2.5f, mBinder.ratingBar.getRating());
297b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2.5f, mBindingObject.rating.get());
298b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
299b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
300b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
301b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
302b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testSeekBarProgress() throws Throwable {
303b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.seekBar);
304b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
305b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
306b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
307b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBindingObject.progress.get());
308b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBinder.seekBar.getProgress());
309b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.seekBar.setProgress(30);
310b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
311b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
312b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
313b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
314b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.progress.get() == 1 && SystemClock.uptimeMillis() < timeout) {
315b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
316b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
317b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
318b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
319b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
320b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
321b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(30, mBinder.seekBar.getProgress());
322b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(30, mBindingObject.progress.get());
323b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
324b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
325b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
326b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
327b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testTabHostCurrentTab() throws Throwable {
328b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.tabhost);
329b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
330b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
331b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
332b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.tabhost.setup();
333b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                TabSpec tab1 = mBinder.tabhost.newTabSpec("Tab1");
334b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                TabSpec tab2 = mBinder.tabhost.newTabSpec("Tab2");
335b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
336b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                tab1.setIndicator("tab1");
337b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                tab1.setContent(R.id.foo);
338b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                tab2.setIndicator("tab2");
339b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                tab2.setContent(R.id.bar);
340b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.tabhost.addTab(tab1);
341b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.tabhost.addTab(tab2);
342b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.tabhost.setCurrentTab(1);
343b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
344b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
345b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
346b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
347b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.currentTab.get() == 0 && SystemClock.uptimeMillis() < timeout) {
348b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
349b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
350b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
351b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
352b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
353b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
354b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBinder.tabhost.getCurrentTab());
355b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBindingObject.currentTab.get());
356b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
357b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
358b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
359b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
360b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testTextViewText() throws Throwable {
361b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.textView);
362b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
363b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
364b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
365b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(null, mBindingObject.text.get());
366b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("", mBinder.textView.getText().toString());
367b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.textView.setText("Hello World");
368b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
369b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
370b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
371b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
372b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.text.get().isEmpty() && SystemClock.uptimeMillis() < timeout) {
373b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
374b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
375b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
376b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
377b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
378b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
379b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBinder.textView.getText().toString());
380b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBindingObject.text.get());
381b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
382b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
383b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
384b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
385b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testDatePicker() throws Throwable {
386b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.datePicker);
387b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
388b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
389b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
390b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1972, mBindingObject.year.get());
391b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(9, mBindingObject.month.get());
392b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(21, mBindingObject.day.get());
393b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1972, mBinder.datePicker.getYear());
394b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(9, mBinder.datePicker.getMonth());
395b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(21, mBinder.datePicker.getDayOfMonth());
396b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.datePicker.updateDate(2003, 4, 17);
397b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
398b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
399b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
400b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
401b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.year.get() == 1972 && SystemClock.uptimeMillis() < timeout) {
402b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
403b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
404b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
405b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
406b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
407b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
408b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2003, mBindingObject.year.get());
409b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(4, mBindingObject.month.get());
410b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(17, mBindingObject.day.get());
411b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
412b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
413b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
414b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
415b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testExpressions1() throws Throwable {
416b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.expressions1);
417b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
418b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
419b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
420b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1972, mBindingObject.year.get());
421b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(9, mBindingObject.month.get());
422b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(21, mBindingObject.day.get());
423b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1972000, mBinder.expressions1.getYear());
424b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBinder.expressions1.getMonth());
425b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(22, mBinder.expressions1.getDayOfMonth());
426b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions1.updateDate(2003000, 3, 18);
427b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
428b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
429b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
430b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
431b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.year.get() == 1972 && SystemClock.uptimeMillis() < timeout) {
432b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
433b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
434b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
435b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
436b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
437b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
438b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2003, mBindingObject.year.get());
439b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(8, mBindingObject.month.get());
440b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(17, mBindingObject.day.get());
441b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
442b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
443b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
444b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
445b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testExpressions2() throws Throwable {
446b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.expressions2);
447b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
448b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
449b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
450b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1972, mBindingObject.year.get());
451b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(9, mBindingObject.month.get());
452b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(21, mBindingObject.day.get());
453b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBinder.expressions2.getYear());
454b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(9, mBinder.expressions2.getMonth());
455b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(21, mBinder.expressions2.getDayOfMonth());
456b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions2.updateDate(2, 4, 17);
457b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
458b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
459b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
460b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
461b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.year.get() == 1972 && SystemClock.uptimeMillis() < timeout) {
462b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
463b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
464b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
465b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
466b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
467b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
468b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2000, mBindingObject.year.get());
469b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(4, mBindingObject.month.get());
470b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(17, mBindingObject.day.get());
471b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
472b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
473b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
474b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
475b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testExpressions3() throws Throwable {
476b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.expressions3);
477b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
478b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
479b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
480b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals((Integer)1, mBindingObject.list.get(1));
481b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals((Integer)2, mBindingObject.map.get("two"));
482b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBindingObject.array.get()[1]);
483b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBinder.expressions3.getYear());
484b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBinder.expressions3.getMonth());
485b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBinder.expressions3.getDayOfMonth());
486b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions3.updateDate(2003, 4, 17);
487b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
488b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
489b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
490b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
491b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.year.get() == 1972 && SystemClock.uptimeMillis() < timeout) {
492b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
493b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
494b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
495b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
496b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
497b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
498b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals((Integer)2003, mBindingObject.list.get(1));
499b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals((Integer)4, mBindingObject.map.get("two"));
500b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(17, mBindingObject.array.get()[1]);
501b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
502b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
503b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
504b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
505b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testExpressions4() throws Throwable {
506b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.expressions4);
507b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
508b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
509b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
510b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1972, mBindingObject.year.get());
511b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(9, mBindingObject.month.get());
512b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(21, mBindingObject.day.get());
513b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(50, mBinder.expressions4.getYear());
514b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(5, mBinder.expressions4.getMonth());
515b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(21, mBinder.expressions4.getDayOfMonth());
516b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions4.updateDate(49, 4, 17);
517b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
518b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
519b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
520b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
521b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.year.get() == 1972 && SystemClock.uptimeMillis() < timeout) {
522b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
523b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
524b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
525b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
526b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
527b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
528b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2040, mBindingObject.year.get());
529b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(6, mBindingObject.month.get());
530b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(17, mBindingObject.day.get());
531b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
532b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
533b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
534b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
535b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testChaining() throws Throwable {
536b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.checkBox, mBinder.checkBox2);
537b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
538b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
539b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
540b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertTrue(mBinder.checkBox2.isChecked());
541b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBindingObject.checked.set(true);
542b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.executePendingBindings();
543b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertFalse(mBinder.checkBox2.isChecked());
544b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
545b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
546b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
547b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
548b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testTwoWayChaining() throws Throwable {
549b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.checkBox3, mBinder.checkBox4);
550b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
551b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
552b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
553b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertFalse(mBinder.checkBox3.isChecked());
554b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertTrue(mBinder.checkBox4.isChecked());
555b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.checkBox3.setChecked(true);
556b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.executePendingBindings();
557b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertTrue(mBinder.checkBox3.isChecked());
558b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertFalse(mBinder.checkBox4.isChecked());
559b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
560b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
561b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
562b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
563b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testIncludedTwoWay1() throws Throwable {
564b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.included.editText1, mBinder.textView);
565b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
566b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
567b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
568b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(null, mBindingObject.text.get());
569b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("", mBinder.textView.getText().toString());
570b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("", mBinder.included.editText1.getText().toString());
571b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.included.editText1.setText("Hello World");
572b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
573b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
574b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
575b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
576b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.text.get().isEmpty() && SystemClock.uptimeMillis() < timeout) {
577b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
578b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
579b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
580b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
581b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
582b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
583b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBinder.included.editText1.getText().toString());
584b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBinder.textView.getText().toString());
585b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBindingObject.text.get());
586b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
587b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
588b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
589b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
590b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testIncludedTwoWay2() throws Throwable {
591b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.included.editText2, mBinder.textView);
592b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
593b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
594b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
595b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(null, mBindingObject.text.get());
596b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("", mBinder.textView.getText().toString());
597b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("", mBinder.included.editText2.getText().toString());
598b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.included.editText2.setText("Hello World");
599b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
600b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
601b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
602b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final long timeout = SystemClock.uptimeMillis() + 500;
603b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        while (mBindingObject.text.get().isEmpty() && SystemClock.uptimeMillis() < timeout) {
604b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            Thread.sleep(1);
605b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        }
606b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
607b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
608b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
609b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
610b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBinder.included.editText2.getText().toString());
611b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBinder.textView.getText().toString());
612b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBindingObject.text.get());
613b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
614b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
615b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
616b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
617b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    public void testNoEditableLoop() throws Throwable {
618b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        makeVisible(mBinder.editText1, mBinder.editText2);
619b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
620b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        final SpannableString text = new SpannableString("Hello World Also");
621b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        BackgroundColorSpan highlight = new BackgroundColorSpan(0xFFFFFF80);
622b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        text.setSpan(highlight, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
623b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
624b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        mBindingObject.textLatch = new CountDownLatch(2);
625b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
626b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
627b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
628b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("", mBinder.editText1.getText().toString());
629b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(0, mBindingObject.text1Changes);
630b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(0, mBindingObject.text2Changes);
631b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
632b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // Change the text of one of the controls
633b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.editText1.setText("Hello World");
634b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
635b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
636b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
637b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertTrue(mBindingObject.textLatch.await(500, TimeUnit.MILLISECONDS));
638b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        mBindingObject.textLatch = new CountDownLatch(2);
639b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
640b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
641b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
642b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
643b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertNotNull(mBindingObject.editText.get());
644b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World", mBindingObject.editText.get().toString());
645b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // They should both be set
646b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBindingObject.text1Changes);
647b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(1, mBindingObject.text2Changes);
648b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
649b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // Edit the span, but the text remains the same.
650b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.editText2.setText(text);
651b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
652b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
653b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
654b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertTrue(mBindingObject.textLatch.await(500, TimeUnit.MILLISECONDS));
655b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        mBindingObject.textLatch = new CountDownLatch(1);
656b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
657b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
658b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
659b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
660b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // The one control should notify a change, but not the other.
661b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBindingObject.text1Changes);
662b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBindingObject.text2Changes);
663b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
664b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // No more changes should occur
665b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.executePendingBindings();
666b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
667b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
668b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
669b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertFalse(mBindingObject.textLatch.await(200, TimeUnit.MILLISECONDS));
670b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        mBindingObject.textLatch = new CountDownLatch(2);
671b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
672b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
673b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
674b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
675b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // Nothing changed:
676b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBindingObject.text1Changes);
677b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(2, mBindingObject.text2Changes);
678b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
679b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // Now try changing the value to the same thing. Because the
680b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // value is Spannable, it will set it to the EditText
681b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                // and then get back a String in the onTextChanged.
682b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBindingObject.editText.set(text);
683b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
684b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
685b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
686b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        assertTrue(mBindingObject.textLatch.await(500, TimeUnit.MILLISECONDS));
687b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
688b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
689b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
690b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
691b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(3, mBindingObject.text1Changes);
692b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals(3, mBindingObject.text2Changes);
693b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                assertEquals("Hello World Also", mBindingObject.editText.get());
694b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
695b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
696b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
697b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount
69811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount    public void testStringConversions() throws Throwable {
69911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        makeVisible(mBinder.convertBool, mBinder.convertByte, mBinder.convertShort,
70011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertInt, mBinder.convertLong, mBinder.convertFloat,
70111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertDouble, mBinder.convertChar);
70211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        runTestOnUiThread(new Runnable() {
70311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            @Override
70411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            public void run() {
70511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertBool.setText("True");
70611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertByte.setText("123");
70711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertShort.setText("1234");
70811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertInt.setText("12345");
70911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertLong.setText("123456");
71011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertFloat.setText("1.2345");
71111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertDouble.setText("1.23456");
71211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertChar.setText("a");
71311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            }
71411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        });
71511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount
71611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        final long timeout = SystemClock.uptimeMillis() + 500;
71711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        while (!mBindingObject.booleanField.get() && SystemClock.uptimeMillis() < timeout) {
71811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            Thread.sleep(1);
71911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        }
72011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        getInstrumentation().waitForIdleSync();
72111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertTrue(mBindingObject.booleanField.get());
72211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(123, mBindingObject.byteField.get());
72311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(1234, mBindingObject.shortField.get());
72411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(12345, mBindingObject.intField.get());
72511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(123456, mBindingObject.longField.get());
72611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(1.2345f, mBindingObject.floatField.get(), 0.0001f);
72711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(1.23456, mBindingObject.doubleField.get(), 0.000001);
72811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals('a', mBindingObject.charField.get());
72911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount    }
73011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount
73111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount    public void testBadStringConversions() throws Throwable {
73211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        makeVisible(mBinder.convertBool, mBinder.convertByte, mBinder.convertShort,
73311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertInt, mBinder.convertLong, mBinder.convertFloat,
73411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertDouble, mBinder.convertChar);
73511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.booleanField.set(true);
73611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.charField.set('1');
73711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.byteField.set((byte) 1);
73811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.shortField.set((short) 12);
73911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.intField.set(123);
74011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.longField.set(1234);
74111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.floatField.set(1.2345f);
74211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        mBindingObject.doubleField.set(1.23456);
74311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        runTestOnUiThread(new Runnable() {
74411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            @Override
74511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            public void run() {
74611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.executePendingBindings();
74711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertBool.setText("foobar");
74811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertByte.setText("fred");
74911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertShort.setText("wilma");
75011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertInt.setText("barney");
75111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertLong.setText("betty");
75211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertFloat.setText("pebbles");
75311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertDouble.setText("bam-bam");
75411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertChar.setText("");
75511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            }
75611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        });
75711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount
75811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        final long timeout = SystemClock.uptimeMillis() + 500;
75911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        while (mBindingObject.booleanField.get() && SystemClock.uptimeMillis() < timeout) {
76011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount            Thread.sleep(1);
76111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        }
76211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        getInstrumentation().waitForIdleSync();
76311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertFalse(mBindingObject.booleanField.get());
76411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(1, mBindingObject.byteField.get());
76511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(12, mBindingObject.shortField.get());
76611df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(123, mBindingObject.intField.get());
76711df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(1234, mBindingObject.longField.get());
76811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(1.2345f, mBindingObject.floatField.get(), 0.0001f);
76911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals(1.23456, mBindingObject.doubleField.get(), 0.00001);
77011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount        assertEquals('1', mBindingObject.charField.get());
77111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount    }
77211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount
773b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    private void makeVisible(final View... views) throws Throwable {
774b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        runTestOnUiThread(new Runnable() {
775b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            @Override
776b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            public void run() {
777b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.calendarView.setVisibility(View.GONE);
778b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.listView.setVisibility(View.GONE);
779b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.checkBox.setVisibility(View.GONE);
780b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.numberPicker.setVisibility(View.GONE);
781b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.ratingBar.setVisibility(View.GONE);
782b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.seekBar.setVisibility(View.GONE);
783b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.tabhost.setVisibility(View.GONE);
784b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.textView.setVisibility(View.GONE);
785b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.timePicker.setVisibility(View.GONE);
786b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.datePicker.setVisibility(View.GONE);
787b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions1.setVisibility(View.GONE);
788b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions2.setVisibility(View.GONE);
789b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions3.setVisibility(View.GONE);
790b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.expressions4.setVisibility(View.GONE);
791b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.checkBox2.setVisibility(View.GONE);
792b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.checkBox3.setVisibility(View.GONE);
793b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.checkBox4.setVisibility(View.GONE);
794b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.editText1.setVisibility(View.GONE);
795b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.editText2.setVisibility(View.GONE);
796b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.included.editText1.setVisibility(View.GONE);
797b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                mBinder.included.editText2.setVisibility(View.GONE);
79811df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertBool.setVisibility(View.GONE);
79911df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertByte.setVisibility(View.GONE);
80011df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertShort.setVisibility(View.GONE);
80111df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertInt.setVisibility(View.GONE);
80211df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertLong.setVisibility(View.GONE);
80311df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertFloat.setVisibility(View.GONE);
80411df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertDouble.setVisibility(View.GONE);
80511df39c91611b9ff2d7c87a9a9829251a015bccfGeorge Mount                mBinder.convertChar.setVisibility(View.GONE);
806b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                for (View view : views) {
807b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                    view.setVisibility(View.VISIBLE);
808b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount                }
809b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount            }
810b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        });
811b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount        getInstrumentation().waitForIdleSync();
812b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount    }
813b7eeedbfadec03792551014e9dfa2bd384fc21a3George Mount}
814