TextViewBindingAdapterTest.java revision d0bb3f1e1a94747bb3dd8bd2fee315d8816f0f5d
1/*
2 * Copyright (C) 2015 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 */
16package android.databinding.testapp;
17
18import android.databinding.testapp.databinding.TextViewAdapterTestBinding;
19import android.databinding.testapp.vo.TextViewBindingObject;
20
21import android.annotation.TargetApi;
22import android.databinding.adapters.TextViewBindingAdapter;
23import android.graphics.drawable.ColorDrawable;
24import android.os.Build;
25import android.test.UiThreadTest;
26import android.text.Editable;
27import android.text.InputFilter;
28import android.text.InputType;
29import android.text.Spannable;
30import android.text.method.DialerKeyListener;
31import android.text.method.DigitsKeyListener;
32import android.text.method.KeyListener;
33import android.text.method.TextKeyListener;
34import android.widget.TextView;
35
36public class TextViewBindingAdapterTest
37        extends BindingAdapterTestBase<TextViewAdapterTestBinding, TextViewBindingObject> {
38
39    public TextViewBindingAdapterTest() {
40        super(TextViewAdapterTestBinding.class, TextViewBindingObject.class,
41                R.layout.text_view_adapter_test);
42    }
43
44    public void testNumeric() throws Throwable {
45        TextView view = mBinder.numericText;
46        assertTrue(view.getKeyListener() instanceof DigitsKeyListener);
47        DigitsKeyListener listener = (DigitsKeyListener) view.getKeyListener();
48        assertEquals(getExpectedNumericType(), listener.getInputType());
49
50        changeValues();
51
52        assertTrue(view.getKeyListener() instanceof DigitsKeyListener);
53        listener = (DigitsKeyListener) view.getKeyListener();
54        assertEquals(getExpectedNumericType(), listener.getInputType());
55    }
56
57    private int getExpectedNumericType() {
58        int expectedType = InputType.TYPE_CLASS_NUMBER;
59        if ((mBindingObject.getNumeric() & TextViewBindingAdapter.SIGNED) != 0) {
60            expectedType |= InputType.TYPE_NUMBER_FLAG_SIGNED;
61        }
62        if ((mBindingObject.getNumeric() & TextViewBindingAdapter.DECIMAL) != 0) {
63            expectedType |= InputType.TYPE_NUMBER_FLAG_DECIMAL;
64        }
65        return expectedType;
66    }
67
68    public void testDrawables() throws Throwable {
69        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
70            TextView view = mBinder.textDrawableNormal;
71            assertEquals(mBindingObject.getDrawableLeft(),
72                    ((ColorDrawable) view.getCompoundDrawables()[0]).getColor());
73            assertEquals(mBindingObject.getDrawableTop(),
74                    ((ColorDrawable) view.getCompoundDrawables()[1]).getColor());
75            assertEquals(mBindingObject.getDrawableRight(),
76                    ((ColorDrawable) view.getCompoundDrawables()[2]).getColor());
77            assertEquals(mBindingObject.getDrawableBottom(),
78                    ((ColorDrawable) view.getCompoundDrawables()[3]).getColor());
79
80            changeValues();
81
82            assertEquals(mBindingObject.getDrawableLeft(),
83                    ((ColorDrawable) view.getCompoundDrawables()[0]).getColor());
84            assertEquals(mBindingObject.getDrawableTop(),
85                    ((ColorDrawable) view.getCompoundDrawables()[1]).getColor());
86            assertEquals(mBindingObject.getDrawableRight(),
87                    ((ColorDrawable) view.getCompoundDrawables()[2]).getColor());
88            assertEquals(mBindingObject.getDrawableBottom(),
89                    ((ColorDrawable) view.getCompoundDrawables()[3]).getColor());
90        }
91    }
92
93    public void testDrawableStartEnd() throws Throwable {
94        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
95            TextView view = mBinder.textDrawableStartEnd;
96            assertEquals(mBindingObject.getDrawableStart(),
97                    ((ColorDrawable) view.getCompoundDrawablesRelative()[0]).getColor());
98            assertEquals(mBindingObject.getDrawableEnd(),
99                    ((ColorDrawable) view.getCompoundDrawablesRelative()[2]).getColor());
100
101            changeValues();
102
103            assertEquals(mBindingObject.getDrawableStart(),
104                    ((ColorDrawable) view.getCompoundDrawablesRelative()[0]).getColor());
105            assertEquals(mBindingObject.getDrawableEnd(),
106                    ((ColorDrawable) view.getCompoundDrawablesRelative()[2]).getColor());
107        }
108    }
109
110    public void testSimpleProperties() throws Throwable {
111        TextView view = mBinder.textView;
112
113        assertEquals(mBindingObject.getAutoLink(), view.getAutoLinkMask());
114        assertEquals(mBindingObject.getDrawablePadding(), view.getCompoundDrawablePadding());
115        assertEquals(mBindingObject.getTextSize(), view.getTextSize());
116        assertEquals(mBindingObject.getTextColorHint(), view.getHintTextColors().getDefaultColor());
117        assertEquals(mBindingObject.getTextColorLink(), view.getLinkTextColors().getDefaultColor());
118        assertEquals(mBindingObject.isAutoText(), isAutoTextEnabled(view));
119        assertEquals(mBindingObject.getCapitalize(), getCapitalization(view));
120        assertEquals(mBindingObject.getImeActionLabel(), view.getImeActionLabel());
121        assertEquals(mBindingObject.getImeActionId(), view.getImeActionId());
122        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
123            assertEquals(mBindingObject.getTextColorHighlight(), view.getHighlightColor());
124            assertEquals(mBindingObject.getLineSpacingExtra(), view.getLineSpacingExtra());
125            assertEquals(mBindingObject.getLineSpacingMultiplier(),
126                    view.getLineSpacingMultiplier());
127            assertEquals(mBindingObject.getShadowColor(), view.getShadowColor());
128            assertEquals(mBindingObject.getShadowDx(), view.getShadowDx());
129            assertEquals(mBindingObject.getShadowDy(), view.getShadowDy());
130            assertEquals(mBindingObject.getShadowRadius(), view.getShadowRadius());
131            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
132                assertEquals(mBindingObject.getMaxLength(), getMaxLength(view));
133            }
134        }
135
136        changeValues();
137
138        assertEquals(mBindingObject.getAutoLink(), view.getAutoLinkMask());
139        assertEquals(mBindingObject.getDrawablePadding(), view.getCompoundDrawablePadding());
140        assertEquals(mBindingObject.getTextSize(), view.getTextSize());
141        assertEquals(mBindingObject.getTextColorHint(), view.getHintTextColors().getDefaultColor());
142        assertEquals(mBindingObject.getTextColorLink(), view.getLinkTextColors().getDefaultColor());
143        assertEquals(mBindingObject.isAutoText(), isAutoTextEnabled(view));
144        assertEquals(mBindingObject.getCapitalize(), getCapitalization(view));
145        assertEquals(mBindingObject.getImeActionLabel(), view.getImeActionLabel());
146        assertEquals(mBindingObject.getImeActionId(), view.getImeActionId());
147        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
148            assertEquals(mBindingObject.getTextColorHighlight(), view.getHighlightColor());
149            assertEquals(mBindingObject.getLineSpacingExtra(), view.getLineSpacingExtra());
150            assertEquals(mBindingObject.getLineSpacingMultiplier(),
151                    view.getLineSpacingMultiplier());
152            assertEquals(mBindingObject.getShadowColor(), view.getShadowColor());
153            assertEquals(mBindingObject.getShadowDx(), view.getShadowDx());
154            assertEquals(mBindingObject.getShadowDy(), view.getShadowDy());
155            assertEquals(mBindingObject.getShadowRadius(), view.getShadowRadius());
156            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
157                assertEquals(mBindingObject.getMaxLength(), getMaxLength(view));
158            }
159        }
160
161        runTestOnUiThread(new Runnable() {
162            @Override
163            public void run() {
164                mBindingObject.setCapitalize(TextKeyListener.Capitalize.CHARACTERS);
165                mBinder.executePendingBindings();
166            }
167        });
168
169        assertEquals(mBindingObject.getCapitalize(), getCapitalization(view));
170
171        runTestOnUiThread(new Runnable() {
172            @Override
173            public void run() {
174                mBindingObject.setCapitalize(TextKeyListener.Capitalize.WORDS);
175                mBinder.executePendingBindings();
176            }
177        });
178
179        assertEquals(mBindingObject.getCapitalize(), getCapitalization(view));
180    }
181
182    private static boolean isAutoTextEnabled(TextView view) {
183        KeyListener keyListener = view.getKeyListener();
184        if (keyListener == null) {
185            return false;
186        }
187        if (!(keyListener instanceof TextKeyListener)) {
188            return false;
189        }
190        TextKeyListener textKeyListener = (TextKeyListener) keyListener;
191        return ((textKeyListener.getInputType() & InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) != 0);
192    }
193
194    private static TextKeyListener.Capitalize getCapitalization(TextView view) {
195        KeyListener keyListener = view.getKeyListener();
196        if (keyListener == null) {
197            return TextKeyListener.Capitalize.NONE;
198        }
199        int inputType = keyListener.getInputType();
200        if ((inputType & InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS) != 0) {
201            return TextKeyListener.Capitalize.CHARACTERS;
202        } else if ((inputType & InputType.TYPE_TEXT_FLAG_CAP_WORDS) != 0) {
203            return TextKeyListener.Capitalize.WORDS;
204        } else if ((inputType & InputType.TYPE_TEXT_FLAG_CAP_SENTENCES) != 0) {
205            return TextKeyListener.Capitalize.SENTENCES;
206        } else {
207            return TextKeyListener.Capitalize.NONE;
208        }
209    }
210
211    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
212    private static int getMaxLength(TextView view) {
213        InputFilter[] filters = view.getFilters();
214        for (InputFilter filter : filters) {
215            if (filter instanceof InputFilter.LengthFilter) {
216                InputFilter.LengthFilter lengthFilter = (InputFilter.LengthFilter) filter;
217                return lengthFilter.getMax();
218            }
219        }
220        return -1;
221    }
222
223    public void testAllCaps() throws Throwable {
224        TextView view = mBinder.textAllCaps;
225
226        assertEquals(mBindingObject.isTextAllCaps(), view.getTransformationMethod() != null);
227        if (view.getTransformationMethod() != null) {
228            assertEquals("ALL CAPS",
229                    view.getTransformationMethod().getTransformation("all caps", view));
230        }
231
232        changeValues();
233
234        assertEquals(mBindingObject.isTextAllCaps(), view.getTransformationMethod() != null);
235        if (view.getTransformationMethod() != null) {
236            assertEquals("ALL CAPS",
237                    view.getTransformationMethod().getTransformation("all caps", view));
238        }
239    }
240
241    public void testBufferType() throws Throwable {
242        TextView view = mBinder.textBufferType;
243
244        assertEquals(mBindingObject.getBufferType(), getBufferType(view));
245        changeValues();
246        assertEquals(mBindingObject.getBufferType(), getBufferType(view));
247    }
248
249    private static TextView.BufferType getBufferType(TextView view) {
250        CharSequence text = view.getText();
251        if (text instanceof Editable) {
252            return TextView.BufferType.EDITABLE;
253        }
254        if (text instanceof Spannable) {
255            return TextView.BufferType.SPANNABLE;
256        }
257        return TextView.BufferType.NORMAL;
258    }
259
260    public void testInputType() throws Throwable {
261        TextView view = mBinder.textInputType;
262        assertEquals(mBindingObject.getInputType(), view.getInputType());
263        changeValues();
264        assertEquals(mBindingObject.getInputType(), view.getInputType());
265    }
266
267    public void testDigits() throws Throwable {
268        TextView view = mBinder.textDigits;
269        assertEquals(mBindingObject.getDigits(), getDigits(view));
270        changeValues();
271        assertEquals(mBindingObject.getDigits(), getDigits(view));
272    }
273
274    private static String getDigits(TextView textView) {
275        KeyListener keyListener = textView.getKeyListener();
276        if (!(keyListener instanceof DigitsKeyListener)) {
277            return null;
278        }
279        DigitsKeyListener digitsKeyListener = (DigitsKeyListener) keyListener;
280        String input = "abcdefghijklmnopqrstuvwxyz";
281        Spannable spannable = Spannable.Factory.getInstance().newSpannable(input);
282        return digitsKeyListener.filter(input, 0, input.length(), spannable, 0, input.length())
283                .toString();
284    }
285
286    public void testPhoneNumber() throws Throwable {
287        TextView textView = mBinder.textPhoneNumber;
288        assertEquals(mBindingObject.isPhoneNumber(), isPhoneNumber(textView));
289        changeValues();
290        assertEquals(mBindingObject.isPhoneNumber(), isPhoneNumber(textView));
291    }
292
293    private static boolean isPhoneNumber(TextView view) {
294        KeyListener keyListener = view.getKeyListener();
295        return (keyListener instanceof DialerKeyListener);
296    }
297
298    public void testInputMethod() throws Throwable {
299        TextView textView = mBinder.textInputMethod;
300        assertTrue(TextViewBindingObject.KeyListener1.class.isInstance(textView.getKeyListener()));
301        changeValues();
302        assertTrue(TextViewBindingObject.KeyListener2.class.isInstance(textView.getKeyListener()));
303    }
304
305    @UiThreadTest
306    public void testTextWithTheme() throws Throwable {
307        TextView textView = mBinder.textWithTheme;
308        assertNotNull(textView.getTextColors());
309    }
310
311}
312